def request_url(self, path, data=None, headers=None, method=None): path = path.lstrip("/") if not headers: headers = self.headers() if headers.get("content-type") == "application/json" and data: data = json.dumps(data).encode("utf-8") url = urljoin(getattr(self.cfg, self.cfg_url_base_attr), path) try: response, headers = util.readurl(url=url, data=data, headers=headers, method=method) except error.URLError as e: if hasattr(e, "read"): try: error_details = json.loads(e.read().decode("utf-8")) except ValueError: error_details = None if error_details: raise self.api_error_cls(e, error_details) raise util.UrlError(e, code=getattr(e, "code", None), headers=headers, url=url) return response, headers
def test_url_error_handled_gracefully( self, m_get_parser, _m_setup_logging, error_url, expected_log, capsys, logging_sandbox, caplog_text, ): m_args = m_get_parser.return_value.parse_args.return_value m_args.action.side_effect = util.UrlError(socket.gaierror( -2, "Name or service not known"), url=error_url) with pytest.raises(SystemExit) as excinfo: main(["some", "args"]) exc = excinfo.value assert 1 == exc.code out, err = capsys.readouterr() assert "" == out assert "{}\n".format(status.MESSAGE_CONNECTIVITY_ERROR) == err error_log = caplog_text() assert expected_log in error_log assert "Traceback (most recent call last):" in error_log
def test_error_on_connectivity_errors(self, m_getuid, m_get_avail_resources, capsys): """Raise UrlError on connectivity issues""" m_get_avail_resources.side_effect = util.UrlError( socket.gaierror(-2, "Name or service not known")) cfg = FakeConfig() with pytest.raises(util.UrlError): action_status(mock.MagicMock(), cfg)
def test_request_resources_error_on_network_disconnected( self, m_request_resources, FakeConfig): """Raise error get_available_resources can't contact backend""" cfg = FakeConfig() urlerror = util.UrlError( socket.gaierror(-2, "Name or service not known")) m_request_resources.side_effect = urlerror with pytest.raises(util.UrlError) as exc: get_available_resources(cfg) assert urlerror == exc.value
def fake_contract_client(cfg): fake_client = FakeContractClient(cfg) fake_client._responses = { API_V1_CONTEXT_MACHINE_TOKEN: ContractAPIError( util.UrlError( "Server error", code=500, url="http://me", headers={} ), error_response={ "message": "invalid token: checksum error" }, ) } return fake_client
def fake_contract_client(cfg): fake_client = FakeContractClient(cfg) fake_client._responses = { API_V1_CONTEXT_MACHINE_TOKEN: ContractAPIError( util.UrlError( "Server error", code=error_code, url="http://me", headers={}, ), error_response={"message": "unauthorized"}, ) } return fake_client
def test_aws_cloud_type_non_auto_attach_returns_no_token( self, _get_cloud_type, cloud_instance_factory, request_aws_contract_token, ): """AWS clouds on non-auto-attach images not return a token.""" cloud_instance_factory.side_effect = self.fake_instance_factory request_aws_contract_token.side_effect = ContractAPIError( util.UrlError("Server error", code=500, url="http://me", headers={}), error_response={"message": "missing instance information"}, ) with pytest.raises(NonAutoAttachImageError) as excinfo: _get_contract_token_from_cloud_identity(FakeConfig()) assert status.MESSAGE_UNSUPPORTED_AUTO_ATTACH == str(excinfo.value)
def request_url(self, path, data=None, headers=None, method=None): path = path.lstrip('/') if not headers: headers = self.headers() if headers.get('content-type') == 'application/json' and data: data = json.dumps(data).encode('utf-8') url = urljoin(getattr(self.cfg, self.cfg_url_base_attr), path) try: response, headers = util.readurl(url=url, data=data, headers=headers, method=method) except error.URLError as e: code = e.errno if hasattr(e, 'read'): error_details = util.maybe_parse_json(e.read().decode('utf-8')) if error_details: raise self.api_error_cls(e, error_details) raise util.UrlError(e, code=code, headers=headers, url=url) return response, headers
def test_raise_unexpected_errors( self, _get_cloud_type, cloud_instance_factory, request_auto_attach_contract_token, FakeConfig, ): """Any unexpected errors will be raised.""" cloud_instance_factory.side_effect = self.fake_instance_factory unexpected_error = ContractAPIError( util.UrlError( "Server error", code=500, url="http://me", headers={} ), error_response={"message": "something unexpected"}, ) request_auto_attach_contract_token.side_effect = unexpected_error with pytest.raises(ContractAPIError) as excinfo: _get_contract_token_from_cloud_identity(FakeConfig()) assert unexpected_error == excinfo.value
def request_url(self, path, data=None, headers=None, method=None): if path[0] != '/': path = '/' + path if not headers: headers = self.headers() if headers.get('content-type') == 'application/json' and data: data = util.encode_text(json.dumps(data)) url = getattr(self.cfg, self.cfg_url_base_attr) + path try: response, headers = util.readurl(url=url, data=data, headers=headers, method=method) except error.URLError as e: code = e.errno if hasattr(e, 'read'): error_details = util.maybe_parse_json(e.read()) if error_details: raise self.api_error_cls(e, error_details) raise util.UrlError(e, code=code, headers=headers, url=url) return response, headers
def test_aws_cloud_type_non_auto_attach_returns_no_token( self, cloud_instance_factory, get_instance_id, request_auto_attach_contract_token, http_msg, http_code, http_response, FakeConfig, ): """VMs running on non-auto-attach images do not return a token.""" cloud_instance_factory.side_effect = self.fake_instance_factory request_auto_attach_contract_token.side_effect = ContractAPIError( util.UrlError( http_msg, code=http_code, url="http://me", headers={} ), error_response=http_response, ) with pytest.raises(NonAutoAttachImageError) as excinfo: _get_contract_token_from_cloud_identity(FakeConfig()) assert status.MESSAGE_UNSUPPORTED_AUTO_ATTACH == str(excinfo.value)