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)
Ejemplo n.º 2
0
 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)
Ejemplo n.º 6
0
 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)
Ejemplo n.º 7
0
 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)
Ejemplo n.º 8
0
    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)
Ejemplo n.º 9
0
 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)
Ejemplo n.º 10
0
    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)