[Fix] Fix two issues with redeploy

- The second time a server deployment is attempted, the
  tag providing kernel parameters wasn't applied. Change
  the logic so that the tag is recreated.
- If a node is found in 'Failed deployment' status, release it
  such that it can be retried.

Change-Id: I145f77458741caa0358887829c1209e25db5d9b1
This commit is contained in:
Scott Hussey 2018-03-15 09:48:54 -05:00
parent b628a1bfce
commit 8d2973081d
2 changed files with 50 additions and 20 deletions

View File

@ -957,6 +957,24 @@ class ApplyNodeNetworking(BaseMaasAction):
n, update_name=False)
if machine is not None:
if machine.status_name.startswith('Failed Dep'):
msg = ("Node %s has failed deployment, releasing to try again." % n.name)
self.logger.debug(msg)
try:
machine.release()
machine.refresh()
except errors.DriverError as ex:
msg = ("Node %s could not be released, skipping deployment." % n.name)
self.logger.info(msg)
self.task.add_status_msg(
msg=msg, error=True, ctx=n.name, ctx_type='node')
self.task.failure(focus=n.name)
continue
msg = ("Released failed node %s to retry deployment." % n.name)
self.logger.info(msg)
self.task.add_status_msg(
msg=msg, error=False, ctx=n.name, ctx_type='node')
if machine.status_name == 'Ready':
msg = "Located node %s in MaaS, starting interface configuration" % (
n.name)
@ -1327,26 +1345,20 @@ class ApplyNodePlatform(BaseMaasAction):
self.logger.info(
"Configuring kernel parameters for node %s" % (n.name))
if node_kp_tag is None:
msg = "Creating kernel_params tag for node %s: %s" % (
n.name, kp_string)
self.logger.debug(msg)
node_kp_tag = maas_tag.Tag(
self.maas_client,
name="%s_kp" % (n.name),
kernel_opts=kp_string)
node_kp_tag = tag_list.add(node_kp_tag)
node_kp_tag.apply_to_node(machine.resource_id)
self.task.add_status_msg(
msg=msg, error=False, ctx=n.name, ctx_type='node')
else:
msg = "Updating tag %s for node %s: %s" % (
node_kp_tag.resource_id, n.name, kp_string)
node_kp_tag.kernel_opts = kp_string
node_kp_tag.update()
self.logger.debug(msg)
self.task.add_status_msg(
msg=msg, error=False, ctx=n.name, ctx_type='node')
if node_kp_tag:
node_kp_tag.delete()
msg = "Creating kernel_params tag for node %s: %s" % (
n.name, kp_string)
self.logger.debug(msg)
node_kp_tag = maas_tag.Tag(
self.maas_client,
name="%s_kp" % (n.name),
kernel_opts=kp_string)
node_kp_tag = tag_list.add(node_kp_tag)
node_kp_tag.apply_to_node(machine.resource_id)
self.task.add_status_msg(
msg=msg, error=False, ctx=n.name, ctx_type='node')
msg = "Applied kernel parameters to node %s" % n.name
self.logger.info(msg)

View File

@ -202,6 +202,24 @@ class Machine(model_base.ResourceBase):
self.logger.error(msg)
raise errors.DriverError(msg)
def release(self, erase_disk=False):
"""Release a node so it can be redeployed.
:param erase_disk: If true, the local disks on the machine will be quick wiped
"""
url = self.interpolate_url()
options = {'erase': erase_disk}
resp = self.api_client.post(url, op='release', files=options)
if not resp.ok:
brief_msg = ("Error releasing node, received HTTP %s from MaaS" %
resp.status_code)
self.logger.error(brief_msg)
self.logger.debug("MaaS response: %s" % resp.text)
raise errors.DriverError(brief_msg)
def commission(self, debug=False):
"""Start the MaaS commissioning process.