Skip to content

Commit

Permalink
source: do not fire a configured event again if nothing changed
Browse files Browse the repository at this point in the history
When handling a POST request to /source, Subiquity sends a 'source
configured' event. This signals other controllers / models that they
need to restart their tasks that depend on the source being used.

However, if the user of the installer goes back all the way to the
source page and submits it again without changing the settings, there
should be no reason to restart the machinery.

If a call to source ends up doing no modification to the model (i.e.,
not changing the source used or the search_drivers setting), we now
avoid emitting the 'source configured' event ; except if the model has
not been configured yet.

Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
  • Loading branch information
ogayot committed Oct 2, 2023
1 parent bd52c48 commit fff2f65
Showing 1 changed file with 25 additions and 5 deletions.
30 changes: 25 additions & 5 deletions subiquity/server/controllers/source.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

import contextlib
import logging
import os
from typing import Any, Optional
Expand Down Expand Up @@ -79,6 +78,7 @@ def __init__(self, app):
self._handler = None
self.source_path: Optional[str] = None
self.ai_source_id: Optional[str] = None
self._configured: bool = False

def make_autoinstall(self):
return {
Expand Down Expand Up @@ -148,10 +148,30 @@ def get_handler(

async def configured(self):
await super().configured()
self._configured = True
self.app.base_model.set_source_variant(self.model.current.variant)

async def POST(self, source_id: str, search_drivers: bool = False) -> None:
self.model.search_drivers = search_drivers
with contextlib.suppress(KeyError):
self.model.current = self.model.get_matching_source(source_id)
await self.configured()
# Marking the source model configured has an effect on many of the
# other controllers. Oftentimes, it would involve cancelling and
# restarting various operations.
# Let's try not to trigger the event again if we are not changing any
# of the settings.
changed = False
if self.model.search_drivers != search_drivers:
changed = True
self.model.search_drivers = search_drivers

try:
new_source = self.model.get_matching_source(source_id)
except KeyError:
# TODO going forward, we should probably stop silently ignoring
# unmatched sources.
pass
else:
if self.model.current != new_source:
changed = True
self.model.current = new_source

if changed or not self._configured:
await self.configured()

0 comments on commit fff2f65

Please sign in to comment.