|
| 1 | +from clustersConfig import ClustersConfig |
| 2 | +import host |
| 3 | +from logger import logger |
| 4 | +from clustersConfig import ExtraConfigArgs |
| 5 | +from bmc import BMC |
| 6 | +from concurrent.futures import Future |
| 7 | +from typing import Optional |
| 8 | +import time |
| 9 | + |
| 10 | +LATEST_MEV_FW = "1.8.0.10052" |
| 11 | + |
| 12 | + |
| 13 | +def ExtraConfigMevFwUp(cc: ClustersConfig, cfg: ExtraConfigArgs, futures: dict[str, Future[Optional[host.Result]]]) -> None: |
| 14 | + logger.info("Running pre config step to flash MeV firmware on IPU IMC") |
| 15 | + |
| 16 | + # This preconfig step is expected to run on an IMC only |
| 17 | + assert cc.kind == "iso" |
| 18 | + master = cc.masters[0] |
| 19 | + assert master.kind == "ipu" |
| 20 | + assert master.host_side_bmc is not None |
| 21 | + imc = host.Host(master.bmc) |
| 22 | + |
| 23 | + # Check if a particular firmware version is being requested or if we will use default |
| 24 | + if cfg.mev_version == "": |
| 25 | + logger.info("Desired MeV fw release not specified, will install the latest by default") |
| 26 | + cfg.mev_version = LATEST_MEV_FW |
| 27 | + logger.info(f"Will ensure {master.bmc} is on firmware version: {cfg.mev_version}") |
| 28 | + |
| 29 | + # We should only perform an update if it is required, or if the user insists we do so |
| 30 | + if not cfg.force_mev_fw_up: |
| 31 | + logger.info("Checking if firmware update is required") |
| 32 | + if imc.ping(): |
| 33 | + imc.ssh_connect(master.bmc_user, master.bmc_password) |
| 34 | + ret = imc.run("cat /etc/issue.net") |
| 35 | + if cfg.mev_version in ret.out: |
| 36 | + logger.info(f"Current MeV fw version is {cfg.mev_version}, no need to update") |
| 37 | + return |
| 38 | + |
| 39 | + # Perform upgrade |
| 40 | + lh = host.LocalHost() |
| 41 | + |
| 42 | + fw_up_cmd = f"--dpu-type ipu --imc-address {master.bmc} firmware up --version {cfg.mev_version}" |
| 43 | + |
| 44 | + ret = lh.run_in_container(fw_up_cmd, interactive=True) |
| 45 | + |
| 46 | + if not ret.success(): |
| 47 | + logger.error_and_exit(f"Failed to flash new firmware. Error: {ret.err}") |
| 48 | + |
| 49 | + # Perform coldboot to apply the change |
| 50 | + ipu_host_bmc = BMC.from_bmc(master.host_side_bmc) |
| 51 | + ipu_host_bmc.cold_boot() |
| 52 | + # Cold boot should also reboot IMC, give time to settle before trying to ping IMC |
| 53 | + time.sleep(20) |
| 54 | + |
| 55 | + # Access the IMC to validate the flash was successful |
| 56 | + imc.ssh_connect(master.bmc_user, master.bmc_password) |
| 57 | + ret = imc.run("cat /etc/issue.net") |
| 58 | + if cfg.mev_version not in ret.out or ret.returncode != 0: |
| 59 | + logger.error_and_exit(f"Mev firmware release is not the expected version: {ret.out}") |
| 60 | + |
| 61 | + logger.info("MeV firmware flash complete") |
0 commit comments