Ejemplo n.º 1
0
    def start(self, provider_type=None):
        """Starts the unit deployer."""
        # Find out what provided the machine, and how to deploy units.
        if provider_type is None:
            settings = GlobalSettingsStateManager(self.client)
            provider_type = yield settings.get_provider_type()
        self.deploy_factory = get_deploy_factory(provider_type)

        if not os.path.exists(self.charms_directory):
            os.makedirs(self.charms_directory)
Ejemplo n.º 2
0
def get_unit_address(client):
    settings = GlobalSettingsStateManager(client)
    provider_type = yield settings.get_provider_type()
    if provider_type == "ec2":
        returnValue(EC2UnitAddress())
    elif provider_type == "local":
        returnValue(LocalUnitAddress())
    elif provider_type == "orchestra":
        returnValue(OrchestraUnitAddress())
    elif provider_type == "dummy":
        returnValue(DummyUnitAddress())

    raise JujuError("Unknown provider type: %r, unit addresses unknown." %
                    provider_type)
Ejemplo n.º 3
0
def get_unit_address(client):
    settings = GlobalSettingsStateManager(client)
    provider_type = yield settings.get_provider_type()
    if provider_type == "ec2":
        returnValue(EC2UnitAddress())
    elif provider_type == "local":
        returnValue(LocalUnitAddress())
    elif provider_type == "orchestra":
        returnValue(OrchestraUnitAddress())
    elif provider_type == "dummy":
        returnValue(DummyUnitAddress())

    raise JujuError(
        "Unknown provider type: %r, unit addresses unknown." % provider_type)
Ejemplo n.º 4
0
    def test_initialize(self):
        yield self.layout.initialize()

        yield self.assert_existence_and_acl("/charms")
        yield self.assert_existence_and_acl("/services")
        yield self.assert_existence_and_acl("/units")
        yield self.assert_existence_and_acl("/machines")
        yield self.assert_existence_and_acl("/relations")
        yield self.assert_existence_and_acl("/initialized")

        # To check that the constraints landed correctly, we need the
        # environment config to have been sent, or we won't be able to
        # get a provider to help us construct the appropriate objects.
        yield self.push_default_config(with_constraints=False)

        esm = EnvironmentStateManager(self.client)
        env_constraints = yield esm.get_constraints()
        self.assertEquals(env_constraints, {
            "provider-type": "dummy",
            "ubuntu-series": None,
            "arch": "arm",
            "cpu": None,
            "mem": 512})

        machine_state_manager = MachineStateManager(self.client)
        machine_state = yield machine_state_manager.get_machine_state(0)
        machine_constraints = yield machine_state.get_constraints()
        self.assertTrue(machine_constraints.complete)
        self.assertEquals(machine_constraints, {
            "provider-type": "dummy",
            "ubuntu-series": "cranky",
            "arch": "arm",
            "cpu": None,
            "mem": 512})
        instance_id = yield machine_state.get_instance_id()
        self.assertEqual(instance_id, "i-abcdef")

        settings_manager = GlobalSettingsStateManager(self.client)
        self.assertEqual((yield settings_manager.get_provider_type()), "dummy")
        self.assertEqual(
            self.log.getvalue().strip(),
            "Initializing zookeeper hierarchy")
Ejemplo n.º 5
0
    def test_initialize(self):
        yield self.layout.initialize()

        yield self.assert_existence_and_acl("/charms")
        yield self.assert_existence_and_acl("/services")
        yield self.assert_existence_and_acl("/units")
        yield self.assert_existence_and_acl("/machines")
        yield self.assert_existence_and_acl("/relations")
        yield self.assert_existence_and_acl("/initialized")

        machine_state_manager = MachineStateManager(self.client)
        machine_state = yield machine_state_manager.get_machine_state(0)
        self.assertTrue(machine_state)
        instance_id = yield machine_state.get_instance_id()
        self.assertEqual(instance_id, "i-abcdef")

        settings_manager = GlobalSettingsStateManager(self.client)
        self.assertEqual((yield settings_manager.get_provider_type()), "dummy")
        self.assertEqual(self.log.getvalue().strip(),
                         "Initializing zookeeper hierarchy")
