def _get_ip_address(self, power_address, ip_address): """Get the IP address of the AMT BMC.""" # The user specified power_address overrides any automatically # determined ip_address. if is_power_parameter_set( power_address) and not is_power_parameter_set(ip_address): return power_address elif is_power_parameter_set(ip_address): return ip_address else: raise PowerSettingError( "No IP address provided. " "Please update BMC configuration and try again.")
def _issue_ipmi_command(self, power_change, power_address=None, power_user=None, power_pass=None, power_driver=None, power_off_mode=None, mac_address=None, power_boot_type=None, k_g=None, cipher_suite_id=None, privilege_level=None, **extra): """Issue command to ipmipower, for the given system.""" # This script deliberately does not check the current power state # before issuing the requested power command. See bug 1171418 for an # explanation. if is_power_parameter_set( mac_address) and not is_power_parameter_set(power_address): power_address = find_ip_via_arp(mac_address) # The `-W opensesspriv` workaround is required on many BMCs, and # should have no impact on BMCs that don't require it. # See https://bugs.launchpad.net/maas/+bug/1287964 ipmi_chassis_config_command = [ "ipmi-chassis-config", "-W", "opensesspriv", ] ipmipower_command = [ "ipmipower", "-W", "opensesspriv", ] # Arguments in common between chassis config and power control. See # https://launchpad.net/bugs/1053391 for details of modifying the # command for power_driver and power_user. common_args = [] if is_power_parameter_set(power_driver): common_args.extend(("--driver-type", power_driver)) common_args.extend(("-h", power_address)) if is_power_parameter_set(power_user): common_args.extend(("-u", power_user)) common_args.extend(("-p", power_pass)) if is_power_parameter_set(k_g): common_args.extend(("-k", k_g)) if is_power_parameter_set(cipher_suite_id): common_args.extend(("-I", cipher_suite_id)) if is_power_parameter_set(privilege_level): common_args.extend(("-l", privilege_level)) else: # LP:1889788 - Default to communicate at operator level. common_args.extend(("-l", IPMI_PRIVILEGE_LEVEL.OPERATOR.name)) # Update the power commands with common args. ipmipower_command.extend(common_args) # Additional arguments for the power command. if power_change == "on": # Update the chassis config commands and call it just when # powering on the machine. ipmi_chassis_config_command.extend(common_args) ipmi_chassis_config_command.append("--commit") self._issue_ipmi_chassis_config_command( ipmi_chassis_config_command, power_change, power_address, power_boot_type, ) ipmipower_command.append("--cycle") ipmipower_command.append("--on-if-off") elif power_change == "off": if power_off_mode == "soft": ipmipower_command.append("--soft") else: ipmipower_command.append("--off") elif power_change == "query": ipmipower_command.append("--stat") # Update or query the power state. return self._issue_ipmipower_command(ipmipower_command, power_change, power_address)
def _issue_ipmi_command(self, power_change, power_address=None, power_user=None, power_pass=None, power_driver=None, power_off_mode=None, mac_address=None, **extra): """Issue command to ipmipower, for the given system.""" # This script deliberately does not check the current power state # before issuing the requested power command. See bug 1171418 for an # explanation. if (is_power_parameter_set(mac_address) and not is_power_parameter_set(power_address)): power_address = find_ip_via_arp(mac_address) # The `-W opensesspriv` workaround is required on many BMCs, and # should have no impact on BMCs that don't require it. # See https://bugs.launchpad.net/maas/+bug/1287964 ipmi_chassis_config_command = [ 'ipmi-chassis-config', '-W', 'opensesspriv' ] ipmipower_command = ['ipmipower', '-W', 'opensesspriv'] # Arguments in common between chassis config and power control. See # https://launchpad.net/bugs/1053391 for details of modifying the # command for power_driver and power_user. common_args = [] if is_power_parameter_set(power_driver): common_args.extend(("--driver-type", power_driver)) common_args.extend(('-h', power_address)) if is_power_parameter_set(power_user): common_args.extend(("-u", power_user)) common_args.extend(('-p', power_pass)) # Update the chassis config and power commands. ipmi_chassis_config_command.extend(common_args) ipmi_chassis_config_command.append('--commit') ipmipower_command.extend(common_args) # Before changing state run the chassis config command. if power_change in ("on", "off"): self._issue_ipmi_chassis_config_command( ipmi_chassis_config_command, power_change, power_address) # Additional arguments for the power command. if power_change == 'on': ipmipower_command.append('--cycle') ipmipower_command.append('--on-if-off') elif power_change == 'off': if power_off_mode == 'soft': ipmipower_command.append('--soft') else: ipmipower_command.append('--off') elif power_change == 'query': ipmipower_command.append('--stat') # Update or query the power state. return self._issue_ipmipower_command(ipmipower_command, power_change, power_address)