def test_agent_upgrade(self): """The agent can succesfully upgrade its charm.""" self.agent.set_watch_enabled(False) yield self.agent.startService() yield self.mark_charm_upgrade() hook_done = self.wait_on_hook("upgrade-charm", executor=self.agent.executor) self.write_hook("upgrade-charm", "#!/bin/bash\nexit 0") output = self.capture_logging("unit.upgrade", level=logging.DEBUG) # Do the upgrade upgrade = CharmUpgradeOperation(self.agent) value = yield upgrade.run() # Verify the upgrade. self.assertIdentical(value, True) self.assertIn("Unit upgraded", output.getvalue()) yield hook_done new_charm = get_charm_from_path( os.path.join(self.agent.unit_directory, "charm")) self.assertEqual(self.charm.get_revision() + 1, new_charm.get_revision())
def test_agent_upgrade_bad_unit_state(self): """The an upgrade fails if the unit is in a bad state.""" self.agent.set_watch_enabled(False) yield self.agent.startService() # Upload a new version of the unit's charm repository = self.increment_charm(self.charm) charm = yield repository.find(CharmURL.parse("local:series/mysql")) charm, charm_state = yield self.publish_charm(charm.path) # Mark the unit for upgrade, with an invalid state. yield self.states["service"].set_charm_id(charm_state.id) yield self.states["unit"].set_upgrade_flag() yield self.agent.workflow.set_state("start_error") output = self.capture_logging("unit.upgrade", level=logging.DEBUG) # Do the upgrade upgrade = CharmUpgradeOperation(self.agent) value = yield upgrade.run() # Verify the upgrade. self.assertIdentical(value, False) self.assertIn("Unit not in an upgradeable state: start_error", output.getvalue()) self.assertIdentical((yield self.states["unit"].get_upgrade_flag()), False)
def test_agent_upgrade_bad_unit_state(self): """The an upgrade fails if the unit is in a bad state.""" self.agent.set_watch_enabled(False) yield self.agent.startService() # Upload a new version of the unit's charm repository = self.increment_charm(self.charm) charm = yield repository.find(CharmURL.parse("local:series/mysql")) charm, charm_state = yield self.publish_charm(charm.path) # Mark the unit for upgrade, with an invalid state. yield self.states["service"].set_charm_id(charm_state.id) yield self.states["unit"].set_upgrade_flag() yield self.agent.workflow.set_state("start_error") output = self.capture_logging("unit.upgrade", level=logging.DEBUG) # Do the upgrade upgrade = CharmUpgradeOperation(self.agent) value = yield upgrade.run() # Verify the upgrade. self.assertIdentical(value, False) self.assertIn("Unit not in an upgradeable state: start_error", output.getvalue()) self.assertIdentical( (yield self.states["unit"].get_upgrade_flag()), False)
def test_agent_upgrade(self): """The agent can succesfully upgrade its charm.""" self.agent.set_watch_enabled(False) yield self.agent.startService() yield self.mark_charm_upgrade() hook_done = self.wait_on_hook( "upgrade-charm", executor=self.agent.executor) self.write_hook("upgrade-charm", "#!/bin/bash\nexit 0") output = self.capture_logging("unit.upgrade", level=logging.DEBUG) # Do the upgrade upgrade = CharmUpgradeOperation(self.agent) value = yield upgrade.run() # Verify the upgrade. self.assertIdentical(value, True) self.assertIn("Unit upgraded", output.getvalue()) yield hook_done new_charm = get_charm_from_path( os.path.join(self.agent.unit_directory, "charm")) self.assertEqual( self.charm.get_revision() + 1, new_charm.get_revision())
def test_agent_upgrade_no_flag(self): """An upgrade fails if there is no upgrade flag set.""" self.agent.set_watch_enabled(False) yield self.agent.startService() output = self.capture_logging("unit.upgrade", level=logging.DEBUG) upgrade = CharmUpgradeOperation(self.agent) value = yield upgrade.run() self.assertIdentical(value, False) self.assertIn("No upgrade flag set", output.getvalue()) yield self.agent.workflow.fire_transition("stop")
def test_agent_upgrade_version_current(self): """An upgrade fails if the unit is running the latest charm.""" self.agent.set_watch_enabled(False) yield self.agent.startService() yield self.states["unit"].set_upgrade_flag() output = self.capture_logging("unit.upgrade", level=logging.DEBUG) upgrade = CharmUpgradeOperation(self.agent) value = yield upgrade.run() self.assertIdentical(value, True) self.assertIn("Unit already running latest charm", output.getvalue()) self.assertFalse((yield self.states["unit"].get_upgrade_flag()))
def test_agent_upgrade_hook_failure(self): """An upgrade fails if the upgrade hook errors.""" self.agent.set_watch_enabled(False) yield self.agent.startService() # Upload a new version of the unit's charm repository = self.increment_charm(self.charm) charm = yield repository.find(CharmURL.parse("local:series/mysql")) charm, charm_state = yield self.publish_charm(charm.path) # Mark the unit for upgrade yield self.states["service"].set_charm_id(charm_state.id) yield self.states["unit"].set_upgrade_flag() hook_done = self.wait_on_hook("upgrade-charm", executor=self.agent.executor) self.write_hook("upgrade-charm", "#!/bin/bash\nexit 1") output = self.capture_logging("unit.upgrade", level=logging.DEBUG) # Do the upgrade upgrade = CharmUpgradeOperation(self.agent) value = yield upgrade.run() # Verify the failed upgrade. self.assertIdentical(value, False) self.assertIn("Invoking upgrade transition", output.getvalue()) self.assertIn("Upgrade failed.", output.getvalue()) yield hook_done # Verify state workflow_state = yield self.agent.workflow.get_state() self.assertEqual("charm_upgrade_error", workflow_state) # Verify new charm is in place new_charm = get_charm_from_path( os.path.join(self.agent.unit_directory, "charm")) self.assertEqual(self.charm.get_revision() + 1, new_charm.get_revision()) # Verify upgrade flag is cleared. self.assertFalse((yield self.states["unit"].get_upgrade_flag()))
def test_agent_upgrade_hook_failure(self): """An upgrade fails if the upgrade hook errors.""" self.agent.set_watch_enabled(False) yield self.agent.startService() # Upload a new version of the unit's charm repository = self.increment_charm(self.charm) charm = yield repository.find(CharmURL.parse("local:series/mysql")) charm, charm_state = yield self.publish_charm(charm.path) # Mark the unit for upgrade yield self.states["service"].set_charm_id(charm_state.id) yield self.states["unit"].set_upgrade_flag() hook_done = self.wait_on_hook( "upgrade-charm", executor=self.agent.executor) self.write_hook("upgrade-charm", "#!/bin/bash\nexit 1") output = self.capture_logging("unit.upgrade", level=logging.DEBUG) # Do the upgrade upgrade = CharmUpgradeOperation(self.agent) value = yield upgrade.run() # Verify the failed upgrade. self.assertIdentical(value, False) self.assertIn("Invoking upgrade transition", output.getvalue()) self.assertIn("Upgrade failed.", output.getvalue()) yield hook_done # Verify state workflow_state = yield self.agent.workflow.get_state() self.assertEqual("charm_upgrade_error", workflow_state) # Verify new charm is in place new_charm = get_charm_from_path( os.path.join(self.agent.unit_directory, "charm")) self.assertEqual( self.charm.get_revision() + 1, new_charm.get_revision()) # Verify upgrade flag is cleared. self.assertFalse((yield self.states["unit"].get_upgrade_flag()))