Ejemplo n.º 6
0
    def test_initialize(self):
        yield self.layout.initialize()

        yield self.assert_existence_and_acl("/charms")
        yield self.assert_existence_and_acl("/services")
        yield self.assert_existence_and_acl("/units")
        yield self.assert_existence_and_acl("/machines")
        yield self.assert_existence_and_acl("/relations")
        yield self.assert_existence_and_acl("/initialized")

        machine_state_manager = MachineStateManager(self.client)
        machine_state = yield machine_state_manager.get_machine_state(0)
        self.assertTrue(machine_state)
        instance_id = yield machine_state.get_instance_id()
        self.assertEqual(instance_id, "i-abcdef")

        settings_manager = GlobalSettingsStateManager(self.client)
        self.assertEqual((yield settings_manager.get_provider_type()), "dummy")
        self.assertEqual(
            self.log.getvalue().strip(),
            "Initializing zookeeper hierarchy")
Ejemplo n.º 7
0
    def start(self):
        """Start the machine agent.

        Creates state directories on the machine, retrieves the machine state,
        and enables watch on assigned units.
        """
        # Initialize directory paths.
        if not os.path.exists(self.charms_directory):
            os.makedirs(self.charms_directory)

        if not os.path.exists(self.units_directory):
            os.makedirs(self.units_directory)

        if not os.path.exists(self.unit_state_directory):
            os.makedirs(self.unit_state_directory)

        # Get state managers we'll be utilizing.
        self.service_state_manager = ServiceStateManager(self.client)
        self.charm_state_manager = CharmStateManager(self.client)

        # Retrieve the machine state for the machine we represent.
        machine_manager = MachineStateManager(self.client)
        self.machine_state = yield machine_manager.get_machine_state(
            self.get_machine_id())

        # Watch assigned units for the machine.
        if self.get_watch_enabled():
            self.machine_state.watch_assigned_units(
                self.watch_service_units)

        # Find out what provided the machine, and how to deploy units.
        settings = GlobalSettingsStateManager(self.client)
        self.provider_type = yield settings.get_provider_type()
        self.deploy_factory = get_deploy_factory(self.provider_type)

        # Connect the machine agent, broadcasting presence to the world.
        yield self.machine_state.connect_agent()
        log.info("Machine agent started id:%s deploy:%r provider:%r" % (
            self.get_machine_id(), self.deploy_factory, self.provider_type))
Ejemplo n.º 8
0
    def start(self):
        """Start the machine agent.

        Creates state directories on the machine, retrieves the machine state,
        and enables watch on assigned units.
        """
        # Initialize directory paths.
        if not os.path.exists(self.charms_directory):
            os.makedirs(self.charms_directory)

        if not os.path.exists(self.units_directory):
            os.makedirs(self.units_directory)

        if not os.path.exists(self.unit_state_directory):
            os.makedirs(self.unit_state_directory)

        # Get state managers we'll be utilizing.
        self.service_state_manager = ServiceStateManager(self.client)
        self.charm_state_manager = CharmStateManager(self.client)

        # Retrieve the machine state for the machine we represent.
        machine_manager = MachineStateManager(self.client)
        self.machine_state = yield machine_manager.get_machine_state(
            self.get_machine_id())

        # Watch assigned units for the machine.
        if self.get_watch_enabled():
            self.machine_state.watch_assigned_units(self.watch_service_units)

        # Find out what provided the machine, and how to deploy units.
        settings = GlobalSettingsStateManager(self.client)
        self.provider_type = yield settings.get_provider_type()
        self.deploy_factory = get_deploy_factory(self.provider_type)

        # Connect the machine agent, broadcasting presence to the world.
        yield self.machine_state.connect_agent()
        log.info(
            "Machine agent started id:%s deploy:%r provider:%r" %
            (self.get_machine_id(), self.deploy_factory, self.provider_type))
