def test_get_http_error(self, mock_session_class): """ test ensures that exception is captured and does not impede """ mock_result = mock.Mock(name="mock_result") mock_result.status_code = 500 mock_result.text = "error" mock_session = Mock(name="mock_session") mock_session.send = Mock(return_value=mock_result, name="mock_session.send") mock_session.side_effect = requests.exceptions.HTTPError() mock_session.prepare_request = mock_prepare_request mock_session.hooks = {"response": []} mock_session_class.return_value = mock_session # We need to patch only Session in this case self.requests_patcher.stop() self.collector = cloud_facts.CloudFactsCollector( collected_hw_info={ "virt.is_guest": True, "dmi.bios.version": "4.2.amazon" }) facts = self.collector.get_all() self.assertNotIn("aws_instance_id", facts)
def test_get_timeout(self, MockConn): self.collector = cloud_facts.CloudFactsCollector( collected_hw_info={"dmi.bios.version": "4.2.amazon"}) self.mock_facts.return_value.read_cache_only.return_value = {} MockConn.return_value.getresponse.side_effect = socket.timeout facts = self.collector.get_all() self.assertNotIn("aws_instance_id", facts)
def test_get_gcp_facts(self, mock_get_metadata_from_cache, mock_write_token_to_cache_file): """ Test getting GCP instance ID from metadata provided by GCP cloud provider """ self.requests_mock.Request = Mock(name="mock_Request") mock_result = Mock(name="mock_result") mock_result.status_code = 200 mock_result.text = GCP_JWT_TOKEN mock_session = Mock(name="mock_session") mock_session.send = Mock(return_value=mock_result, name="mock_send") mock_session.prepare_request = Mock(name="mock_prepare_request") mock_session.hooks = {"response": []} self.requests_mock.Session = Mock(return_value=mock_session, name="mock_Session") mock_get_metadata_from_cache.return_value = None mock_write_token_to_cache_file.return_value = None self.collector = cloud_facts.CloudFactsCollector( collected_hw_info={ "virt.is_guest": True, "dmi.bios.vendor": "google" }) facts = self.collector.get_all() self.assertIn("gcp_instance_id", facts) self.assertEqual(facts["gcp_instance_id"], "2589221140676718026")
def test_get_azure_facts(self): """ Test getting Azure facts instance ID (vmId) from metadata provided by Azure cloud provider """ self.requests_mock.Request = Mock(name="mock_Request") mock_result = Mock(name="mock_result") mock_result.status_code = 200 mock_result.text = AZURE_METADATA mock_session = Mock(name="mock_session") mock_session.send = Mock(return_value=mock_result, name="mock_send") mock_session.prepare_request = Mock(name="mock_prepare_request") mock_session.hooks = {"response": []} self.requests_mock.Session = Mock(return_value=mock_session, name="mock_Session") self.collector = cloud_facts.CloudFactsCollector( collected_hw_info={ "virt.is_guest": True, "dmi.chassis.asset_tag": "7783-7084-3265-9085-8269-3286-77", }) facts = self.collector.get_all() # azure_instance_id should be included in the facts self.assertIn("azure_instance_id", facts) self.assertEqual(facts["azure_instance_id"], AZURE_INSTANCE_ID) # some other azure facts should be included in facts too self.assertIn("azure_sku", facts) self.assertEqual(facts["azure_sku"], AZURE_SKU) self.assertIn("azure_offer", facts) self.assertEqual(facts["azure_offer"], AZURE_OFFER)
def test_get_aws_facts(self, mock_session_class): """ Test getting AWS facts (instance ID, accountID and billingProducts) """ mock_result = Mock(name="_test_get_aws_facts.mock_result") mock_result.status_code = 200 mock_result.text = AWS_METADATA mock_session = Mock(name="_test_get_aws_facts.mock_session") mock_session.send = Mock(return_value=mock_result, name="_test_get_aws_facts.mock_session.send") mock_session.prepare_request = mock_prepare_request mock_session.hooks = {"response": []} mock_session_class.return_value = mock_session # We need to patch only Session in this case self.requests_patcher.stop() self.collector = cloud_facts.CloudFactsCollector( collected_hw_info={ "virt.is_guest": True, "dmi.bios.version": "4.2.amazon" }) facts = self.collector.get_all() self.assertIn("aws_instance_id", facts) self.assertEqual(facts["aws_instance_id"], AWS_INSTANCE_ID) self.assertIn("aws_account_id", facts) self.assertEqual(facts["aws_account_id"], AWS_ACCOUNT_ID) self.assertIn("aws_billing_products", facts) self.assertEqual(facts["aws_billing_products"], AWS_BILLING_PRODUCTS) self.assertIn("aws_marketplace_product_codes", facts) self.assertEqual(facts["aws_marketplace_product_codes"], None)
def test_get_bad_json(self, MockConn): self.collector = cloud_facts.CloudFactsCollector( collected_hw_info={"dmi.bios.version": "4.2.amazon"}) self.mock_facts.return_value.read_cache_only.return_value = {} MockConn.return_value.getresponse.return_value.read.return_value = \ "other text stuff" facts = self.collector.get_all() self.assertNotIn("aws_instance_id", facts)
def test_get_http_error(self, MockConn): self.collector = cloud_facts.CloudFactsCollector( collected_hw_info={"dmi.bios.version": "4.2.amazon"}) self.mock_facts.return_value.read_cache_only.return_value = {} MockConn.return_value.getresponse.side_effect = httplib.HTTPException( mock.Mock(return_value={'status': 500}), 'error') facts = self.collector.get_all() self.assertNotIn("aws_instance_id", facts)
def test_get_not_instance_id(self, MockConn): self.collector = cloud_facts.CloudFactsCollector( collected_hw_info={"dmi.bios.version": "4.2.amazon"}) self.mock_facts.return_value.read_cache_only.return_value = {} MockConn.return_value.getresponse.return_value.read.return_value = \ "{'privateIp' : '10.158.112.84', \ 'version' : '2017-09-30'}" facts = self.collector.get_all() self.assertNotIn("aws_instance_id", facts)
def test_get_instance_id(self, MockConn): self.collector = cloud_facts.CloudFactsCollector( collected_hw_info={"dmi.bios.version": "4.2.amazon"}) self.mock_facts.return_value.read_cache_only.return_value = {} MockConn.return_value.getresponse.return_value.read.return_value = \ '{"privateIp": "10.158.112.84", \ "version" : "2017-09-30", \ "instanceId" : "' + AWS_INSTANCE_ID + '"}' facts = self.collector.get_all() self.assertIn("aws_instance_id", facts) self.assertEqual(facts["aws_instance_id"], AWS_INSTANCE_ID)
def get_all(self): host_facts = {} firmware_collector = firmware_info.FirmwareCollector( prefix=self.prefix, testing=self.testing, ) firmware_info_dict = firmware_collector.get_all() virt_collector = virt.VirtCollector( prefix=self.prefix, testing=self.testing, collected_hw_info=firmware_info_dict) virt_collector_info = virt_collector.get_all() cloud_collector = cloud_facts.CloudFactsCollector( prefix=self.prefix, testing=self.testing, collected_hw_info=firmware_info_dict) cloud_facts_info = cloud_collector.get_all() host_facts.update(cloud_facts_info) host_facts.update(virt_collector_info) host_facts.update(firmware_info_dict) locale_info = {} effective_locale = 'Unknown' # When there is no locale set (system variable LANG is unset), # then this is value returned by locale.getdefaultlocale() # Tuple contains: (language[_territory], encoding identifier) default_locale = (None, None) try: default_locale = locale.getdefaultlocale() except ValueError as err: log.warning( "Unable to get default locale (bad environment variable?): %s" % err) if default_locale[0] is not None: effective_locale = ".".join([_f for _f in default_locale if _f]) locale_info['system.default_locale'] = effective_locale host_facts.update(locale_info) # Now, munging, kluges, special cases, etc # NOTE: we are passing the facts we've already collected into # cleanup_collector. cleanup_collector = cleanup.CleanupCollector( prefix=self.prefix, testing=self.testing, collected_hw_info=host_facts) cleanup_info = cleanup_collector.get_all() host_facts.update(cleanup_info) return host_facts
def test_get_not_aws_instance(self, MockConn): self.collector = cloud_facts.CloudFactsCollector( collected_hw_info={ "virt.is_guest": True, "dmi.bios.version": "1.0.cloud" }) self.mock_facts.return_value.read_cache_only.return_value = {} MockConn.return_value.getresponse.return_value.read.return_value = \ "{'privateIp' : '10.158.112.84', \ 'version' : '2017-09-30, \ 'instanceId' : '" + CLOUD_INSTANCE_ID + "'}" facts = self.collector.get_all() self.assertNotIn("aws_instance_id", facts)
def test_get_aws_facts_with_null_billing_products(self, mock_session_class): """ Billing products could be null in some cases (not RHEL) """ mock_result = Mock(name="mock_result") mock_result.status_code = 200 mock_result.text = """ { "accountId" : "012345678900", "architecture" : "x86_64", "availabilityZone" : "eu-central-1b", "billingProducts" : null, "devpayProductCodes" : null, "marketplaceProductCodes" : null, "imageId" : "ami-0123456789abcdeff", "instanceId" : "i-abcdef01234567890", "instanceType" : "m5.large", "kernelId" : null, "pendingTime" : "2020-02-02T02:02:02Z", "privateIp" : "12.34.56.78", "ramdiskId" : null, "region" : "eu-central-1", "version" : "2017-09-30" } """ mock_session = Mock(name="mock_session") mock_session.send = Mock(return_value=mock_result, name="mock_session.send") mock_session.prepare_request = mock_prepare_request mock_session.hooks = {"response": []} mock_session_class.return_value = mock_session # We need to patch only Session in this case self.requests_patcher.stop() self.collector = cloud_facts.CloudFactsCollector( collected_hw_info={ "virt.is_guest": True, "dmi.bios.version": "4.2.amazon" }) facts = self.collector.get_all() self.assertIn("aws_instance_id", facts) self.assertEqual(facts["aws_instance_id"], AWS_INSTANCE_ID) self.assertIn("aws_account_id", facts) self.assertEqual(facts["aws_account_id"], AWS_ACCOUNT_ID) self.assertIn("aws_billing_products", facts) self.assertEqual(facts["aws_billing_products"], None) self.assertIn("aws_marketplace_product_codes", facts) self.assertEqual(facts["aws_marketplace_product_codes"], None)
def test_get_instance_id_from_cache(self, MockConn): self.collector = cloud_facts.CloudFactsCollector( collected_hw_info={ "virt.is_guest": True, "dmi.bios.version": "4.2.amazon" }) self.mock_facts.return_value.read_cache_only.return_value = { "aws_instance_id": CACHED_AWS_INSTANCE_ID } # does not get read if in cache already MockConn.return_value.getresponse.return_value.read.return_value = \ '{"privateIp": "10.158.112.84", \ "version" : "2017-09-30", \ "instanceId" : "' + AWS_INSTANCE_ID + '"}' facts = self.collector.get_all() self.assertIn("aws_instance_id", facts) self.assertEqual(facts["aws_instance_id"], CACHED_AWS_INSTANCE_ID)
def test_get_bad_json(self, mock_session_class): """ Test parsing some string that is not Json document """ mock_result = mock.Mock(name="mock_result") mock_result.status_code = 200 mock_result.text = "not json document" mock_session = Mock(name="mock_session") mock_session.send = Mock(return_value=mock_result, name="mock_session.send") mock_session.prepare_request = mock_prepare_request mock_session.hooks = {"response": []} mock_session_class.return_value = mock_session # We need to patch only Session in this case self.requests_patcher.stop() self.collector = cloud_facts.CloudFactsCollector( collected_hw_info={ "virt.is_guest": True, "dmi.bios.version": "4.2.amazon" }) facts = self.collector.get_all() self.assertNotIn("aws_instance_id", facts)
def test_get_not_aws_instance(self, mock_session_class): """ Test that AWS instance ID is not included in facts, when VM is not running on the AWS public cloud """ mock_result = mock.Mock(name="mock_result") mock_result.status_code = 200 mock_result.text = '{"foo": "bar"}' mock_session = Mock(name="mock_session") mock_session.send = Mock(return_value=mock_result, name="mock_session.send") mock_session.prepare_request = mock_prepare_request mock_session.hooks = {"response": []} mock_session_class.return_value = mock_session # We need to patch only Session in this case self.requests_patcher.stop() self.collector = cloud_facts.CloudFactsCollector( collected_hw_info={ "virt.is_guest": True, "dmi.bios.version": "Foo" }) facts = self.collector.get_all() self.assertNotIn("aws_instance_id", facts)