Add websockets progress, "multi-system" support for upgrades

and related things to better support that
This commit is contained in:
Lance Edgar 2022-08-20 17:39:33 -05:00
parent db3f215ebe
commit 18cec49a86
12 changed files with 731 additions and 114 deletions

View file

@ -1790,14 +1790,28 @@ class MasterView(View):
"""
obj = self.get_instance()
model_title = self.get_model_title()
progress = self.make_execute_progress(obj)
# caller must explicitly request websocket behavior; otherwise
# we will assume traditional behavior for progress
ws = self.request.is_xhr and self.request.json_body.get('ws')
# make our progress tracker
progress = self.make_execute_progress(obj, ws=ws)
# start execution in a separate thread
kwargs = {'progress': progress}
key = [self.request.matchdict[k]
for k in self.get_model_key(as_tuple=True)]
thread = Thread(target=self.execute_thread, args=(key, self.request.user.uuid), kwargs=kwargs)
thread = Thread(target=self.execute_thread,
args=(key, self.request.user.uuid),
kwargs=kwargs)
thread.start()
# we're done here if using websockets
if ws:
return self.json_response({'ok': True})
# traditional behavior sends user to dedicated progress page
return self.render_progress(progress, {
'instance': obj,
'initial_msg': self.execute_progress_initial_msg,
@ -1805,9 +1819,12 @@ class MasterView(View):
'cancel_msg': "{} execution was canceled".format(model_title),
}, template=self.execute_progress_template)
def make_execute_progress(self, obj):
key = '{}.execute'.format(self.get_grid_key())
return self.make_progress(key)
def make_execute_progress(self, obj, ws=False):
if ws:
key = '{}.{}.execution_progress'.format(self.get_route_prefix(), obj.uuid)
else:
key = '{}.execute'.format(self.get_grid_key())
return self.make_progress(key, ws=ws)
def get_instance_for_key(self, key, session):
model_key = self.get_model_key(as_tuple=True)