Esempio n. 1
0
 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)
Esempio n. 4
0
    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
Esempio n. 5
0
 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)
Esempio n. 8
0
 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)