Example #1
0
    def test_create_fip_agent_gw_port_if_not_exists_with_l3_agent(self):
        fport_db = {'id': _uuid()}
        self.mixin._get_agent_gw_ports_exist_for_network = mock.Mock(
            return_value=fport_db)

        fipagent = agent_model.Agent(
            binary='foo-agent',
            host='host',
            agent_type='L3 agent',
            topic='foo_topic',
            configurations='{"agent_mode": "dvr_no_external"}')
        self.mixin._get_agent_by_type_and_host = mock.Mock(
            return_value=fipagent)
        fport = self.mixin.create_fip_agent_gw_port_if_not_exists(
            self.ctx, 'network_id', 'host')
        self.assertIsNone(fport)

        fipagent = agent_model.Agent(binary='foo-agent',
                                     host='host',
                                     agent_type='L3 agent',
                                     topic='foo_topic',
                                     configurations='{"agent_mode": "dvr"}')
        self.mixin._get_agent_by_type_and_host = mock.Mock(
            return_value=fipagent)
        fport = self.mixin.create_fip_agent_gw_port_if_not_exists(
            self.ctx, 'network_id', 'host')
        self.assertIsNotNone(fport)
Example #2
0
 def test__get_enabled_agents(self):
     agent1 = agent_model.Agent()
     agent1.admin_state_up = True
     agent1.heartbeat_timestamp = timeutils.utcnow()
     agent2 = agent_model.Agent()
     agent2.admin_state_up = False
     agent2.heartbeat_timestamp = timeutils.utcnow()
     network = {'id': 'foo_network_id'}
     self._test__get_enabled_agents(network, agents=[agent1])
Example #3
0
 def test__get_enabled_agents_with_inactive_ones(self):
     agent1 = agent_model.Agent()
     agent1.admin_state_up = True
     agent1.heartbeat_timestamp = timeutils.utcnow()
     agent2 = agent_model.Agent()
     agent2.admin_state_up = True
     # This is effectively an inactive agent
     agent2.heartbeat_timestamp = datetime.datetime(2000, 1, 1, 0, 0)
     network = {'id': 'foo_network_id'}
     self._test__get_enabled_agents(network,
                                    agents=[agent1, agent2],
                                    expected_warnings=1, expected_errors=0)
Example #4
0
    def test_add_metering_label_rpc_call(self):
        second_uuid = 'e27fe2df-376e-4ac7-ae13-92f050a21f84'
        expected = [{
            'status': 'ACTIVE',
            'name': 'router1',
            'gw_port_id': None,
            'admin_state_up': True,
            'distributed': False,
            'tenant_id': self.tenant_id,
            '_metering_labels': [{
                'rules': [],
                'id': second_uuid
            }],
            'id': self.uuid
        }, {
            'status': 'ACTIVE',
            'name': 'router2',
            'gw_port_id': None,
            'admin_state_up': True,
            'distributed': False,
            'tenant_id': self.tenant_id,
            '_metering_labels': [{
                'rules': [],
                'id': second_uuid
            }],
            'id': second_uuid
        }]

        # bind each router to a specific agent
        agent1 = agent_model.Agent(host='agent1')
        agent2 = agent_model.Agent(host='agent2')

        agents = {self.uuid: agent1, second_uuid: agent2}

        def side_effect(context, routers, admin_state_up, active):
            return [agents[routers[0]]]

        self.l3routers_mock.side_effect = side_effect

        with self.router(name='router1',
                         tenant_id=self.tenant_id,
                         set_context=True):
            self.mock_uuid.return_value = second_uuid
            with self.router(name='router2',
                             tenant_id=self.tenant_id,
                             set_context=True):
                with self.metering_label(tenant_id=self.tenant_id,
                                         set_context=True):
                    self.mock_add.assert_called_with(
                        self.ctx, tools.UnorderedList(expected))
Example #5
0
 def test__get_enabled_agents_with_notification_required(self):
     network = {'id': 'foo_network_id', 'subnets': ['foo_subnet_id']}
     agent = agent_model.Agent()
     agent.admin_state_up = False
     agent.heartbeat_timestamp = timeutils.utcnow()
     self._test__get_enabled_agents(network, [agent], port_count=20,
                                    expected_warnings=0, expected_errors=1)
