16
16
17
17
import mock
18
18
import os
19
-
19
+ import functools
20
20
21
21
from google .cloud .logging_v2 .handlers ._monitored_resources import (
22
22
_create_functions_resource ,
@@ -66,6 +66,20 @@ def _mock_metadata(self, endpoint):
66
66
else :
67
67
return None
68
68
69
+ def _mock_metadata_no_project (self , endpoint ):
70
+ if (
71
+ endpoint == _monitored_resources ._ZONE_ID
72
+ or endpoint == _monitored_resources ._REGION_ID
73
+ ):
74
+ return self .LOCATION
75
+ elif (
76
+ endpoint == _monitored_resources ._GKE_CLUSTER_NAME
77
+ or endpoint == _monitored_resources ._GCE_INSTANCE_ID
78
+ ):
79
+ return self .NAME
80
+ else :
81
+ return None
82
+
69
83
def setUp (self ):
70
84
os .environ .clear ()
71
85
@@ -100,6 +114,23 @@ def test_create_modern_functions_resource(self):
100
114
self .assertEqual (func_resource .labels ["function_name" ], self .NAME )
101
115
self .assertEqual (func_resource .labels ["region" ], self .LOCATION )
102
116
117
+ def test_functions_resource_no_name (self ):
118
+ """
119
+ Simulate functions environment with function name returned as None
120
+ https://github.com/googleapis/python-logging/pull/718
121
+ """
122
+ patch = mock .patch (
123
+ "google.cloud.logging_v2.handlers._monitored_resources.retrieve_metadata_server" ,
124
+ wraps = self ._mock_metadata_no_project ,
125
+ )
126
+ with patch :
127
+ func_resource = _create_functions_resource ()
128
+
129
+ self .assertIsInstance (func_resource , Resource )
130
+ self .assertEqual (func_resource .type , "cloud_function" )
131
+ self .assertEqual (func_resource .labels ["project_id" ], "" )
132
+ self .assertEqual (func_resource .labels ["function_name" ], "" )
133
+
103
134
def test_create_kubernetes_resource (self ):
104
135
105
136
patch = mock .patch (
@@ -169,6 +200,29 @@ def test_global_resource(self):
169
200
self .assertEqual (resource .type , "global" )
170
201
self .assertEqual (resource .labels ["project_id" ], self .PROJECT )
171
202
203
+ def test_with_no_project_from_server (self ):
204
+ """
205
+ Ensure project_id uses an empty string if not known
206
+ https://github.com/googleapis/python-logging/issues/710
207
+ """
208
+ patch = mock .patch (
209
+ "google.cloud.logging_v2.handlers._monitored_resources.retrieve_metadata_server" ,
210
+ wraps = self ._mock_metadata_no_project ,
211
+ )
212
+ with patch :
213
+ _global_resource_patched = functools .partial (_create_global_resource , None )
214
+ resource_fns = [
215
+ _global_resource_patched ,
216
+ _create_app_engine_resource ,
217
+ _create_cloud_run_resource ,
218
+ _create_compute_resource ,
219
+ _create_kubernetes_resource ,
220
+ _create_functions_resource ,
221
+ ]
222
+ for fn in resource_fns :
223
+ resource = fn ()
224
+ self .assertEqual (resource .labels ["project_id" ], "" )
225
+
172
226
173
227
class Test_Resource_Detection (unittest .TestCase ):
174
228
@@ -189,6 +243,14 @@ def _mock_gce_metadata(self, endpoint):
189
243
else :
190
244
return None
191
245
246
+ def _mock_partial_metadata (self , endpoint ):
247
+ if endpoint == _monitored_resources ._ZONE_ID :
248
+ return "ZONE"
249
+ elif endpoint == _monitored_resources ._GCE_INSTANCE_ID :
250
+ return "instance"
251
+ else :
252
+ return None
253
+
192
254
def setUp (self ):
193
255
os .environ .clear ()
194
256
@@ -249,3 +311,19 @@ def test_detection_unknown(self):
249
311
resource = detect_resource (self .PROJECT )
250
312
self .assertIsInstance (resource , Resource )
251
313
self .assertEqual (resource .type , "global" )
314
+
315
+ def test_detect_partial_data (self ):
316
+ """
317
+ Test case where the metadata server returns partial data
318
+ """
319
+ patch = mock .patch (
320
+ "google.cloud.logging_v2.handlers._monitored_resources.retrieve_metadata_server" ,
321
+ wraps = self ._mock_partial_metadata ,
322
+ )
323
+ with patch :
324
+ resource = detect_resource (self .PROJECT )
325
+ self .assertIsInstance (resource , Resource )
326
+ self .assertEqual (resource .type , "gce_instance" )
327
+ # project id not returned from metadata serve
328
+ # should be empty string
329
+ self .assertEqual (resource .labels ["project_id" ], "" )
0 commit comments