Make device alias resolution optional

When compiling an effective site design, make
the step for resolving device aliases optional
as only a few tasks need this information but it
takes a large amount of the time.

Change-Id: I9f1090de0ec26887217be80567367547306b3905
This commit is contained in:
Scott Hussey 2018-06-27 15:25:39 -05:00
parent 754d4b45b0
commit 541b2d413c
5 changed files with 18 additions and 13 deletions

View File

@ -1281,7 +1281,7 @@ class ApplyNodeNetworking(BaseMaasAction):
self.task.save() self.task.save()
try: try:
site_design = self._load_site_design() site_design = self._load_site_design(resolve_aliases=True)
except errors.OrchestratorError: except errors.OrchestratorError:
self.task.add_status_msg( self.task.add_status_msg(
msg="Error loading site design.", msg="Error loading site design.",
@ -1819,7 +1819,7 @@ class ApplyNodeStorage(BaseMaasAction):
self.task.save() self.task.save()
try: try:
site_design = self._load_site_design() site_design = self._load_site_design(resolve_aliases=True)
except errors.OrchestratorError: except errors.OrchestratorError:
self.task.add_status_msg( self.task.add_status_msg(
msg="Error loading site design.", msg="Error loading site design.",

View File

@ -49,7 +49,7 @@ class BaremetalNode(drydock_provisioner.objects.hostprofile.HostProfile):
# Compile the applied version of this model sourcing referenced # Compile the applied version of this model sourcing referenced
# data from the passed site design # data from the passed site design
def compile_applied_model(self, site_design, state_manager): def compile_applied_model(self, site_design, state_manager, resolve_aliases=False):
self.logger.debug("Applying host profile to node %s" % self.name) self.logger.debug("Applying host profile to node %s" % self.name)
self.apply_host_profile(site_design) self.apply_host_profile(site_design)
self.logger.debug("Applying hardware profile to node %s" % self.name) self.logger.debug("Applying hardware profile to node %s" % self.name)
@ -57,8 +57,9 @@ class BaremetalNode(drydock_provisioner.objects.hostprofile.HostProfile):
self.source = hd_fields.ModelSource.Compiled self.source = hd_fields.ModelSource.Compiled
self.logger.debug("Resolving kernel parameters on node %s" % self.name) self.logger.debug("Resolving kernel parameters on node %s" % self.name)
self.resolve_kernel_params(site_design) self.resolve_kernel_params(site_design)
self.logger.debug("Resolving device aliases on node %s" % self.name) if resolve_aliases:
self.apply_logicalnames(site_design, state_manager) self.logger.debug("Resolving device aliases on node %s" % self.name)
self.apply_logicalnames(site_design, state_manager)
return return
def apply_host_profile(self, site_design): def apply_host_profile(self, site_design):

View File

@ -131,15 +131,18 @@ class BaseAction(object):
self.task.align_result() self.task.align_result()
return return
def _load_site_design(self): def _load_site_design(self, resolve_aliases=False):
"""Load the site design from this action's task. """Load the site design from this action's task.
The design_ref in the task can be resolved to a set of design documents The design_ref in the task can be resolved to a set of design documents
that reflect the site design to be operated on. Load this design for use that reflect the site design to be operated on. Load this design for use
by this action. by this action.
:param resolve_aliases: boolean on whether to resolve device aliases, defaults
to False
""" """
design_status, site_design = self.orchestrator.get_effective_site( design_status, site_design = self.orchestrator.get_effective_site(
self.task.design_ref) self.task.design_ref, resolve_aliases=resolve_aliases)
if design_status is None or design_status.status == hd_fields.ActionResult.Failure: if design_status is None or design_status.status == hd_fields.ActionResult.Failure:
raise errors.OrchestratorError("Site design failed load.") raise errors.OrchestratorError("Site design failed load.")

View File

@ -241,7 +241,7 @@ class Orchestrator(object):
return new_task return new_task
def compute_model_inheritance(self, site_design): def compute_model_inheritance(self, site_design, resolve_aliases=False):
"""Compute inheritance of the design model. """Compute inheritance of the design model.
Given a fully populated Site model, compute the effective Given a fully populated Site model, compute the effective
@ -254,7 +254,9 @@ class Orchestrator(object):
for n in nodes or []: for n in nodes or []:
try: try:
n.compile_applied_model( n.compile_applied_model(
site_design, state_manager=self.state_manager) site_design,
state_manager=self.state_manager,
resolve_aliases=resolve_aliases)
except Exception as ex: except Exception as ex:
node_failed.append(n) node_failed.append(n)
self.logger.error( self.logger.error(
@ -283,7 +285,7 @@ class Orchestrator(object):
return status, site_design return status, site_design
def get_effective_site(self, design_ref): def get_effective_site(self, design_ref, resolve_aliases=False):
"""Ingest design data and compile the effective model of the design. """Ingest design data and compile the effective model of the design.
Return a tuple of the processing status and the populated instance Return a tuple of the processing status and the populated instance
@ -297,7 +299,7 @@ class Orchestrator(object):
try: try:
status, site_design = self.get_described_site(design_ref) status, site_design = self.get_described_site(design_ref)
if status.status == hd_fields.ValidationResult.Success: if status.status == hd_fields.ValidationResult.Success:
self.compute_model_inheritance(site_design) self.compute_model_inheritance(site_design, resolve_aliases=resolve_aliases)
self.compute_bootaction_targets(site_design) self.compute_bootaction_targets(site_design)
self.render_route_domains(site_design) self.render_route_domains(site_design)
status = val.validate_design(site_design, result_status=status) status = val.validate_design(site_design, result_status=status)

View File

@ -140,10 +140,9 @@ class TestClass(object):
drydock_state.get_build_data = Mock(side_effect=side_effect) drydock_state.get_build_data = Mock(side_effect=side_effect)
design_status, design_data = deckhand_orchestrator.get_effective_site( design_status, design_data = deckhand_orchestrator.get_effective_site(
design_ref) design_ref, resolve_aliases=True)
nodes = design_data.baremetal_nodes nodes = design_data.baremetal_nodes
nodes[0].apply_logicalnames(design_data, state_manager=drydock_state)
expected = { expected = {
'primary_boot': 'sda', 'primary_boot': 'sda',