def __init__( self, *, host: str = DEFAULT_HOST, credentials: ga_credentials.Credentials = None, credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, quota_project_id: Optional[str] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, always_use_jwt_access: Optional[bool] = False, **kwargs, ) -> None: """Instantiate the transport. Args: host (Optional[str]): The hostname to connect to. credentials (Optional[google.auth.credentials.Credentials]): The authorization credentials to attach to requests. These credentials identify the application to the service; if none are specified, the client will attempt to ascertain the credentials from the environment. credentials_file (Optional[str]): A file with credentials that can be loaded with :func:`google.auth.load_credentials_from_file`. This argument is mutually exclusive with credentials. scopes (Optional[Sequence[str]]): A list of scopes. quota_project_id (Optional[str]): An optional project to use for billing and quota. client_info (google.api_core.gapic_v1.client_info.ClientInfo): The client info used to send a user-agent string along with API requests. If ``None``, then default info will be used. Generally, you only need to set this if you're developing your own client library. always_use_jwt_access (Optional[bool]): Whether self signed JWT should be used for service account credentials. """ # Save the hostname. Default to port 443 (HTTPS) if none is specified. if ':' not in host: host += ':443' self._host = host scopes_kwargs = self._get_scopes_kwargs(self._host, scopes) # Save the scopes. self._scopes = scopes # If no credentials are provided, then determine the appropriate # defaults. if credentials and credentials_file: raise core_exceptions.DuplicateCredentialArgs("'credentials_file' and 'credentials' are mutually exclusive") if credentials_file is not None: credentials, _ = google.auth.load_credentials_from_file( credentials_file, **scopes_kwargs, quota_project_id=quota_project_id ) elif credentials is None: credentials, _ = google.auth.default(**scopes_kwargs, quota_project_id=quota_project_id) # If the credentials is service account credentials, then always try to use self signed JWT. if always_use_jwt_access and isinstance(credentials, service_account.Credentials) and hasattr(service_account.Credentials, "with_always_use_jwt_access"): credentials = credentials.with_always_use_jwt_access(True) # Save the credentials. self._credentials = credentials
async def _get_metadata( client_session: aiohttp.ClientSession, credentials: Credentials, project: str, instance: str, ) -> Dict[str, Union[Dict, str]]: """Requests metadata from the Cloud SQL Instance and returns a dictionary containing the IP addresses and certificate authority of the Cloud SQL Instance. :type credentials: google.oauth2.service_account.Credentials :param service: A credentials object created from the google-auth Python library. Must have the SQL Admin API scopes. For more info check out https://google-auth.readthedocs.io/en/latest/. :type project: str :param project: A string representing the name of the project. :type inst_name: str :param project: A string representing the name of the instance. :rtype: Dict[str: Union[Dict, str]] :returns: Returns a dictionary containing a dictionary of all IP addresses and their type and a string representing the certificate authority. :raises TypeError: If any of the arguments are not the specified type. """ if (not isinstance(credentials, Credentials) or not isinstance(project, str) or not isinstance(instance, str)): raise TypeError("Arguments must be as follows: " + "service (googleapiclient.discovery.Resource), " + "proj_name (str) and inst_name (str).") if not credentials.valid: request = google.auth.transport.requests.Request() credentials.refresh(request) headers = { "Authorization": "Bearer {}".format(credentials.token), } url = "https://www.googleapis.com/sql/{}/projects/{}/instances/{}".format( _sql_api_version, project, instance) logger.debug("Requesting metadata") resp = await client_session.get(url, headers=headers, raise_for_status=True) ret_dict = json.loads(await resp.text()) metadata = { "ip_addresses": {ip["type"]: ip["ipAddress"] for ip in ret_dict["ipAddresses"]}, "server_ca_cert": ret_dict["serverCaCert"]["cert"], } return metadata