def setUp(self):
        self.hostname = "localhost"
        self.host_port = 1234
        self.availability_zone_id = "test"
        self.host_addr = ServerAddress(self.hostname, self.host_port)
        self.chairman_list = []
        self.agent_id = "foo"
        self.host_config = HostConfig(self.agent_id, self.availability_zone_id,
                                      [Datastore("bar")], self.host_addr,
                                      [Network("nw1")])
        self.registrant = ChairmanRegistrant(self.chairman_list)
        host_handler = MagicMock()
        host_handler.get_host_config_no_logging.return_value = \
            GetConfigResponse(hostConfig=self.host_config)
        common.services.register(Host.Iface, host_handler)
        self.request = RegisterHostRequest("foo", self.host_config)

        self.state_file = tempfile.mktemp()
        common.services.register(ServiceName.MODE,
                                 Mode(State(self.state_file)))
Exemple #2
0
    def _setup_chairman_registrants(self):
        """
        Setup the chairman registrant to register the host configuration.
        """

        for host_id, pseudoConfig in self._hosts.iteritems():
            registrant = ChairmanRegistrant(host_id, pseudoConfig,
                                            pseudoConfig.datastore_ids,
                                            pseudoConfig.networks)
            self._registrants.append(registrant)

        # Register the host with the chairman
        self._register_with_chairman()
    def setUp(self):
        self.hostname = "localhost"
        self.host_port = 1234
        self.availability_zone_id = "test"
        self.host_addr = ServerAddress(self.hostname,
                                       self.host_port)
        self.chairman_list = []
        self.agent_id = "foo"
        self.host_config = HostConfig(self.agent_id,
                                      self.availability_zone_id,
                                      [Datastore("bar")],
                                      self.host_addr,
                                      [Network("nw1")])
        self.registrant = ChairmanRegistrant(self.chairman_list)
        host_handler = MagicMock()
        host_handler.get_host_config_no_logging.return_value = \
            GetConfigResponse(hostConfig=self.host_config)
        common.services.register(Host.Iface, host_handler)
        self.request = RegisterHostRequest("foo", self.host_config)

        self.state_file = tempfile.mktemp()
        common.services.register(ServiceName.MODE,
                                 Mode(State(self.state_file)))
