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"))
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))
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 ), )
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), )
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'))
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))
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), )