Ejemplo n.º 9
0
class GlobalSettingsTest(StateTestBase):

    @inlineCallbacks
    def setUp(self):
        yield super(GlobalSettingsTest, self).setUp()
        self.manager = GlobalSettingsStateManager(self.client)

    @inlineCallbacks
    def test_get_set_provider_type(self):
        """Debug logging is off by default."""
        self.assertEqual((yield self.manager.get_provider_type()), None)
        yield self.manager.set_provider_type("ec2")
        self.assertEqual((yield self.manager.get_provider_type()), "ec2")
        content, stat = yield self.client.get("/settings")
        self.assertEqual(yaml.load(content),
                         {"provider-type": "ec2"})

    @inlineCallbacks
    def test_get_debug_log_enabled_no_settings_default(self):
        """Debug logging is off by default."""
        value = yield self.manager.is_debug_log_enabled()
        self.assertFalse(value)

    @inlineCallbacks
    def test_set_debug_log(self):
        """Debug logging can be (dis)enabled via the runtime manager."""
        yield self.manager.set_debug_log(True)
        value = yield self.manager.is_debug_log_enabled()
        self.assertTrue(value)
        yield self.manager.set_debug_log(False)
        value = yield self.manager.is_debug_log_enabled()
        self.assertFalse(value)

    @inlineCallbacks
    def test_watcher(self):
        """Use the watch facility of the settings manager to observer changes.
        """
        results = []
        callbacks = [Deferred() for i in range(5)]

        def watch(content):
            results.append(content)
            callbacks[len(results) - 1].callback(content)

        yield self.manager.set_debug_log(True)
        yield self.manager.watch_settings_changes(watch)
        self.assertTrue(results)

        yield self.manager.set_debug_log(False)
        yield self.manager.set_debug_log(True)
        yield callbacks[2]
        self.assertEqual(len(results), 3)

        self.assertEqual(
            map(lambda x: isinstance(x, bool) and x or x.type_name, results),
            [True, "changed", "changed"])
        data, stat = yield self.client.get(SETTINGS_PATH)
        self.assertEqual(
            (yield self.manager.is_debug_log_enabled()),
            True)

    @inlineCallbacks
    def test_watcher_start_stop(self):
        """Setings watcher observes changes till stopped.

        Additionally watching can be enabled on a setting node that doesn't
        exist yet.

        XXX For reasons unknown this fails under coverage outside of the test,
        at least for me (k.), but not for others.
        """
        results = []
        callbacks = [Deferred() for i in range(5)]

        def watch(content):
            results.append(content)
            callbacks[len(results) - 1].callback(content)

        watcher = yield self.manager.watch_settings_changes(watch)
        yield self.client.create(SETTINGS_PATH, "x")
        value = yield callbacks[0]
        self.assertEqual(value.type_name, "created")

        data = dict(x=1, y=2, z=3, moose=u"moon")
        yield self.client.set(
            SETTINGS_PATH, yaml.safe_dump(data))
        value = yield callbacks[1]
        self.assertEqual(value.type_name, "changed")

        watcher.stop()

        yield self.client.set(SETTINGS_PATH, "z")
        # Give a chance for things to go bad.
        yield self.sleep(0.1)
        self.assertFalse(callbacks[2].called)

    @inlineCallbacks
    def test_watcher_stops_on_callback_exception(self):
        """If a callback has an exception the watcher is stopped."""
        results = []
        callbacks = [Deferred(), Deferred()]

        def watch(content):
            results.append(content)
            callbacks[len(results) - 1].callback(content)
            raise AttributeError("foobar")

        def on_error(error):
            results.append(True)

        yield self.client.create(SETTINGS_PATH, "z")
        watcher = yield self.manager.watch_settings_changes(
            watch, on_error)
        yield callbacks[0]

        # The callback error should have disconnected the system.
        yield self.client.set(SETTINGS_PATH, "x")

        # Give a chance for things to go bad.
        yield self.sleep(0.1)

        # Verify nothing did go bad.
        self.assertFalse(watcher.is_running)
        self.assertFalse(callbacks[1].called)
        self.assertIdentical(results[1], True)
