diff --git a/packages/google-cloud-gke-hub/.github/.OwlBot.yaml b/packages/google-cloud-gke-hub/.github/.OwlBot.yaml index b8ea2983c9fe..24cf6c4961e4 100644 --- a/packages/google-cloud-gke-hub/.github/.OwlBot.yaml +++ b/packages/google-cloud-gke-hub/.github/.OwlBot.yaml @@ -21,7 +21,7 @@ deep-remove-regex: deep-preserve-regex: - /owl-bot-staging/v1alpha - /owl-bot-staging/v1alpha2 - - /owl-bot-staging/v1beta + - /owl-bot-staging/v1beta/ deep-copy-regex: - source: /google/cloud/gkehub/(v.*)/.*-py/(.*) diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/configmanagement_v1/types/configmanagement.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/configmanagement_v1/types/configmanagement.py index 1c1a952f9396..dae7aa17b17c 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/configmanagement_v1/types/configmanagement.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/configmanagement_v1/types/configmanagement.py @@ -181,6 +181,8 @@ class GitConfig(proto.Message): class PolicyController(proto.Message): r"""Configuration for Policy Controller + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: enabled (bool): Enables the installation of Policy @@ -189,10 +191,14 @@ class PolicyController(proto.Message): template_library_installed (bool): Installs the default template library along with Policy Controller. + + This field is a member of `oneof`_ ``_template_library_installed``. audit_interval_seconds (int): Sets the interval for Policy Controller Audit Scans (in seconds). When set to 0, this disables audit functionality altogether. + + This field is a member of `oneof`_ ``_audit_interval_seconds``. exemptable_namespaces (Sequence[str]): The set of namespaces that are excluded from Policy Controller checks. Namespaces do not need diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/async_client.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/async_client.py index 697af4c9625a..805a79f28164 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/async_client.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/async_client.py @@ -19,13 +19,15 @@ from typing import Dict, Sequence, Tuple, Type, Union import pkg_resources -import google.api_core.client_options as ClientOptions # type: ignore +from google.api_core.client_options import ClientOptions # type: ignore from google.api_core import exceptions as core_exceptions # type: ignore from google.api_core import gapic_v1 # type: ignore from google.api_core import retry as retries # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.api_core import operation # type: ignore from google.api_core import operation_async # type: ignore from google.cloud.gkehub_v1.services.gke_hub import pagers @@ -176,17 +178,17 @@ def __init__( async def list_memberships( self, - request: service.ListMembershipsRequest = None, + request: Union[service.ListMembershipsRequest, dict] = None, *, parent: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListMembershipsAsyncPager: r"""Lists Memberships in a given project and location. Args: - request (:class:`google.cloud.gkehub_v1.types.ListMembershipsRequest`): + request (Union[google.cloud.gkehub_v1.types.ListMembershipsRequest, dict]): The request object. Request message for `GkeHub.ListMemberships` method. parent (:class:`str`): @@ -256,17 +258,17 @@ async def list_memberships( async def list_features( self, - request: service.ListFeaturesRequest = None, + request: Union[service.ListFeaturesRequest, dict] = None, *, parent: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListFeaturesAsyncPager: r"""Lists Features in a given project and location. Args: - request (:class:`google.cloud.gkehub_v1.types.ListFeaturesRequest`): + request (Union[google.cloud.gkehub_v1.types.ListFeaturesRequest, dict]): The request object. Request message for `GkeHub.ListFeatures` method. parent (:class:`str`): @@ -336,17 +338,17 @@ async def list_features( async def get_membership( self, - request: service.GetMembershipRequest = None, + request: Union[service.GetMembershipRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> membership.Membership: r"""Gets the details of a Membership. Args: - request (:class:`google.cloud.gkehub_v1.types.GetMembershipRequest`): + request (Union[google.cloud.gkehub_v1.types.GetMembershipRequest, dict]): The request object. Request message for `GkeHub.GetMembership` method. name (:class:`str`): @@ -407,17 +409,17 @@ async def get_membership( async def get_feature( self, - request: service.GetFeatureRequest = None, + request: Union[service.GetFeatureRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> feature.Feature: r"""Gets details of a single Feature. Args: - request (:class:`google.cloud.gkehub_v1.types.GetFeatureRequest`): + request (Union[google.cloud.gkehub_v1.types.GetFeatureRequest, dict]): The request object. Request message for `GkeHub.GetFeature` method. name (:class:`str`): @@ -478,12 +480,12 @@ async def get_feature( async def create_membership( self, - request: service.CreateMembershipRequest = None, + request: Union[service.CreateMembershipRequest, dict] = None, *, parent: str = None, resource: membership.Membership = None, membership_id: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> operation_async.AsyncOperation: @@ -494,7 +496,7 @@ async def create_membership( https://cloud.google.com/anthos/multicluster-management/connect/registering-a-cluster. Args: - request (:class:`google.cloud.gkehub_v1.types.CreateMembershipRequest`): + request (Union[google.cloud.gkehub_v1.types.CreateMembershipRequest, dict]): The request object. Request message for the `GkeHub.CreateMembership` method. parent (:class:`str`): @@ -593,19 +595,19 @@ async def create_membership( async def create_feature( self, - request: service.CreateFeatureRequest = None, + request: Union[service.CreateFeatureRequest, dict] = None, *, parent: str = None, resource: feature.Feature = None, feature_id: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> operation_async.AsyncOperation: r"""Adds a new Feature. Args: - request (:class:`google.cloud.gkehub_v1.types.CreateFeatureRequest`): + request (Union[google.cloud.gkehub_v1.types.CreateFeatureRequest, dict]): The request object. Request message for the `GkeHub.CreateFeature` method. parent (:class:`str`): @@ -692,10 +694,10 @@ async def create_feature( async def delete_membership( self, - request: service.DeleteMembershipRequest = None, + request: Union[service.DeleteMembershipRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> operation_async.AsyncOperation: @@ -707,7 +709,7 @@ async def delete_membership( https://cloud.google.com/anthos/multicluster-management/connect/unregistering-a-cluster. Args: - request (:class:`google.cloud.gkehub_v1.types.DeleteMembershipRequest`): + request (Union[google.cloud.gkehub_v1.types.DeleteMembershipRequest, dict]): The request object. Request message for `GkeHub.DeleteMembership` method. name (:class:`str`): @@ -789,17 +791,17 @@ async def delete_membership( async def delete_feature( self, - request: service.DeleteFeatureRequest = None, + request: Union[service.DeleteFeatureRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> operation_async.AsyncOperation: r"""Removes a Feature. Args: - request (:class:`google.cloud.gkehub_v1.types.DeleteFeatureRequest`): + request (Union[google.cloud.gkehub_v1.types.DeleteFeatureRequest, dict]): The request object. Request message for `GkeHub.DeleteFeature` method. name (:class:`str`): @@ -881,19 +883,19 @@ async def delete_feature( async def update_membership( self, - request: service.UpdateMembershipRequest = None, + request: Union[service.UpdateMembershipRequest, dict] = None, *, name: str = None, resource: membership.Membership = None, update_mask: field_mask_pb2.FieldMask = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> operation_async.AsyncOperation: r"""Updates an existing Membership. Args: - request (:class:`google.cloud.gkehub_v1.types.UpdateMembershipRequest`): + request (Union[google.cloud.gkehub_v1.types.UpdateMembershipRequest, dict]): The request object. Request message for `GkeHub.UpdateMembership` method. name (:class:`str`): @@ -988,19 +990,19 @@ async def update_membership( async def update_feature( self, - request: service.UpdateFeatureRequest = None, + request: Union[service.UpdateFeatureRequest, dict] = None, *, name: str = None, resource: feature.Feature = None, update_mask: field_mask_pb2.FieldMask = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> operation_async.AsyncOperation: r"""Updates an existing Feature. Args: - request (:class:`google.cloud.gkehub_v1.types.UpdateFeatureRequest`): + request (Union[google.cloud.gkehub_v1.types.UpdateFeatureRequest, dict]): The request object. Request message for `GkeHub.UpdateFeature` method. name (:class:`str`): @@ -1095,9 +1097,9 @@ async def update_feature( async def generate_connect_manifest( self, - request: service.GenerateConnectManifestRequest = None, + request: Union[service.GenerateConnectManifestRequest, dict] = None, *, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> service.GenerateConnectManifestResponse: @@ -1107,7 +1109,7 @@ async def generate_connect_manifest( Most clients should not need to call this method directly. Args: - request (:class:`google.cloud.gkehub_v1.types.GenerateConnectManifestRequest`): + request (Union[google.cloud.gkehub_v1.types.GenerateConnectManifestRequest, dict]): The request object. Request message for `GkeHub.GenerateConnectManifest` method. . diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/client.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/client.py index 2dc7db06f8b6..dc6dc79a193b 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/client.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/client.py @@ -30,6 +30,8 @@ from google.auth.exceptions import MutualTLSChannelError # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.api_core import operation # type: ignore from google.api_core import operation_async # type: ignore from google.cloud.gkehub_v1.services.gke_hub import pagers @@ -387,7 +389,7 @@ def list_memberships( request: Union[service.ListMembershipsRequest, dict] = None, *, parent: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListMembershipsPager: @@ -467,7 +469,7 @@ def list_features( request: Union[service.ListFeaturesRequest, dict] = None, *, parent: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListFeaturesPager: @@ -547,7 +549,7 @@ def get_membership( request: Union[service.GetMembershipRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> membership.Membership: @@ -618,7 +620,7 @@ def get_feature( request: Union[service.GetFeatureRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> feature.Feature: @@ -691,7 +693,7 @@ def create_membership( parent: str = None, resource: membership.Membership = None, membership_id: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> operation.Operation: @@ -806,7 +808,7 @@ def create_feature( parent: str = None, resource: feature.Feature = None, feature_id: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> operation.Operation: @@ -903,7 +905,7 @@ def delete_membership( request: Union[service.DeleteMembershipRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> operation.Operation: @@ -1000,7 +1002,7 @@ def delete_feature( request: Union[service.DeleteFeatureRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> operation.Operation: @@ -1094,7 +1096,7 @@ def update_membership( name: str = None, resource: membership.Membership = None, update_mask: field_mask_pb2.FieldMask = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> operation.Operation: @@ -1201,7 +1203,7 @@ def update_feature( name: str = None, resource: feature.Feature = None, update_mask: field_mask_pb2.FieldMask = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> operation.Operation: @@ -1305,7 +1307,7 @@ def generate_connect_manifest( self, request: Union[service.GenerateConnectManifestRequest, dict] = None, *, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> service.GenerateConnectManifestResponse: diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/transports/base.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/transports/base.py index b5596de7a770..d38a289a2571 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/transports/base.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/transports/base.py @@ -15,7 +15,6 @@ # import abc from typing import Awaitable, Callable, Dict, Optional, Sequence, Union -import packaging.version import pkg_resources import google.auth # type: ignore @@ -39,15 +38,6 @@ except pkg_resources.DistributionNotFound: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() -try: - # google.auth.__version__ was added in 1.26.0 - _GOOGLE_AUTH_VERSION = google.auth.__version__ -except AttributeError: - try: # try pkg_resources if it is available - _GOOGLE_AUTH_VERSION = pkg_resources.get_distribution("google-auth").version - except pkg_resources.DistributionNotFound: # pragma: NO COVER - _GOOGLE_AUTH_VERSION = None - class GkeHubTransport(abc.ABC): """Abstract transport class for GkeHub.""" @@ -97,7 +87,7 @@ def __init__( host += ":443" self._host = host - scopes_kwargs = self._get_scopes_kwargs(self._host, scopes) + scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} # Save the scopes. self._scopes = scopes @@ -130,29 +120,6 @@ def __init__( # Save the credentials. self._credentials = credentials - # TODO(busunkim): This method is in the base transport - # to avoid duplicating code across the transport classes. These functions - # should be deleted once the minimum required versions of google-auth is increased. - - # TODO: Remove this function once google-auth >= 1.25.0 is required - @classmethod - def _get_scopes_kwargs( - cls, host: str, scopes: Optional[Sequence[str]] - ) -> Dict[str, Optional[Sequence[str]]]: - """Returns scopes kwargs to pass to google-auth methods depending on the google-auth version""" - - scopes_kwargs = {} - - if _GOOGLE_AUTH_VERSION and ( - packaging.version.parse(_GOOGLE_AUTH_VERSION) - >= packaging.version.parse("1.25.0") - ): - scopes_kwargs = {"scopes": scopes, "default_scopes": cls.AUTH_SCOPES} - else: - scopes_kwargs = {"scopes": scopes or cls.AUTH_SCOPES} - - return scopes_kwargs - def _prep_wrapped_messages(self, client_info): # Precompute the wrapped methods. self._wrapped_methods = { @@ -203,7 +170,7 @@ def close(self): raise NotImplementedError() @property - def operations_client(self) -> operations_v1.OperationsClient: + def operations_client(self): """Return the client designed to process long-running operations.""" raise NotImplementedError() diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/transports/grpc.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/transports/grpc.py index 5c852eca29e3..cbf30d5be0ae 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/transports/grpc.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/transports/grpc.py @@ -127,7 +127,7 @@ def __init__( self._grpc_channel = None self._ssl_channel_credentials = ssl_channel_credentials self._stubs: Dict[str, Callable] = {} - self._operations_client = None + self._operations_client: Optional[operations_v1.OperationsClient] = None if api_mtls_endpoint: warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/transports/grpc_asyncio.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/transports/grpc_asyncio.py index dba785754184..f4b7b5d8f68f 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/transports/grpc_asyncio.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/transports/grpc_asyncio.py @@ -21,7 +21,6 @@ from google.api_core import operations_v1 # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.auth.transport.grpc import SslCredentials # type: ignore -import packaging.version import grpc # type: ignore from grpc.experimental import aio # type: ignore @@ -174,7 +173,7 @@ def __init__( self._grpc_channel = None self._ssl_channel_credentials = ssl_channel_credentials self._stubs: Dict[str, Callable] = {} - self._operations_client = None + self._operations_client: Optional[operations_v1.OperationsAsyncClient] = None if api_mtls_endpoint: warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/types/feature.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/types/feature.py index c0599dde0d5c..08c489d0a294 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/types/feature.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/types/feature.py @@ -174,9 +174,13 @@ class Code(proto.Enum): class CommonFeatureSpec(proto.Message): r"""CommonFeatureSpec contains Hub-wide configuration information + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: multiclusteringress (google.cloud.gkehub_v1.multiclusteringress_v1.FeatureSpec): Multicluster Ingress-specific spec. + + This field is a member of `oneof`_ ``feature_spec``. """ multiclusteringress = proto.Field( @@ -204,9 +208,14 @@ class MembershipFeatureSpec(proto.Message): r"""MembershipFeatureSpec contains configuration information for a single Membership. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: configmanagement (google.cloud.gkehub_v1.configmanagement_v1.MembershipSpec): Config Management-specific spec. + + This field is a member of `oneof`_ ``feature_spec``. """ configmanagement = proto.Field( @@ -221,9 +230,14 @@ class MembershipFeatureState(proto.Message): r"""MembershipFeatureState contains Feature status information for a single Membership. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: configmanagement (google.cloud.gkehub_v1.configmanagement_v1.MembershipState): Config Management-specific state. + + This field is a member of `oneof`_ ``feature_state``. state (google.cloud.gkehub_v1.types.FeatureState): The high-level state of this Feature for a single membership. diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/types/membership.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/types/membership.py index f1ea88d4e9b7..499e17c02465 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/types/membership.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/types/membership.py @@ -34,10 +34,14 @@ class Membership(proto.Message): r"""Membership contains information about a member cluster. + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: endpoint (google.cloud.gkehub_v1.types.MembershipEndpoint): Optional. Endpoint information to reach this member. + + This field is a member of `oneof`_ ``type``. name (str): Output only. The full, unique name of this Membership resource in the format diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/__init__.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/__init__.py index c1a2e5514a43..fdbb537bd8ec 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/__init__.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/__init__.py @@ -35,6 +35,8 @@ from .types.membership import Membership from .types.membership import MembershipEndpoint from .types.membership import MembershipState +from .types.membership import MultiCloudCluster +from .types.membership import OnPremCluster from .types.membership import OperationMetadata from .types.membership import ResourceManifest from .types.membership import ResourceOptions @@ -64,6 +66,8 @@ "Membership", "MembershipEndpoint", "MembershipState", + "MultiCloudCluster", + "OnPremCluster", "OperationMetadata", "ResourceManifest", "ResourceOptions", diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/async_client.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/async_client.py index 4ce26f4b44c8..199905b59a99 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/async_client.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/async_client.py @@ -19,13 +19,15 @@ from typing import Dict, Sequence, Tuple, Type, Union import pkg_resources -import google.api_core.client_options as ClientOptions # type: ignore +from google.api_core.client_options import ClientOptions # type: ignore from google.api_core import exceptions as core_exceptions # type: ignore from google.api_core import gapic_v1 # type: ignore from google.api_core import retry as retries # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.api_core import operation # type: ignore from google.api_core import operation_async # type: ignore from google.cloud.gkehub_v1beta1.services.gke_hub_membership_service import pagers @@ -40,9 +42,15 @@ class GkeHubMembershipServiceAsyncClient: - """GKE Hub CRUD API for the Membership resource. - The Membership service is currently only available in the global - location. + """The GKE Hub MembershipService handles the registration of many + Kubernetes clusters to Google Cloud, represented with the + [Membership][google.cloud.gkehub.v1beta1.Membership] resource. + + GKE Hub is currently only available in the global region. + + **Membership management may be non-trivial:** it is recommended to + use one of the Google-provided client libraries or tools where + possible when working with Membership resources. """ _client: GkeHubMembershipServiceClient @@ -179,17 +187,17 @@ def __init__( async def list_memberships( self, - request: membership.ListMembershipsRequest = None, + request: Union[membership.ListMembershipsRequest, dict] = None, *, parent: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListMembershipsAsyncPager: r"""Lists Memberships in a given project and location. Args: - request (:class:`google.cloud.gkehub_v1beta1.types.ListMembershipsRequest`): + request (Union[google.cloud.gkehub_v1beta1.types.ListMembershipsRequest, dict]): The request object. Request message for `GkeHubMembershipService.ListMemberships` method. parent (:class:`str`): @@ -260,17 +268,17 @@ async def list_memberships( async def get_membership( self, - request: membership.GetMembershipRequest = None, + request: Union[membership.GetMembershipRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> membership.Membership: r"""Gets the details of a Membership. Args: - request (:class:`google.cloud.gkehub_v1beta1.types.GetMembershipRequest`): + request (Union[google.cloud.gkehub_v1beta1.types.GetMembershipRequest, dict]): The request object. Request message for `GkeHubMembershipService.GetMembership` method. name (:class:`str`): @@ -331,19 +339,23 @@ async def get_membership( async def create_membership( self, - request: membership.CreateMembershipRequest = None, + request: Union[membership.CreateMembershipRequest, dict] = None, *, parent: str = None, resource: membership.Membership = None, membership_id: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> operation_async.AsyncOperation: - r"""Adds a new Membership. + r"""Creates a new Membership. + + **This is currently only supported for GKE clusters on Google + Cloud**. To register other clusters, follow the instructions at + https://cloud.google.com/anthos/multicluster-management/connect/registering-a-cluster. Args: - request (:class:`google.cloud.gkehub_v1beta1.types.CreateMembershipRequest`): + request (Union[google.cloud.gkehub_v1beta1.types.CreateMembershipRequest, dict]): The request object. Request message for the `GkeHubMembershipService.CreateMembership` method. parent (:class:`str`): @@ -442,17 +454,22 @@ async def create_membership( async def delete_membership( self, - request: membership.DeleteMembershipRequest = None, + request: Union[membership.DeleteMembershipRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> operation_async.AsyncOperation: r"""Removes a Membership. + **This is currently only supported for GKE clusters on Google + Cloud**. To unregister other clusters, follow the instructions + at + https://cloud.google.com/anthos/multicluster-management/connect/unregistering-a-cluster. + Args: - request (:class:`google.cloud.gkehub_v1beta1.types.DeleteMembershipRequest`): + request (Union[google.cloud.gkehub_v1beta1.types.DeleteMembershipRequest, dict]): The request object. Request message for `GkeHubMembershipService.DeleteMembership` method. name (:class:`str`): @@ -534,19 +551,19 @@ async def delete_membership( async def update_membership( self, - request: membership.UpdateMembershipRequest = None, + request: Union[membership.UpdateMembershipRequest, dict] = None, *, name: str = None, resource: membership.Membership = None, update_mask: field_mask_pb2.FieldMask = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> operation_async.AsyncOperation: r"""Updates an existing Membership. Args: - request (:class:`google.cloud.gkehub_v1beta1.types.UpdateMembershipRequest`): + request (Union[google.cloud.gkehub_v1beta1.types.UpdateMembershipRequest, dict]): The request object. Request message for `GkeHubMembershipService.UpdateMembership` method. name (:class:`str`): @@ -563,7 +580,9 @@ async def update_membership( If you are updating a map field, set the value of a key to null or empty string to delete the key from the map. It's not possible to update a key's value to the empty - string. + string. If you specify the update_mask to be a special + path "*", fully replaces all user-modifiable fields to + match ``resource``. This corresponds to the ``resource`` field on the ``request`` instance; if ``request`` is provided, this @@ -642,17 +661,19 @@ async def update_membership( async def generate_connect_manifest( self, - request: membership.GenerateConnectManifestRequest = None, + request: Union[membership.GenerateConnectManifestRequest, dict] = None, *, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> membership.GenerateConnectManifestResponse: - r"""Generates the manifest for deployment of the GKE - connect agent. + r"""Generates the manifest for deployment of the GKE connect agent. + + **This method is used internally by Google-provided libraries.** + Most clients should not need to call this method directly. Args: - request (:class:`google.cloud.gkehub_v1beta1.types.GenerateConnectManifestRequest`): + request (Union[google.cloud.gkehub_v1beta1.types.GenerateConnectManifestRequest, dict]): The request object. Request message for `GkeHubMembershipService.GenerateConnectManifest` method. . @@ -694,9 +715,9 @@ async def generate_connect_manifest( async def validate_exclusivity( self, - request: membership.ValidateExclusivityRequest = None, + request: Union[membership.ValidateExclusivityRequest, dict] = None, *, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> membership.ValidateExclusivityResponse: @@ -705,7 +726,7 @@ async def validate_exclusivity( depend on an existing Hub membership resource. Args: - request (:class:`google.cloud.gkehub_v1beta1.types.ValidateExclusivityRequest`): + request (Union[google.cloud.gkehub_v1beta1.types.ValidateExclusivityRequest, dict]): The request object. The request to validate the existing state of the membership CR in the cluster. retry (google.api_core.retry.Retry): Designation of what errors, if any, @@ -745,9 +766,9 @@ async def validate_exclusivity( async def generate_exclusivity_manifest( self, - request: membership.GenerateExclusivityManifestRequest = None, + request: Union[membership.GenerateExclusivityManifestRequest, dict] = None, *, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> membership.GenerateExclusivityManifestResponse: @@ -767,7 +788,7 @@ async def generate_exclusivity_manifest( any differences between the versions. Args: - request (:class:`google.cloud.gkehub_v1beta1.types.GenerateExclusivityManifestRequest`): + request (Union[google.cloud.gkehub_v1beta1.types.GenerateExclusivityManifestRequest, dict]): The request object. The request to generate the manifests for exclusivity artifacts. retry (google.api_core.retry.Retry): Designation of what errors, if any, @@ -806,6 +827,12 @@ async def generate_exclusivity_manifest( # Done; return the response. return response + async def __aenter__(self): + return self + + async def __aexit__(self, exc_type, exc, tb): + await self.transport.close() + try: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/client.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/client.py index 5fa44ce48459..c7dfccb33f19 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/client.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/client.py @@ -17,7 +17,7 @@ from distutils import util import os import re -from typing import Callable, Dict, Optional, Sequence, Tuple, Type, Union +from typing import Dict, Optional, Sequence, Tuple, Type, Union import pkg_resources from google.api_core import client_options as client_options_lib # type: ignore @@ -30,6 +30,8 @@ from google.auth.exceptions import MutualTLSChannelError # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.api_core import operation # type: ignore from google.api_core import operation_async # type: ignore from google.cloud.gkehub_v1beta1.services.gke_hub_membership_service import pagers @@ -79,9 +81,15 @@ def get_transport_class( class GkeHubMembershipServiceClient(metaclass=GkeHubMembershipServiceClientMeta): - """GKE Hub CRUD API for the Membership resource. - The Membership service is currently only available in the global - location. + """The GKE Hub MembershipService handles the registration of many + Kubernetes clusters to Google Cloud, represented with the + [Membership][google.cloud.gkehub.v1beta1.Membership] resource. + + GKE Hub is currently only available in the global region. + + **Membership management may be non-trivial:** it is recommended to + use one of the Google-provided client libraries or tools where + possible when working with Membership resources. """ @staticmethod @@ -355,21 +363,22 @@ def __init__( client_cert_source_for_mtls=client_cert_source_func, quota_project_id=client_options.quota_project_id, client_info=client_info, + always_use_jwt_access=True, ) def list_memberships( self, - request: membership.ListMembershipsRequest = None, + request: Union[membership.ListMembershipsRequest, dict] = None, *, parent: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListMembershipsPager: r"""Lists Memberships in a given project and location. Args: - request (google.cloud.gkehub_v1beta1.types.ListMembershipsRequest): + request (Union[google.cloud.gkehub_v1beta1.types.ListMembershipsRequest, dict]): The request object. Request message for `GkeHubMembershipService.ListMemberships` method. parent (str): @@ -440,17 +449,17 @@ def list_memberships( def get_membership( self, - request: membership.GetMembershipRequest = None, + request: Union[membership.GetMembershipRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> membership.Membership: r"""Gets the details of a Membership. Args: - request (google.cloud.gkehub_v1beta1.types.GetMembershipRequest): + request (Union[google.cloud.gkehub_v1beta1.types.GetMembershipRequest, dict]): The request object. Request message for `GkeHubMembershipService.GetMembership` method. name (str): @@ -511,19 +520,23 @@ def get_membership( def create_membership( self, - request: membership.CreateMembershipRequest = None, + request: Union[membership.CreateMembershipRequest, dict] = None, *, parent: str = None, resource: membership.Membership = None, membership_id: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> operation.Operation: - r"""Adds a new Membership. + r"""Creates a new Membership. + + **This is currently only supported for GKE clusters on Google + Cloud**. To register other clusters, follow the instructions at + https://cloud.google.com/anthos/multicluster-management/connect/registering-a-cluster. Args: - request (google.cloud.gkehub_v1beta1.types.CreateMembershipRequest): + request (Union[google.cloud.gkehub_v1beta1.types.CreateMembershipRequest, dict]): The request object. Request message for the `GkeHubMembershipService.CreateMembership` method. parent (str): @@ -622,17 +635,22 @@ def create_membership( def delete_membership( self, - request: membership.DeleteMembershipRequest = None, + request: Union[membership.DeleteMembershipRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> operation.Operation: r"""Removes a Membership. + **This is currently only supported for GKE clusters on Google + Cloud**. To unregister other clusters, follow the instructions + at + https://cloud.google.com/anthos/multicluster-management/connect/unregistering-a-cluster. + Args: - request (google.cloud.gkehub_v1beta1.types.DeleteMembershipRequest): + request (Union[google.cloud.gkehub_v1beta1.types.DeleteMembershipRequest, dict]): The request object. Request message for `GkeHubMembershipService.DeleteMembership` method. name (str): @@ -714,19 +732,19 @@ def delete_membership( def update_membership( self, - request: membership.UpdateMembershipRequest = None, + request: Union[membership.UpdateMembershipRequest, dict] = None, *, name: str = None, resource: membership.Membership = None, update_mask: field_mask_pb2.FieldMask = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> operation.Operation: r"""Updates an existing Membership. Args: - request (google.cloud.gkehub_v1beta1.types.UpdateMembershipRequest): + request (Union[google.cloud.gkehub_v1beta1.types.UpdateMembershipRequest, dict]): The request object. Request message for `GkeHubMembershipService.UpdateMembership` method. name (str): @@ -743,7 +761,9 @@ def update_membership( If you are updating a map field, set the value of a key to null or empty string to delete the key from the map. It's not possible to update a key's value to the empty - string. + string. If you specify the update_mask to be a special + path "*", fully replaces all user-modifiable fields to + match ``resource``. This corresponds to the ``resource`` field on the ``request`` instance; if ``request`` is provided, this @@ -822,17 +842,19 @@ def update_membership( def generate_connect_manifest( self, - request: membership.GenerateConnectManifestRequest = None, + request: Union[membership.GenerateConnectManifestRequest, dict] = None, *, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> membership.GenerateConnectManifestResponse: - r"""Generates the manifest for deployment of the GKE - connect agent. + r"""Generates the manifest for deployment of the GKE connect agent. + + **This method is used internally by Google-provided libraries.** + Most clients should not need to call this method directly. Args: - request (google.cloud.gkehub_v1beta1.types.GenerateConnectManifestRequest): + request (Union[google.cloud.gkehub_v1beta1.types.GenerateConnectManifestRequest, dict]): The request object. Request message for `GkeHubMembershipService.GenerateConnectManifest` method. . @@ -877,9 +899,9 @@ def generate_connect_manifest( def validate_exclusivity( self, - request: membership.ValidateExclusivityRequest = None, + request: Union[membership.ValidateExclusivityRequest, dict] = None, *, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> membership.ValidateExclusivityResponse: @@ -888,7 +910,7 @@ def validate_exclusivity( depend on an existing Hub membership resource. Args: - request (google.cloud.gkehub_v1beta1.types.ValidateExclusivityRequest): + request (Union[google.cloud.gkehub_v1beta1.types.ValidateExclusivityRequest, dict]): The request object. The request to validate the existing state of the membership CR in the cluster. retry (google.api_core.retry.Retry): Designation of what errors, if any, @@ -929,9 +951,9 @@ def validate_exclusivity( def generate_exclusivity_manifest( self, - request: membership.GenerateExclusivityManifestRequest = None, + request: Union[membership.GenerateExclusivityManifestRequest, dict] = None, *, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> membership.GenerateExclusivityManifestResponse: @@ -951,7 +973,7 @@ def generate_exclusivity_manifest( any differences between the versions. Args: - request (google.cloud.gkehub_v1beta1.types.GenerateExclusivityManifestRequest): + request (Union[google.cloud.gkehub_v1beta1.types.GenerateExclusivityManifestRequest, dict]): The request object. The request to generate the manifests for exclusivity artifacts. retry (google.api_core.retry.Retry): Designation of what errors, if any, @@ -993,6 +1015,19 @@ def generate_exclusivity_manifest( # Done; return the response. return response + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + """Releases underlying transport's resources. + + .. warning:: + ONLY use as a context manager if the transport is NOT shared + with other clients! Exiting the with block will CLOSE the transport + and may cause errors in other clients! + """ + self.transport.close() + try: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/pagers.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/pagers.py index 81a020826583..77c9c4faf852 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/pagers.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/pagers.py @@ -15,13 +15,13 @@ # from typing import ( Any, - AsyncIterable, + AsyncIterator, Awaitable, Callable, - Iterable, Sequence, Tuple, Optional, + Iterator, ) from google.cloud.gkehub_v1beta1.types import membership @@ -74,14 +74,14 @@ def __getattr__(self, name: str) -> Any: return getattr(self._response, name) @property - def pages(self) -> Iterable[membership.ListMembershipsResponse]: + def pages(self) -> Iterator[membership.ListMembershipsResponse]: yield self._response while self._response.next_page_token: self._request.page_token = self._response.next_page_token self._response = self._method(self._request, metadata=self._metadata) yield self._response - def __iter__(self) -> Iterable[membership.Membership]: + def __iter__(self) -> Iterator[membership.Membership]: for page in self.pages: yield from page.resources @@ -136,14 +136,14 @@ def __getattr__(self, name: str) -> Any: return getattr(self._response, name) @property - async def pages(self) -> AsyncIterable[membership.ListMembershipsResponse]: + async def pages(self) -> AsyncIterator[membership.ListMembershipsResponse]: yield self._response while self._response.next_page_token: self._request.page_token = self._response.next_page_token self._response = await self._method(self._request, metadata=self._metadata) yield self._response - def __aiter__(self) -> AsyncIterable[membership.Membership]: + def __aiter__(self) -> AsyncIterator[membership.Membership]: async def async_generator(): async for page in self.pages: for response in page.resources: diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/transports/base.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/transports/base.py index ae89f690ac60..75385448fd16 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/transports/base.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/transports/base.py @@ -15,7 +15,6 @@ # import abc from typing import Awaitable, Callable, Dict, Optional, Sequence, Union -import packaging.version import pkg_resources import google.auth # type: ignore @@ -37,15 +36,6 @@ except pkg_resources.DistributionNotFound: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() -try: - # google.auth.__version__ was added in 1.26.0 - _GOOGLE_AUTH_VERSION = google.auth.__version__ -except AttributeError: - try: # try pkg_resources if it is available - _GOOGLE_AUTH_VERSION = pkg_resources.get_distribution("google-auth").version - except pkg_resources.DistributionNotFound: # pragma: NO COVER - _GOOGLE_AUTH_VERSION = None - class GkeHubMembershipServiceTransport(abc.ABC): """Abstract transport class for GkeHubMembershipService.""" @@ -95,7 +85,7 @@ def __init__( host += ":443" self._host = host - scopes_kwargs = self._get_scopes_kwargs(self._host, scopes) + scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} # Save the scopes. self._scopes = scopes @@ -117,7 +107,7 @@ def __init__( **scopes_kwargs, quota_project_id=quota_project_id ) - # If the credentials is service account credentials, then always try to use self signed JWT. + # If the credentials are service account credentials, then always try to use self signed JWT. if ( always_use_jwt_access and isinstance(credentials, service_account.Credentials) @@ -128,29 +118,6 @@ def __init__( # Save the credentials. self._credentials = credentials - # TODO(busunkim): This method is in the base transport - # to avoid duplicating code across the transport classes. These functions - # should be deleted once the minimum required versions of google-auth is increased. - - # TODO: Remove this function once google-auth >= 1.25.0 is required - @classmethod - def _get_scopes_kwargs( - cls, host: str, scopes: Optional[Sequence[str]] - ) -> Dict[str, Optional[Sequence[str]]]: - """Returns scopes kwargs to pass to google-auth methods depending on the google-auth version""" - - scopes_kwargs = {} - - if _GOOGLE_AUTH_VERSION and ( - packaging.version.parse(_GOOGLE_AUTH_VERSION) - >= packaging.version.parse("1.25.0") - ): - scopes_kwargs = {"scopes": scopes, "default_scopes": cls.AUTH_SCOPES} - else: - scopes_kwargs = {"scopes": scopes or cls.AUTH_SCOPES} - - return scopes_kwargs - def _prep_wrapped_messages(self, client_info): # Precompute the wrapped methods. self._wrapped_methods = { @@ -186,8 +153,17 @@ def _prep_wrapped_messages(self, client_info): ), } + def close(self): + """Closes resources associated with the transport. + + .. warning:: + Only call this method if the transport is NOT shared + with other clients - this may cause errors in other clients! + """ + raise NotImplementedError() + @property - def operations_client(self) -> operations_v1.OperationsClient: + def operations_client(self): """Return the client designed to process long-running operations.""" raise NotImplementedError() diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/transports/grpc.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/transports/grpc.py index 1c0b01f58700..ee744c123293 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/transports/grpc.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/transports/grpc.py @@ -33,9 +33,15 @@ class GkeHubMembershipServiceGrpcTransport(GkeHubMembershipServiceTransport): """gRPC backend transport for GkeHubMembershipService. - GKE Hub CRUD API for the Membership resource. - The Membership service is currently only available in the global - location. + The GKE Hub MembershipService handles the registration of many + Kubernetes clusters to Google Cloud, represented with the + [Membership][google.cloud.gkehub.v1beta1.Membership] resource. + + GKE Hub is currently only available in the global region. + + **Membership management may be non-trivial:** it is recommended to + use one of the Google-provided client libraries or tools where + possible when working with Membership resources. This class defines the same methods as the primary client, so the primary client can load the underlying transport implementation @@ -84,16 +90,16 @@ def __init__( api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. If provided, it overrides the ``host`` argument and tries to create a mutual TLS channel with client SSL credentials from - ``client_cert_source`` or applicatin default SSL credentials. + ``client_cert_source`` or application default SSL credentials. client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): Deprecated. A callback to provide client SSL certificate bytes and private key bytes, both in PEM format. It is ignored if ``api_mtls_endpoint`` is None. ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials - for grpc channel. It is ignored if ``channel`` is provided. + for the grpc channel. It is ignored if ``channel`` is provided. client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): A callback to provide client certificate bytes and private key bytes, - both in PEM format. It is used to configure mutual TLS channel. It is + both in PEM format. It is used to configure a mutual TLS channel. It is ignored if ``channel`` or ``ssl_channel_credentials`` is provided. quota_project_id (Optional[str]): An optional project to use for billing and quota. @@ -114,7 +120,7 @@ def __init__( self._grpc_channel = None self._ssl_channel_credentials = ssl_channel_credentials self._stubs: Dict[str, Callable] = {} - self._operations_client = None + self._operations_client: Optional[operations_v1.OperationsClient] = None if api_mtls_endpoint: warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) @@ -304,7 +310,11 @@ def create_membership( ) -> Callable[[membership.CreateMembershipRequest], operations_pb2.Operation]: r"""Return a callable for the create membership method over gRPC. - Adds a new Membership. + Creates a new Membership. + + **This is currently only supported for GKE clusters on Google + Cloud**. To register other clusters, follow the instructions at + https://cloud.google.com/anthos/multicluster-management/connect/registering-a-cluster. Returns: Callable[[~.CreateMembershipRequest], @@ -332,6 +342,11 @@ def delete_membership( Removes a Membership. + **This is currently only supported for GKE clusters on Google + Cloud**. To unregister other clusters, follow the instructions + at + https://cloud.google.com/anthos/multicluster-management/connect/unregistering-a-cluster. + Returns: Callable[[~.DeleteMembershipRequest], ~.Operation]: @@ -385,8 +400,10 @@ def generate_connect_manifest( ]: r"""Return a callable for the generate connect manifest method over gRPC. - Generates the manifest for deployment of the GKE - connect agent. + Generates the manifest for deployment of the GKE connect agent. + + **This method is used internally by Google-provided libraries.** + Most clients should not need to call this method directly. Returns: Callable[[~.GenerateConnectManifestRequest], @@ -480,5 +497,8 @@ def generate_exclusivity_manifest( ) return self._stubs["generate_exclusivity_manifest"] + def close(self): + self.grpc_channel.close() + __all__ = ("GkeHubMembershipServiceGrpcTransport",) diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/transports/grpc_asyncio.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/transports/grpc_asyncio.py index 372660033012..f9d00e7f1391 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/transports/grpc_asyncio.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/transports/grpc_asyncio.py @@ -21,7 +21,6 @@ from google.api_core import operations_v1 # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.auth.transport.grpc import SslCredentials # type: ignore -import packaging.version import grpc # type: ignore from grpc.experimental import aio # type: ignore @@ -35,9 +34,15 @@ class GkeHubMembershipServiceGrpcAsyncIOTransport(GkeHubMembershipServiceTransport): """gRPC AsyncIO backend transport for GkeHubMembershipService. - GKE Hub CRUD API for the Membership resource. - The Membership service is currently only available in the global - location. + The GKE Hub MembershipService handles the registration of many + Kubernetes clusters to Google Cloud, represented with the + [Membership][google.cloud.gkehub.v1beta1.Membership] resource. + + GKE Hub is currently only available in the global region. + + **Membership management may be non-trivial:** it is recommended to + use one of the Google-provided client libraries or tools where + possible when working with Membership resources. This class defines the same methods as the primary client, so the primary client can load the underlying transport implementation @@ -131,16 +136,16 @@ def __init__( api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. If provided, it overrides the ``host`` argument and tries to create a mutual TLS channel with client SSL credentials from - ``client_cert_source`` or applicatin default SSL credentials. + ``client_cert_source`` or application default SSL credentials. client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): Deprecated. A callback to provide client SSL certificate bytes and private key bytes, both in PEM format. It is ignored if ``api_mtls_endpoint`` is None. ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials - for grpc channel. It is ignored if ``channel`` is provided. + for the grpc channel. It is ignored if ``channel`` is provided. client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): A callback to provide client certificate bytes and private key bytes, - both in PEM format. It is used to configure mutual TLS channel. It is + both in PEM format. It is used to configure a mutual TLS channel. It is ignored if ``channel`` or ``ssl_channel_credentials`` is provided. quota_project_id (Optional[str]): An optional project to use for billing and quota. @@ -161,7 +166,7 @@ def __init__( self._grpc_channel = None self._ssl_channel_credentials = ssl_channel_credentials self._stubs: Dict[str, Callable] = {} - self._operations_client = None + self._operations_client: Optional[operations_v1.OperationsAsyncClient] = None if api_mtls_endpoint: warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) @@ -312,7 +317,11 @@ def create_membership( ]: r"""Return a callable for the create membership method over gRPC. - Adds a new Membership. + Creates a new Membership. + + **This is currently only supported for GKE clusters on Google + Cloud**. To register other clusters, follow the instructions at + https://cloud.google.com/anthos/multicluster-management/connect/registering-a-cluster. Returns: Callable[[~.CreateMembershipRequest], @@ -342,6 +351,11 @@ def delete_membership( Removes a Membership. + **This is currently only supported for GKE clusters on Google + Cloud**. To unregister other clusters, follow the instructions + at + https://cloud.google.com/anthos/multicluster-management/connect/unregistering-a-cluster. + Returns: Callable[[~.DeleteMembershipRequest], Awaitable[~.Operation]]: @@ -397,8 +411,10 @@ def generate_connect_manifest( ]: r"""Return a callable for the generate connect manifest method over gRPC. - Generates the manifest for deployment of the GKE - connect agent. + Generates the manifest for deployment of the GKE connect agent. + + **This method is used internally by Google-provided libraries.** + Most clients should not need to call this method directly. Returns: Callable[[~.GenerateConnectManifestRequest], @@ -493,5 +509,8 @@ def generate_exclusivity_manifest( ) return self._stubs["generate_exclusivity_manifest"] + def close(self): + return self.grpc_channel.close() + __all__ = ("GkeHubMembershipServiceGrpcAsyncIOTransport",) diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/types/__init__.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/types/__init__.py index 6e0e0ba04f0e..13d02bbe5da5 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/types/__init__.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/types/__init__.py @@ -32,6 +32,8 @@ Membership, MembershipEndpoint, MembershipState, + MultiCloudCluster, + OnPremCluster, OperationMetadata, ResourceManifest, ResourceOptions, @@ -60,6 +62,8 @@ "Membership", "MembershipEndpoint", "MembershipState", + "MultiCloudCluster", + "OnPremCluster", "OperationMetadata", "ResourceManifest", "ResourceOptions", diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/types/membership.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/types/membership.py index af7c0d7a7cf0..021e8826a324 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/types/membership.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/types/membership.py @@ -29,6 +29,8 @@ "ResourceOptions", "ResourceManifest", "GkeCluster", + "OnPremCluster", + "MultiCloudCluster", "KubernetesMetadata", "Authority", "MembershipState", @@ -54,6 +56,9 @@ class Membership(proto.Message): r"""Membership contains information about a member cluster. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: name (str): Output only. The full, unique name of this Membership @@ -75,12 +80,14 @@ class Membership(proto.Message): labels (Sequence[google.cloud.gkehub_v1beta1.types.Membership.LabelsEntry]): Optional. GCP labels for this membership. description (str): - Required. Description of this membership, limited to 63 + Optional. Description of this membership, limited to 63 characters. Must match the regex: ``[a-zA-Z0-9][a-zA-Z0-9_\-\.\ ]*`` endpoint (google.cloud.gkehub_v1beta1.types.MembershipEndpoint): Optional. Endpoint information to reach this member. + + This field is a member of `oneof`_ ``type``. state (google.cloud.gkehub_v1beta1.types.MembershipState): Output only. State of the Membership resource. @@ -162,10 +169,29 @@ class MembershipEndpoint(proto.Message): r"""MembershipEndpoint contains information needed to contact a Kubernetes API, endpoint and any additional Kubernetes metadata. + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: gke_cluster (google.cloud.gkehub_v1beta1.types.GkeCluster): - Optional. GKE-specific information. Only - present if this Membership is a GKE cluster. + Optional. Specific information for a GKE-on- + CP cluster. + + This field is a member of `oneof`_ ``type``. + on_prem_cluster (google.cloud.gkehub_v1beta1.types.OnPremCluster): + Optional. Specific information for a GKE On- + rem cluster. + + This field is a member of `oneof`_ ``type``. + multi_cloud_cluster (google.cloud.gkehub_v1beta1.types.MultiCloudCluster): + Optional. Specific information for a GKE + Multi-Cloud cluster. + + This field is a member of `oneof`_ ``type``. kubernetes_metadata (google.cloud.gkehub_v1beta1.types.KubernetesMetadata): Output only. Useful Kubernetes-specific metadata. @@ -182,7 +208,15 @@ class MembershipEndpoint(proto.Message): Features. """ - gke_cluster = proto.Field(proto.MESSAGE, number=4, message="GkeCluster",) + gke_cluster = proto.Field( + proto.MESSAGE, number=4, oneof="type", message="GkeCluster", + ) + on_prem_cluster = proto.Field( + proto.MESSAGE, number=7, oneof="type", message="OnPremCluster", + ) + multi_cloud_cluster = proto.Field( + proto.MESSAGE, number=8, oneof="type", message="MultiCloudCluster", + ) kubernetes_metadata = proto.Field( proto.MESSAGE, number=5, message="KubernetesMetadata", ) @@ -289,16 +323,73 @@ class ResourceManifest(proto.Message): class GkeCluster(proto.Message): r"""GkeCluster contains information specific to GKE clusters. + Attributes: resource_link (str): Immutable. Self-link of the GCP resource for the GKE cluster. For example: - > container.googleapis.com/projects/my- + //container.googleapis.com/projects/my- project/locations/us-west1-a/clusters/my-cluster Zonal clusters are also supported. + cluster_missing (bool): + Output only. If cluster_missing is set then it denotes that + the GKE cluster no longer exists in the GKE Control Plane. """ resource_link = proto.Field(proto.STRING, number=1,) + cluster_missing = proto.Field(proto.BOOL, number=3,) + + +class OnPremCluster(proto.Message): + r"""OnPremCluster contains information specific to GKE On-Prem + clusters. + + Attributes: + resource_link (str): + Immutable. Self-link of the GCP resource for + the GKE On-Prem cluster. For example: + //gkeonprem.googleapis.com/projects/my- + project/locations/us-west1-a/vmwareClusters/my- + cluster //gkeonprem.googleapis.com/projects/my- + project/locations/us- + west1-a/bareMetalClusters/my-cluster + cluster_missing (bool): + Output only. If cluster_missing is set then it denotes that + API(gkeonprem.googleapis.com) resource for this GKE On-Prem + cluster no longer exists. + admin_cluster (bool): + Immutable. Whether the cluster is an admin + cluster. + """ + + resource_link = proto.Field(proto.STRING, number=1,) + cluster_missing = proto.Field(proto.BOOL, number=2,) + admin_cluster = proto.Field(proto.BOOL, number=3,) + + +class MultiCloudCluster(proto.Message): + r"""MultiCloudCluster contains information specific to GKE Multi- + loud clusters. + + Attributes: + resource_link (str): + Immutable. Self-link of the GCP resource for + the GKE Multi-Cloud cluster. For example: + + //gkemulticloud.googleapis.com/projects/my- + project/locations/us-west1-a/awsClusters/my- + cluster + //gkemulticloud.googleapis.com/projects/my- + project/locations/us-west1-a/azureClusters/my- + cluster + cluster_missing (bool): + Output only. If cluster_missing is set then it denotes that + API(gkemulticloud.googleapis.com) resource for this GKE + Multi-Cloud cluster no longer exists. + """ + + resource_link = proto.Field(proto.STRING, number=1,) + cluster_missing = proto.Field(proto.BOOL, number=2,) class KubernetesMetadata(proto.Message): @@ -392,6 +483,7 @@ class Authority(proto.Message): class MembershipState(proto.Message): r"""State of the Membership resource. + Attributes: code (google.cloud.gkehub_v1beta1.types.MembershipState.Code): Output only. The current state of the @@ -533,11 +625,30 @@ class CreateMembershipRequest(proto.Message): 63 characters. resource (google.cloud.gkehub_v1beta1.types.Membership): Required. The membership to create. + request_id (str): + Optional. A 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. The server will guarantee that for at + least 60 minutes after the first request. + 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). """ parent = proto.Field(proto.STRING, number=1,) membership_id = proto.Field(proto.STRING, number=2,) resource = proto.Field(proto.MESSAGE, number=3, message="Membership",) + request_id = proto.Field(proto.STRING, number=4,) class DeleteMembershipRequest(proto.Message): @@ -548,9 +659,28 @@ class DeleteMembershipRequest(proto.Message): name (str): Required. The Membership resource name in the format ``projects/*/locations/*/memberships/*``. + request_id (str): + Optional. A 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. The server will guarantee that for at + least 60 minutes after the first request. + 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). """ name = proto.Field(proto.STRING, number=1,) + request_id = proto.Field(proto.STRING, number=4,) class UpdateMembershipRequest(proto.Message): @@ -570,7 +700,27 @@ class UpdateMembershipRequest(proto.Message): its value here that field will be deleted. If you are updating a map field, set the value of a key to null or empty string to delete the key from the map. It's not - possible to update a key's value to the empty string. + possible to update a key's value to the empty string. If you + specify the update_mask to be a special path "*", fully + replaces all user-modifiable fields to match ``resource``. + request_id (str): + Optional. A 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. The server will guarantee that for at + least 60 minutes after the first request. + 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). """ name = proto.Field(proto.STRING, number=1,) @@ -578,6 +728,7 @@ class UpdateMembershipRequest(proto.Message): proto.MESSAGE, number=2, message=field_mask_pb2.FieldMask, ) resource = proto.Field(proto.MESSAGE, number=3, message="Membership",) + request_id = proto.Field(proto.STRING, number=4,) class GenerateConnectManifestRequest(proto.Message): @@ -663,6 +814,7 @@ class TypeMeta(proto.Message): class ConnectAgent(proto.Message): r"""The information required from end users to use GKE Connect. + Attributes: name (str): Do not set. @@ -775,6 +927,7 @@ class GenerateExclusivityManifestResponse(proto.Message): class OperationMetadata(proto.Message): r"""Represents the metadata of the long-running operation. + Attributes: create_time (google.protobuf.timestamp_pb2.Timestamp): Output only. The time the operation was diff --git a/packages/google-cloud-gke-hub/owlbot.py b/packages/google-cloud-gke-hub/owlbot.py index 5cf3d42bb6e5..a0e91deef1a9 100644 --- a/packages/google-cloud-gke-hub/owlbot.py +++ b/packages/google-cloud-gke-hub/owlbot.py @@ -66,14 +66,6 @@ f"{submodule}_v1" ) - # Work around gapic generator bug https://github.com/googleapis/gapic-generator-python/issues/902 - s.replace(library / f"google/cloud/**/types/*.py", - r""". - Attributes:""", - r""".\n - Attributes:""", - ) - # Work around docs issue. Fix proposed upstream in cl/382492769 s.replace(library / f"google/cloud/gkehub_{library.name}/types/feature.py", " projects/{p}/locations/{l}/memberships/{m}", @@ -103,6 +95,46 @@ s.remove_staging_dirs() +# Work around gapic generator bug https://github.com/googleapis/gapic-generator-python/pull/1071 +s.replace( + "google/cloud/**/types/*.py", + """\. + This field is a member of `oneof`_""", + """. + + This field is a member of `oneof`_""" +) + +# Work around gapic generator bug +s.replace( + "google/cloud/**/types/configmanagement.py", + """Configuration for Policy Controller\n + Attributes""", + """Configuration for Policy Controller\n + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields\n + Attributes""" +) + +# Work around issue with docstring +s.replace("google/cloud/gkehub_v1beta1/types/membership.py", +"""For example: + //gkeonprem.googleapis.com/projects/my-""", +"""For example: + //gkeonprem.googleapis.com/projects/my-""", +) + + +# Work around issue with docstring +s.replace("google/cloud/gkehub_v1beta1/types/membership.py", +"""For example: + + //gkemulticloud.googleapis.com/projects/my-""", +"""For example: + + //gkemulticloud.googleapis.com/projects/my-""", +) + + # ---------------------------------------------------------------------------- # Add templated files # ---------------------------------------------------------------------------- diff --git a/packages/google-cloud-gke-hub/scripts/fixup_gkehub_v1beta1_keywords.py b/packages/google-cloud-gke-hub/scripts/fixup_gkehub_v1beta1_keywords.py index b7bb67bd3df0..f80d7ad23917 100644 --- a/packages/google-cloud-gke-hub/scripts/fixup_gkehub_v1beta1_keywords.py +++ b/packages/google-cloud-gke-hub/scripts/fixup_gkehub_v1beta1_keywords.py @@ -39,14 +39,14 @@ def partition( class gkehubCallTransformer(cst.CSTTransformer): CTRL_PARAMS: Tuple[str] = ('retry', 'timeout', 'metadata') METHOD_TO_PARAMS: Dict[str, Tuple[str]] = { - 'create_membership': ('parent', 'membership_id', 'resource', ), - 'delete_membership': ('name', ), - 'generate_connect_manifest': ('name', 'connect_agent', 'version', 'is_upgrade', 'registry', 'image_pull_secret_content', ), - 'generate_exclusivity_manifest': ('name', 'crd_manifest', 'cr_manifest', ), - 'get_membership': ('name', ), - 'list_memberships': ('parent', 'page_size', 'page_token', 'filter', 'order_by', ), - 'update_membership': ('name', 'update_mask', 'resource', ), - 'validate_exclusivity': ('parent', 'intended_membership', 'cr_manifest', ), + 'create_membership': ('parent', 'membership_id', 'resource', 'request_id', ), + 'delete_membership': ('name', 'request_id', ), + 'generate_connect_manifest': ('name', 'connect_agent', 'version', 'is_upgrade', 'registry', 'image_pull_secret_content', ), + 'generate_exclusivity_manifest': ('name', 'crd_manifest', 'cr_manifest', ), + 'get_membership': ('name', ), + 'list_memberships': ('parent', 'page_size', 'page_token', 'filter', 'order_by', ), + 'update_membership': ('name', 'update_mask', 'resource', 'request_id', ), + 'validate_exclusivity': ('parent', 'intended_membership', 'cr_manifest', ), } def leave_Call(self, original: cst.Call, updated: cst.Call) -> cst.CSTNode: @@ -65,7 +65,7 @@ def leave_Call(self, original: cst.Call, updated: cst.Call) -> cst.CSTNode: return updated kwargs, ctrl_kwargs = partition( - lambda a: not a.keyword.value in self.CTRL_PARAMS, + lambda a: a.keyword.value not in self.CTRL_PARAMS, kwargs ) diff --git a/packages/google-cloud-gke-hub/setup.py b/packages/google-cloud-gke-hub/setup.py index 390ace8b768e..c0bc0f1fc890 100644 --- a/packages/google-cloud-gke-hub/setup.py +++ b/packages/google-cloud-gke-hub/setup.py @@ -28,9 +28,8 @@ # NOTE: Maintainers, please do not require google-api-core>=2.x.x # Until this issue is closed # https://github.com/googleapis/google-cloud-python/issues/10566 - "google-api-core[grpc] >= 1.26.0, <3.0.0dev", + "google-api-core[grpc] >= 1.28.0, <3.0.0dev", "proto-plus >= 1.4.0", - "packaging >= 14.3", ] package_root = os.path.abspath(os.path.dirname(__file__)) diff --git a/packages/google-cloud-gke-hub/testing/constraints-3.6.txt b/packages/google-cloud-gke-hub/testing/constraints-3.6.txt index 2955fcf7451a..8fad4fcfc843 100644 --- a/packages/google-cloud-gke-hub/testing/constraints-3.6.txt +++ b/packages/google-cloud-gke-hub/testing/constraints-3.6.txt @@ -19,6 +19,5 @@ # # e.g., if setup.py has "foo >= 1.14.0, < 2.0.0dev", # Then this file should have foo==1.14.0 -google-api-core==1.26.0 +google-api-core==1.28.0 proto-plus==1.4.0 -packaging==14.3 diff --git a/packages/google-cloud-gke-hub/tests/unit/gapic/gkehub_v1/test_gke_hub.py b/packages/google-cloud-gke-hub/tests/unit/gapic/gkehub_v1/test_gke_hub.py index 21e434fb3028..cdd0e236e192 100644 --- a/packages/google-cloud-gke-hub/tests/unit/gapic/gkehub_v1/test_gke_hub.py +++ b/packages/google-cloud-gke-hub/tests/unit/gapic/gkehub_v1/test_gke_hub.py @@ -15,7 +15,6 @@ # import os import mock -import packaging.version import grpc from grpc.experimental import aio @@ -41,7 +40,6 @@ from google.cloud.gkehub_v1.services.gke_hub import GkeHubClient from google.cloud.gkehub_v1.services.gke_hub import pagers from google.cloud.gkehub_v1.services.gke_hub import transports -from google.cloud.gkehub_v1.services.gke_hub.transports.base import _GOOGLE_AUTH_VERSION from google.cloud.gkehub_v1.types import feature from google.cloud.gkehub_v1.types import membership from google.cloud.gkehub_v1.types import service @@ -52,20 +50,6 @@ import google.auth -# TODO(busunkim): Once google-auth >= 1.25.0 is required transitively -# through google-api-core: -# - Delete the auth "less than" test cases -# - Delete these pytest markers (Make the "greater than or equal to" tests the default). -requires_google_auth_lt_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) >= packaging.version.parse("1.25.0"), - reason="This test requires google-auth < 1.25.0", -) -requires_google_auth_gte_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) < packaging.version.parse("1.25.0"), - reason="This test requires google-auth >= 1.25.0", -) - - def client_cert_source_callback(): return b"cert bytes", b"key bytes" @@ -200,7 +184,7 @@ def test_gke_hub_client_client_options(client_class, transport_class, transport_ options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -217,7 +201,7 @@ def test_gke_hub_client_client_options(client_class, transport_class, transport_ with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -234,7 +218,7 @@ def test_gke_hub_client_client_options(client_class, transport_class, transport_ with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -263,7 +247,7 @@ def test_gke_hub_client_client_options(client_class, transport_class, transport_ options = client_options.ClientOptions(quota_project_id="octopus") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -318,7 +302,7 @@ def test_gke_hub_client_mtls_env_auto( ) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) if use_client_cert_env == "false": expected_client_cert_source = None @@ -360,7 +344,7 @@ def test_gke_hub_client_mtls_env_auto( expected_client_cert_source = client_cert_source_callback patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -382,7 +366,7 @@ def test_gke_hub_client_mtls_env_auto( return_value=False, ): patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -409,7 +393,7 @@ def test_gke_hub_client_client_options_scopes( options = client_options.ClientOptions(scopes=["1", "2"],) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -436,7 +420,7 @@ def test_gke_hub_client_client_options_credentials_file( options = client_options.ClientOptions(credentials_file="credentials.json") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file="credentials.json", @@ -621,7 +605,9 @@ def test_list_memberships_flattened(): # request object values. assert len(call.mock_calls) == 1 _, args, _ = call.mock_calls[0] - assert args[0].parent == "parent_value" + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val def test_list_memberships_flattened_error(): @@ -655,7 +641,9 @@ async def test_list_memberships_flattened_async(): # request object values. assert len(call.mock_calls) _, args, _ = call.mock_calls[0] - assert args[0].parent == "parent_value" + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val @pytest.mark.asyncio @@ -957,7 +945,9 @@ def test_list_features_flattened(): # request object values. assert len(call.mock_calls) == 1 _, args, _ = call.mock_calls[0] - assert args[0].parent == "parent_value" + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val def test_list_features_flattened_error(): @@ -991,7 +981,9 @@ async def test_list_features_flattened_async(): # request object values. assert len(call.mock_calls) _, args, _ = call.mock_calls[0] - assert args[0].parent == "parent_value" + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val @pytest.mark.asyncio @@ -1294,7 +1286,9 @@ def test_get_membership_flattened(): # request object values. assert len(call.mock_calls) == 1 _, args, _ = call.mock_calls[0] - assert args[0].name == "name_value" + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val def test_get_membership_flattened_error(): @@ -1328,7 +1322,9 @@ async def test_get_membership_flattened_async(): # request object values. assert len(call.mock_calls) _, args, _ = call.mock_calls[0] - assert args[0].name == "name_value" + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val @pytest.mark.asyncio @@ -1486,7 +1482,9 @@ def test_get_feature_flattened(): # request object values. assert len(call.mock_calls) == 1 _, args, _ = call.mock_calls[0] - assert args[0].name == "name_value" + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val def test_get_feature_flattened_error(): @@ -1518,7 +1516,9 @@ async def test_get_feature_flattened_async(): # request object values. assert len(call.mock_calls) _, args, _ = call.mock_calls[0] - assert args[0].name == "name_value" + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val @pytest.mark.asyncio @@ -1700,13 +1700,19 @@ def test_create_membership_flattened(): # request object values. assert len(call.mock_calls) == 1 _, args, _ = call.mock_calls[0] - assert args[0].parent == "parent_value" - assert args[0].resource == membership.Membership( + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val + arg = args[0].resource + mock_val = membership.Membership( endpoint=membership.MembershipEndpoint( gke_cluster=membership.GkeCluster(resource_link="resource_link_value") ) ) - assert args[0].membership_id == "membership_id_value" + assert arg == mock_val + arg = args[0].membership_id + mock_val = "membership_id_value" + assert arg == mock_val def test_create_membership_flattened_error(): @@ -1761,13 +1767,19 @@ async def test_create_membership_flattened_async(): # request object values. assert len(call.mock_calls) _, args, _ = call.mock_calls[0] - assert args[0].parent == "parent_value" - assert args[0].resource == membership.Membership( + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val + arg = args[0].resource + mock_val = membership.Membership( endpoint=membership.MembershipEndpoint( gke_cluster=membership.GkeCluster(resource_link="resource_link_value") ) ) - assert args[0].membership_id == "membership_id_value" + assert arg == mock_val + arg = args[0].membership_id + mock_val = "membership_id_value" + assert arg == mock_val @pytest.mark.asyncio @@ -1940,9 +1952,15 @@ def test_create_feature_flattened(): # request object values. assert len(call.mock_calls) == 1 _, args, _ = call.mock_calls[0] - assert args[0].parent == "parent_value" - assert args[0].resource == feature.Feature(name="name_value") - assert args[0].feature_id == "feature_id_value" + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val + arg = args[0].resource + mock_val = feature.Feature(name="name_value") + assert arg == mock_val + arg = args[0].feature_id + mock_val = "feature_id_value" + assert arg == mock_val def test_create_feature_flattened_error(): @@ -1983,9 +2001,15 @@ async def test_create_feature_flattened_async(): # request object values. assert len(call.mock_calls) _, args, _ = call.mock_calls[0] - assert args[0].parent == "parent_value" - assert args[0].resource == feature.Feature(name="name_value") - assert args[0].feature_id == "feature_id_value" + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val + arg = args[0].resource + mock_val = feature.Feature(name="name_value") + assert arg == mock_val + arg = args[0].feature_id + mock_val = "feature_id_value" + assert arg == mock_val @pytest.mark.asyncio @@ -2160,7 +2184,9 @@ def test_delete_membership_flattened(): # request object values. assert len(call.mock_calls) == 1 _, args, _ = call.mock_calls[0] - assert args[0].name == "name_value" + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val def test_delete_membership_flattened_error(): @@ -2196,7 +2222,9 @@ async def test_delete_membership_flattened_async(): # request object values. assert len(call.mock_calls) _, args, _ = call.mock_calls[0] - assert args[0].name == "name_value" + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val @pytest.mark.asyncio @@ -2356,7 +2384,9 @@ def test_delete_feature_flattened(): # request object values. assert len(call.mock_calls) == 1 _, args, _ = call.mock_calls[0] - assert args[0].name == "name_value" + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val def test_delete_feature_flattened_error(): @@ -2390,7 +2420,9 @@ async def test_delete_feature_flattened_async(): # request object values. assert len(call.mock_calls) _, args, _ = call.mock_calls[0] - assert args[0].name == "name_value" + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val @pytest.mark.asyncio @@ -2572,13 +2604,19 @@ def test_update_membership_flattened(): # request object values. assert len(call.mock_calls) == 1 _, args, _ = call.mock_calls[0] - assert args[0].name == "name_value" - assert args[0].resource == membership.Membership( + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val + arg = args[0].resource + mock_val = membership.Membership( endpoint=membership.MembershipEndpoint( gke_cluster=membership.GkeCluster(resource_link="resource_link_value") ) ) - assert args[0].update_mask == field_mask_pb2.FieldMask(paths=["paths_value"]) + assert arg == mock_val + arg = args[0].update_mask + mock_val = field_mask_pb2.FieldMask(paths=["paths_value"]) + assert arg == mock_val def test_update_membership_flattened_error(): @@ -2633,13 +2671,19 @@ async def test_update_membership_flattened_async(): # request object values. assert len(call.mock_calls) _, args, _ = call.mock_calls[0] - assert args[0].name == "name_value" - assert args[0].resource == membership.Membership( + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val + arg = args[0].resource + mock_val = membership.Membership( endpoint=membership.MembershipEndpoint( gke_cluster=membership.GkeCluster(resource_link="resource_link_value") ) ) - assert args[0].update_mask == field_mask_pb2.FieldMask(paths=["paths_value"]) + assert arg == mock_val + arg = args[0].update_mask + mock_val = field_mask_pb2.FieldMask(paths=["paths_value"]) + assert arg == mock_val @pytest.mark.asyncio @@ -2812,9 +2856,15 @@ def test_update_feature_flattened(): # request object values. assert len(call.mock_calls) == 1 _, args, _ = call.mock_calls[0] - assert args[0].name == "name_value" - assert args[0].resource == feature.Feature(name="name_value") - assert args[0].update_mask == field_mask_pb2.FieldMask(paths=["paths_value"]) + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val + arg = args[0].resource + mock_val = feature.Feature(name="name_value") + assert arg == mock_val + arg = args[0].update_mask + mock_val = field_mask_pb2.FieldMask(paths=["paths_value"]) + assert arg == mock_val def test_update_feature_flattened_error(): @@ -2855,9 +2905,15 @@ async def test_update_feature_flattened_async(): # request object values. assert len(call.mock_calls) _, args, _ = call.mock_calls[0] - assert args[0].name == "name_value" - assert args[0].resource == feature.Feature(name="name_value") - assert args[0].update_mask == field_mask_pb2.FieldMask(paths=["paths_value"]) + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val + arg = args[0].resource + mock_val = feature.Feature(name="name_value") + assert arg == mock_val + arg = args[0].update_mask + mock_val = field_mask_pb2.FieldMask(paths=["paths_value"]) + assert arg == mock_val @pytest.mark.asyncio @@ -3134,7 +3190,6 @@ def test_gke_hub_base_transport(): transport.operations_client -@requires_google_auth_gte_1_25_0 def test_gke_hub_base_transport_with_credentials_file(): # Instantiate the base transport with a credentials file with mock.patch.object( @@ -3155,26 +3210,6 @@ def test_gke_hub_base_transport_with_credentials_file(): ) -@requires_google_auth_lt_1_25_0 -def test_gke_hub_base_transport_with_credentials_file_old_google_auth(): - # Instantiate the base transport with a credentials file - with mock.patch.object( - google.auth, "load_credentials_from_file", autospec=True - ) as load_creds, mock.patch( - "google.cloud.gkehub_v1.services.gke_hub.transports.GkeHubTransport._prep_wrapped_messages" - ) as Transport: - Transport.return_value = None - load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) - transport = transports.GkeHubTransport( - credentials_file="credentials.json", quota_project_id="octopus", - ) - load_creds.assert_called_once_with( - "credentials.json", - scopes=("https://www.googleapis.com/auth/cloud-platform",), - quota_project_id="octopus", - ) - - def test_gke_hub_base_transport_with_adc(): # Test the default credentials are used if credentials and credentials_file are None. with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch( @@ -3186,7 +3221,6 @@ def test_gke_hub_base_transport_with_adc(): adc.assert_called_once() -@requires_google_auth_gte_1_25_0 def test_gke_hub_auth_adc(): # If no credentials are provided, we should use ADC credentials. with mock.patch.object(google.auth, "default", autospec=True) as adc: @@ -3199,23 +3233,10 @@ def test_gke_hub_auth_adc(): ) -@requires_google_auth_lt_1_25_0 -def test_gke_hub_auth_adc_old_google_auth(): - # If no credentials are provided, we should use ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - GkeHubClient() - adc.assert_called_once_with( - scopes=("https://www.googleapis.com/auth/cloud-platform",), - quota_project_id=None, - ) - - @pytest.mark.parametrize( "transport_class", [transports.GkeHubGrpcTransport, transports.GkeHubGrpcAsyncIOTransport,], ) -@requires_google_auth_gte_1_25_0 def test_gke_hub_transport_auth_adc(transport_class): # If credentials and host are not provided, the transport class should use # ADC credentials. @@ -3229,23 +3250,6 @@ def test_gke_hub_transport_auth_adc(transport_class): ) -@pytest.mark.parametrize( - "transport_class", - [transports.GkeHubGrpcTransport, transports.GkeHubGrpcAsyncIOTransport,], -) -@requires_google_auth_lt_1_25_0 -def test_gke_hub_transport_auth_adc_old_google_auth(transport_class): - # If credentials and host are not provided, the transport class should use - # ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport_class(quota_project_id="octopus") - adc.assert_called_once_with( - scopes=("https://www.googleapis.com/auth/cloud-platform",), - quota_project_id="octopus", - ) - - @pytest.mark.parametrize( "transport_class,grpc_helpers", [ diff --git a/packages/google-cloud-gke-hub/tests/unit/gapic/gkehub_v1beta1/test_gke_hub_membership_service.py b/packages/google-cloud-gke-hub/tests/unit/gapic/gkehub_v1beta1/test_gke_hub_membership_service.py index 39711b99e2f6..0d246ecc8e85 100644 --- a/packages/google-cloud-gke-hub/tests/unit/gapic/gkehub_v1beta1/test_gke_hub_membership_service.py +++ b/packages/google-cloud-gke-hub/tests/unit/gapic/gkehub_v1beta1/test_gke_hub_membership_service.py @@ -15,7 +15,6 @@ # import os import mock -import packaging.version import grpc from grpc.experimental import aio @@ -32,6 +31,7 @@ from google.api_core import grpc_helpers_async from google.api_core import operation_async # type: ignore from google.api_core import operations_v1 +from google.api_core import path_template from google.auth import credentials as ga_credentials from google.auth.exceptions import MutualTLSChannelError from google.cloud.gkehub_v1beta1.services.gke_hub_membership_service import ( @@ -42,9 +42,6 @@ ) from google.cloud.gkehub_v1beta1.services.gke_hub_membership_service import pagers from google.cloud.gkehub_v1beta1.services.gke_hub_membership_service import transports -from google.cloud.gkehub_v1beta1.services.gke_hub_membership_service.transports.base import ( - _GOOGLE_AUTH_VERSION, -) from google.cloud.gkehub_v1beta1.types import membership from google.longrunning import operations_pb2 from google.oauth2 import service_account @@ -54,20 +51,6 @@ import google.auth -# TODO(busunkim): Once google-auth >= 1.25.0 is required transitively -# through google-api-core: -# - Delete the auth "less than" test cases -# - Delete these pytest markers (Make the "greater than or equal to" tests the default). -requires_google_auth_lt_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) >= packaging.version.parse("1.25.0"), - reason="This test requires google-auth < 1.25.0", -) -requires_google_auth_gte_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) < packaging.version.parse("1.25.0"), - reason="This test requires google-auth >= 1.25.0", -) - - def client_cert_source_callback(): return b"cert bytes", b"key bytes" @@ -130,18 +113,6 @@ def test_gke_hub_membership_service_client_from_service_account_info(client_clas assert client.transport._host == "gkehub.googleapis.com:443" -@pytest.mark.parametrize( - "client_class", [GkeHubMembershipServiceClient, GkeHubMembershipServiceAsyncClient,] -) -def test_gke_hub_membership_service_client_service_account_always_use_jwt(client_class): - with mock.patch.object( - service_account.Credentials, "with_always_use_jwt_access", create=True - ) as use_jwt: - creds = service_account.Credentials(None, None, None) - client = client_class(credentials=creds) - use_jwt.assert_not_called() - - @pytest.mark.parametrize( "transport_class,transport_name", [ @@ -149,7 +120,7 @@ def test_gke_hub_membership_service_client_service_account_always_use_jwt(client (transports.GkeHubMembershipServiceGrpcAsyncIOTransport, "grpc_asyncio"), ], ) -def test_gke_hub_membership_service_client_service_account_always_use_jwt_true( +def test_gke_hub_membership_service_client_service_account_always_use_jwt( transport_class, transport_name ): with mock.patch.object( @@ -159,6 +130,13 @@ def test_gke_hub_membership_service_client_service_account_always_use_jwt_true( transport = transport_class(credentials=creds, always_use_jwt_access=True) use_jwt.assert_called_once_with(True) + with mock.patch.object( + service_account.Credentials, "with_always_use_jwt_access", create=True + ) as use_jwt: + creds = service_account.Credentials(None, None, None) + transport = transport_class(credentials=creds, always_use_jwt_access=False) + use_jwt.assert_not_called() + @pytest.mark.parametrize( "client_class", [GkeHubMembershipServiceClient, GkeHubMembershipServiceAsyncClient,] @@ -234,7 +212,7 @@ def test_gke_hub_membership_service_client_client_options( options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -243,6 +221,7 @@ def test_gke_hub_membership_service_client_client_options( client_cert_source_for_mtls=None, quota_project_id=None, client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, ) # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is @@ -250,7 +229,7 @@ def test_gke_hub_membership_service_client_client_options( with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -259,6 +238,7 @@ def test_gke_hub_membership_service_client_client_options( client_cert_source_for_mtls=None, quota_project_id=None, client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, ) # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is @@ -266,7 +246,7 @@ def test_gke_hub_membership_service_client_client_options( with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -275,6 +255,7 @@ def test_gke_hub_membership_service_client_client_options( client_cert_source_for_mtls=None, quota_project_id=None, client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, ) # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has @@ -294,7 +275,7 @@ def test_gke_hub_membership_service_client_client_options( options = client_options.ClientOptions(quota_project_id="octopus") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -303,6 +284,7 @@ def test_gke_hub_membership_service_client_client_options( client_cert_source_for_mtls=None, quota_project_id="octopus", client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, ) @@ -362,7 +344,7 @@ def test_gke_hub_membership_service_client_mtls_env_auto( ) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) if use_client_cert_env == "false": expected_client_cert_source = None @@ -379,6 +361,7 @@ def test_gke_hub_membership_service_client_mtls_env_auto( client_cert_source_for_mtls=expected_client_cert_source, quota_project_id=None, client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, ) # Check the case ADC client cert is provided. Whether client cert is used depends on @@ -403,7 +386,7 @@ def test_gke_hub_membership_service_client_mtls_env_auto( expected_client_cert_source = client_cert_source_callback patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -412,6 +395,7 @@ def test_gke_hub_membership_service_client_mtls_env_auto( client_cert_source_for_mtls=expected_client_cert_source, quota_project_id=None, client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, ) # Check the case client_cert_source and ADC client cert are not provided. @@ -424,7 +408,7 @@ def test_gke_hub_membership_service_client_mtls_env_auto( return_value=False, ): patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -433,6 +417,7 @@ def test_gke_hub_membership_service_client_mtls_env_auto( client_cert_source_for_mtls=None, quota_project_id=None, client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, ) @@ -458,7 +443,7 @@ def test_gke_hub_membership_service_client_client_options_scopes( options = client_options.ClientOptions(scopes=["1", "2"],) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -467,6 +452,7 @@ def test_gke_hub_membership_service_client_client_options_scopes( client_cert_source_for_mtls=None, quota_project_id=None, client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, ) @@ -492,7 +478,7 @@ def test_gke_hub_membership_service_client_client_options_credentials_file( options = client_options.ClientOptions(credentials_file="credentials.json") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file="credentials.json", @@ -501,6 +487,7 @@ def test_gke_hub_membership_service_client_client_options_credentials_file( client_cert_source_for_mtls=None, quota_project_id=None, client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, ) @@ -520,6 +507,7 @@ def test_gke_hub_membership_service_client_client_options_from_dict(): client_cert_source_for_mtls=None, quota_project_id=None, client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, ) @@ -683,7 +671,9 @@ def test_list_memberships_flattened(): # request object values. assert len(call.mock_calls) == 1 _, args, _ = call.mock_calls[0] - assert args[0].parent == "parent_value" + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val def test_list_memberships_flattened_error(): @@ -721,7 +711,9 @@ async def test_list_memberships_flattened_async(): # request object values. assert len(call.mock_calls) _, args, _ = call.mock_calls[0] - assert args[0].parent == "parent_value" + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val @pytest.mark.asyncio @@ -1064,7 +1056,9 @@ def test_get_membership_flattened(): # request object values. assert len(call.mock_calls) == 1 _, args, _ = call.mock_calls[0] - assert args[0].name == "name_value" + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val def test_get_membership_flattened_error(): @@ -1102,7 +1096,9 @@ async def test_get_membership_flattened_async(): # request object values. assert len(call.mock_calls) _, args, _ = call.mock_calls[0] - assert args[0].name == "name_value" + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val @pytest.mark.asyncio @@ -1286,9 +1282,15 @@ def test_create_membership_flattened(): # request object values. assert len(call.mock_calls) == 1 _, args, _ = call.mock_calls[0] - assert args[0].parent == "parent_value" - assert args[0].resource == membership.Membership(name="name_value") - assert args[0].membership_id == "membership_id_value" + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val + arg = args[0].resource + mock_val = membership.Membership(name="name_value") + assert arg == mock_val + arg = args[0].membership_id + mock_val = "membership_id_value" + assert arg == mock_val def test_create_membership_flattened_error(): @@ -1335,9 +1337,15 @@ async def test_create_membership_flattened_async(): # request object values. assert len(call.mock_calls) _, args, _ = call.mock_calls[0] - assert args[0].parent == "parent_value" - assert args[0].resource == membership.Membership(name="name_value") - assert args[0].membership_id == "membership_id_value" + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val + arg = args[0].resource + mock_val = membership.Membership(name="name_value") + assert arg == mock_val + arg = args[0].membership_id + mock_val = "membership_id_value" + assert arg == mock_val @pytest.mark.asyncio @@ -1520,7 +1528,9 @@ def test_delete_membership_flattened(): # request object values. assert len(call.mock_calls) == 1 _, args, _ = call.mock_calls[0] - assert args[0].name == "name_value" + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val def test_delete_membership_flattened_error(): @@ -1560,7 +1570,9 @@ async def test_delete_membership_flattened_async(): # request object values. assert len(call.mock_calls) _, args, _ = call.mock_calls[0] - assert args[0].name == "name_value" + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val @pytest.mark.asyncio @@ -1744,9 +1756,15 @@ def test_update_membership_flattened(): # request object values. assert len(call.mock_calls) == 1 _, args, _ = call.mock_calls[0] - assert args[0].name == "name_value" - assert args[0].resource == membership.Membership(name="name_value") - assert args[0].update_mask == field_mask_pb2.FieldMask(paths=["paths_value"]) + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val + arg = args[0].resource + mock_val = membership.Membership(name="name_value") + assert arg == mock_val + arg = args[0].update_mask + mock_val = field_mask_pb2.FieldMask(paths=["paths_value"]) + assert arg == mock_val def test_update_membership_flattened_error(): @@ -1793,9 +1811,15 @@ async def test_update_membership_flattened_async(): # request object values. assert len(call.mock_calls) _, args, _ = call.mock_calls[0] - assert args[0].name == "name_value" - assert args[0].resource == membership.Membership(name="name_value") - assert args[0].update_mask == field_mask_pb2.FieldMask(paths=["paths_value"]) + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val + arg = args[0].resource + mock_val = membership.Membership(name="name_value") + assert arg == mock_val + arg = args[0].update_mask + mock_val = field_mask_pb2.FieldMask(paths=["paths_value"]) + assert arg == mock_val @pytest.mark.asyncio @@ -2371,13 +2395,15 @@ def test_gke_hub_membership_service_base_transport(): with pytest.raises(NotImplementedError): getattr(transport, method)(request=object()) + with pytest.raises(NotImplementedError): + transport.close() + # Additionally, the LRO client (a property) should # also raise NotImplementedError with pytest.raises(NotImplementedError): transport.operations_client -@requires_google_auth_gte_1_25_0 def test_gke_hub_membership_service_base_transport_with_credentials_file(): # Instantiate the base transport with a credentials file with mock.patch.object( @@ -2398,26 +2424,6 @@ def test_gke_hub_membership_service_base_transport_with_credentials_file(): ) -@requires_google_auth_lt_1_25_0 -def test_gke_hub_membership_service_base_transport_with_credentials_file_old_google_auth(): - # Instantiate the base transport with a credentials file - with mock.patch.object( - google.auth, "load_credentials_from_file", autospec=True - ) as load_creds, mock.patch( - "google.cloud.gkehub_v1beta1.services.gke_hub_membership_service.transports.GkeHubMembershipServiceTransport._prep_wrapped_messages" - ) as Transport: - Transport.return_value = None - load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) - transport = transports.GkeHubMembershipServiceTransport( - credentials_file="credentials.json", quota_project_id="octopus", - ) - load_creds.assert_called_once_with( - "credentials.json", - scopes=("https://www.googleapis.com/auth/cloud-platform",), - quota_project_id="octopus", - ) - - def test_gke_hub_membership_service_base_transport_with_adc(): # Test the default credentials are used if credentials and credentials_file are None. with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch( @@ -2429,7 +2435,6 @@ def test_gke_hub_membership_service_base_transport_with_adc(): adc.assert_called_once() -@requires_google_auth_gte_1_25_0 def test_gke_hub_membership_service_auth_adc(): # If no credentials are provided, we should use ADC credentials. with mock.patch.object(google.auth, "default", autospec=True) as adc: @@ -2442,18 +2447,6 @@ def test_gke_hub_membership_service_auth_adc(): ) -@requires_google_auth_lt_1_25_0 -def test_gke_hub_membership_service_auth_adc_old_google_auth(): - # If no credentials are provided, we should use ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - GkeHubMembershipServiceClient() - adc.assert_called_once_with( - scopes=("https://www.googleapis.com/auth/cloud-platform",), - quota_project_id=None, - ) - - @pytest.mark.parametrize( "transport_class", [ @@ -2461,7 +2454,6 @@ def test_gke_hub_membership_service_auth_adc_old_google_auth(): transports.GkeHubMembershipServiceGrpcAsyncIOTransport, ], ) -@requires_google_auth_gte_1_25_0 def test_gke_hub_membership_service_transport_auth_adc(transport_class): # If credentials and host are not provided, the transport class should use # ADC credentials. @@ -2475,26 +2467,6 @@ def test_gke_hub_membership_service_transport_auth_adc(transport_class): ) -@pytest.mark.parametrize( - "transport_class", - [ - transports.GkeHubMembershipServiceGrpcTransport, - transports.GkeHubMembershipServiceGrpcAsyncIOTransport, - ], -) -@requires_google_auth_lt_1_25_0 -def test_gke_hub_membership_service_transport_auth_adc_old_google_auth(transport_class): - # If credentials and host are not provided, the transport class should use - # ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport_class(quota_project_id="octopus") - adc.assert_called_once_with( - scopes=("https://www.googleapis.com/auth/cloud-platform",), - quota_project_id="octopus", - ) - - @pytest.mark.parametrize( "transport_class,grpc_helpers", [ @@ -2890,3 +2862,49 @@ def test_client_withDEFAULT_CLIENT_INFO(): credentials=ga_credentials.AnonymousCredentials(), client_info=client_info, ) prep.assert_called_once_with(client_info) + + +@pytest.mark.asyncio +async def test_transport_close_async(): + client = GkeHubMembershipServiceAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), transport="grpc_asyncio", + ) + with mock.patch.object( + type(getattr(client.transport, "grpc_channel")), "close" + ) as close: + async with client: + close.assert_not_called() + close.assert_called_once() + + +def test_transport_close(): + transports = { + "grpc": "_grpc_channel", + } + + for transport, close_name in transports.items(): + client = GkeHubMembershipServiceClient( + credentials=ga_credentials.AnonymousCredentials(), transport=transport + ) + with mock.patch.object( + type(getattr(client.transport, close_name)), "close" + ) as close: + with client: + close.assert_not_called() + close.assert_called_once() + + +def test_client_ctx(): + transports = [ + "grpc", + ] + for transport in transports: + client = GkeHubMembershipServiceClient( + credentials=ga_credentials.AnonymousCredentials(), transport=transport + ) + # Test client calls underlying transport. + with mock.patch.object(type(client.transport), "close") as close: + close.assert_not_called() + with client: + pass + close.assert_called()