Exemplo n.º 1
0
    def _assert_validation(self, http_status_code, http_response,
                           expected_valid, expected_response):
        test_subject = imds.ImdsClient(restutil.KNOWN_WIRESERVER_IP)
        with patch("azurelinuxagent.common.utils.restutil.http_get"
                   ) as mock_http_get:
            mock_http_get.return_value = ResponseMock(status=http_status_code,
                                                      reason='reason',
                                                      response=http_response)
            validate_response = test_subject.validate()

        self.assertEqual(1, mock_http_get.call_count)
        positional_args, kw_args = mock_http_get.call_args

        self.assertTrue('User-Agent' in kw_args['headers'])
        self.assertEqual(restutil.HTTP_USER_AGENT_HEALTH,
                         kw_args['headers']['User-Agent'])
        self.assertTrue('Metadata' in kw_args['headers'])
        self.assertEqual(True, kw_args['headers']['Metadata'])
        self.assertEqual(
            'http://169.254.169.254/metadata/instance?api-version=2018-02-01',
            positional_args[0])
        self.assertEqual(expected_valid, validate_response[0])
        self.assertTrue(
            expected_response in validate_response[1],
            "Expected: '{0}', Actual: '{1}'".format(expected_response,
                                                    validate_response[1]))
    def test_get(self, mock_http_get):
        mock_http_get.return_value = ResponseMock(response='''{
        "location": "westcentralus",
        "name": "unit_test",
        "offer": "UnitOffer",
        "osType": "Linux",
        "placementGroupId": "",
        "platformFaultDomain": "0",
        "platformUpdateDomain": "0",
        "publisher": "UnitPublisher",
        "resourceGroupName": "UnitResourceGroupName",
        "sku": "UnitSku",
        "subscriptionId": "e4402c6c-2804-4a0a-9dee-d61918fc4d28",
        "tags": "Key1:Value1;Key2:Value2",
        "vmId": "f62f23fb-69e2-4df0-a20b-cb5c201a3e7a",
        "version": "UnitVersion",
        "vmSize": "Standard_D1_v2"
        }'''.encode('utf-8'))

        test_subject = imds.ImdsClient()
        test_subject.get_compute()

        self.assertEqual(1, mock_http_get.call_count)
        positional_args, kw_args = mock_http_get.call_args

        self.assertEqual(
            'http://169.254.169.254/metadata/instance/compute?api-version=2018-02-01',
            positional_args[0])
        self.assertTrue('User-Agent' in kw_args['headers'])
        self.assertTrue('Metadata' in kw_args['headers'])
        self.assertEqual(True, kw_args['headers']['Metadata'])
Exemplo n.º 3
0
    def test_get(self, mock_http_get):
        mock_http_get.return_value = get_mock_compute_response()

        test_subject = imds.ImdsClient(restutil.KNOWN_WIRESERVER_IP)
        test_subject.get_compute()

        self.assertEqual(1, mock_http_get.call_count)
        positional_args, kw_args = mock_http_get.call_args

        self.assertEqual('http://169.254.169.254/metadata/instance/compute?api-version=2018-02-01', positional_args[0])
        self.assertTrue('User-Agent' in kw_args['headers'])
        self.assertTrue('Metadata' in kw_args['headers'])
        self.assertEqual(True, kw_args['headers']['Metadata'])
Exemplo n.º 4
0
    def test_get_empty_response(self, mock_http_get):
        mock_http_get.return_value = ResponseMock(response=''.encode('utf-8'))

        test_subject = imds.ImdsClient(restutil.KNOWN_WIRESERVER_IP)
        self.assertRaises(ValueError, test_subject.get_compute)
Exemplo n.º 5
0
    def test_get_internal_service_error(self, mock_http_get):
        mock_http_get.return_value = ResponseMock(status=restutil.httpclient.INTERNAL_SERVER_ERROR)

        test_subject = imds.ImdsClient(restutil.KNOWN_WIRESERVER_IP)
        self.assertRaises(HttpError, test_subject.get_compute)
Exemplo n.º 6
0
    def test_get_bad_request(self, mock_http_get):
        mock_http_get.return_value = ResponseMock(status=restutil.httpclient.BAD_REQUEST)

        test_subject = imds.ImdsClient(restutil.KNOWN_WIRESERVER_IP)
        self.assertRaises(HttpError, test_subject.get_compute)
