def test_auto_schedule_one_network_two_segments_with_one_subnet_each(self):
        net_id = self._create_network()
        seg1_id = self._create_segment(net_id)
        self._create_subnet(seg1_id, net_id)
        helpers.register_dhcp_agent(HOST_D)
        segments_service_db.update_segment_host_mapping(
            self.ctx, HOST_D, {seg1_id})
        scheduler = dhcp_agent_scheduler.ChanceScheduler()
        observed_val_first_segment = scheduler.auto_schedule_networks(
            self.plugin, self.ctx, HOST_D)
        self.assertTrue(observed_val_first_segment)
        agents = self.plugin.get_dhcp_agents_hosting_networks(
            self.ctx, [net_id])
        self.assertEqual(1, len(agents))

        seg2_id = self._create_segment(net_id)
        self._create_subnet(seg2_id, net_id, '192.168.11.0/24')
        helpers.register_dhcp_agent(HOST_C)
        segments_service_db.update_segment_host_mapping(
            self.ctx, HOST_C, {seg2_id})
        observed_val_second_segment = scheduler.auto_schedule_networks(
            self.plugin, self.ctx, HOST_C)
        self.assertTrue(observed_val_second_segment)
        agents = self.plugin.get_dhcp_agents_hosting_networks(
            self.ctx, [net_id])
        self.assertEqual(2, len(agents))
Esempio n. 2
0
    def test_schedule_network(self):
        self.config(dhcp_agents_per_network=self.max_agents_per_network)
        scheduler = dhcp_agent_scheduler.ChanceScheduler()

        # create dhcp agents
        hosts = ['host-%s' % i for i in range(self.agent_count)]
        dhcp_agents = self._create_and_set_agents_down(
            hosts, down_agent_count=self.down_agent_count)

        active_agents = dhcp_agents[self.down_agent_count:]

        # schedule some agents before calling schedule
        if self.scheduled_agent_count:
            # schedule the network
            schedule_agents = active_agents[:self.scheduled_agent_count]
            scheduler.resource_filter.bind(self.ctx, schedule_agents,
                                           self.network_id)
        actual_scheduled_agents = scheduler.schedule(self, self.ctx,
                                                     self.network)
        if self.expected_scheduled_agent_count:
            self.assertEqual(self.expected_scheduled_agent_count,
                             len(actual_scheduled_agents))
            hosted_agents = self.list_dhcp_agents_hosting_network(
                self.ctx, self.network_id)
            self.assertEqual(
                self.scheduled_agent_count + len(actual_scheduled_agents),
                len(hosted_agents['agents']))
        else:
            self.assertEqual([], actual_scheduled_agents)
Esempio n. 3
0
    def test_auto_schedule_network(self):
        plugin = mock.MagicMock()
        plugin.get_subnets.return_value = ([{
            "network_id": self.network_id,
            "enable_dhcp": self.enable_dhcp
        }] if self.network_present else [])
        plugin.get_network.return_value = {
            'availability_zone_hints': self.az_hints
        }
        scheduler = dhcp_agent_scheduler.ChanceScheduler()
        if self.network_present:
            down_agent_count = 1 if self.agent_down else 0
            agents = self._create_and_set_agents_down(
                ['host-a'], down_agent_count=down_agent_count)
            if self.scheduled_already:
                self._test_schedule_bind_network(agents, self.network_id)

        expected_result = (self.network_present and self.enable_dhcp)
        expected_hosted_agents = (1 if expected_result and self.valid_host else
                                  0)
        if (self.az_hints
                and agents[0]['availability_zone'] not in self.az_hints):
            expected_hosted_agents = 0
        host = "host-a" if self.valid_host else "host-b"
        observed_ret_value = scheduler.auto_schedule_networks(
            plugin, self.ctx, host)
        self.assertEqual(expected_result, observed_ret_value)
        hosted_agents = self.ctx.session.query(
            sched_db.NetworkDhcpAgentBinding).all()
        self.assertEqual(expected_hosted_agents, len(hosted_agents))
