示例#1
0
    def test__calls_power_driver_off_for_power_driver(self):
        system_id = factory.make_name("system_id")
        hostname = factory.make_name("hostname")
        power_driver = random.choice(
            [driver for _, driver in PowerDriverRegistry if driver.queryable]
        )
        power_change = "off"
        context = {
            factory.make_name("context-key"): factory.make_name("context-val")
        }
        self.patch(power, "is_driver_available").return_value = True
        get_item = self.patch(PowerDriverRegistry, "get_item")
        perform_power_driver_query = self.patch(
            power, "perform_power_driver_query"
        )
        perform_power_driver_query.return_value = succeed(power_change)
        self.patch(power, "power_change_success")
        yield self.patch_rpc_methods()

        result = yield power.change_power_state(
            system_id, hostname, power_driver.name, power_change, context
        )

        self.expectThat(get_item, MockCalledWith(power_driver.name))
        self.expectThat(
            perform_power_driver_query,
            MockCalledOnceWith(
                system_id, hostname, power_driver.name, context
            ),
        )
        self.expectThat(
            power.power_change_success,
            MockCalledOnceWith(system_id, hostname, power_change),
        )
        self.expectThat(result, Equals("off"))
示例#2
0
    def test__return_none_when_unqueryable(self):
        system_id = factory.make_name("system_id")
        hostname = factory.make_name("hostname")
        power_driver = random.choice(
            [
                driver
                for _, driver in PowerDriverRegistry
                if not driver.queryable
            ]
        )
        power_change = "on"
        context = {
            factory.make_name("context-key"): factory.make_name("context-val")
        }
        self.patch(power, "is_driver_available").return_value = True
        get_item = self.patch(PowerDriverRegistry, "get_item")
        get_item.return_value = MagicMock()
        get_item.return_value.queryable = False
        perform_power_driver_query = self.patch(
            power, "perform_power_driver_query"
        )
        perform_power_driver_query.return_value = succeed(power_change)
        self.patch(power, "power_change_success")
        yield self.patch_rpc_methods()

        result = yield power.change_power_state(
            system_id, hostname, power_driver.name, power_change, context
        )

        self.expectThat(get_item, MockCalledWith(power_driver.name))
        self.expectThat(perform_power_driver_query, MockNotCalled())
        self.expectThat(power.power_change_success, MockNotCalled())
        self.expectThat(result, Equals(None))
示例#3
0
    def test_change_power_state_calls_power_change_starting_early_on(self):
        # The first, or one of the first, things that change_power_state()
        # does is write to the node event log via power_change_starting().

        class ArbitraryException(Exception):
            """This allows us to return early from a function."""

        # Raise this exception when power_change_starting() is called, to
        # return early from change_power_state(). This lets us avoid set-up
        # for parts of the function that we're presently not interested in.
        pcs = self.patch_autospec(power, "power_change_starting")
        pcs.return_value = fail(ArbitraryException())

        d = power.change_power_state(
            sentinel.system_id,
            sentinel.hostname,
            sentinel.power_type,
            sentinel.power_change,
            sentinel.context,
        )
        self.assertRaises(ArbitraryException, extract_result, d)
        self.assertThat(
            power.power_change_starting,
            MockCalledOnceWith(
                sentinel.system_id, sentinel.hostname, sentinel.power_change
            ),
        )
示例#4
0
    def test__marks_the_node_broken_if_exception_for_power_driver(self):
        system_id = factory.make_name("system_id")
        hostname = factory.make_name("hostname")
        power_driver = random.choice(
            [driver for _, driver in PowerDriverRegistry if driver.queryable])
        power_change = "on"
        context = {
            factory.make_name("context-key"): factory.make_name("context-val"),
            "system_id": system_id,
        }
        self.patch(power, "is_driver_available").return_value = True
        exception = PowerError(factory.make_string())
        get_item = self.patch(PowerDriverRegistry, "get_item")
        power_driver = get_item.return_value
        power_driver.on.return_value = fail(exception)

        markNodeBroken = yield self.patch_rpc_methods()

        with ExpectedException(PowerError):
            yield power.change_power_state(system_id, hostname,
                                           power_driver.name, power_change,
                                           context)

        error_message = "Power on for the node failed: %s" % (
            get_driver_error_message(exception))
        self.expectThat(
            markNodeBroken,
            MockCalledOnceWith(ANY,
                               system_id=system_id,
                               error_description=error_message),
        )
