コード例 #1
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 = (
            "-C",
            "/etc/openwsman/openwsman_client.conf",
            "--port",
            "16992",
            "--hostname",
            ip_address,
            "--username",
            "admin",
            "--password",
            power_pass,
            "--noverifypeer",
            "--noverifyhost",
        )
        wsman_query_opts = wsman_opts + ("--optimize", "--encoding", "utf-8")
        action = ("enumerate", wsman_query_schema_uri)
        command = ("wsman", ) + wsman_query_opts + action
        _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))
コード例 #2
0
    def test_power_off_powers_off_with_amttool(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 = "amttool"
        amttool_query_state_mock = self.patch(amt_power_driver,
                                              "amttool_query_state")
        amttool_query_state_mock.return_value = "on"
        amttool_power_off_mock = self.patch(amt_power_driver,
                                            "amttool_power_off")

        amt_power_driver.power_off(context["system_id"], context)
        self.expectThat(
            _get_amt_command_mock,
            MockCalledOnceWith(context["ip_address"], context["power_pass"]),
        )
        self.expectThat(
            amttool_query_state_mock,
            MockCalledOnceWith(context["ip_address"], context["power_pass"]),
        )
        self.expectThat(
            amttool_power_off_mock,
            MockCalledOnceWith(context["ip_address"], context["power_pass"]),
        )
コード例 #3
0
    def test_power_on_powers_on_with_wsman_when_already_off(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 = "off"
        wsman_power_on_mock = self.patch(amt_power_driver, "wsman_power_on")

        amt_power_driver.power_on(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(
            wsman_power_on_mock,
            MockCalledOnceWith(context["ip_address"], context["power_pass"]),
        )
コード例 #4
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")
        mock_run_command = self.patch_run_command(
            stdout=WSMAN_IDENTIFY_OUTPUT % b"10.0.47",
            stderr=b"stderr",
            decode=True,
        )
        result = amt_power_driver._get_amt_command(ip_address, power_pass)

        mock_run_command.assert_called_once_with(
            "wsman",
            "-C",
            "/etc/openwsman/openwsman_client.conf",
            "identify",
            "--port",
            "16992",
            "--hostname",
            ip_address,
            "--username",
            "admin",
            "--password",
            power_pass,
        )
        self.expectThat(result, Equals("wsman"))
コード例 #5
0
    def test_amttool_power_on_powers_on(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")
        amttool_query_state_mock = self.patch(amt_power_driver,
                                              "amttool_query_state")
        amttool_query_state_mock.return_value = "on"

        amt_power_driver.amttool_power_on(ip_address, power_pass,
                                          amttool_boot_mode)

        self.expectThat(
            _issue_amttool_command_mock,
            MockCalledOnceWith(
                "powerup",
                ip_address,
                power_pass,
                amttool_boot_mode=amttool_boot_mode,
                stdin=b"yes",
            ),
        )
        self.expectThat(
            amttool_query_state_mock,
            MockCalledOnceWith(ip_address, power_pass),
        )
コード例 #6
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'))
コード例 #7
0
ファイル: test_amt.py プロジェクト: zeronewb/maas
    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)
コード例 #8
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,
     )
コード例 #9
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,
     )
コード例 #10
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,
     )
コード例 #11
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,
     )
コード例 #12
0
    def test__set_pxe_boot_sets_pxe(self):
        amt_power_driver = AMTPowerDriver()
        ip_address = factory.make_ipv4_address()
        power_pass = factory.make_name("power_pass")
        wsman_pxe_options = {
            "ChangeBootOrder": (
                join(dirname(dirname(__file__)), "amt.wsman-pxe.xml"),
                (
                    "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/"
                    'CIM_BootConfigSetting?InstanceID="Intel(r) '
                    'AMT: Boot Configuration 0"'
                ),
            ),
            "SetBootConfigRole": (
                join(dirname(dirname(__file__)), "amt.wsman-boot-config.xml"),
                (
                    "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/"
                    "CIM_BootService?SystemCreationClassName="
                    '"CIM_ComputerSystem"&SystemName="Intel(r) AMT"'
                    '&CreationClassName="CIM_BootService"&Name="Intel(r)'
                    ' AMT Boot Service"'
                ),
            ),
        }
        wsman_opts = (
            "--port",
            "16992",
            "--hostname",
            ip_address,
            "--username",
            "admin",
            "--password",
            power_pass,
            "--noverifypeer",
            "--noverifyhost",
        )
        _run_mock = self.patch(amt_power_driver, "_run")
        amt_power_driver._set_pxe_boot(ip_address, power_pass)

        commands = []
        stdins = []
        for method, (schema_file, schema_uri) in wsman_pxe_options.items():
            with open(schema_file, "rb") as fd:
                wsman_opts += ("--input", "-")
                action = ("invoke", "--method", method, schema_uri)
                command = ("wsman",) + wsman_opts + action
                commands.append(command)
                stdins.append(fd.read())

        self.assertThat(
            _run_mock,
            MockCallsMatch(
                call(commands[0], power_pass, stdin=stdins[0]),
                call(commands[1], power_pass, stdin=stdins[1]),
            ),
        )
コード例 #13
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)
コード例 #14
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,
     )
コード例 #15
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"),
         )
コード例 #16
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'))
コード例 #17
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)
コード例 #18
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")
        popen_mock = self.patch_popen(return_value=(b"stdout", b""))

        result = amt_power_driver._run(command, power_pass, stdin)

        self.expectThat(popen_mock.communicate, MockCalledOnceWith(stdin))
        self.expectThat(result, Equals(b"stdout"))
コード例 #19
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')
        popen_mock = self.patch_popen(return_value=(b'stdout', b''))

        result = amt_power_driver._run(command, power_pass, stdin)

        self.expectThat(popen_mock.communicate, MockCalledOnceWith(stdin))
        self.expectThat(result, Equals(b'stdout'))
コード例 #20
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))
コード例 #21
0
    def test_amttool_power_on_raises_power_action_error(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')
        self.patch(amt_power_driver, '_issue_amttool_command')
        amttool_query_state_mock = self.patch(amt_power_driver,
                                              'amttool_query_state')
        amttool_query_state_mock.return_value = 'error'

        self.assertRaises(PowerActionError, amt_power_driver.amttool_power_on,
                          ip_address, power_pass, amttool_boot_mode)
コード例 #22
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")
        self.patch(amt_power_driver, "_issue_wsman_command").return_value = b""

        self.assertRaises(
            PowerActionError,
            amt_power_driver.wsman_query_state,
            ip_address,
            power_pass,
        )
コード例 #23
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))
コード例 #24
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))
コード例 #25
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'))
コード例 #26
0
    def test_wsman_query_state_queries_unknown(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 = 'unknown'
        _issue_wsman_command_mock = self.patch(amt_power_driver,
                                               '_issue_wsman_command')
        _issue_wsman_command_mock.return_value = WSMAN_OUTPUT % b'error'

        self.assertRaises(PowerActionError, amt_power_driver.wsman_query_state,
                          ip_address, power_pass)
        self.assertThat(_issue_wsman_command_mock,
                        MockCalledOnceWith('query', ip_address, power_pass))
コード例 #27
0
ファイル: test_amt.py プロジェクト: zeronewb/maas
    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'))
コード例 #28
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))
コード例 #29
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'))
コード例 #30
0
    def test_amttool_power_off_raises_power_action_error(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 = "error"
        self.patch(amt_power_driver, "_issue_amttool_command")

        self.assertRaises(
            PowerActionError,
            amt_power_driver.amttool_power_off,
            ip_address,
            power_pass,
        )