def test_amttool_query_state_queries_on(self): amt_power_driver = AMTPowerDriver() ip_address = factory.make_ipv4_address() power_pass = factory.make_name('power_pass') _issue_amttool_command_mock = self.patch(amt_power_driver, '_issue_amttool_command') _issue_amttool_command_mock.return_value = (AMTTOOL_OUTPUT % (b'', b'S0')) result = amt_power_driver.amttool_query_state(ip_address, power_pass) self.expectThat(_issue_amttool_command_mock, MockCalledOnceWith('info', ip_address, power_pass)) self.expectThat(result, Equals('on'))
def test_amttool_power_off_powers_off(self): amt_power_driver = AMTPowerDriver() ip_address = factory.make_ipv4_address() power_pass = factory.make_name("power_pass") amttool_query_state_mock = self.patch(amt_power_driver, "amttool_query_state") amttool_query_state_mock.return_value = "off" amt_power_driver.amttool_power_off(ip_address, power_pass) self.assertThat( amttool_query_state_mock, MockCalledOnceWith(ip_address, power_pass), )
def test__render_wsman_state_xml_renders_xml(self): amt_power_driver = AMTPowerDriver() power_change = choice(['on', 'off', 'restart']) result = amt_power_driver._render_wsman_state_xml(power_change) with open( join(dirname(dirname(__file__)), "amt.wsman-state.xml"), 'rb') as fd: tree = etree.fromstring(fd.read()) power_states = {'on': '2', 'off': '8', 'restart': '10'} [state] = tree.xpath( '//p:PowerState', namespaces=tree.nsmap) state.text = power_states[power_change] self.assertEqual(result, etree.tostring(tree))
def test_amttool_restart_power_cycles(self): amt_power_driver = AMTPowerDriver() ip_address = factory.make_ipv4_address() power_pass = factory.make_name('power_pass') amttool_boot_mode = factory.make_name('amttool_boot_mode') _issue_amttool_command_mock = self.patch( amt_power_driver, '_issue_amttool_command') amt_power_driver.amttool_restart( ip_address, power_pass, amttool_boot_mode) self.assertThat( _issue_amttool_command_mock, MockCalledOnceWith( 'power_cycle', ip_address, power_pass, amttool_boot_mode=amttool_boot_mode, stdin=b'yes'))
def test_wsman_query_state_queries_off(self): amt_power_driver = AMTPowerDriver() ip_address = factory.make_ipv4_address() power_pass = factory.make_name('power_pass') get_power_state_mock = self.patch(amt_power_driver, 'get_power_state') get_power_state_mock.return_value = '6' _issue_wsman_command_mock = self.patch(amt_power_driver, '_issue_wsman_command') _issue_wsman_command_mock.return_value = WSMAN_OUTPUT % b'6' result = amt_power_driver.wsman_query_state(ip_address, power_pass) self.expectThat(_issue_wsman_command_mock, MockCalledOnceWith('query', ip_address, power_pass)) self.expectThat(result, Equals('off'))
def test_amttool_query_state_queries_unknown(self): amt_power_driver = AMTPowerDriver() ip_address = factory.make_ipv4_address() power_pass = factory.make_name('power_pass') amt_power_driver.ip_address = factory.make_name('ip_address') _issue_amttool_command_mock = self.patch(amt_power_driver, '_issue_amttool_command') _issue_amttool_command_mock.return_value = (AMTTOOL_OUTPUT % (b'', b'error')) self.assertRaises(PowerActionError, amt_power_driver.amttool_query_state, ip_address, power_pass) self.assertThat(_issue_amttool_command_mock, MockCalledOnceWith('info', ip_address, power_pass))
def test__get_amt_command_returns_wsman(self): amt_power_driver = AMTPowerDriver() ip_address = factory.make_ipv4_address() power_pass = factory.make_name('power_pass') amt_environment_mock = self.patch(amt_power_driver, '_get_amt_environment') amt_environment_mock.return_value = None popen_mock = self.patch_popen(return_value=(WSMAN_IDENTIFY_OUTPUT % b'10.0.47', b'stderr')) result = amt_power_driver._get_amt_command(ip_address, power_pass) self.expectThat(amt_environment_mock, MockCalledOnceWith(power_pass)) self.expectThat(popen_mock.communicate, MockCalledOnceWith()) self.expectThat(result, Equals('wsman'))
def test__get_amt_command_returns_amttool(self): amt_power_driver = AMTPowerDriver() ip_address = factory.make_ipv4_address() power_pass = factory.make_name("power_pass") amt_environment_mock = self.patch(amt_power_driver, "_get_amt_environment") amt_environment_mock.return_value = None popen_mock = self.patch_popen(return_value=(WSMAN_IDENTIFY_OUTPUT % b"8.1.57", b"stderr")) result = amt_power_driver._get_amt_command(ip_address, power_pass) self.expectThat(amt_environment_mock, MockCalledOnceWith(power_pass)) self.expectThat(popen_mock.communicate, MockCalledOnceWith()) self.expectThat(result, Equals("amttool"))
def test_run_runs_command(self): amt_power_driver = AMTPowerDriver() amt_power_driver.env = None command = (factory.make_name("command"), ) power_pass = factory.make_name("power_pass") stdin = factory.make_name("stdin").encode("utf-8") run_command_mock = self.patch_run_command(stdout=b"stdout") result = amt_power_driver._run(command, power_pass, stdin) run_command_mock.assert_called_once_with( *command, stdin=stdin, extra_environ={"AMT_PASSWORD": power_pass}, decode=False) self.expectThat(result, Equals(b"stdout"))
def test_wsman_power_on_powers_off(self): amt_power_driver = AMTPowerDriver() ip_address = factory.make_ipv4_address() power_pass = factory.make_name('power_pass') _issue_wsman_command_mock = self.patch(amt_power_driver, '_issue_wsman_command') wsman_query_state_mock = self.patch(amt_power_driver, 'wsman_query_state') wsman_query_state_mock.return_value = 'off' amt_power_driver.wsman_power_off(ip_address, power_pass) self.expectThat(_issue_wsman_command_mock, MockCalledOnceWith('off', ip_address, power_pass)) self.expectThat(wsman_query_state_mock, MockCalledOnceWith(ip_address, power_pass))
def test__get_amt_command_returns_amttool(self): amt_power_driver = AMTPowerDriver() ip_address = factory.make_ipv4_address() power_pass = factory.make_name('power_pass') amt_environment_mock = self.patch( amt_power_driver, '_get_amt_environment') amt_environment_mock.return_value = None popen_mock = self.patch_popen(return_value=( AMTTOOL_OUTPUT % (b'8.1.57', b''), b'stderr')) result = amt_power_driver._get_amt_command(ip_address, power_pass) self.expectThat( amt_environment_mock, MockCalledOnceWith(power_pass)) self.expectThat(popen_mock.communicate, MockCalledOnceWith()) self.expectThat(result, Equals('amttool'))
def test__issue_wsman_command_calls__run_for_power(self): amt_power_driver = AMTPowerDriver() power_change = choice(["on", "off", "restart"]) ip_address = factory.make_ipv4_address() power_pass = factory.make_name("power_pass") wsman_power_schema_uri = ( "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/" "CIM_PowerManagementService?SystemCreationClassName=" '"CIM_ComputerSystem"&SystemName="Intel(r) AMT"' '&CreationClassName="CIM_PowerManagementService"&Name=' '"Intel(r) AMT Power Management Service"' ) wsman_opts = ( "--port", "16992", "--hostname", ip_address, "--username", "admin", "--password", power_pass, "--noverifypeer", "--noverifyhost", ) _render_wsman_state_xml_mock = self.patch( amt_power_driver, "_render_wsman_state_xml" ) _render_wsman_state_xml_mock.return_value = b"stdin" action = ( "invoke", "--method", "RequestPowerStateChange", wsman_power_schema_uri, ) wsman_opts += ("--input", "-") command = ("wsman",) + wsman_opts + action _run_mock = self.patch(amt_power_driver, "_run") _run_mock.return_value = b"output" result = amt_power_driver._issue_wsman_command( power_change, ip_address, power_pass ) self.expectThat( _run_mock, MockCalledOnceWith(command, power_pass, stdin=b"stdin") ) self.expectThat(result, Equals(b"output"))
def test_issue_wsman_has_config_file_from_snap(self): self.patch(amt_module.snappy, "get_snap_path").return_value = "/snap/maas/current" ip_address = factory.make_ipv4_address() power_pass = factory.make_name("power_pass") amt_power_driver = AMTPowerDriver() _run_mock = self.patch(amt_power_driver, "_run") amt_power_driver._issue_wsman_command("query", ip_address, power_pass) [call] = _run_mock.mock_calls self.assertEqual( call.args[0][:3], ( "wsman", "-C", "/snap/maas/current/etc/openwsman/openwsman_client.conf", ), )
def test_wsman_query_state_queries_off(self): amt_power_driver = AMTPowerDriver() ip_address = factory.make_ipv4_address() power_pass = factory.make_name("power_pass") get_power_state_mock = self.patch(amt_power_driver, "get_power_state") get_power_state_mock.return_value = "6" _issue_wsman_command_mock = self.patch(amt_power_driver, "_issue_wsman_command") _issue_wsman_command_mock.return_value = WSMAN_OUTPUT % b"6" result = amt_power_driver.wsman_query_state(ip_address, power_pass) self.expectThat( _issue_wsman_command_mock, MockCalledOnceWith("query", ip_address, power_pass), ) self.expectThat(result, Equals("off"))
def test__run_raises_power_action_error(self): amt_power_driver = AMTPowerDriver() self.patch_popen( return_value=(b'', b''), returncode=1) self.assertRaises( PowerActionError, amt_power_driver._run, (), factory.make_name("power-pass"), None)
def test_wsman_power_on_powers_on(self): amt_power_driver = AMTPowerDriver() ip_address = factory.make_ipv4_address() power_pass = factory.make_name("power_pass") _set_pxe_boot_mock = self.patch(amt_power_driver, "_set_pxe_boot") _issue_wsman_command_mock = self.patch(amt_power_driver, "_issue_wsman_command") wsman_query_state_mock = self.patch(amt_power_driver, "wsman_query_state") wsman_query_state_mock.return_value = "on" amt_power_driver.wsman_power_on(ip_address, power_pass) _set_pxe_boot_mock.assert_called_once_with(ip_address, power_pass) _issue_wsman_command_mock.assert_called_once_with( "on", ip_address, power_pass) wsman_query_state_mock.assert_called_once_with(ip_address, power_pass)
def test__issue_amttool_command_calls__run(self): amt_power_driver = AMTPowerDriver() ip_address = factory.make_ipv4_address() power_pass = factory.make_name('power_pass') amttool_boot_mode = factory.make_name('amttool_boot_mode') stdin = factory.make_name('stdin').encode('utf-8') cmd = choice(['power-cycle', 'powerup']) command = 'amttool', ip_address, cmd, amttool_boot_mode _run_mock = self.patch(amt_power_driver, '_run') _run_mock.return_value = b'output' result = amt_power_driver._issue_amttool_command( cmd, ip_address, power_pass, amttool_boot_mode=amttool_boot_mode, stdin=stdin) self.expectThat( _run_mock, MockCalledOnceWith(command, power_pass, stdin=stdin)) self.expectThat(result, Equals(b'output'))
def test__get_amt_command_crashes_when_no_version_found(self): amt_power_driver = AMTPowerDriver() self.patch_popen(return_value=(b"No match here", b"")) self.assertRaises( PowerActionError, amt_power_driver._get_amt_command, sentinel.ip_address, sentinel.power_pass, )
def test__get_amt_command_crashes_when_amttool_has_no_output(self): amt_power_driver = AMTPowerDriver() self.patch_popen(return_value=(b"", b"")) self.assertRaises( PowerConnError, amt_power_driver._get_amt_command, sentinel.ip_address, sentinel.power_pass, )
def test_get_amt_command_crashes_when_no_version_found(self): amt_power_driver = AMTPowerDriver() self.patch_run_command(stdout=b"No match here", decode=True) self.assertRaises( PowerActionError, amt_power_driver._get_amt_command, sentinel.ip_address, sentinel.power_pass, )
def test_get_amt_command_crashes_when_amttool_has_no_output(self): amt_power_driver = AMTPowerDriver() self.patch_run_command(decode=True) self.assertRaises( PowerConnError, amt_power_driver._get_amt_command, sentinel.ip_address, sentinel.power_pass, )
def test_wsman_power_on_powers_off(self): amt_power_driver = AMTPowerDriver() ip_address = factory.make_ipv4_address() power_pass = factory.make_name("power_pass") _issue_wsman_command_mock = self.patch(amt_power_driver, "_issue_wsman_command") wsman_query_state_mock = self.patch(amt_power_driver, "wsman_query_state") wsman_query_state_mock.return_value = "off" amt_power_driver.wsman_power_off(ip_address, power_pass) self.expectThat( _issue_wsman_command_mock, MockCalledOnceWith("off", ip_address, power_pass), ) self.expectThat(wsman_query_state_mock, MockCalledOnceWith(ip_address, power_pass))
def test_amttool_query_state_queries_off(self): amt_power_driver = AMTPowerDriver() ip_address = factory.make_ipv4_address() power_pass = factory.make_name("power_pass") _issue_amttool_command_mock = self.patch(amt_power_driver, "_issue_amttool_command") _issue_amttool_command_mock.return_value = AMTTOOL_OUTPUT % ( b"", b"S5 (soft-off)", ) result = amt_power_driver.amttool_query_state(ip_address, power_pass) self.expectThat( _issue_amttool_command_mock, MockCalledOnceWith("info", ip_address, power_pass), ) self.expectThat(result, Equals("off"))
def test_power_query_queries_with_wsman(self): amt_power_driver = AMTPowerDriver() context = make_context() _get_amt_command_mock = self.patch( amt_power_driver, '_get_amt_command') _get_amt_command_mock.return_value = 'wsman' wsman_query_state_mock = self.patch( amt_power_driver, 'wsman_query_state') wsman_query_state_mock.return_value = 'on' state = amt_power_driver.power_query(context['system_id'], context) self.expectThat( _get_amt_command_mock, MockCalledOnceWith( context['ip_address'], context['power_pass'])) self.expectThat( wsman_query_state_mock, MockCalledOnceWith( context['ip_address'], context['power_pass'])) self.expectThat(state, Equals('on'))
def test_wsman_query_state_runs_query_loop(self): amt_power_driver = AMTPowerDriver() ip_address = factory.make_ipv4_address() power_pass = factory.make_name('power_pass') _issue_wsman_command_mock = self.patch(amt_power_driver, '_issue_wsman_command') _issue_wsman_command_mock.return_value = None self.assertRaises(PowerActionError, amt_power_driver.wsman_query_state, ip_address, power_pass)
def test__get_amt_command_raises_power_error(self): amt_power_driver = AMTPowerDriver() for error, error_info in AMT_ERRORS.items(): popen_mock = self.patch(amt_module, 'Popen') process = popen_mock.return_value process.communicate.return_value = (b'', error.encode('utf-8')) self.assertRaises(error_info.get('exception'), amt_power_driver._get_amt_command, factory.make_ipv4_address(), factory.make_name('power_pass'))
def test_get_amt_command_raises_power_error(self): amt_power_driver = AMTPowerDriver() for error, error_info in AMT_ERRORS.items(): self.patch_run_command(stderr=error.encode("utf-8"), decode=True) self.assertRaises( error_info.get("exception"), amt_power_driver._get_amt_command, factory.make_ipv4_address(), factory.make_name("power_pass"), )
def test_run_raises_power_action_error(self): amt_power_driver = AMTPowerDriver() self.patch_run_command(returncode=1) self.assertRaises( PowerActionError, amt_power_driver._run, (), factory.make_name("power-pass"), None, )
def test__issue_wsman_command_calls__run_for_query(self): amt_power_driver = AMTPowerDriver() ip_address = factory.make_ipv4_address() power_pass = factory.make_name('power_pass') wsman_query_schema_uri = ( 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/' 'CIM_AssociatedPowerManagementService') wsman_opts = ('--port', '16992', '--hostname', ip_address, '--username', 'admin', '--password', power_pass, '--noverifypeer', '--noverifyhost') wsman_query_opts = wsman_opts + ('--optimize', '--encoding', 'utf-8') command = ('wsman', 'enumerate', wsman_query_schema_uri) + wsman_query_opts _run_mock = self.patch(amt_power_driver, '_run') _run_mock.return_value = b'ignored' amt_power_driver._issue_wsman_command('query', ip_address, power_pass) self.assertThat(_run_mock, MockCalledOnceWith(command, power_pass, stdin=None))
def test_wsman_power_off_raises_power_action_error(self): amt_power_driver = AMTPowerDriver() ip_address = factory.make_ipv4_address() power_pass = factory.make_name('power_pass') self.patch(amt_power_driver, '_issue_wsman_command') wsman_query_state_mock = self.patch(amt_power_driver, 'wsman_query_state') wsman_query_state_mock.return_value = 'error' self.assertRaises(PowerActionError, amt_power_driver.wsman_power_off, ip_address, power_pass)