maas/images/maas-region-controller/2.3_configure_ipmi_user.patch
Carter, Matt (mc981n) 48df9fd6f5 Add retries to MaaS BMC user configuration
It has been observed that MaaS will fail to enlist/commission/deploy
nodes if it fails to set up its own user in the BMC during cloud
init. This patch set adds a git patch file to update the MaaS source
code in order to retry setting up the MaaS BMC user if it fails.

This patch set also adds to the exception message sent when MaaS
fails to set up a BMC user.

Change-Id: I475988875acffac620302fae3eed8d236a5a46f7
2019-09-17 15:49:46 -05:00

58 lines
2.1 KiB
Diff

diff --git a/src/metadataserver/user_data/templates/snippets/maas_ipmi_autodetect.py b/src/metadataserver/user_data/templates/snippets/maas_ipmi_autodetect.py
index e2c3ce5..7370963 100644
--- a/src/metadataserver/user_data/templates/snippets/maas_ipmi_autodetect.py
+++ b/src/metadataserver/user_data/templates/snippets/maas_ipmi_autodetect.py
@@ -229,17 +229,40 @@ def make_ipmi_user_settings(username, password):
return user_settings
+def configure_ipmi_user_with_backoff(username):
+ """Create/configure an IPMI user, but with several tries"""
+ attempt = 1
+ max_attempts = 5
+ backoff_amount = 30
+ while attempt <= max_attempts:
+ password = None
+ try:
+ password = configure_ipmi_user(username)
+ except:
+ if (attempt + 1) > max_attempts:
+ # This is our last attempt, don't catch anything:
+ raise
+
+ if password is None:
+ time.sleep(attempt * backoff_amount)
+ else:
+ return password
+ attempt += 1
+
+
def configure_ipmi_user(username):
"""Create or configure an IPMI user for remote use."""
+ exceptions_caught = []
for password in [generate_random_password(),
generate_random_password(with_special_chars=True)]:
user_settings = make_ipmi_user_settings(username, password)
try:
apply_ipmi_user_settings(user_settings)
return password
- except subprocess.CalledProcessError:
- pass
- raise IPMIError("Unable to set BMC password.")
+ except subprocess.CalledProcessError as e:
+ exceptions_caught.append(e)
+ raise IPMIError(
+ "Unable to set BMC password:\n{}".format(exceptions_caught))
def set_ipmi_lan_channel_settings():
@@ -357,7 +380,7 @@ def main():
IPMI_MAAS_USER = "maas"
IPMI_MAAS_PASSWORD = None
- IPMI_MAAS_PASSWORD = configure_ipmi_user(IPMI_MAAS_USER)
+ IPMI_MAAS_PASSWORD = configure_ipmi_user_with_backoff(IPMI_MAAS_USER)
# Attempt to enable IPMI Over Lan. If it is disabled, MAAS won't
# be able to remotely communicate to the BMC.