codekingpro/portable-devtools
114k
1# Copyright 2023 Google LLC2#3# Licensed under the Apache License, Version 2.0 (the "License");4# you may not use this file except in compliance with the License.5# You may obtain a copy of the License at6#7# http://www.apache.org/licenses/LICENSE-2.08#9# Unless required by applicable law or agreed to in writing, software10# distributed under the License is distributed on an "AS IS" BASIS,11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.12# See the License for the specific language governing permissions and13# limitations under the License.14 15""" We use x-goog-api-client header to report metrics. This module provides16the constants and helper methods to construct x-goog-api-client header.17"""18 19import platform20 21from google.auth import version22 23 24API_CLIENT_HEADER = "x-goog-api-client"25 26# BYOID Specific consts27BYOID_HEADER_SECTION = "google-byoid-sdk"28 29# Auth request type30REQUEST_TYPE_ACCESS_TOKEN = "auth-request-type/at"31REQUEST_TYPE_ID_TOKEN = "auth-request-type/it"32REQUEST_TYPE_MDS_PING = "auth-request-type/mds"33REQUEST_TYPE_REAUTH_START = "auth-request-type/re-start"34REQUEST_TYPE_REAUTH_CONTINUE = "auth-request-type/re-cont"35 36# Credential type37CRED_TYPE_USER = "cred-type/u"38CRED_TYPE_SA_ASSERTION = "cred-type/sa"39CRED_TYPE_SA_JWT = "cred-type/jwt"40CRED_TYPE_SA_MDS = "cred-type/mds"41CRED_TYPE_SA_IMPERSONATE = "cred-type/imp"42 43 44# Versions45def python_and_auth_lib_version():46 return "gl-python/{} auth/{}".format(platform.python_version(), version.__version__)47 48 49# Token request metric header values50 51# x-goog-api-client header value for access token request via metadata server.52# Example: "gl-python/3.7 auth/1.1 auth-request-type/at cred-type/mds"53def token_request_access_token_mds():54 return "{} {} {}".format(55 python_and_auth_lib_version(), REQUEST_TYPE_ACCESS_TOKEN, CRED_TYPE_SA_MDS56 )57 58 59# x-goog-api-client header value for ID token request via metadata server.60# Example: "gl-python/3.7 auth/1.1 auth-request-type/it cred-type/mds"61def token_request_id_token_mds():62 return "{} {} {}".format(63 python_and_auth_lib_version(), REQUEST_TYPE_ID_TOKEN, CRED_TYPE_SA_MDS64 )65 66 67# x-goog-api-client header value for impersonated credentials access token request.68# Example: "gl-python/3.7 auth/1.1 auth-request-type/at cred-type/imp"69def token_request_access_token_impersonate():70 return "{} {} {}".format(71 python_and_auth_lib_version(),72 REQUEST_TYPE_ACCESS_TOKEN,73 CRED_TYPE_SA_IMPERSONATE,74 )75 76 77# x-goog-api-client header value for impersonated credentials ID token request.78# Example: "gl-python/3.7 auth/1.1 auth-request-type/it cred-type/imp"79def token_request_id_token_impersonate():80 return "{} {} {}".format(81 python_and_auth_lib_version(), REQUEST_TYPE_ID_TOKEN, CRED_TYPE_SA_IMPERSONATE82 )83 84 85# x-goog-api-client header value for service account credentials access token86# request (assertion flow).87# Example: "gl-python/3.7 auth/1.1 auth-request-type/at cred-type/sa"88def token_request_access_token_sa_assertion():89 return "{} {} {}".format(90 python_and_auth_lib_version(), REQUEST_TYPE_ACCESS_TOKEN, CRED_TYPE_SA_ASSERTION91 )92 93 94# x-goog-api-client header value for service account credentials ID token95# request (assertion flow).96# Example: "gl-python/3.7 auth/1.1 auth-request-type/it cred-type/sa"97def token_request_id_token_sa_assertion():98 return "{} {} {}".format(99 python_and_auth_lib_version(), REQUEST_TYPE_ID_TOKEN, CRED_TYPE_SA_ASSERTION100 )101 102 103# x-goog-api-client header value for user credentials token request.104# Example: "gl-python/3.7 auth/1.1 cred-type/u"105def token_request_user():106 return "{} {}".format(python_and_auth_lib_version(), CRED_TYPE_USER)107 108 109# Miscellenous metrics110 111# x-goog-api-client header value for metadata server ping.112# Example: "gl-python/3.7 auth/1.1 auth-request-type/mds"113def mds_ping():114 return "{} {}".format(python_and_auth_lib_version(), REQUEST_TYPE_MDS_PING)115 116 117# x-goog-api-client header value for reauth start endpoint calls.118# Example: "gl-python/3.7 auth/1.1 auth-request-type/re-start"119def reauth_start():120 return "{} {}".format(python_and_auth_lib_version(), REQUEST_TYPE_REAUTH_START)121 122 123# x-goog-api-client header value for reauth continue endpoint calls.124# Example: "gl-python/3.7 auth/1.1 cred-type/re-cont"125def reauth_continue():126 return "{} {}".format(python_and_auth_lib_version(), REQUEST_TYPE_REAUTH_CONTINUE)127 128 129# x-goog-api-client header value for BYOID calls to the Security Token Service exchange token endpoint.130# Example: "gl-python/3.7 auth/1.1 google-byoid-sdk source/aws sa-impersonation/true sa-impersonation/true"131def byoid_metrics_header(metrics_options):132 header = "{} {}".format(python_and_auth_lib_version(), BYOID_HEADER_SECTION)133 for key, value in metrics_options.items():134 header = "{} {}/{}".format(header, key, value)135 return header136 137 138def add_metric_header(headers, metric_header_value):139 """Add x-goog-api-client header with the given value.140 141 Args:142 headers (Mapping[str, str]): The headers to which we will add the143 metric header.144 metric_header_value (Optional[str]): If value is None, do nothing;145 if headers already has a x-goog-api-client header, append the value146 to the existing header; otherwise add a new x-goog-api-client147 header with the given value.148 """149 if not metric_header_value:150 return151 if API_CLIENT_HEADER not in headers:152 headers[API_CLIENT_HEADER] = metric_header_value153 else:154 headers[API_CLIENT_HEADER] += " " + metric_header_value155 