class OpTestOpenBMC(): def __init__(self, ip=None, username=None, password=None, ipmi=None, rest_api=None, logfile=sys.stdout, check_ssh_keys=False, known_hosts_file=None): self.hostname = ip self.username = username self.password = password self.ipmi = ipmi self.rest_api = rest_api self.has_vpnor = None self.logfile = logfile self.console = OpTestSSH(ip, username, password, port=2200, logfile=self.logfile, check_ssh_keys=check_ssh_keys, known_hosts_file=known_hosts_file) self.bmc = OpTestBMC(ip=self.hostname, username=self.username, password=self.password, logfile=self.logfile, check_ssh_keys=check_ssh_keys, known_hosts_file=known_hosts_file) def set_system(self, system): self.console.set_system(system) self.bmc.set_system(system) def has_new_pnor_code_update(self, minutes=BMC_CONST.HTTP_RETRY): if self.has_vpnor is not None: return self.has_vpnor has_local_share_pnor = True try: self.bmc.run_command("ls -1 /usr/local/share/pnor") except CommandFailed: has_local_share_pnor = False has_pflash = self.bmc.validate_pflash_tool() # As of April 2019, now there's APIs for machies using the non-vpnor # layout. So our previosu logic of assuming that we should use pflash # only if the API is not there is now invalid. # So we have to guess, as there's no real good documented way to work # out what to do. if not has_local_share_pnor and has_pflash: return False list = self.rest_api.get_list_of_image_ids(minutes=minutes) for id in list: i = self.rest_api.image_data(id) if i['data'].get('Purpose') == 'xyz.openbmc_project.Software.Version.VersionPurpose.Host': log.debug("Host image") self.has_vpnor = True return True log.debug("# Checking for pflash on BMC to determine update method") self.has_vpnor = not self.bmc.validate_pflash_tool() return self.has_vpnor def reboot(self): self.bmc.reboot() # After a BMC reboot, wait for it to reach ready state self.rest_api.wait_for_bmc_runtime() def image_transfer(self, i_imageName, copy_as=None): self.bmc.image_transfer(i_imageName, copy_as=copy_as) def pnor_img_flash_openbmc(self, pnor_name): self.bmc.pnor_img_flash_openbmc(pnor_name) def skiboot_img_flash_openbmc(self, lid_name): if not self.has_new_pnor_code_update(): self.bmc.skiboot_img_flash_openbmc(lid_name) else: # don't ask. There appears to be a bug where we need to be 4k aligned. self.bmc.run_command("dd if=/dev/zero of=/dev/stdout bs=1M count=1 | tr '\\000' '\\377' > /tmp/ones") self.bmc.run_command("cat /tmp/%s /tmp/ones > /tmp/padded" % lid_name) self.bmc.run_command("dd if=/tmp/padded of=/usr/local/share/pnor/PAYLOAD bs=1M count=1") #self.bmc.run_command("mv /tmp/%s /usr/local/share/pnor/PAYLOAD" % lid_name, timeout=60) def skiroot_img_flash_openbmc(self, lid_name): if not self.has_new_pnor_code_update(): self.bmc.skiroot_img_flash_openbmc(lid_name) else: # don't ask. There appears to be a bug where we need to be 4k aligned. self.bmc.run_command("dd if=/dev/zero of=/dev/stdout bs=16M count=1 | tr '\\000' '\\377' > /tmp/ones") self.bmc.run_command("cat /tmp/%s /tmp/ones > /tmp/padded" % lid_name) self.bmc.run_command("dd if=/tmp/padded of=/usr/local/share/pnor/BOOTKERNEL bs=16M count=1") #self.bmc.run_command("mv /tmp/%s /usr/local/share/pnor/BOOTKERNEL" % lid_name, timeout=60) def flash_part_openbmc(self, lid_name, part_name): if not self.has_new_pnor_code_update(): self.bmc.flash_part_openbmc(lid_name, part_name) else: self.bmc.run_command("mv /tmp/%s /usr/local/share/pnor/%s" % (lid_name, part_name), timeout=60) def clear_field_mode(self): self.bmc.run_command("fw_setenv fieldmode") self.bmc.run_command("systemctl unmask usr-local.mount") self.reboot() def bmc_host(self): return self.hostname def get_ipmi(self): return self.ipmi def get_host_console(self): return self.console def get_rest_api(self): return self.rest_api def run_command(self, command, timeout=10, retry=0): return self.bmc.run_command(command, timeout, retry) def has_inband_bootdev(self): return False def has_os_boot_sensor(self): return False def has_host_status_sensor(self): return False def has_occ_active_sensor(self): return False def has_ipmi_sel(self): return False def supports_ipmi_dcmi(self): return False
class OpTestOpenBMC(): def __init__(self, ip=None, username=None, password=None, ipmi=None, rest_api=None, logfile=sys.stdout, check_ssh_keys=False, known_hosts_file=None): self.hostname = ip self.username = username self.password = password self.ipmi = ipmi self.rest_api = rest_api self.has_vpnor = None self.logfile = logfile self.console = OpTestSSH(ip, username, password, port=2200, logfile=self.logfile, check_ssh_keys=check_ssh_keys, known_hosts_file=known_hosts_file) self.bmc = OpTestBMC(ip=self.hostname, username=self.username, password=self.password, logfile=self.logfile, check_ssh_keys=check_ssh_keys, known_hosts_file=known_hosts_file) def set_system(self, system): self.console.set_system(system) self.bmc.set_system(system) def has_new_pnor_code_update(self, minutes=BMC_CONST.HTTP_RETRY): if self.has_vpnor is not None: return self.has_vpnor list = self.rest_api.get_list_of_image_ids(minutes=minutes) for id in list: i = self.rest_api.image_data(id) if i['data'].get('Purpose') == 'xyz.openbmc_project.Software.Version.VersionPurpose.Host': log.debug("Host image") self.has_vpnor = True return True log.debug("# Checking for pflash on BMC to determine update method") self.has_vpnor = not self.bmc.validate_pflash_tool() return self.has_vpnor def reboot(self): self.bmc.reboot() # After a BMC reboot, wait for it to reach ready state self.rest_api.wait_for_bmc_runtime() def image_transfer(self, i_imageName, copy_as=None): self.bmc.image_transfer(i_imageName, copy_as=copy_as) def pnor_img_flash_openbmc(self, pnor_name): self.bmc.pnor_img_flash_openbmc(pnor_name) def skiboot_img_flash_openbmc(self, lid_name): if not self.has_new_pnor_code_update(): self.bmc.skiboot_img_flash_openbmc(lid_name) else: # don't ask. There appears to be a bug where we need to be 4k aligned. self.bmc.run_command("dd if=/dev/zero of=/dev/stdout bs=1M count=1 | tr '\\000' '\\377' > /tmp/ones") self.bmc.run_command("cat /tmp/%s /tmp/ones > /tmp/padded" % lid_name) self.bmc.run_command("dd if=/tmp/padded of=/usr/local/share/pnor/PAYLOAD bs=1M count=1") #self.bmc.run_command("mv /tmp/%s /usr/local/share/pnor/PAYLOAD" % lid_name, timeout=60) def skiroot_img_flash_openbmc(self, lid_name): if not self.has_new_pnor_code_update(): self.bmc.skiroot_img_flash_openbmc(lid_name) else: # don't ask. There appears to be a bug where we need to be 4k aligned. self.bmc.run_command("dd if=/dev/zero of=/dev/stdout bs=16M count=1 | tr '\\000' '\\377' > /tmp/ones") self.bmc.run_command("cat /tmp/%s /tmp/ones > /tmp/padded" % lid_name) self.bmc.run_command("dd if=/tmp/padded of=/usr/local/share/pnor/BOOTKERNEL bs=16M count=1") #self.bmc.run_command("mv /tmp/%s /usr/local/share/pnor/BOOTKERNEL" % lid_name, timeout=60) def flash_part_openbmc(self, lid_name, part_name): if not self.has_new_pnor_code_update(): self.bmc.flash_part_openbmc(lid_name, part_name) else: self.bmc.run_command("mv /tmp/%s /usr/local/share/pnor/%s" % (lid_name, part_name), timeout=60) def clear_field_mode(self): self.bmc.run_command("fw_setenv fieldmode") self.bmc.run_command("systemctl unmask usr-local.mount") self.reboot() def bmc_host(self): return self.hostname def get_ipmi(self): return self.ipmi def get_host_console(self): return self.console def get_rest_api(self): return self.rest_api def run_command(self, command, timeout=10, retry=0): return self.bmc.run_command(command, timeout, retry) def has_inband_bootdev(self): return False def has_os_boot_sensor(self): return False def has_host_status_sensor(self): return False def has_occ_active_sensor(self): return False def has_ipmi_sel(self): return False def supports_ipmi_dcmi(self): return False
class OpTestOpenBMC(): def __init__(self, ip=None, username=None, password=None, ipmi=None, rest_api=None, logfile=sys.stdout): self.hostname = ip self.username = username self.password = password self.ipmi = ipmi self.rest_api = rest_api self.has_vpnor = None self.logfile = logfile # We kind of hack our way into pxssh by setting original_prompt # to also be \n, which appears to fool it enough to allow us # continue. self.console = HostConsole(ip, username, password, port=2200, logfile=self.logfile) self.bmc = OpTestBMC(ip=self.hostname, username=self.username, password=self.password) def has_new_pnor_code_update(self): if self.has_vpnor is not None: return self.has_vpnor list = self.rest_api.get_list_of_image_ids() for id in list: i = self.rest_api.image_data(id) if i['data'].get( 'Purpose' ) == 'xyz.openbmc_project.Software.Version.VersionPurpose.Host': print "Host image" self.has_vpnor = True return True print "# Checking for pflash os BMC to determine update method" self.has_vpnor = not self.bmc.validate_pflash_tool() return self.has_vpnor def reboot(self): self.bmc.reboot() # After a BMC reboot, wait for it to reach ready state self.rest_api.wait_for_bmc_runtime() def image_transfer(self, i_imageName): self.bmc.image_transfer(i_imageName) def pnor_img_flash_openbmc(self, pnor_name): self.bmc.pnor_img_flash_openbmc(pnor_name) def skiboot_img_flash_openbmc(self, lid_name): if not self.has_new_pnor_code_update(): self.bmc.skiboot_img_flash_openbmc(lid_name) else: # don't ask. There appears to be a bug where we need to be 4k aligned. self.bmc.run_command( "dd if=/dev/zero of=/dev/stdout bs=1M count=1 | tr '\\000' '\\377' > /tmp/ones" ) self.bmc.run_command("cat /tmp/%s /tmp/ones > /tmp/padded" % lid_name) self.bmc.run_command( "dd if=/tmp/padded of=/usr/local/share/pnor/PAYLOAD bs=1M count=1" ) #self.bmc.run_command("mv /tmp/%s /usr/local/share/pnor/PAYLOAD" % lid_name, timeout=60) def skiroot_img_flash_openbmc(self, lid_name): if not self.has_new_pnor_code_update(): self.bmc.skiroot_img_flash_openbmc(lid_name) else: # don't ask. There appears to be a bug where we need to be 4k aligned. self.bmc.run_command( "dd if=/dev/zero of=/dev/stdout bs=16M count=1 | tr '\\000' '\\377' > /tmp/ones" ) self.bmc.run_command("cat /tmp/%s /tmp/ones > /tmp/padded" % lid_name) self.bmc.run_command( "dd if=/tmp/padded of=/usr/local/share/pnor/BOOTKERNEL bs=16M count=1" ) #self.bmc.run_command("mv /tmp/%s /usr/local/share/pnor/BOOTKERNEL" % lid_name, timeout=60) def clear_field_mode(self): self.bmc.run_command("fw_setenv fieldmode") self.bmc.run_command("systemctl unmask usr-local.mount") self.reboot() def bmc_host(self): return self.hostname def get_ipmi(self): return self.ipmi def get_host_console(self): return self.console def get_rest_api(self): return self.rest_api def run_command(self, command, timeout=10): return self.bmc.run_command(command, timeout) def has_inband_bootdev(self): return False def has_os_boot_sensor(self): return False def has_host_status_sensor(self): return False def has_occ_active_sensor(self): return False
class OpTestOpenBMC(): def __init__(self, ip=None, username=None, password=None, ipmi=None, rest_api=None, logfile=sys.stdout, check_ssh_keys=False, known_hosts_file=None): self.hostname = ip self.username = username self.password = password self.ipmi = ipmi self.rest_api = rest_api self.has_vpnor = None self.logfile = logfile # We kind of hack our way into pxssh by setting original_prompt # to also be \n, which appears to fool it enough to allow us # continue. self.console = OpTestSSH(ip, username, password, port=2200, logfile=self.logfile, check_ssh_keys=check_ssh_keys, known_hosts_file=known_hosts_file) self.bmc = OpTestBMC(ip=self.hostname, username=self.username, password=self.password, check_ssh_keys=check_ssh_keys, known_hosts_file=known_hosts_file) def set_system(self, system): self.console.set_system(system) def has_new_pnor_code_update(self): if self.has_vpnor is not None: return self.has_vpnor list = self.rest_api.get_list_of_image_ids() for id in list: i = self.rest_api.image_data(id) if i['data'].get('Purpose') == 'xyz.openbmc_project.Software.Version.VersionPurpose.Host': print "Host image" self.has_vpnor = True return True print "# Checking for pflash os BMC to determine update method" self.has_vpnor = not self.bmc.validate_pflash_tool() return self.has_vpnor def reboot(self): self.bmc.reboot() # After a BMC reboot, wait for it to reach ready state self.rest_api.wait_for_bmc_runtime() def image_transfer(self, i_imageName): self.bmc.image_transfer(i_imageName) def pnor_img_flash_openbmc(self, pnor_name): self.bmc.pnor_img_flash_openbmc(pnor_name) def skiboot_img_flash_openbmc(self, lid_name): if not self.has_new_pnor_code_update(): self.bmc.skiboot_img_flash_openbmc(lid_name) else: # don't ask. There appears to be a bug where we need to be 4k aligned. self.bmc.run_command("dd if=/dev/zero of=/dev/stdout bs=1M count=1 | tr '\\000' '\\377' > /tmp/ones") self.bmc.run_command("cat /tmp/%s /tmp/ones > /tmp/padded" % lid_name) self.bmc.run_command("dd if=/tmp/padded of=/usr/local/share/pnor/PAYLOAD bs=1M count=1") #self.bmc.run_command("mv /tmp/%s /usr/local/share/pnor/PAYLOAD" % lid_name, timeout=60) def skiroot_img_flash_openbmc(self, lid_name): if not self.has_new_pnor_code_update(): self.bmc.skiroot_img_flash_openbmc(lid_name) else: # don't ask. There appears to be a bug where we need to be 4k aligned. self.bmc.run_command("dd if=/dev/zero of=/dev/stdout bs=16M count=1 | tr '\\000' '\\377' > /tmp/ones") self.bmc.run_command("cat /tmp/%s /tmp/ones > /tmp/padded" % lid_name) self.bmc.run_command("dd if=/tmp/padded of=/usr/local/share/pnor/BOOTKERNEL bs=16M count=1") #self.bmc.run_command("mv /tmp/%s /usr/local/share/pnor/BOOTKERNEL" % lid_name, timeout=60) def clear_field_mode(self): self.bmc.run_command("fw_setenv fieldmode") self.bmc.run_command("systemctl unmask usr-local.mount") self.reboot() def bmc_host(self): return self.hostname def get_ipmi(self): return self.ipmi def get_host_console(self): return self.console def get_rest_api(self): return self.rest_api def run_command(self, command, timeout=10): return self.bmc.run_command(command, timeout) def has_inband_bootdev(self): return False def has_os_boot_sensor(self): return False def has_host_status_sensor(self): return False def has_occ_active_sensor(self): return False