def test_report_state_one_node_one_port(self, mock_conn, mock_ir_client):
        self.agent = ironic_neutron_agent.BaremetalNeutronAgent()
        with mock.patch.object(self.agent.state_rpc,
                               'report_state',
                               autospec=True) as mock_report_state:
            self.agent.ironic_client = mock_conn
            mock_conn.ports.return_value = iter([FakePort1()])
            self.agent.agent_id = 'agent_id'
            self.agent.member_manager.hashring = hashring.HashRing(
                [self.agent.agent_id])

            expected = {
                'topic': n_const.L2_AGENT_TOPIC,
                'start_flag': True,
                'binary': constants.BAREMETAL_BINARY,
                'host': '55555555-4444-3333-2222-111111111111',
                'configurations': {
                    'bridge_mappings': {
                        'physnet1': 'yes'
                    },
                    'log_agent_heartbeats': False,
                },
                'agent_type': constants.BAREMETAL_AGENT_TYPE
            }
            self.agent._report_state()
            mock_report_state.assert_called_with(self.agent.context, expected)
    def test_start_flag_true_on_update_after_config_change(
            self, mock_conn, mock_ir_client):
        self.agent = ironic_neutron_agent.BaremetalNeutronAgent()
        with mock.patch.object(self.agent.state_rpc,
                               'report_state',
                               autospec=True) as mock_report_state:
            self.agent.ironic_client = mock_conn
            mock_conn.ports.return_value = iter([FakePort1()])
            self.agent.agent_id = 'agent_id'
            self.agent.member_manager.hashring = hashring.HashRing(
                [self.agent.agent_id])

            expected = {
                'topic': n_const.L2_AGENT_TOPIC,
                'start_flag': 'PLACEHOLDER',
                'binary': constants.BAREMETAL_BINARY,
                'host': '55555555-4444-3333-2222-111111111111',
                'configurations': {
                    'bridge_mappings': {
                        'physnet1': 'yes'
                    },
                    'log_agent_heartbeats': False,
                },
                'agent_type': constants.BAREMETAL_AGENT_TYPE
            }

            # First time report start_flag is True
            expected.update({'start_flag': True})
            self.agent._report_state()
            mock_report_state.assert_called_with(self.agent.context, expected)
            # Subsequent times report start_flag is False
            mock_conn.ports.return_value = iter([FakePort1()])
            expected.update({'start_flag': False})
            self.agent._report_state()
            mock_report_state.assert_called_with(self.agent.context, expected)
            # After bridge_mapping config change start_flag is True once
            mock_conn.ports.return_value = iter(
                [FakePort1(physnet='new_physnet')])
            expected.update({
                'configurations': {
                    'bridge_mappings': {
                        'new_physnet': 'yes'
                    },
                    'log_agent_heartbeats': False
                }
            })
            expected.update({'start_flag': True})
            self.agent._report_state()
            mock_report_state.assert_called_with(self.agent.context, expected)
            # Subsequent times report start_flag is False
            mock_conn.ports.return_value = iter(
                [FakePort1(physnet='new_physnet')])
            expected.update({'start_flag': False})
            self.agent._report_state()
            mock_report_state.assert_called_with(self.agent.context, expected)
    def test_ironic_port_list_fail(self, mock_log, mock_conn, mock_ir_client):
        self.agent = ironic_neutron_agent.BaremetalNeutronAgent()
        self.agent.ironic_client = mock_conn

        def mock_generator(details=None):
            raise sdk_exc.OpenStackCloudException()
            yield

        mock_conn.ports.side_effect = mock_generator
        self.agent._report_state()
        self.assertEqual(1, mock_log.call_count)
    def test_state_rpc_report_state_fail(self, mock_report_state, mock_log,
                                         mock_conn, mock_ir_client):
        self.agent = ironic_neutron_agent.BaremetalNeutronAgent()
        self.agent.agent_id = 'agent_id'
        self.agent.member_manager.hashring = hashring.HashRing(
            [self.agent.agent_id])

        self.agent.ironic_client = mock_conn
        self.agent.state_rpc = mock_report_state
        mock_conn.ports.return_value = iter([FakePort1(), FakePort2()])
        mock_report_state.report_state.side_effect = Exception()
        self.agent._report_state()
        self.assertEqual(1, mock_log.call_count)
    def test_get_template_node_state(self, mock_conn, mock_ir_client):
        self.agent = ironic_neutron_agent.BaremetalNeutronAgent()
        # Verify agent binary
        expected = constants.BAREMETAL_BINARY
        self.assertEqual(expected,
                         self.agent.get_template_node_state('uuid')['binary'])

        # Verify agent_type is Baremetal Node
        expected = constants.BAREMETAL_AGENT_TYPE
        self.assertEqual(
            expected,
            self.agent.get_template_node_state('uuid')['agent_type'])
        # Verify topic
        expected = n_const.L2_AGENT_TOPIC
        self.assertEqual(expected,
                         self.agent.get_template_node_state('uuid')['topic'])
        # Verify host
        expected = 'the_node_uuid'
        self.assertEqual(
            expected,
            self.agent.get_template_node_state('the_node_uuid')['host'])