From 0dcb00a20b738bec90b301ac71459d0bc376791e Mon Sep 17 00:00:00 2001 From: Kevin Zheng Date: Thu, 12 Oct 2023 19:52:05 +0000 Subject: [PATCH 1/5] fix: Updated protobuf JSON formatting to support nested protobufs --- google/cloud/logging_v2/entries.py | 9 ++++---- tests/system/test_system.py | 7 ++++++ tests/unit/test_entries.py | 37 ++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/google/cloud/logging_v2/entries.py b/google/cloud/logging_v2/entries.py index 9db020f67..095e33a58 100644 --- a/google/cloud/logging_v2/entries.py +++ b/google/cloud/logging_v2/entries.py @@ -337,10 +337,11 @@ def to_api_repr(self): """API repr (JSON format) for entry.""" info = super(ProtobufEntry, self).to_api_repr() proto_payload = None - if self.payload_json: - proto_payload = dict(self.payload_json) - elif self.payload_pb: - proto_payload = MessageToDict(self.payload_pb) + if self.payload is not None: + try: + proto_payload = MessageToDict(self.payload) + except Exception: + proto_payload = dict(self.payload) info["protoPayload"] = proto_payload return info diff --git a/tests/system/test_system.py b/tests/system/test_system.py index ba7fd6c2a..164544b93 100644 --- a/tests/system/test_system.py +++ b/tests/system/test_system.py @@ -192,6 +192,9 @@ def test_list_entry_with_auditlog(self): "methodName": "test", "resourceName": "test", "serviceName": "test", + "requestMetadata": { + "callerIp": "127.0.0.1" + } } audit_struct = self._dict_to_struct(audit_dict) @@ -223,6 +226,10 @@ def test_list_entry_with_auditlog(self): protobuf_entry.to_api_repr()["protoPayload"]["methodName"], audit_dict["methodName"], ) + self.assertEqual( + protobuf_entry.to_api_repr()["protoPayload"]["requestMetadata"]["callerIp"], + audit_dict["requestMetadata"]["callerIp"] + ) def test_list_entry_with_requestlog(self): """ diff --git a/tests/unit/test_entries.py b/tests/unit/test_entries.py index 4742f5574..817311c73 100644 --- a/tests/unit/test_entries.py +++ b/tests/unit/test_entries.py @@ -738,6 +738,43 @@ def test_to_api_repr_proto_defaults(self): "resource": _GLOBAL_RESOURCE._to_dict(), } self.assertEqual(entry.to_api_repr(), expected) + + def test_to_api_repr_proto_inner_struct_field(self): + from google.protobuf.json_format import MessageToDict + from google.cloud.logging_v2.logger import _GLOBAL_RESOURCE + from google.protobuf.struct_pb2 import Struct + from google.protobuf.struct_pb2 import Value + + LOG_NAME = "test.log" + inner_struct = Struct(fields={"foo": Value(string_value="bar")}) + message = Struct(fields={"inner": Value(struct_value=inner_struct)}) + + entry = self._make_one(log_name=LOG_NAME, payload=message) + expected = { + "logName": LOG_NAME, + "protoPayload": MessageToDict(message), + "resource": _GLOBAL_RESOURCE._to_dict(), + } + self.assertEqual(entry.to_api_repr(), expected) + + def test_to_api_repr_proto_inner_list_field(self): + from google.protobuf.json_format import MessageToDict + from google.cloud.logging_v2.logger import _GLOBAL_RESOURCE + from google.protobuf.struct_pb2 import ListValue + from google.protobuf.struct_pb2 import Struct + from google.protobuf.struct_pb2 import Value + + LOG_NAME = "test.log" + lines = ListValue(values=[Value(string_value="line1"), Value(string_value="line2")]) + message = Struct(fields={"lines": Value(list_value=lines)}) + + entry = self._make_one(log_name=LOG_NAME, payload=message) + expected = { + "logName": LOG_NAME, + "protoPayload": MessageToDict(message), + "resource": _GLOBAL_RESOURCE._to_dict(), + } + self.assertEqual(entry.to_api_repr(), expected) def test_to_api_repr_proto_explicit(self): import datetime From dd9cf186de05474e5818392783ce15069426c15a Mon Sep 17 00:00:00 2001 From: Owl Bot Date: Mon, 16 Oct 2023 21:04:37 +0000 Subject: [PATCH 2/5] =?UTF-8?q?=F0=9F=A6=89=20Updates=20from=20OwlBot=20po?= =?UTF-8?q?st-processor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --- tests/system/test_system.py | 10 +++++----- tests/unit/test_entries.py | 8 +++++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/tests/system/test_system.py b/tests/system/test_system.py index 164544b93..0d39aa0a9 100644 --- a/tests/system/test_system.py +++ b/tests/system/test_system.py @@ -192,9 +192,7 @@ def test_list_entry_with_auditlog(self): "methodName": "test", "resourceName": "test", "serviceName": "test", - "requestMetadata": { - "callerIp": "127.0.0.1" - } + "requestMetadata": {"callerIp": "127.0.0.1"}, } audit_struct = self._dict_to_struct(audit_dict) @@ -227,8 +225,10 @@ def test_list_entry_with_auditlog(self): audit_dict["methodName"], ) self.assertEqual( - protobuf_entry.to_api_repr()["protoPayload"]["requestMetadata"]["callerIp"], - audit_dict["requestMetadata"]["callerIp"] + protobuf_entry.to_api_repr()["protoPayload"]["requestMetadata"][ + "callerIp" + ], + audit_dict["requestMetadata"]["callerIp"], ) def test_list_entry_with_requestlog(self): diff --git a/tests/unit/test_entries.py b/tests/unit/test_entries.py index 817311c73..e7bf30d87 100644 --- a/tests/unit/test_entries.py +++ b/tests/unit/test_entries.py @@ -738,7 +738,7 @@ def test_to_api_repr_proto_defaults(self): "resource": _GLOBAL_RESOURCE._to_dict(), } self.assertEqual(entry.to_api_repr(), expected) - + def test_to_api_repr_proto_inner_struct_field(self): from google.protobuf.json_format import MessageToDict from google.cloud.logging_v2.logger import _GLOBAL_RESOURCE @@ -756,7 +756,7 @@ def test_to_api_repr_proto_inner_struct_field(self): "resource": _GLOBAL_RESOURCE._to_dict(), } self.assertEqual(entry.to_api_repr(), expected) - + def test_to_api_repr_proto_inner_list_field(self): from google.protobuf.json_format import MessageToDict from google.cloud.logging_v2.logger import _GLOBAL_RESOURCE @@ -765,7 +765,9 @@ def test_to_api_repr_proto_inner_list_field(self): from google.protobuf.struct_pb2 import Value LOG_NAME = "test.log" - lines = ListValue(values=[Value(string_value="line1"), Value(string_value="line2")]) + lines = ListValue( + values=[Value(string_value="line1"), Value(string_value="line2")] + ) message = Struct(fields={"lines": Value(list_value=lines)}) entry = self._make_one(log_name=LOG_NAME, payload=message) From 6bb39c8b8bcfa5043984eebc50b65f95d1e55166 Mon Sep 17 00:00:00 2001 From: Kevin Zheng Date: Tue, 17 Oct 2023 21:12:54 +0000 Subject: [PATCH 3/5] Cleaner way to differentiate between proto objects and dict objects in to_api_repr --- google/cloud/logging_v2/entries.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/google/cloud/logging_v2/entries.py b/google/cloud/logging_v2/entries.py index 095e33a58..5e322a1fc 100644 --- a/google/cloud/logging_v2/entries.py +++ b/google/cloud/logging_v2/entries.py @@ -21,6 +21,7 @@ from google.protobuf.any_pb2 import Any from google.protobuf.json_format import MessageToDict from google.protobuf.json_format import Parse +from google.protobuf.message import Message from google.cloud.logging_v2.resource import Resource from google.cloud._helpers import _name_from_project_path @@ -325,7 +326,7 @@ def _extract_payload(cls, resource): @property def payload_pb(self): - if isinstance(self.payload, Any): + if isinstance(self.payload, Message): return self.payload @property @@ -337,11 +338,10 @@ def to_api_repr(self): """API repr (JSON format) for entry.""" info = super(ProtobufEntry, self).to_api_repr() proto_payload = None - if self.payload is not None: - try: - proto_payload = MessageToDict(self.payload) - except Exception: - proto_payload = dict(self.payload) + if self.payload_pb: + proto_payload = MessageToDict(self.payload) + elif self.payload_json: + proto_payload = dict(self.payload) info["protoPayload"] = proto_payload return info From 0c3601f3b742ae5c9a43005c072769eb063045b1 Mon Sep 17 00:00:00 2001 From: Kevin Zheng Date: Wed, 18 Oct 2023 14:26:30 +0000 Subject: [PATCH 4/5] Fixed unused import. --- google/cloud/logging_v2/entries.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/google/cloud/logging_v2/entries.py b/google/cloud/logging_v2/entries.py index 5e322a1fc..f76a56ebc 100644 --- a/google/cloud/logging_v2/entries.py +++ b/google/cloud/logging_v2/entries.py @@ -18,7 +18,6 @@ import json import re -from google.protobuf.any_pb2 import Any from google.protobuf.json_format import MessageToDict from google.protobuf.json_format import Parse from google.protobuf.message import Message @@ -326,7 +325,7 @@ def _extract_payload(cls, resource): @property def payload_pb(self): - if isinstance(self.payload, Message): + if isinstance(self.payload, Message) or isinstance: return self.payload @property From 268cc11746d9b2ae7bebb304dc2d69e73fa186a7 Mon Sep 17 00:00:00 2001 From: Kevin Zheng Date: Wed, 18 Oct 2023 15:43:08 +0000 Subject: [PATCH 5/5] Fixed failing unit test. --- google/cloud/logging_v2/entries.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google/cloud/logging_v2/entries.py b/google/cloud/logging_v2/entries.py index f76a56ebc..d8a877738 100644 --- a/google/cloud/logging_v2/entries.py +++ b/google/cloud/logging_v2/entries.py @@ -325,7 +325,7 @@ def _extract_payload(cls, resource): @property def payload_pb(self): - if isinstance(self.payload, Message) or isinstance: + if isinstance(self.payload, Message): return self.payload @property