Beispiel #1
0
    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'))
Beispiel #2
0
    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),
        )
Beispiel #3
0
    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))
Beispiel #4
0
    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'))
Beispiel #5
0
    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'))
Beispiel #6
0
    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))
Beispiel #7
0
    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'))
Beispiel #8
0
    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"))
Beispiel #9
0
    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"))
Beispiel #10
0
    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))
Beispiel #11
0
    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'))
Beispiel #12
0
    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"))
Beispiel #13
0
 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",
         ),
     )
Beispiel #14
0
    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"))
Beispiel #15
0
    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)
Beispiel #16
0
    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)
Beispiel #17
0
    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'))
Beispiel #18
0
 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,
     )
Beispiel #19
0
 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,
     )
Beispiel #20
0
 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,
     )
Beispiel #21
0
 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,
     )
Beispiel #22
0
    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))
Beispiel #23
0
    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"))
Beispiel #24
0
    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'))
Beispiel #25
0
    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)
Beispiel #26
0
 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'))
Beispiel #27
0
 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"),
         )
Beispiel #28
0
 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,
     )
Beispiel #29
0
    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))
Beispiel #30
0
    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)