Exemplo n.º 7
0
    def test_endpoint_fallback(self):
        # http error status codes are tested in test_response_validation, none of which
        # should trigger a fallback. This is confirmed as _assert_validation will count
        # http GET calls and enforces a single GET call (fallback would cause 2) and
        # checks the url called.

        test_subject = imds.ImdsClient("foo.bar")

        # ensure user-agent gets set correctly
        for is_health, expected_useragent in [(False, restutil.HTTP_USER_AGENT), (True, restutil.HTTP_USER_AGENT_HEALTH)]:
            # set a different resource path for health query to make debugging unit test easier
            resource_path = 'something/health' if is_health else 'something'

            for has_primary_ioerror in (False, True):
                # secondary endpoint unreachable
                test_subject._http_get = Mock(side_effect=self._mock_http_get)
                self._mock_imds_setup(primary_ioerror=has_primary_ioerror, secondary_ioerror=True)
                result = test_subject.get_metadata(resource_path=resource_path, is_health=is_health)
                self.assertFalse(result.success) if has_primary_ioerror else self.assertTrue(result.success)
                self.assertFalse(result.service_error)
                if has_primary_ioerror:
                    self.assertEqual('IMDS error in /metadata/{0}: Unable to connect to endpoint'.format(resource_path), result.response)
                else:
                    self.assertEqual('Mock success response', result.response)
                for _, kwargs in test_subject._http_get.call_args_list:
                    self.assertTrue('User-Agent' in kwargs['headers'])
                    self.assertEqual(expected_useragent, kwargs['headers']['User-Agent'])
                self.assertEqual(2 if has_primary_ioerror else 1, test_subject._http_get.call_count)

                # IMDS success
                test_subject._http_get = Mock(side_effect=self._mock_http_get)
                self._mock_imds_setup(primary_ioerror=has_primary_ioerror)
                result = test_subject.get_metadata(resource_path=resource_path, is_health=is_health)
                self.assertTrue(result.success)
                self.assertFalse(result.service_error)
                self.assertEqual('Mock success response', result.response)
                for _, kwargs in test_subject._http_get.call_args_list:
                    self.assertTrue('User-Agent' in kwargs['headers'])
                    self.assertEqual(expected_useragent, kwargs['headers']['User-Agent'])
                self.assertEqual(2 if has_primary_ioerror else 1, test_subject._http_get.call_count)

                # IMDS throttled
                test_subject._http_get = Mock(side_effect=self._mock_http_get)
                self._mock_imds_setup(primary_ioerror=has_primary_ioerror, throttled=True)
                result = test_subject.get_metadata(resource_path=resource_path, is_health=is_health)
                self.assertFalse(result.success)
                self.assertFalse(result.service_error)
                self.assertEqual('IMDS error in /metadata/{0}: Throttled'.format(resource_path), result.response)
                for _, kwargs in test_subject._http_get.call_args_list:
                    self.assertTrue('User-Agent' in kwargs['headers'])
                    self.assertEqual(expected_useragent, kwargs['headers']['User-Agent'])
                self.assertEqual(2 if has_primary_ioerror else 1, test_subject._http_get.call_count)

                # IMDS gone error
                test_subject._http_get = Mock(side_effect=self._mock_http_get)
                self._mock_imds_setup(primary_ioerror=has_primary_ioerror, gone_error=True)
                result = test_subject.get_metadata(resource_path=resource_path, is_health=is_health)
                self.assertFalse(result.success)
                self.assertTrue(result.service_error)
                self.assertEqual('IMDS error in /metadata/{0}: HTTP Failed with Status Code 410: Gone'.format(resource_path), result.response)
                for _, kwargs in test_subject._http_get.call_args_list:
                    self.assertTrue('User-Agent' in kwargs['headers'])
                    self.assertEqual(expected_useragent, kwargs['headers']['User-Agent'])
                self.assertEqual(2 if has_primary_ioerror else 1, test_subject._http_get.call_count)

                # IMDS bad request
                test_subject._http_get = Mock(side_effect=self._mock_http_get)
                self._mock_imds_setup(primary_ioerror=has_primary_ioerror, bad_request=True)
                result = test_subject.get_metadata(resource_path=resource_path, is_health=is_health)
                self.assertFalse(result.success)
                self.assertFalse(result.service_error)
                self.assertEqual('IMDS error in /metadata/{0}: [HTTP Failed] [404: reason] Mock not found'.format(resource_path), result.response)
                for _, kwargs in test_subject._http_get.call_args_list:
                    self.assertTrue('User-Agent' in kwargs['headers'])
                    self.assertEqual(expected_useragent, kwargs['headers']['User-Agent'])
                self.assertEqual(2 if has_primary_ioerror else 1, test_subject._http_get.call_count)