コード例 #1
0
    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())
コード例 #2
0
    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)
コード例 #3
0
ファイル: test_unit.py プロジェクト: mcclurmc/juju
    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)
コード例 #4
0
ファイル: test_unit.py プロジェクト: mcclurmc/juju
    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())
コード例 #5
0
 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")
コード例 #6
0
ファイル: test_unit.py プロジェクト: mcclurmc/juju
 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")
コード例 #7
0
 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()))
コード例 #8
0
ファイル: test_unit.py プロジェクト: mcclurmc/juju
 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()))
コード例 #9
0
    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()))
コード例 #10
0
ファイル: test_unit.py プロジェクト: mcclurmc/juju
    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()))