class TestChairmanRegistrant(unittest.TestCase):

    def setUp(self):
        self.hostname = "localhost"
        self.host_port = 1234
        self.availability_zone_id = "test"
        self.host_addr = ServerAddress(self.hostname,
                                       self.host_port)
        self.chairman_list = []
        self.agent_id = "foo"
        self.host_config = HostConfig(self.agent_id,
                                      self.availability_zone_id,
                                      [Datastore("bar")],
                                      self.host_addr,
                                      [Network("nw1")])
        self.registrant = ChairmanRegistrant(self.chairman_list)
        host_handler = MagicMock()
        host_handler.get_host_config_no_logging.return_value = \
            GetConfigResponse(hostConfig=self.host_config)
        common.services.register(Host.Iface, host_handler)
        self.request = RegisterHostRequest("foo", self.host_config)

        self.state_file = tempfile.mktemp()
        common.services.register(ServiceName.MODE,
                                 Mode(State(self.state_file)))

    def tearDown(self):
        common.services.reset()
        try:
            os.unlink(self.state_file)
        except:
            pass

    @patch("agent.chairman_registrant.Client")
    def test_register(self, client_class):
        register_succeeded = threading.Event()

        def fake_register(request):
            register_succeeded.set()
            return RegisterHostResponse(RegisterHostResultCode.OK)

        client = MagicMock()
        client.register_host.side_effect = fake_register
        client_class.return_value = client

        self.registrant.start_register()
        register_succeeded.wait(1)
        client.register_host.assert_called_once_with(self.request)
        self.registrant.stop_register()

    @patch("agent.chairman_registrant.Client")
    def test_register_error_retry(self, client_class):
        count = [0, 0]  # [register_count, sleep_count]
        failure_count = 10
        register_succeeded = threading.Event()

        # fail registration for 10 times before succeeding.
        def fake_register(request):
            count[0] += 1
            if count[0] <= failure_count:
                return RegisterHostResponse(RegisterHostResultCode.NOT_LEADER)
            else:
                register_succeeded.set()
                return RegisterHostResponse(RegisterHostResultCode.OK)

        # fake wait to verify exponential backoff.
        def fake_wait(sleep_sec=None):
            if count[0] <= 10:
                expected_sec = min(2 ** count[0], MAX_TIMEOUT)
                count[1] += 1
            else:
                expected_sec = None
            assert_that(sleep_sec, is_(expected_sec))
            if expected_sec is None:
                time.sleep(1)

        client = MagicMock()
        client.register_host.side_effect = fake_register
        cond_mock = MagicMock()
        self.registrant._trigger_condition = cond_mock
        cond_mock.wait.side_effect = fake_wait
        client_class.return_value = client

        self.registrant.start_register()
        register_succeeded.wait(1)

        # sleep should have been called 10 times.
        assert_that(count[1], is_(failure_count))

        # registration should have been called 11 times.
        assert_that(client.register_host.call_count, is_(failure_count + 1))
        assert_that(client.register_host.call_args_list, is_(
            (failure_count + 1) * [call(self.request)]))

        # Stop the registrant thread
        self.registrant.stop_register()

    @patch("agent.chairman_registrant.Client")
    def test_need_to_register_unregister(self, client_class):
        register_succeeded = threading.Event()
        unregister_succeeded = threading.Event()

        def fake_register(request):
            register_succeeded.set()
            return RegisterHostResponse(RegisterHostResultCode.OK)

        def fake_unregister(request):
            unregister_succeeded.set()
            return UnregisterHostResponse(UnregisterHostResultCode.OK)

        client = MagicMock()
        client.register_host.side_effect = fake_register
        client.unregister_host.side_effect = fake_unregister
        client_class.return_value = client

        # Register with chairman
        self.registrant.start_register()

        # Wait for register to happen and verify register called.
        register_succeeded.wait(1)
        assert_that(client.register_host.call_count, is_(1))

        # Trigger register. It should re-register with chairman.
        register_succeeded.clear()
        self.registrant.trigger_chairman_update()

        # Wait for register to happen and verify register called again.
        register_succeeded.wait(1)
        assert_that(client.register_host.call_count, is_(2))
        assert_that(client.register_host.call_args_list, is_(
            2 * [call(self.request)]))
        assert_that(client.unregister_host.call_count, is_(0))

        # Trigger unregister. It should unregister with chairman.
        common.services.get(ServiceName.MODE).set_mode(MODE.MAINTENANCE)
        self.registrant.trigger_chairman_update()

        # Wait for unregister to happen and verify unregister called.
        unregister_succeeded.wait(1)
        assert_that(client.unregister_host.call_count, is_(1))

        self.registrant.stop_register()
