1313# limitations under the License.
1414
1515from contextlib import contextmanager
16- import mock
1716import os
18- import unittest
17+ import sys
1918
2019from opencensus .common .monitored_resource import monitored_resource
2120
21+ if sys .version_info < (3 ,):
22+ import unittest2 as unittest
23+ import mock
24+ else :
25+ import unittest
26+ from unittest import mock
27+
2228
2329@contextmanager
2430def mock_mr_method (method , use ):
@@ -39,50 +45,71 @@ def mock_use_aws(use):
3945 return mock_mr_method ('is_aws_environment' , use )
4046
4147
48+ def mock_oc_env ():
49+ return mock .patch .dict ('os.environ' , {
50+ 'OC_RESOURCE_TYPE' : 'mock_resource_type' ,
51+ 'OC_RESOURCE_LABELS' : 'mock_label_key=mock_label_value'
52+ })
53+
54+
4255@contextmanager
4356def mock_k8s_env ():
4457 with mock_use_k8s (True ):
45- with mock_use_gce (False ):
46- with mock_use_aws (False ):
47- yield
58+ yield
4859
4960
5061@contextmanager
5162def mock_gce_env ():
52- with mock_use_k8s (False ):
53- with mock_use_gce (True ):
54- with mock_use_aws (False ):
55- yield
63+ with mock_use_gce (True ):
64+ with mock_use_aws (False ):
65+ yield
5666
5767
5868@contextmanager
5969def mock_aws_env ():
60- with mock_use_k8s (False ):
61- with mock_use_gce (False ):
62- with mock_use_aws (True ):
63- yield
70+ with mock_use_gce (False ):
71+ with mock_use_aws (True ):
72+ yield
6473
6574
6675class TestMonitoredResource (unittest .TestCase ):
6776
77+ def setUp (self ):
78+ self .env_mock = mock .patch .dict (os .environ , clear = True )
79+ self .env_mock .start ()
80+
81+ def tearDown (self ):
82+ self .env_mock .stop ()
83+
6884 @mock .patch ('opencensus.common.monitored_resource.monitored_resource'
6985 '.gcp_metadata_config.GcpMetadataConfig' )
70- def test_gcp_gce_monitored_resource (self , gcp_metadata_mock ):
86+ def test_gcp_gce_monitored_resource (self , gcp_md_mock ):
7187 mocked_labels = {
7288 'instance_id' : 'my-instance' ,
7389 'project_id' : 'my-project' ,
7490 'zone' : 'us-east1'
7591 }
7692
77- gcp_metadata_mock .return_value = mock .Mock ()
78- gcp_metadata_mock .return_value .get_gce_metadata .return_value = \
79- mocked_labels
93+ gcp_md_mock .return_value = mock .Mock ()
94+ gcp_md_mock .return_value .get_gce_metadata .return_value = mocked_labels
95+
8096 with mock_gce_env ():
8197 resource = monitored_resource .get_instance ()
8298 self .assertEqual (resource .get_type (), 'gce_instance' )
83- self .assertDictEqual (resource .get_labels (), mocked_labels )
99+ self .assertEqual (resource .get_labels (), mocked_labels )
100+
101+ with mock_oc_env ():
102+ with mock_gce_env ():
103+ resource = monitored_resource .get_instance ()
104+ self .assertEqual (resource .get_type (), 'mock_resource_type' )
105+ self .assertDictContainsSubset (
106+ {'mock_label_key' : 'mock_label_value' }, resource .get_labels ())
107+ self .assertDictContainsSubset (mocked_labels , resource .get_labels ())
108+
109+ @mock .patch ('opencensus.common.monitored_resource.monitored_resource'
110+ '.gcp_metadata_config.GcpMetadataConfig' )
111+ def test_gcp_k8s_monitored_resource (self , gcp_md_mock ):
84112
85- def test_gcp_k8s_monitored_resource (self ):
86113 mocked_labels = {
87114 'instance_id' : 'my-instance' ,
88115 'cluster_name' : 'cluster' ,
@@ -92,31 +119,53 @@ def test_gcp_k8s_monitored_resource(self):
92119 'namespace_id' : 'namespace' ,
93120 'container_name' : 'container'
94121 }
122+ cluster_name_key = 'instance/attributes/cluster-name'
123+ cluster_name_val = 'cluster'
124+ gcp_md_mock .return_value = mock .Mock ()
125+ gcp_md_mock .return_value .get_gce_metadata .return_value = mocked_labels
126+ gcp_md_mock .get_attribute .return_value = cluster_name_val
127+
128+ with mock_k8s_env ():
129+ r1 = monitored_resource .get_instance ()
130+
131+ gcp_md_mock .get_attribute .assert_called_once_with (cluster_name_key )
132+ self .assertEqual (r1 .get_type (), 'k8s_container' )
133+ self .assertDictContainsSubset (mocked_labels , r1 .get_labels ())
95134
96- with mock_mr_method ( 'k8s_utils.get_k8s_metadata' , mocked_labels ):
135+ with mock_oc_env ( ):
97136 with mock_k8s_env ():
98- resource = monitored_resource .get_instance ()
99- self .assertEqual (resource .get_type (), 'k8s_container' )
100- self .assertDictEqual (resource .get_labels (), mocked_labels )
137+ r2 = monitored_resource .get_instance ()
138+
139+ self .assertEqual (r1 .get_type (), 'k8s_container' )
140+ self .assertDictContainsSubset (mocked_labels , r1 .get_labels ())
141+ self .assertDictContainsSubset (
142+ {'mock_label_key' : 'mock_label_value' }, r2 .get_labels ())
101143
102144 @mock .patch ('opencensus.common.monitored_resource.monitored_resource'
103145 '.aws_identity_doc_utils.AwsIdentityDocumentUtils' )
104- def test_aws_monitored_resource (self , aws_metadata_mock ):
146+ def test_aws_monitored_resource (self , aws_md_mock ):
105147
106148 mocked_labels = {
107149 'instance_id' : 'i-1234567890abcdef0' ,
108150 'aws_account' : '123456789012' ,
109151 'region' : 'us-west-2'
110152 }
111153
112- aws_metadata_mock .return_value = mock .Mock ()
113- aws_metadata_mock .return_value .get_aws_metadata .return_value = \
114- mocked_labels
154+ aws_md_mock .return_value = mock .Mock ()
155+ aws_md_mock .return_value .get_aws_metadata .return_value = mocked_labels
115156
116157 with mock_aws_env ():
117158 resource = monitored_resource .get_instance ()
118159 self .assertEqual (resource .get_type (), 'aws_ec2_instance' )
119- self .assertDictEqual (resource .get_labels (), mocked_labels )
160+ self .assertEqual (resource .get_labels (), mocked_labels )
161+
162+ with mock_oc_env ():
163+ with mock_aws_env ():
164+ resource = monitored_resource .get_instance ()
165+ self .assertEqual (resource .get_type (), 'mock_resource_type' )
166+ self .assertDictContainsSubset (
167+ {'mock_label_key' : 'mock_label_value' }, resource .get_labels ())
168+ self .assertDictContainsSubset (mocked_labels , resource .get_labels ())
120169
121170 def test_k8s_environment (self ):
122171 patch = mock .patch .dict (os .environ ,
@@ -147,7 +196,7 @@ def test_gce_environment(self):
147196 'aws_identity_doc_utils.AwsIdentityDocumentUtils.'
148197 'is_running_on_aws' ,
149198 return_value = True )
150- def test_aws_environment (self , aws_util_mock , gcp_metadata_mock ):
199+ def test_aws_environment (self , aws_util_mock , gcp_md_mock ):
151200 mr = monitored_resource .get_instance ()
152201
153202 self .assertIsNotNone (mr )
@@ -160,7 +209,13 @@ def test_aws_environment(self, aws_util_mock, gcp_metadata_mock):
160209 'aws_identity_doc_utils.AwsIdentityDocumentUtils.'
161210 'is_running_on_aws' ,
162211 return_value = False )
163- def test_non_supported_environment (self , aws_util_mock , gcp_metadata_mock ):
212+ def test_non_supported_environment (self , aws_util_mock , gcp_md_mock ):
164213 mr = monitored_resource .get_instance ()
165-
166214 self .assertIsNone (mr )
215+
216+ with mock_oc_env ():
217+ mr = monitored_resource .get_instance ()
218+ self .assertIsNotNone (mr )
219+ self .assertEqual (mr .get_type (), 'mock_resource_type' )
220+ self .assertDictEqual (
221+ mr .get_labels (), {'mock_label_key' : 'mock_label_value' })
0 commit comments