Esempio n. 4
0
 def _test_get_agents_and_scheduler_for_dead_agent(self):
     agents = self._create_and_set_agents_down(['dead_host', 'alive_host'],
                                               1)
     dead_agent = [agents[0]]
     alive_agent = [agents[1]]
     self._test_schedule_bind_network(dead_agent, self.network_id)
     scheduler = dhcp_agent_scheduler.ChanceScheduler()
     return dead_agent, alive_agent, scheduler
 def _test_schedule_bind_network(self, agents, network_id):
     scheduler = dhcp_agent_scheduler.ChanceScheduler()
     scheduler.resource_filter.bind(self.ctx, agents, network_id)
     binding_objs = network_obj.NetworkDhcpAgentBinding.get_objects(
         self.ctx, network_id=network_id)
     self.assertEqual(len(agents), len(binding_objs))
     for result in binding_objs:
         self.assertEqual(network_id, result.network_id)
Esempio n. 6
0
 def _test_schedule_bind_network(self, agents, network_id):
     scheduler = dhcp_agent_scheduler.ChanceScheduler()
     scheduler.resource_filter.bind(self.ctx, agents, network_id)
     results = self.ctx.session.query(
         sched_db.NetworkDhcpAgentBinding).filter_by(
         network_id=network_id).all()
     self.assertEqual(len(agents), len(results))
     for result in results:
         self.assertEqual(network_id, result.network_id)
Esempio n. 7
0
    def test_auto_schedule_networks(self):
        plugin = mock.MagicMock()
        plugin.get_subnets.return_value = [{"network_id": self.network_id,
                                            "enable_dhcp": True}]
        agents = self._get_agents(['host-a'])
        self._save_agents(agents)
        scheduler = dhcp_agent_scheduler.ChanceScheduler()

        self.assertTrue(scheduler.auto_schedule_networks(plugin,
                                                         self.ctx, "host-a"))
        results = (
            self.ctx.session.query(agentschedulers_db.NetworkDhcpAgentBinding)
            .all())
        self.assertEqual(1, len(results))
    def _test_auto_schedule(self, host_index):
        self.config(dhcp_agents_per_network=self.max_agents_per_network)
        scheduler = dhcp_agent_scheduler.ChanceScheduler()
        self.ctx = context.get_admin_context()
        msg = 'host_index = %s' % host_index

        # create dhcp agents
        hosts = [
            '%s-agent-%s' % (host_index, i) for i in range(self.agent_count)
        ]
        dhcp_agents = self._create_and_set_agents_down(hosts)

        # create networks
        self._networks = [
            network.Network(self.ctx,
                            id=uuidutils.generate_uuid(),
                            name='%s-network-%s' % (host_index, i))
            for i in range(self.network_count)
        ]
        for i in range(len(self._networks)):
            self._networks[i].create()
        network_ids = [net.id for net in self._networks]

        # pre schedule the networks to the agents defined in
        # self.hosted_networks before calling auto_schedule_network
        for agent, networks in self.hosted_networks.items():
            agent_index = self._extract_index(agent)
            for net in networks:
                net_index = self._extract_index(net)
                scheduler.resource_filter.bind(self.ctx,
                                               [dhcp_agents[agent_index]],
                                               network_ids[net_index])

        retval = scheduler.auto_schedule_networks(self, self.ctx,
                                                  hosts[host_index])
        self.assertEqual(self.expected_auto_schedule_return_value,
                         retval,
                         message=msg)

        agent_id = dhcp_agents[host_index].id
        hosted_networks = self._get_hosted_networks_on_dhcp_agent(agent_id)
        hosted_net_names = [
            self._strip_host_index(net['name'])
            for net in network.Network.get_objects(self.ctx,
                                                   id=hosted_networks)
        ]
        expected_hosted_networks = self.expected_hosted_networks['agent-%s' %
                                                                 host_index]
        self.assertItemsEqual(hosted_net_names, expected_hosted_networks, msg)
 def test_auto_schedule_one_network_one_segment_one_subnet(self):
     net_id = self._create_network()
     seg_id = self._create_segment(net_id)
     self._create_subnet(seg_id, net_id)
     helpers.register_dhcp_agent(HOST_C)
     segments_service_db.update_segment_host_mapping(
         self.ctx, HOST_C, {seg_id})
     scheduler = dhcp_agent_scheduler.ChanceScheduler()
     observed_return_val = scheduler.auto_schedule_networks(
         self.plugin, self.ctx, HOST_C)
     self.assertTrue(observed_return_val)
     agent1 = self.plugin.get_dhcp_agents_hosting_networks(
         self.ctx, [net_id])
     self.assertEqual(1, len(agent1))
     self.assertEqual('host-c', agent1[0]['host'])
    def _test_auto_schedule(self, host_index):
        self.config(dhcp_agents_per_network=self.max_agents_per_network)
        scheduler = dhcp_agent_scheduler.ChanceScheduler()
        self.ctx = context.get_admin_context()
        msg = 'host_index = %s' % host_index

        # create dhcp agents
        hosts = [
            '%s-agent-%s' % (host_index, i) for i in range(self.agent_count)
        ]
        dhcp_agents = self._create_and_set_agents_down(hosts)

        # create networks
        self._networks = [
            '%s-network-%s' % (host_index, i)
            for i in range(self.network_count)
        ]
        self._save_networks(self._networks)

        # pre schedule the networks to the agents defined in
        # self.hosted_networks before calling auto_schedule_network
        for agent, networks in six.iteritems(self.hosted_networks):
            agent_index = self._extract_index(agent)
            for net in networks:
                net_index = self._extract_index(net)
                scheduler.resource_filter.bind(self.ctx,
                                               [dhcp_agents[agent_index]],
                                               self._networks[net_index])

        retval = scheduler.auto_schedule_networks(self, self.ctx,
                                                  hosts[host_index])
        self.assertEqual(self.expected_auto_schedule_return_value,
                         retval,
                         message=msg)

        agent_id = dhcp_agents[host_index].id
        hosted_networks = self._get_hosted_networks_on_dhcp_agent(agent_id)
        hosted_net_ids = [
            self._strip_host_index(net) for net in hosted_networks
        ]
        expected_hosted_networks = self.expected_hosted_networks['agent-%s' %
                                                                 host_index]
        for hosted_net_id in hosted_net_ids:
            self.assertIn(hosted_net_id,
                          expected_hosted_networks,
                          message=msg + '[%s]' % hosted_net_id)
