class GetServicenetIPs(SynchronousTestCase): """ Tests for :func:`ScalingGroup.get_servicenet_ips`. """ def setUp(self): """Create our simulated clock and scaling group.""" self.clock = Clock() self.pool = object() self.treq = object() self.queried_server_ids = [] class FakeRCS(object): endpoints = {'nova': 'novaurl'} token = "token" @attributes(['id', 'pool', 'treq']) class FakeNova(object): def get_addresses(nova_self, rcs): self.assertIs(nova_self.pool, self.pool) self.assertIs(nova_self.treq, self.treq) self.queried_server_ids.append(nova_self.id) return defer.succeed({ 'addresses': { 'private': [ {'addr': '10.0.0.{0}'.format( len(self.queried_server_ids)), 'version': 4} ] } }) self.rcs = FakeRCS() self.sg = ScalingGroup(group_config={}, pool=self.pool, reactor=self.clock, treq=self.treq, server_client=FakeNova) def test_queries_for_provided_server_ids(self): """ If server IDs are provided, IPs are queried for those server IDs. And if the same server ID is given multiple times, only one query is made for any given server ID. """ server_ids = ['1', '2', '2', '2', '3'] d = self.sg.get_servicenet_ips(self.rcs, server_ids) result = self.successResultOf(d) self.assertEqual(['10.0.0.1', '10.0.0.2', '10.0.0.3'], sorted(result.values())) self.assertEqual(['1', '2', '3'], sorted(result.keys())) self.assertEqual(['1', '2', '3'], sorted(self.queried_server_ids)) def test_gets_active_server_ids_if_server_ids_not_provided(self): """ If server IDs are not provided, IPs are queried for the active servers on the group server IDs. """ def get_scaling_group_state(_, success_codes): self.assertEqual(success_codes, [200]) return defer.succeed(( 200, {'group': {'active': [{'id': '11'}, {'id': '12'}]}} )) self.sg.get_scaling_group_state = get_scaling_group_state d = self.sg.get_servicenet_ips(self.rcs) self.assertEqual({'11': '10.0.0.1', '12': '10.0.0.2'}, self.successResultOf(d)) self.assertEqual(['11', '12'], self.queried_server_ids)