Example #6
0
 def test__schedule_network_no_existing_agents(self):
     agent = agent_model.Agent()
     agent.admin_state_up = True
     agent.heartbeat_timestamp = timeutils.utcnow()
     network = {'id': 'foo_net_id'}
     self._test__schedule_network(network,
                                  new_agents=None, existing_agents=[agent],
                                  expected_casts=0, expected_warnings=0)
Example #7
0
    def create_or_update_agent(self, context, agent_state):
        """Registers new agent in the database or updates existing.

        Returns tuple of agent status and state.
        Status is from server point of view: alive, new or revived.
        It could be used by agent to do some sync with the server if needed.
        """
        status = agent_consts.AGENT_ALIVE
        with context.session.begin(subtransactions=True):
            res_keys = ['agent_type', 'binary', 'host', 'topic']
            res = dict((k, agent_state[k]) for k in res_keys)
            if 'availability_zone' in agent_state:
                res['availability_zone'] = agent_state['availability_zone']
            configurations_dict = agent_state.get('configurations', {})
            res['configurations'] = jsonutils.dumps(configurations_dict)
            resource_versions_dict = agent_state.get('resource_versions')
            if resource_versions_dict:
                res['resource_versions'] = jsonutils.dumps(
                    resource_versions_dict)
            res['load'] = self._get_agent_load(agent_state)
            current_time = timeutils.utcnow()
            try:
                agent_db = self._get_agent_by_type_and_host(
                    context, agent_state['agent_type'], agent_state['host'])
                if not agent_db.is_active:
                    status = agent_consts.AGENT_REVIVED
                    if 'resource_versions' not in agent_state:
                        # updating agent_state with resource_versions taken
                        # from db so that
                        # _update_local_agent_resource_versions() will call
                        # version_manager and bring it up to date
                        agent_state['resource_versions'] = self._get_dict(
                            agent_db, 'resource_versions', ignore_missing=True)
                res['heartbeat_timestamp'] = current_time
                if agent_state.get('start_flag'):
                    res['started_at'] = current_time
                greenthread.sleep(0)
                self._log_heartbeat(agent_state, agent_db, configurations_dict)
                agent_db.update(res)
                event_type = events.AFTER_UPDATE
            except ext_agent.AgentNotFoundByTypeHost:
                greenthread.sleep(0)
                res['created_at'] = current_time
                res['started_at'] = current_time
                res['heartbeat_timestamp'] = current_time
                res['admin_state_up'] = cfg.CONF.enable_new_agents
                agent_db = agent_model.Agent(**res)
                greenthread.sleep(0)
                context.session.add(agent_db)
                event_type = events.AFTER_CREATE
                self._log_heartbeat(agent_state, agent_db, configurations_dict)
                status = agent_consts.AGENT_NEW
            greenthread.sleep(0)

        registry.notify(resources.AGENT, event_type, self, context=context,
                        host=agent_state['host'], plugin=self,
                        agent=agent_state)
        return status, agent_state
Example #8
0
 def _test__notify_agents_with_function(
     self, function, expected_scheduling=0, expected_casts=0):
     with mock.patch.object(self.notifier, '_schedule_network') as f:
         with mock.patch.object(self.notifier, '_get_enabled_agents') as g:
             agent = agent_model.Agent()
             agent.admin_state_up = True
             agent.heartbeat_timestamp = timeutils.utcnow()
             g.return_value = [agent]
             function()
             self.assertEqual(expected_scheduling, f.call_count)
             self.assertEqual(expected_casts, self.mock_cast.call_count)
Example #9
0
 def _get_agents(self, hosts, agent_type):
     return [
         agent_model.Agent(binary='foo-agent',
                           host=host,
                           agent_type=agent_type,
                           topic='foo_topic',
                           configurations="{}",
                           resource_versions="{}",
                           created_at=timeutils.utcnow(),
                           started_at=timeutils.utcnow(),
                           heartbeat_timestamp=timeutils.utcnow())
         for host in hosts
     ]