class TestChairmanRegistrant(unittest.TestCase):

    def setUp(self):
        self.hostname = "localhost"
        self.host_port = 1234
        self.availability_zone_id = "test"
        self.host_addr = ServerAddress(self.hostname,
                                       self.host_port)
        self.chairman_list = []
        self.agent_id = "foo"
        self.host_config = HostConfig(self.agent_id,
                                      self.availability_zone_id,
                                      [Datastore("bar")],
                                      self.host_addr,
                                      [Network("nw1")])
        self.registrant = ChairmanRegistrant(self.chairman_list)
        host_handler = MagicMock()
        host_handler.get_host_config_no_logging.return_value = \
            GetConfigResponse(hostConfig=self.host_config)
        common.services.register(Host.Iface, host_handler)
        self.request = RegisterHostRequest("foo", self.host_config)

        self.state_file = tempfile.mktemp()
        common.services.register(ServiceName.MODE,
                                 Mode(State(self.state_file)))

    def tearDown(self):
        common.services.reset()
        try:
            os.unlink(self.state_file)
        except:
            pass

    @patch("agent.chairman_registrant.Client")
    def test_register(self, client_class):
        register_succeeded = threading.Event()

        def fake_register(request):
            register_succeeded.set()
            return RegisterHostResponse(RegisterHostResultCode.OK)

        client = MagicMock()
        client.register_host.side_effect = fake_register
        client_class.return_value = client

        self.registrant.start_register()
        register_succeeded.wait(1)
        client.register_host.assert_called_once_with(self.request)
        self.registrant.stop_register()

    @patch("agent.chairman_registrant.Client")
    def test_register_error_retry(self, client_class):
        count = [0, 0]  # [register_count, sleep_count]
        failure_count = 10
        register_succeeded = threading.Event()

        # fail registration for 10 times before succeeding.
        def fake_register(request):
            count[0] += 1
            if count[0] <= failure_count:
                return RegisterHostResponse(RegisterHostResultCode.NOT_LEADER)
            else:
                register_succeeded.set()
                return RegisterHostResponse(RegisterHostResultCode.OK)

        # fake wait to verify exponential backoff.
        def fake_wait(sleep_sec=None):
            if count[0] <= 10:
                expected_sec = min(2 ** count[0], MAX_TIMEOUT)
                count[1] += 1
            else:
                expected_sec = None
            assert_that(sleep_sec, is_(expected_sec))
            if expected_sec is None:
                time.sleep(1)

        client = MagicMock()
        client.register_host.side_effect = fake_register
        cond_mock = MagicMock()
        self.registrant._trigger_condition = cond_mock
        cond_mock.wait.side_effect = fake_wait
        client_class.return_value = client

        self.registrant.start_register()
        register_succeeded.wait(1)

        # sleep should have been called 10 times.
        assert_that(count[1], is_(failure_count))

        # registration should have been called 11 times.
        assert_that(client.register_host.call_count, is_(failure_count + 1))
        assert_that(client.register_host.call_args_list, is_(
            (failure_count + 1) * [call(self.request)]))

        # Stop the registrant thread
        self.registrant.stop_register()

    @patch("agent.chairman_registrant.Client")
    def test_need_to_register_unregister(self, client_class):
        register_succeeded = threading.Event()
        unregister_succeeded = threading.Event()

        def fake_register(request):
            register_succeeded.set()
            return RegisterHostResponse(RegisterHostResultCode.OK)

        def fake_unregister(request):
            unregister_succeeded.set()
            return UnregisterHostResponse(UnregisterHostResultCode.OK)

        client = MagicMock()
        client.register_host.side_effect = fake_register
        client.unregister_host.side_effect = fake_unregister
        client_class.return_value = client

        # Register with chairman
        self.registrant.start_register()

        # Wait for register to happen and verify register called.
        register_succeeded.wait(10)
        assert_that(client.register_host.call_count, is_(1))

        # Trigger register. It should re-register with chairman.
        register_succeeded.clear()
        self.registrant.trigger_chairman_update()

        # Wait for register to happen and verify register called again.
        register_succeeded.wait(10)
        assert_that(client.register_host.call_count, is_(2))
        assert_that(client.register_host.call_args_list, is_(
            2 * [call(self.request)]))
        assert_that(client.unregister_host.call_count, is_(0))

        # Trigger unregister. It should unregister with chairman.
        common.services.get(ServiceName.MODE).set_mode(MODE.MAINTENANCE)
        self.registrant.trigger_chairman_update()

        # Wait for unregister to happen and verify unregister called.
        unregister_succeeded.wait(10)
        assert_that(client.unregister_host.call_count, is_(1))

        # Trigger unregister. It should unregister with chairman.
        unregister_succeeded.clear()
        common.services.get(ServiceName.MODE).set_mode(MODE.DEPROVISIONED)
        self.registrant.trigger_chairman_update()

        # Wait for unregister to happen and verify unregister called.
        unregister_succeeded.wait(10)
        assert_that(client.unregister_host.call_count, is_(2))
        assert_that(client.register_host.call_count, is_(2))

        self.registrant.stop_register()