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()
try:
site_design = self._load_site_design()
site_design = self._load_site_design(resolve_aliases=True)
except errors.OrchestratorError:
self.task.add_status_msg(
msg="Error loading site design.",
@ -1819,7 +1819,7 @@ class ApplyNodeStorage(BaseMaasAction):
self.task.save()
try:
site_design = self._load_site_design()
site_design = self._load_site_design(resolve_aliases=True)
except errors.OrchestratorError:
self.task.add_status_msg(
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
# 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.apply_host_profile(site_design)
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.logger.debug("Resolving kernel parameters on node %s" % self.name)
self.resolve_kernel_params(site_design)
self.logger.debug("Resolving device aliases on node %s" % self.name)
self.apply_logicalnames(site_design, state_manager)
if resolve_aliases:
self.logger.debug("Resolving device aliases on node %s" % self.name)
self.apply_logicalnames(site_design, state_manager)
return
def apply_host_profile(self, site_design):

View File

@ -131,15 +131,18 @@ class BaseAction(object):
self.task.align_result()
return
def _load_site_design(self):
def _load_site_design(self, resolve_aliases=False):
"""Load the site design from this action's task.
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
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(
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:
raise errors.OrchestratorError("Site design failed load.")

View File

@ -241,7 +241,7 @@ class Orchestrator(object):
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.
Given a fully populated Site model, compute the effective
@ -254,7 +254,9 @@ class Orchestrator(object):
for n in nodes or []:
try:
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:
node_failed.append(n)
self.logger.error(
@ -283,7 +285,7 @@ class Orchestrator(object):
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.
Return a tuple of the processing status and the populated instance
@ -297,7 +299,7 @@ class Orchestrator(object):
try:
status, site_design = self.get_described_site(design_ref)
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.render_route_domains(site_design)
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)
design_status, design_data = deckhand_orchestrator.get_effective_site(
design_ref)
design_ref, resolve_aliases=True)
nodes = design_data.baremetal_nodes
nodes[0].apply_logicalnames(design_data, state_manager=drydock_state)
expected = {
'primary_boot': 'sda',