Merge pull request #964 from mwhudson/network-error-reports

handle some networking errors better
This commit is contained in:
Michael Hudson-Doyle 2021-06-02 13:44:26 +12:00 committed by GitHub
commit 5b7409750e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 25 additions and 6 deletions

View File

@ -19,6 +19,8 @@ import shutil
import tempfile import tempfile
from typing import List, Optional from typing import List, Optional
from aiohttp import web
from subiquitycore.controllers.network import NetworkAnswersMixin from subiquitycore.controllers.network import NetworkAnswersMixin
from subiquitycore.models.network import ( from subiquitycore.models.network import (
BondConfig, BondConfig,
@ -30,6 +32,7 @@ from subiquitycore.ui.views.network import NetworkView
from subiquity.client.controller import SubiquityTuiController from subiquity.client.controller import SubiquityTuiController
from subiquity.common.api.server import make_server_at_path from subiquity.common.api.server import make_server_at_path
from subiquity.common.apidef import LinkAction, NetEventAPI from subiquity.common.apidef import LinkAction, NetEventAPI
from subiquity.common.types import ErrorReportKind
log = logging.getLogger('subiquity.client.controllers.network') log = logging.getLogger('subiquity.client.controllers.network')
@ -42,6 +45,19 @@ class NetworkController(SubiquityTuiController, NetworkAnswersMixin):
super().__init__(app) super().__init__(app)
self.view = None self.view = None
@web.middleware
async def middleware(self, request, handler):
resp = await handler(request)
if resp.get('exception'):
exc = resp['exception']
log.debug(
'request to {} crashed'.format(request.raw_path), exc_info=exc)
self.app.make_apport_report(
ErrorReportKind.NETWORK_CLIENT_FAIL,
"request to {}".format(request.raw_path),
exc=exc, interrupt=True)
return resp
async def update_link_POST(self, act: LinkAction, async def update_link_POST(self, act: LinkAction,
info: NetDevInfo) -> None: info: NetDevInfo) -> None:
if self.view is None: if self.view is None:
@ -73,7 +89,7 @@ class NetworkController(SubiquityTuiController, NetworkAnswersMixin):
self.tdir = tempfile.mkdtemp() self.tdir = tempfile.mkdtemp()
self.sock_path = os.path.join(self.tdir, 'socket') self.sock_path = os.path.join(self.tdir, 'socket')
self.site = await make_server_at_path( self.site = await make_server_at_path(
self.sock_path, NetEventAPI, self) self.sock_path, NetEventAPI, self, middlewares=[self.middleware])
await self.endpoint.subscription.PUT(self.sock_path) await self.endpoint.subscription.PUT(self.sock_path)
async def unsubscribe(self): async def unsubscribe(self):

View File

@ -168,8 +168,8 @@ def bind(router, endpoint, controller, serializer=None, _depth=None):
handler=_make_handler(controller, v, impl, serializer)) handler=_make_handler(controller, v, impl, serializer))
async def make_server_at_path(socket_path, endpoint, controller): async def make_server_at_path(socket_path, endpoint, controller, **kw):
app = web.Application() app = web.Application(**kw)
bind(app.router, endpoint, controller) bind(app.router, endpoint, controller)
runner = web.AppRunner(app) runner = web.AppRunner(app)
await runner.setup() await runner.setup()

View File

@ -39,6 +39,7 @@ class ErrorReportKind(enum.Enum):
INSTALL_FAIL = _("Install failure") INSTALL_FAIL = _("Install failure")
UI = _("Installer crash") UI = _("Installer crash")
NETWORK_FAIL = _("Network error") NETWORK_FAIL = _("Network error")
NETWORK_CLIENT_FAIL = _("Network client error")
SERVER_REQUEST_FAIL = _("Server request failure") SERVER_REQUEST_FAIL = _("Server request failure")
UNKNOWN = _("Unknown error") UNKNOWN = _("Unknown error")

View File

@ -184,8 +184,7 @@ class NetworkController(BaseNetworkController, SubiquityController):
log.exception("_apply_config failed") log.exception("_apply_config failed")
self.model.has_network = False self.model.has_network = False
self.app.make_apport_report( self.app.make_apport_report(
ErrorReportKind.NETWORK_FAIL, "applying network", ErrorReportKind.NETWORK_FAIL, "applying network")
interrupt=True)
if not self.interactive(): if not self.interactive():
raise raise
@ -239,7 +238,10 @@ class NetworkController(BaseNetworkController, SubiquityController):
if conn.closed: if conn.closed:
log.debug('closed') log.debug('closed')
return return
await getattr(client, meth_name).POST(*args) try:
await getattr(client, meth_name).POST(*args)
except aiohttp.ClientError:
log.exception("call to %s on %s failed", meth_name, conn.path)
def _call_clients(self, meth_name, *args): def _call_clients(self, meth_name, *args):
for client, conn, lock in self.clients.values(): for client, conn, lock in self.clients.values():