Ejemplo n.º 10
0
class GlobalSettingsTest(StateTestBase):
    @inlineCallbacks
    def setUp(self):
        yield super(GlobalSettingsTest, self).setUp()
        self.manager = GlobalSettingsStateManager(self.client)

    @inlineCallbacks
    def test_get_set_provider_type(self):
        """Debug logging is off by default."""
        self.assertEqual((yield self.manager.get_provider_type()), None)
        yield self.manager.set_provider_type("ec2")
        self.assertEqual((yield self.manager.get_provider_type()), "ec2")
        content, stat = yield self.client.get("/settings")
        self.assertEqual(yaml.load(content), {"provider-type": "ec2"})

    @inlineCallbacks
    def test_get_debug_log_enabled_no_settings_default(self):
        """Debug logging is off by default."""
        value = yield self.manager.is_debug_log_enabled()
        self.assertFalse(value)

    @inlineCallbacks
    def test_set_debug_log(self):
        """Debug logging can be (dis)enabled via the runtime manager."""
        yield self.manager.set_debug_log(True)
        value = yield self.manager.is_debug_log_enabled()
        self.assertTrue(value)
        yield self.manager.set_debug_log(False)
        value = yield self.manager.is_debug_log_enabled()
        self.assertFalse(value)

    @inlineCallbacks
    def test_watcher(self):
        """Use the watch facility of the settings manager to observer changes.
        """
        results = []
        callbacks = [Deferred() for i in range(5)]

        def watch(content):
            results.append(content)
            callbacks[len(results) - 1].callback(content)

        yield self.manager.set_debug_log(True)
        yield self.manager.watch_settings_changes(watch)
        self.assertTrue(results)

        yield self.manager.set_debug_log(False)
        yield self.manager.set_debug_log(True)
        yield callbacks[2]
        self.assertEqual(len(results), 3)

        self.assertEqual(
            map(lambda x: isinstance(x, bool) and x or x.type_name, results),
            [True, "changed", "changed"])
        data, stat = yield self.client.get(SETTINGS_PATH)
        self.assertEqual((yield self.manager.is_debug_log_enabled()), True)

    @inlineCallbacks
    def test_watcher_start_stop(self):
        """Setings watcher observes changes till stopped.

        Additionally watching can be enabled on a setting node that doesn't
        exist yet.

        XXX For reasons unknown this fails under coverage outside of the test,
        at least for me (k.), but not for others.
        """
        results = []
        callbacks = [Deferred() for i in range(5)]

        def watch(content):
            results.append(content)
            callbacks[len(results) - 1].callback(content)

        watcher = yield self.manager.watch_settings_changes(watch)
        yield self.client.create(SETTINGS_PATH, "x")
        value = yield callbacks[0]
        self.assertEqual(value.type_name, "created")

        data = dict(x=1, y=2, z=3, moose=u"moon")
        yield self.client.set(SETTINGS_PATH, yaml.safe_dump(data))
        value = yield callbacks[1]
        self.assertEqual(value.type_name, "changed")

        watcher.stop()

        yield self.client.set(SETTINGS_PATH, "z")
        # Give a chance for things to go bad.
        yield self.sleep(0.1)
        self.assertFalse(callbacks[2].called)

    @inlineCallbacks
    def test_watcher_stops_on_callback_exception(self):
        """If a callback has an exception the watcher is stopped."""
        results = []
        callbacks = [Deferred(), Deferred()]

        def watch(content):
            results.append(content)
            callbacks[len(results) - 1].callback(content)
            raise AttributeError("foobar")

        def on_error(error):
            results.append(True)

        yield self.client.create(SETTINGS_PATH, "z")
        watcher = yield self.manager.watch_settings_changes(watch, on_error)
        yield callbacks[0]

        # The callback error should have disconnected the system.
        yield self.client.set(SETTINGS_PATH, "x")

        # Give a chance for things to go bad.
        yield self.sleep(0.1)

        # Verify nothing did go bad.
        self.assertFalse(watcher.is_running)
        self.assertFalse(callbacks[1].called)
        self.assertIdentical(results[1], True)