48df9fd6f5
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
58 lines
2.1 KiB
Diff
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.
|