示例#5
0
    def test__calls_power_driver_cycle_for_power_driver(self):
        system_id = factory.make_name('system_id')
        hostname = factory.make_name('hostname')
        power_driver = random.choice(
            [driver for _, driver in PowerDriverRegistry if driver.queryable])
        power_change = 'cycle'
        context = {
            factory.make_name('context-key'): factory.make_name('context-val')
        }
        self.patch(power, 'is_driver_available').return_value = True
        get_item = self.patch(PowerDriverRegistry, 'get_item')
        perform_power_driver_query = self.patch(power,
                                                'perform_power_driver_query')
        perform_power_driver_query.return_value = succeed('on')
        self.patch(power, 'power_change_success')
        yield self.patch_rpc_methods()

        result = yield power.change_power_state(system_id, hostname,
                                                power_driver.name,
                                                power_change, context)

        self.expectThat(get_item, MockCalledWith(power_driver.name))
        self.expectThat(
            perform_power_driver_query,
            MockCalledOnceWith(system_id, hostname, power_driver.name,
                               context))
        self.expectThat(power.power_change_success,
                        MockCalledOnceWith(system_id, hostname, 'on'))
        self.expectThat(result, Equals('on'))
示例#6
0
    def test___handles_power_driver_power_types(self):
        system_id = factory.make_name('system_id')
        hostname = factory.make_name('hostname')
        power_driver = random.choice(
            [driver for _, driver in PowerDriverRegistry if driver.queryable])
        power_change = random.choice(['on', 'off'])
        context = {
            factory.make_name('context-key'): factory.make_name('context-val')
        }
        self.patch(power, 'is_driver_available').return_value = True
        perform_power_driver_change = self.patch_autospec(
            power, 'perform_power_driver_change')
        perform_power_driver_query = self.patch_autospec(
            power, 'perform_power_driver_query')
        perform_power_driver_query.return_value = succeed(power_change)
        power_change_success = self.patch_autospec(power,
                                                   'power_change_success')
        yield self.patch_rpc_methods()

        yield power.change_power_state(system_id, hostname, power_driver.name,
                                       power_change, context)

        self.expectThat(
            perform_power_driver_change,
            MockCalledOnceWith(system_id, hostname, power_driver.name,
                               power_change, context))
        self.expectThat(
            perform_power_driver_query,
            MockCalledOnceWith(system_id, hostname, power_driver.name,
                               context))
        self.expectThat(power_change_success,
                        MockCalledOnceWith(system_id, hostname, power_change))
示例#7
0
    def test_handles_power_driver_power_types(self):
        system_id = factory.make_name("system_id")
        hostname = factory.make_name("hostname")
        power_driver = random.choice(
            [driver for _, driver in PowerDriverRegistry if driver.queryable]
        )
        power_change = random.choice(["on", "off"])
        context = {
            factory.make_name("context-key"): factory.make_name("context-val")
        }
        self.patch(power, "is_driver_available").return_value = True
        perform_power_driver_change = self.patch_autospec(
            power, "perform_power_driver_change"
        )
        perform_power_driver_query = self.patch_autospec(
            power, "perform_power_driver_query"
        )
        perform_power_driver_query.return_value = succeed(power_change)
        power_change_success = self.patch_autospec(
            power, "power_change_success"
        )
        yield self.patch_rpc_methods()

        yield power.change_power_state(
            system_id, hostname, power_driver.name, power_change, context
        )

        self.expectThat(
            perform_power_driver_change,
            MockCalledOnceWith(
                system_id, hostname, power_driver.name, power_change, context
            ),
        )
        self.expectThat(
            perform_power_driver_query,
            MockCalledOnceWith(
                system_id, hostname, power_driver.name, context
            ),
        )
        self.expectThat(
            power_change_success,
            MockCalledOnceWith(system_id, hostname, power_change),
        )