Esempio n. 11
0
 def test_auto_schedule_network_excess_agents(self):
     plugin = mock.MagicMock()
     plugin.get_subnets.return_value = (
         [{"network_id": self.network_id, "enable_dhcp": True}])
     plugin.get_network.return_value = {'availability_zone_hints': ['nova']}
     scheduler = dhcp_agent_scheduler.ChanceScheduler()
     dhcpfilter = 'neutron.scheduler.dhcp_agent_scheduler.DhcpFilter'
     self._create_and_set_agents_down(['host-a', 'host-b'])
     expected_hosted_agents = 1
     binding_index = 1
     scheduler.auto_schedule_networks(plugin, self.ctx, 'host-a')
     with mock.patch(
             dhcpfilter + '.get_vacant_network_dhcp_agent_binding_index',
             context=self.ctx, network_id=self.network_id) as ndab:
         ndab.return_value = binding_index
         scheduler.auto_schedule_networks(plugin, self.ctx, 'host-b')
         self.assertTrue(ndab.called)
     num_hosted_agents = network_obj.NetworkDhcpAgentBinding.count(
         self.ctx, network_id=self.network_id)
     self.assertEqual(expected_hosted_agents, num_hosted_agents)
Esempio n. 12
0
 def test_auto_schedule_networks_no_networks(self):
     plugin = mock.MagicMock()
     plugin.get_networks.return_value = []
     scheduler = dhcp_agent_scheduler.ChanceScheduler()
     self.assertFalse(
         scheduler.auto_schedule_networks(plugin, self.ctx, "host-a"))