Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(536)

Unified Diff: third_party/google-endpoints/google/api/control/label_descriptor.py

Issue 2666783008: Add google-endpoints to third_party/. (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/google-endpoints/google/api/control/label_descriptor.py
diff --git a/third_party/google-endpoints/google/api/control/label_descriptor.py b/third_party/google-endpoints/google/api/control/label_descriptor.py
new file mode 100644
index 0000000000000000000000000000000000000000..0fc18a1da60a913a2b1904c58b9581b05863d7aa
--- /dev/null
+++ b/third_party/google-endpoints/google/api/control/label_descriptor.py
@@ -0,0 +1,279 @@
+# Copyright 2016 Google Inc. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""label_descriptor provides funcs for working with `LabelDescriptor` instances.
+
+:class:`KnownLabels` is an :class:`enum.Enum` that defines the list of known
+`LabelDescriptor` instances. Each enum instance has several fields
+
+- label_name: the name used in the label
+- kind: indicates whether the label is system or user label
+- value_type: the value type used in the label
+- update_label_func: a function to update the labels
+
+"""
+
+from __future__ import absolute_import
+
+import base64
+from enum import Enum
+from . import messages, USER_AGENT, SERVICE_AGENT
+
+ValueType = messages.LabelDescriptor.ValueTypeValueValuesEnum
+
+
+class Kind(Enum):
+ """Enumerates the known labels."""
+ # pylint: disable=too-few-public-methods
+ USER = 0
+ SYSTEM = 1
+
+
+_CANONICAL_CODES = {
+ 200: 0, # OK
+ 400: 3, # INVALID_ARGUMENT
+ 401: 16, # UNAUTHENTICATED
+ 403: 7, # PERMISSION_DENIED
+ 404: 5, # NOT_FOUND
+ 409: 10, # ABORTED
+ 412: 9, # FAILED_PRECONDITION
+ 416: 11, # OUT_OF_RANGE
+ 429: 8, # RESOURCE_EXHAUSTED
+ 499: 1, # CANCELLED
+ 500: 13, # INTERNAL, UNKNOWN
+ 504: 4, # DEADLINE_EXCEEDED
+ 501: 12, # UNIMPLEMENTED
+ 503: 14, # UNAVAILABLE
+}
+
+
+def _canonical_code(http_code):
+ mapped_code = _CANONICAL_CODES.get(http_code, 0)
+ if mapped_code != 0:
+ return mapped_code
+ elif 200 <= http_code < 300:
+ return 0 # OK
+ elif 400 <= http_code < 500:
+ return 9 # failed precondition
+ elif 500 <= http_code < 600:
+ return 13 # internal
+ else:
+ return 2 # unknown
+
+
+def set_credential_id(name, info, labels):
+ # The rule to set /credential_id is:
+ # 1) If api_key is available, set it as apiKey:API-KEY
+ # 2) If auth issuer and audience both are available, set it as:
+ # jwtAuth:issuer=base64(issuer)&audience=base64(audience)
+ if info.api_key:
+ labels[name] = 'apiKey:' + info.api_key
+ elif info.auth_issuer:
+ value = 'jwtAuth:issuer=' + base64.urlsafe_b64encode(info.auth_issuer)
+ if info.auth_audience:
+ value += '&audience=' + base64.urlsafe_b64encode(info.auth_audience)
+ labels[name] = value
+
+
+_ERROR_TYPES = tuple('%dxx' % (x,) for x in range(10))
+
+
+def set_error_type(name, info, labels):
+ if info.response_code > 0:
+ code = (info.response_code // 100) % 10
+ if code < len(_ERROR_TYPES):
+ labels[name] = _ERROR_TYPES[code]
+
+
+def set_protocol(name, info, labels):
+ labels[name] = info.protocol.name
+
+
+def set_referer(name, info, labels):
+ if info.referer:
+ labels[name] = info.referer
+
+
+def set_response_code(name, info, labels):
+ labels[name] = '%d' % (info.response_code,)
+
+
+def set_response_code_class(name, info, labels):
+ if info.response_code > 0:
+ code = (info.response_code // 100) % 10
+ if code < len(_ERROR_TYPES):
+ labels[name] = _ERROR_TYPES[code]
+
+
+def set_status_code(name, info, labels):
+ if info.response_code > 0:
+ labels[name] = '%d' % (_canonical_code(info.response_code),)
+
+
+def set_location(name, info, labels):
+ if info.location:
+ labels[name] = info.location
+
+
+def set_api_method(name, info, labels):
+ if info.api_method:
+ labels[name] = info.api_method
+
+
+def set_api_version(name, info, labels):
+ if info.api_version:
+ labels[name] = info.api_version
+
+
+def set_platform(name, info, labels):
+ labels[name] = info.platform.name
+
+
+def set_service_agent(name, dummy_info, labels):
+ labels[name] = SERVICE_AGENT
+
+
+def set_user_agent(name, dummy_info, labels):
+ labels[name] = USER_AGENT
+
+
+class KnownLabels(Enum):
+ """Enumerates the known labels."""
+
+ CREDENTIAL_ID = (
+ '/credential_id', ValueType.STRING, Kind.USER, set_credential_id)
+ END_USER = ('/end_user', ValueType.STRING, Kind.USER, None)
+ END_USER_COUNTRY = ('/end_user_country', ValueType.STRING, Kind.USER, None)
+ ERROR_TYPE = ('/error_type', ValueType.STRING, Kind.USER,
+ set_error_type)
+ PROTOCOL = ('/protocol', ValueType.STRING, Kind.USER,
+ set_protocol)
+ REFERER = ('/referer', ValueType.STRING, Kind.USER,
+ set_referer)
+ RESPONSE_CODE = ('/response_code', ValueType.STRING, Kind.USER,
+ set_response_code)
+ RESPONSE_CODE_CLASS = ('/response_code_class', ValueType.STRING, Kind.USER,
+ set_response_code_class)
+ STATUS_CODE = ('/status_code', ValueType.STRING, Kind.USER,
+ set_status_code)
+ GAE_CLONE_ID = (
+ 'appengine.googleapis.com/clone_id', ValueType.STRING, Kind.USER, None)
+ GAE_MODULE_ID = (
+ 'appengine.googleapis.com/module_id', ValueType.STRING, Kind.USER, None)
+ GAE_REPLICA_INDEX = (
+ 'appengine.googleapis.com/replica_index', ValueType.STRING, Kind.USER,
+ None)
+ GAE_VERSION_ID = (
+ 'appengine.googleapis.com/version_id', ValueType.STRING, Kind.USER, None)
+ GCP_LOCATION = (
+ 'cloud.googleapis.com/location', ValueType.STRING, Kind.SYSTEM,
+ set_location)
+ GCP_PROJECT = (
+ 'cloud.googleapis.com/project', ValueType.STRING, Kind.SYSTEM, None)
+ GCP_REGION = (
+ 'cloud.googleapis.com/region', ValueType.STRING, Kind.SYSTEM, None)
+ GCP_RESOURCE_ID = (
+ 'cloud.googleapis.com/resource_id', ValueType.STRING, Kind.USER, None)
+ GCP_RESOURCE_TYPE = (
+ 'cloud.googleapis.com/resource_type', ValueType.STRING, Kind.USER, None)
+ GCP_SERVICE = (
+ 'cloud.googleapis.com/service', ValueType.STRING, Kind.SYSTEM, None)
+ GCP_ZONE = (
+ 'cloud.googleapis.com/zone', ValueType.STRING, Kind.SYSTEM, None)
+ GCP_UID = (
+ 'cloud.googleapis.com/uid', ValueType.STRING, Kind.SYSTEM, None)
+ GCP_API_METHOD = (
+ 'serviceruntime.googleapis.com/api_method', ValueType.STRING, Kind.USER,
+ set_api_method)
+ GCP_API_VERSION = (
+ 'serviceruntime.googleapis.com/api_version', ValueType.STRING, Kind.USER,
+ set_api_version)
+ SCC_CALLER_IP = (
+ 'servicecontrol.googleapis.com/caller_ip', ValueType.STRING, Kind.SYSTEM, None)
+ SCC_PLATFORM = (
+ 'servicecontrol.googleapis.com/platform', ValueType.STRING, Kind.SYSTEM,
+ set_platform)
+ SCC_REFERER = (
+ 'servicecontrol.googleapis.com/referer', ValueType.STRING, Kind.SYSTEM, None)
+ SCC_SERVICE_AGENT = (
+ 'servicecontrol.googleapis.com/service_agent', ValueType.STRING, Kind.SYSTEM,
+ set_service_agent)
+ SCC_USER_AGENT = (
+ 'servicecontrol.googleapis.com/user_agent', ValueType.STRING, Kind.SYSTEM,
+ set_user_agent)
+
+ def __init__(self, label_name, value_type, kind, update_label_func):
+ """Constructor.
+
+ update_label_func is used when updating a label in an `Operation` from a
+ `ReportRequestInfo`.
+
+ Args:
+ label_name (str): the name of the label descriptor
+ value_type (:class:`ValueType`): the `value type` of the described metric
+ kind (:class:`Kind`): the ``kind`` of the described metric
+ update_op_func (function): the func to update an operation
+
+ """
+ self.label_name = label_name
+ self.kind = kind
+ self.update_label_func = update_label_func
+ self.value_type = value_type
+
+ def matches(self, desc):
+ """Determines if a given label descriptor matches this enum instance
+
+ Args:
+ desc (:class:`google.api.gen.servicecontrol_v1_messages.LabelDescriptor`): the
+ instance to test
+
+ Return:
+ `True` if desc is supported, otherwise `False`
+
+ """
+ desc_value_type = desc.valueType or ValueType.STRING # default not parsed
+ return (self.label_name == desc.key and
+ self.value_type == desc_value_type)
+
+ def do_labels_update(self, info, labels):
+ """Updates a dictionary of labels using the assigned update_op_func
+
+ Args:
+ info (:class:`google.api.control.report_request.Info`): the
+ info instance to update
+ labels (dict[string[string]]): the labels dictionary
+
+ Return:
+ `True` if desc is supported, otherwise `False`
+
+ """
+ if self.update_label_func:
+ self.update_label_func(self.label_name, info, labels)
+
+ @classmethod
+ def is_supported(cls, desc):
+ """Determines if the given label descriptor is supported.
+
+ Args:
+ desc (:class:`google.api.gen.servicecontrol_v1_messages.LabelDescriptor`): the
+ label descriptor to test
+
+ Return:
+ `True` if desc is supported, otherwise `False`
+
+ """
+ for l in cls:
+ if l.matches(desc):
+ return True
+ return False

Powered by Google App Engine
This is Rietveld 408576698