~ubuntu-branches/ubuntu/vivid/neutron/vivid-proposed

« back to all changes in this revision

Viewing changes to neutron/tests/functional/agent/linux/test_linuxbridge_arp_protect.py

  • Committer: Package Import Robot
  • Author(s): Chuck Short, Chuck Short, Corey Byrant
  • Date: 2015-10-15 08:56:04 UTC
  • mfrom: (1.1.25)
  • Revision ID: package-import@ubuntu.com-20151015085604-zmf42dhshxz2qjad
Tags: 1:2015.1.2-0ubuntu1
[ Chuck Short ]
* Resynchronize with stable/kilo (7dbaa12) (LP: #1506058):
  - [7dbaa12] Changed filter field to router_id
  - [6c55f58] Do not log an error when deleting a linuxbridge does not exist
  - [118a76f] metadata: don't crash proxy on non-unicode user data
  - [eec8c50] Only get host data for floating ips on DVR routers
  - [9950ce2] Update dhcp host portbinding on failover
  - [1c87d72] func: Don't use private method of AsyncProcess
  - [834279c] Allow setting Agents description to None
  - [2f85b22] Process user iptables rules before INVALID
  - [f232475] Execute ipset command using check_exit_code
  - [d78899d] Don't write DHCP opts for SLAAC entries
  - [cb0554f] Check idl.run() return value before blocking
  - [2224851] Stop sending gratuitous arp when ip version is 6
  - [96276d5] Fix _ensure_default_security_group logic
  - [66a5116] Remove hack for sending gratuitous arp from fip ns
  - [2394418] populate port security default into network
  - [fc1c812] Remove early yields in _iter_hosts in dhcp agent
  - [2ead51a] Enable servicing lbaasV2 vip by DVR
  - [9498ea2] Descheduling DVR routers when ports are unbound from VM
  - [c74b05e] Bug-Fix for unexpected DHCP agent redundant
  - [e6a0e7d] Switch to dictionary for iptables find
  - [c377330] Add configurable options for HA networks
  - [114949b] Fix ipset can't be destroyed when last rule is deleted
  - [aba5e82] Updated NSXv plugin parameter descriptions
  - [d1a48f7] ovs: don't use ARP responder for IPv6 addresses
  - [4d15b6f] Configure gw_iface for RAs only in Master HA Router
  - [6975b2b] Register extraroute extension
  - [19d5ba4] Broadcast service port's arp in DVR
  - [767cea2] Stop device_owner from being set to 'network:*'
  - [2a6b34e] Fix a wrong condition for the _purge_metering_info function
  - [bf28c72] Add ARP spoofing protection for LinuxBridge agent
  - [635d5cf] Correct neutron-ns-metadata-proxy command when watch_log is
              False
  - [cc791b0] Fix usage of netaddr '.broadcast'
  - [f57a90a] Switch to using os-testr's copy of subunit2html
  - [c1201a2] Add optional file permission argument to replace_file()
  - [533900c] Adding loadbalanacerv2 device owner constant to neutron
              constants
  - [2a00016] Don't fatal error during initialization for missing service
              providers
  - [7c2727c] Update port bindings for master router
  - [6298a90] Setup reference service providers for API test runs
  - [6167d44] Move away nested transaction from _ensure_default_security_group
  - [c129bfa] Reject router-interface-add with a port which doesn't have any
              addresses
  - [770a105] SR-IOV: Fix SR-IOV agent to run ip link commands as root
  - [a0632d7] Catch ObjectDeletedError and skip port or subnet removal
  - [c4c8686] Cleanup stale metadata processes on l3 agent sync
  - [0c22d15] Bump stable/kilo next version to 2015.1.2
  - [4f9409d] lb-agent: ensure tap mtu is the same as physical device
  - [5d38dc5] Adds garp_master_repeat and garp_master_refresh to
              keepalived.conf
  - [e759c1c] Lower log level of errors caused by user requests to INFO
  - [1a1cc3d] Fix race condition by using lock on enable_radvd
  - [5827664] Remove bridge cleanup call
  - [23f5134] Added networking-plumgrid in plugin requirements

[ Corey Byrant ]
* d/rules: Prevent dh_python2 from guessing dependencies.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (c) 2015 Mirantis, Inc.
 
2
# All Rights Reserved.
 
3
#
 
4
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
 
5
#    not use this file except in compliance with the License. You may obtain
 
6
#    a copy of the License at
 
7
#
 
8
#         http://www.apache.org/licenses/LICENSE-2.0
 
9
#
 
10
#    Unless required by applicable law or agreed to in writing, software
 
11
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 
12
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 
13
#    License for the specific language governing permissions and limitations
 
14
#    under the License.
 
15
from oslo_config import cfg
 
16
 
 
17
from neutron.plugins.linuxbridge.agent import arp_protect
 
18
from neutron.tests.common import machine_fixtures
 
19
from neutron.tests.common import net_helpers
 
20
from neutron.tests.functional import base as functional_base
 
21
 
 
22
no_arping = net_helpers.assert_no_arping
 
23
arping = net_helpers.assert_arping
 
24
 
 
25
 
 
26
class LinuxBridgeARPSpoofTestCase(functional_base.BaseSudoTestCase):
 
27
 
 
28
    def setUp(self):
 
29
        super(LinuxBridgeARPSpoofTestCase, self).setUp()
 
30
        cfg.CONF.set_override('prevent_arp_spoofing', True, 'AGENT')
 
31
        lbfixture = self.useFixture(net_helpers.LinuxBridgeFixture())
 
32
        self.addCleanup(setattr, arp_protect, 'NAMESPACE', None)
 
33
        arp_protect.NAMESPACE = lbfixture.namespace
 
34
        bridge = lbfixture.bridge
 
35
        self.source, self.destination, self.observer = self.useFixture(
 
36
            machine_fixtures.PeerMachines(bridge, amount=3)).machines
 
37
 
 
38
    def _add_arp_protection(self, machine, addresses, extra_port_dict=None):
 
39
        port_dict = {'fixed_ips': [{'ip_address': a} for a in addresses]}
 
40
        if extra_port_dict:
 
41
            port_dict.update(extra_port_dict)
 
42
        name = net_helpers.VethFixture.get_peer_name(machine.port.name)
 
43
        arp_protect.setup_arp_spoofing_protection(name, port_dict)
 
44
        self.addCleanup(arp_protect.delete_arp_spoofing_protection,
 
45
                        [name])
 
46
 
 
47
    def test_arp_no_protection(self):
 
48
        arping(self.source.namespace, self.destination.ip)
 
49
        arping(self.destination.namespace, self.source.ip)
 
50
 
 
51
    def test_arp_correct_protection(self):
 
52
        self._add_arp_protection(self.source, [self.source.ip])
 
53
        self._add_arp_protection(self.destination, [self.destination.ip])
 
54
        arping(self.source.namespace, self.destination.ip)
 
55
        arping(self.destination.namespace, self.source.ip)
 
56
 
 
57
    def test_arp_fails_incorrect_protection(self):
 
58
        self._add_arp_protection(self.source, ['1.1.1.1'])
 
59
        self._add_arp_protection(self.destination, ['2.2.2.2'])
 
60
        no_arping(self.source.namespace, self.destination.ip)
 
61
        no_arping(self.destination.namespace, self.source.ip)
 
62
 
 
63
    def test_arp_protection_removal(self):
 
64
        self._add_arp_protection(self.source, ['1.1.1.1'])
 
65
        self._add_arp_protection(self.destination, ['2.2.2.2'])
 
66
        no_arping(self.observer.namespace, self.destination.ip)
 
67
        no_arping(self.observer.namespace, self.source.ip)
 
68
        name = net_helpers.VethFixture.get_peer_name(self.source.port.name)
 
69
        arp_protect.delete_arp_spoofing_protection([name])
 
70
        # spoofing should have been removed from source, but not dest
 
71
        arping(self.observer.namespace, self.source.ip)
 
72
        no_arping(self.observer.namespace, self.destination.ip)
 
73
 
 
74
    def test_arp_protection_update(self):
 
75
        self._add_arp_protection(self.source, ['1.1.1.1'])
 
76
        self._add_arp_protection(self.destination, ['2.2.2.2'])
 
77
        no_arping(self.observer.namespace, self.destination.ip)
 
78
        no_arping(self.observer.namespace, self.source.ip)
 
79
        self._add_arp_protection(self.source, ['192.0.0.0/1'])
 
80
        # spoofing should have been updated on source, but not dest
 
81
        arping(self.observer.namespace, self.source.ip)
 
82
        no_arping(self.observer.namespace, self.destination.ip)
 
83
 
 
84
    def test_arp_protection_port_security_disabled(self):
 
85
        self._add_arp_protection(self.source, ['1.1.1.1'])
 
86
        no_arping(self.observer.namespace, self.source.ip)
 
87
        self._add_arp_protection(self.source, ['1.1.1.1'],
 
88
                                 {'port_security_enabled': False})
 
89
        arping(self.observer.namespace, self.source.ip)
 
90
 
 
91
    def test_arp_protection_dead_reference_removal(self):
 
92
        self._add_arp_protection(self.source, ['1.1.1.1'])
 
93
        self._add_arp_protection(self.destination, ['2.2.2.2'])
 
94
        no_arping(self.observer.namespace, self.destination.ip)
 
95
        no_arping(self.observer.namespace, self.source.ip)
 
96
        name = net_helpers.VethFixture.get_peer_name(self.source.port.name)
 
97
        # This should remove all arp protect rules that aren't source port
 
98
        arp_protect.delete_unreferenced_arp_protection([name])
 
99
        no_arping(self.observer.namespace, self.source.ip)
 
100
        arping(self.observer.namespace, self.destination.ip)