use context stuff for the snaplist snapd requests

This commit is contained in:
Michael Hudson-Doyle 2019-12-20 00:29:19 +13:00
parent dacd77f2be
commit 8fe1bffea1
1 changed files with 31 additions and 29 deletions

View File

@ -33,9 +33,10 @@ log = logging.getLogger('subiquity.controllers.snaplist')
class SnapdSnapInfoLoader: class SnapdSnapInfoLoader:
def __init__(self, model, snapd, store_section): def __init__(self, model, snapd, store_section, context):
self.model = model self.model = model
self.store_section = store_section self.store_section = store_section
self.context = context
self.main_task = None self.main_task = None
self.snap_list_fetched = False self.snap_list_fetched = False
@ -50,41 +51,42 @@ class SnapdSnapInfoLoader:
self.main_task = schedule_task(self._start()) self.main_task = schedule_task(self._start())
async def _start(self): async def _start(self):
task = self.tasks[None] = schedule_task(self._load_list()) with self.context:
await task task = self.tasks[None] = schedule_task(self._load_list())
self.pending_snaps = self.model.get_snap_list()
log.debug("fetched list of %s snaps", len(self.pending_snaps))
while self.pending_snaps:
snap = self.pending_snaps.pop(0)
task = self.tasks[snap] = schedule_task(
self._fetch_info_for_snap(snap))
await task await task
self.pending_snaps = self.model.get_snap_list()
log.debug("fetched list of %s snaps", len(self.pending_snaps))
while self.pending_snaps:
snap = self.pending_snaps.pop(0)
task = self.tasks[snap] = schedule_task(
self._fetch_info_for_snap(snap))
await task
async def _load_list(self): async def _load_list(self):
try: with self.context.child("list"):
result = await self.snapd.get( try:
'v2/find', section=self.store_section) result = await self.snapd.get(
except requests.exceptions.RequestException: 'v2/find', section=self.store_section)
log.exception("loading list of snaps failed") except requests.exceptions.RequestException:
self.failed = True log.exception("loading list of snaps failed")
return self.failed = True
self.model.load_find_data(result) return
self.snap_list_fetched = True self.model.load_find_data(result)
self.snap_list_fetched = True
def stop(self): def stop(self):
if self.main_task is not None: if self.main_task is not None:
self.main_task.cancel() self.main_task.cancel()
async def _fetch_info_for_snap(self, snap): async def _fetch_info_for_snap(self, snap):
log.debug('starting fetch for %s', snap.name) with self.context.child("fetch").child(snap.name):
try: try:
data = await self.snapd.get('v2/find', name=snap.name) data = await self.snapd.get('v2/find', name=snap.name)
except requests.exceptions.RequestException: except requests.exceptions.RequestException:
log.exception("loading snap info failed") log.exception("loading snap info failed")
# XXX something better here? # XXX something better here?
return return
log.debug('got data for %s', snap.name) self.model.load_info_data(data)
self.model.load_info_data(data)
def get_snap_list_task(self): def get_snap_list_task(self):
return self.tasks[None] return self.tasks[None]
@ -106,8 +108,8 @@ class SnapListController(BaseController):
def _make_loader(self): def _make_loader(self):
return SnapdSnapInfoLoader( return SnapdSnapInfoLoader(
self.model, self.app.snapd, self.model, self.app.snapd, self.opts.snap_section,
self.opts.snap_section) self.context.child("loader"))
def __init__(self, app): def __init__(self, app):
super().__init__(app) super().__init__(app)