py34 fails in neutron.tests.unit.agent.test_securitygroups_rpc

Bug #1473413 reported by Ihar Hrachyshka
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
neutron
Fix Released
High
Ihar Hrachyshka

Bug Description

The job sometimes fails in gate for multiple security groups unit tests:

2015-07-10 10:43:53.260 | FAIL: neutron.tests.unit.agent.test_securitygroups_rpc.TestSecurityGroupAgentWithOVSIptables.test_security_group_rule_updated
2015-07-10 10:43:53.261 | ----------------------------------------------------------------------
2015-07-10 10:43:53.261 | Empty attachments:
2015-07-10 10:43:53.261 | pythonlogging:'neutron.api.extensions'
2015-07-10 10:43:53.261 |
2015-07-10 10:43:53.262 | pythonlogging:'': {{{
2015-07-10 10:43:53.262 | 2015-07-10 10:43:06,008 INFO [neutron.agent.securitygroups_rpc] Preparing filters for devices ['tap_port1', 'tap_port3']
2015-07-10 10:43:53.262 | 2015-07-10 10:43:06,008 WARNING [neutron.agent.securitygroups_rpc] security_group_info_for_devices rpc call not supported by the server, falling back to old security_group_rules_for_devices which scales worse.
2015-07-10 10:43:53.263 | 2015-07-10 10:43:06,012 INFO [neutron.agent.securitygroups_rpc] Security group rule updated ['security_group1']
2015-07-10 10:43:53.263 | 2015-07-10 10:43:06,013 INFO [neutron.agent.securitygroups_rpc] Refresh firewall rules
2015-07-10 10:43:53.263 | }}}
2015-07-10 10:43:53.264 |
2015-07-10 10:43:53.264 | Traceback (most recent call last):
2015-07-10 10:43:53.264 | File "/home/jenkins/workspace/gate-neutron-python34/neutron/tests/unit/agent/test_securitygroups_rpc.py", line 2996, in test_security_group_rule_updated
2015-07-10 10:43:53.265 | self._verify_mock_calls()
2015-07-10 10:43:53.265 | File "/home/jenkins/workspace/gate-neutron-python34/neutron/tests/unit/agent/test_securitygroups_rpc.py", line 2624, in _verify_mock_calls
2015-07-10 10:43:53.265 | matchers.MatchesRegex(expected_regex))
2015-07-10 10:43:53.265 | File "/home/jenkins/workspace/gate-neutron-python34/.tox/py34/lib/python3.4/site-packages/testtools/testcase.py", line 435, in assertThat
2015-07-10 10:43:53.266 | raise mismatch_error
2015-07-10 10:43:53.268 | testtools.matchers._impl.MismatchError: '# Generated by iptables_manager\n*raw\n:run.py-OUTPUT - [0:0]\n:run.py-PREROUTING - [0:0]\n[0:0] -A PREROUTING -j run.py-PREROUTING\n[0:0] -A OUTPUT -j run.py-OUTPUT\n[0:0] -A run.py-PREROUTING -m physdev --physdev-in qvbtap_port1 -j CT --zone 1\n[0:0] -A run.py-PREROUTING -m physdev --physdev-in taptap_port1 -j CT --zone 1\n[0:0] -A run.py-PREROUTING -m physdev --physdev-in qvbtap_port2 -j CT --zone 1\n[0:0] -A run.py-PREROUTING -m physdev --physdev-in taptap_port2 -j CT --zone 1\nCOMMIT\n# Completed by iptables_manager\n# Generated by iptables_manager\n*nat\n:neutron-postrouting-bottom - [0:0]\n:run.py-OUTPUT - [0:0]\n:run.py-POSTROUTING - [0:0]\n:run.py-PREROUTING - [0:0]\n:run.py-float-snat - [0:0]\n:run.py-snat - [0:0]\n[0:0] -A PREROUTING -j run.py-PREROUTING\n[0:0] -A OUTPUT -j run.py-OUTPUT\n[0:0] -A POSTROUTING -j run.py-POSTROUTING\n[0:0] -A POSTROUTING -j neutron-postrouting-bottom\n[0:0] -A neutron-postrouting-bottom -j run.py-snat\n[0:0] -A run.py-snat -j run.py-float-snat\nCOMMIT\n# Completed by iptables_manager\n# Generated by iptables_manager\n*mangle\n:run.py-FORWARD - [0:0]\n:run.py-INPUT - [0:0]\n:run.py-OUTPUT - [0:0]\n:run.py-POSTROUTING - [0:0]\n:run.py-PREROUTING - [0:0]\n:run.py-mark - [0:0]\n[0:0] -A PREROUTING -j run.py-PREROUTING\n[0:0] -A INPUT -j run.py-INPUT\n[0:0] -A FORWARD -j run.py-FORWARD\n[0:0] -A OUTPUT -j run.py-OUTPUT\n[0:0] -A POSTROUTING -j run.py-POSTROUTING\n[0:0] -A run.py-PREROUTING -j run.py-mark\nCOMMIT\n# Completed by iptables_manager\n# Generated by iptables_manager\n*filter\n:neutron-filter-top - [0:0]\n:run.py-FORWARD - [0:0]\n:run.py-INPUT - [0:0]\n:run.py-OUTPUT - [0:0]\n:run.py-itap_port1 - [0:0]\n:run.py-itap_port2 - [0:0]\n:run.py-local - [0:0]\n:run.py-otap_port1 - [0:0]\n:run.py-otap_port2 - [0:0]\n:run.py-sg-chain - [0:0]\n:run.py-sg-fallback - [0:0]\n:run.py-stap_port1 - [0:0]\n:run.py-stap_port2 - [0:0]\n[0:0] -A FORWARD -j neutron-filter-top\n[0:0] -A OUTPUT -j neutron-filter-top\n[0:0] -A neutron-filter-top -j run.py-local\n[0:0] -A INPUT -j run.py-INPUT\n[0:0] -A OUTPUT -j run.py-OUTPUT\n[0:0] -A FORWARD -j run.py-FORWARD\n[0:0] -A run.py-sg-fallback -j DROP\n[0:0] -A run.py-FORWARD -m physdev --physdev-out taptap_port1 --physdev-is-bridged -j run.py-sg-chain\n[0:0] -A run.py-sg-chain -m physdev --physdev-out taptap_port1 --physdev-is-bridged -j run.py-itap_port1\n[0:0] -A run.py-itap_port1 -m state --state INVALID -j DROP\n[0:0] -A run.py-itap_port1 -m state --state RELATED,ESTABLISHED -j RETURN\n[0:0] -A run.py-itap_port1 -s 10.0.0.2/32 -p udp -m udp --sport 67 --dport 68 -j RETURN\n[0:0] -A run.py-itap_port1 -p tcp -m tcp --dport 22 -j RETURN\n[0:0] -A run.py-itap_port1 -s 10.0.0.4/32 -j RETURN\n[0:0] -A run.py-itap_port1 -j run.py-sg-fallback\n[0:0] -A run.py-FORWARD -m physdev --physdev-in taptap_port1 --physdev-is-bridged -j run.py-sg-chain\n[0:0] -A run.py-sg-chain -m physdev --physdev-in taptap_port1 --physdev-is-bridged -j run.py-otap_port1\n[0:0] -A run.py-INPUT -m physdev --physdev-in taptap_port1 --physdev-is-bridged -j run.py-otap_port1\n[0:0] -A run.py-stap_port1 -s 10.0.0.3/32 -m mac --mac-source 12:34:56:78:9A:BC -j RETURN\n[0:0] -A run.py-stap_port1 -j DROP\n[0:0] -A run.py-otap_port1 -p udp -m udp --sport 68 --dport 67 -j RETURN\n[0:0] -A run.py-otap_port1 -j run.py-stap_port1\n[0:0] -A run.py-otap_port1 -p udp -m udp --sport 67 --dport 68 -j DROP\n[0:0] -A run.py-otap_port1 -m state --state INVALID -j DROP\n[0:0] -A run.py-otap_port1 -m state --state RELATED,ESTABLISHED -j RETURN\n[0:0] -A run.py-otap_port1 -j RETURN\n[0:0] -A run.py-otap_port1 -j run.py-sg-fallback\n[0:0] -A run.py-FORWARD -m physdev --physdev-out taptap_port2 --physdev-is-bridged -j run.py-sg-chain\n[0:0] -A run.py-sg-chain -m physdev --physdev-out taptap_port2 --physdev-is-bridged -j run.py-itap_port2\n[0:0] -A run.py-itap_port2 -m state --state INVALID -j DROP\n[0:0] -A run.py-itap_port2 -m state --state RELATED,ESTABLISHED -j RETURN\n[0:0] -A run.py-itap_port2 -s 10.0.0.2/32 -p udp -m udp --sport 67 --dport 68 -j RETURN\n[0:0] -A run.py-itap_port2 -p tcp -m tcp --dport 22 -j RETURN\n[0:0] -A run.py-itap_port2 -s 10.0.0.3/32 -j RETURN\n[0:0] -A run.py-itap_port2 -j run.py-sg-fallback\n[0:0] -A run.py-FORWARD -m physdev --physdev-in taptap_port2 --physdev-is-bridged -j run.py-sg-chain\n[0:0] -A run.py-sg-chain -m physdev --physdev-in taptap_port2 --physdev-is-bridged -j run.py-otap_port2\n[0:0] -A run.py-INPUT -m physdev --physdev-in taptap_port2 --physdev-is-bridged -j run.py-otap_port2\n[0:0] -A run.py-stap_port2 -s 10.0.0.4/32 -m mac --mac-source 12:34:56:78:9A:BD -j RETURN\n[0:0] -A run.py-stap_port2 -j DROP\n[0:0] -A run.py-otap_port2 -p udp -m udp --sport 68 --dport 67 -j RETURN\n[0:0] -A run.py-otap_port2 -j run.py-stap_port2\n[0:0] -A run.py-otap_port2 -p udp -m udp --sport 67 --dport 68 -j DROP\n[0:0] -A run.py-otap_port2 -m state --state INVALID -j DROP\n[0:0] -A run.py-otap_port2 -m state --state RELATED,ESTABLISHED -j RETURN\n[0:0] -A run.py-otap_port2 -j RETURN\n[0:0] -A run.py-otap_port2 -j run.py-sg-fallback\n[0:0] -A run.py-sg-chain -j ACCEPT\nCOMMIT\n# Completed by iptables_manager\n' does not match /# Generated by iptables_manager\n\*raw\n:run.py-OUTPUT - \[0:0\]\n:run.py-PREROUTING - \[0:0\]\n\[0:0\] -A PREROUTING -j run.py-PREROUTING\n\[0:0\] -A OUTPUT -j run.py-OUTPUT\n\[0:0\] -A run.py-PREROUTING -m physdev --physdev-in qvbtap_port2 -j CT --zone 1\n\[0:0\] -A run.py-PREROUTING -m physdev --physdev-in taptap_port2 -j CT --zone 1\n\[0:0\] -A run.py-PREROUTING -m physdev --physdev-in qvbtap_port1 -j CT --zone 1\n\[0:0\] -A run.py-PREROUTING -m physdev --physdev-in taptap_port1 -j CT --zone 1\nCOMMIT\n# Completed by iptables_manager\n# Generated by iptables_manager\n\*nat\n:neutron-postrouting-bottom - \[0:0\]\n:run.py-(OUTPUT|POSTROUTING|PREROUTING|float-snat|snat) - \[0:0\]\n:run.py-(OUTPUT|POSTROUTING|PREROUTING|float-snat|snat) - \[0:0\]\n:run.py-(OUTPUT|POSTROUTING|PREROUTING|float-snat|snat) - \[0:0\]\n:run.py-(OUTPUT|POSTROUTING|PREROUTING|float-snat|snat) - \[0:0\]\n:run.py-(OUTPUT|POSTROUTING|PREROUTING|float-snat|snat) - \[0:0\]\n\[0:0\] -A PREROUTING -j run.py-PREROUTING\n\[0:0\] -A OUTPUT -j run.py-OUTPUT\n\[0:0\] -A POSTROUTING -j run.py-POSTROUTING\n\[0:0\] -A POSTROUTING -j neutron-postrouting-bottom\n\[0:0\] -A neutron-postrouting-bottom -j run.py-snat\n\[0:0\] -A run.py-snat -j run.py-float-snat\nCOMMIT\n# Completed by iptables_manager\n# Generated by iptables_manager\n\*mangle\n:run.py-(FORWARD|INPUT|OUTPUT|POSTROUTING|PREROUTING|mark) - \[0:0\]\n:run.py-(FORWARD|INPUT|OUTPUT|POSTROUTING|PREROUTING|mark) - \[0:0\]\n:run.py-(FORWARD|INPUT|OUTPUT|POSTROUTING|PREROUTING|mark) - \[0:0\]\n:run.py-(FORWARD|INPUT|OUTPUT|POSTROUTING|PREROUTING|mark) - \[0:0\]\n:run.py-(FORWARD|INPUT|OUTPUT|POSTROUTING|PREROUTING|mark) - \[0:0\]\n:run.py-(FORWARD|INPUT|OUTPUT|POSTROUTING|PREROUTING|mark) - \[0:0\]\n\[0:0\] -A PREROUTING -j run.py-PREROUTING\n\[0:0\] -A INPUT -j run.py-INPUT\n\[0:0\] -A FORWARD -j run.py-FORWARD\n\[0:0\] -A OUTPUT -j run.py-OUTPUT\n\[0:0\] -A POSTROUTING -j run.py-POSTROUTING\n\[0:0\] -A run.py-PREROUTING -j run.py-mark\nCOMMIT\n# Completed by iptables_manager\n# Generated by iptables_manager\n\*filter\n:neutron-filter-top - \[0:0\]\n:run.py-(FORWARD|INPUT|OUTPUT|local|sg-chain|sg-fallback|itap_port1|otap_port1|stap_port1|itap_port2|otap_port2|stap_port2) - \[0:0\]\n:run.py-(FORWARD|INPUT|OUTPUT|local|sg-chain|sg-fallback|itap_port1|otap_port1|stap_port1|itap_port2|otap_port2|stap_port2) - \[0:0\]\n:run.py-(FORWARD|INPUT|OUTPUT|local|sg-chain|sg-fallback|itap_port1|otap_port1|stap_port1|itap_port2|otap_port2|stap_port2) - \[0:0\]\n:run.py-(FORWARD|INPUT|OUTPUT|local|sg-chain|sg-fallback|itap_port1|otap_port1|stap_port1|itap_port2|otap_port2|stap_port2) - \[0:0\]\n:run.py-(FORWARD|INPUT|OUTPUT|local|sg-chain|sg-fallback|itap_port1|otap_port1|stap_port1|itap_port2|otap_port2|stap_port2) - \[0:0\]\n:run.py-(FORWARD|INPUT|OUTPUT|local|sg-chain|sg-fallback|itap_port1|otap_port1|stap_port1|itap_port2|otap_port2|stap_port2) - \[0:0\]\n:run.py-(FORWARD|INPUT|OUTPUT|local|sg-chain|sg-fallback|itap_port1|otap_port1|stap_port1|itap_port2|otap_port2|stap_port2) - \[0:0\]\n:run.py-(FORWARD|INPUT|OUTPUT|local|sg-chain|sg-fallback|itap_port1|otap_port1|stap_port1|itap_port2|otap_port2|stap_port2) - \[0:0\]\n:run.py-(FORWARD|INPUT|OUTPUT|local|sg-chain|sg-fallback|itap_port1|otap_port1|stap_port1|itap_port2|otap_port2|stap_port2) - \[0:0\]\n:run.py-(FORWARD|INPUT|OUTPUT|local|sg-chain|sg-fallback|itap_port1|otap_port1|stap_port1|itap_port2|otap_port2|stap_port2) - \[0:0\]\n:run.py-(FORWARD|INPUT|OUTPUT|local|sg-chain|sg-fallback|itap_port1|otap_port1|stap_port1|itap_port2|otap_port2|stap_port2) - \[0:0\]\n:run.py-(FORWARD|INPUT|OUTPUT|local|sg-chain|sg-fallback|itap_port1|otap_port1|stap_port1|itap_port2|otap_port2|stap_port2) - \[0:0\]\n\[0:0\] -A FORWARD -j neutron-filter-top\n\[0:0\] -A OUTPUT -j neutron-filter-top\n\[0:0\] -A neutron-filter-top -j run.py-local\n\[0:0\] -A INPUT -j run.py-INPUT\n\[0:0\] -A OUTPUT -j run.py-OUTPUT\n\[0:0\] -A FORWARD -j run.py-FORWARD\n\[0:0\] -A run.py-sg-fallback -j DROP\n\[0:0\] -A run.py-FORWARD -m physdev --physdev-out taptap_port2 --physdev-is-bridged -j run.py-sg-chain\n\[0:0\] -A run.py-sg-chain -m physdev --physdev-out taptap_port2 --physdev-is-bridged -j run.py-itap_port2\n\[0:0\] -A run.py-itap_port2 -m state --state INVALID -j DROP\n\[0:0\] -A run.py-itap_port2 -m state --state RELATED,ESTABLISHED -j RETURN\n\[0:0\] -A run.py-itap_port2 -s 10.0.0.2/32 -p udp -m udp --sport 67 --dport 68 -j RETURN\n\[0:0\] -A run.py-itap_port2 -p tcp -m tcp --dport 22 -j RETURN\n\[0:0\] -A run.py-itap_port2 -s 10.0.0.3/32 -j RETURN\n\[0:0\] -A run.py-itap_port2 -j run.py-sg-fallback\n\[0:0\] -A run.py-FORWARD -m physdev --physdev-in taptap_port2 --physdev-is-bridged -j run.py-sg-chain\n\[0:0\] -A run.py-sg-chain -m physdev --physdev-in taptap_port2 --physdev-is-bridged -j run.py-otap_port2\n\[0:0\] -A run.py-INPUT -m physdev --physdev-in taptap_port2 --physdev-is-bridged -j run.py-otap_port2\n\[0:0\] -A run.py-stap_port2 -s 10.0.0.4/32 -m mac --mac-source 12:34:56:78:9A:BD -j RETURN\n\[0:0\] -A run.py-stap_port2 -j DROP\n\[0:0\] -A run.py-otap_port2 -p udp -m udp --sport 68 --dport 67 -j RETURN\n\[0:0\] -A run.py-otap_port2 -j run.py-stap_port2\n\[0:0\] -A run.py-otap_port2 -p udp -m udp --sport 67 --dport 68 -j DROP\n\[0:0\] -A run.py-otap_port2 -m state --state INVALID -j DROP\n\[0:0\] -A run.py-otap_port2 -m state --state RELATED,ESTABLISHED -j RETURN\n\[0:0\] -A run.py-otap_port2 -j RETURN\n\[0:0\] -A run.py-otap_port2 -j run.py-sg-fallback\n\[0:0\] -A run.py-FORWARD -m physdev --physdev-out taptap_port1 --physdev-is-bridged -j run.py-sg-chain\n\[0:0\] -A run.py-sg-chain -m physdev --physdev-out taptap_port1 --physdev-is-bridged -j run.py-itap_port1\n\[0:0\] -A run.py-itap_port1 -m state --state INVALID -j DROP\n\[0:0\] -A run.py-itap_port1 -m state --state RELATED,ESTABLISHED -j RETURN\n\[0:0\] -A run.py-itap_port1 -s 10.0.0.2/32 -p udp -m udp --sport 67 --dport 68 -j RETURN\n\[0:0\] -A run.py-itap_port1 -p tcp -m tcp --dport 22 -j RETURN\n\[0:0\] -A run.py-itap_port1 -s 10.0.0.4/32 -j RETURN\n\[0:0\] -A run.py-itap_port1 -j run.py-sg-fallback\n\[0:0\] -A run.py-FORWARD -m physdev --physdev-in taptap_port1 --physdev-is-bridged -j run.py-sg-chain\n\[0:0\] -A run.py-sg-chain -m physdev --physdev-in taptap_port1 --physdev-is-bridged -j run.py-otap_port1\n\[0:0\] -A run.py-INPUT -m physdev --physdev-in taptap_port1 --physdev-is-bridged -j run.py-otap_port1\n\[0:0\] -A run.py-stap_port1 -s 10.0.0.3/32 -m mac --mac-source 12:34:56:78:9A:BC -j RETURN\n\[0:0\] -A run.py-stap_port1 -j DROP\n\[0:0\] -A run.py-otap_port1 -p udp -m udp --sport 68 --dport 67 -j RETURN\n\[0:0\] -A run.py-otap_port1 -j run.py-stap_port1\n\[0:0\] -A run.py-otap_port1 -p udp -m udp --sport 67 --dport 68 -j DROP\n\[0:0\] -A run.py-otap_port1 -m state --state INVALID -j DROP\n\[0:0\] -A run.py-otap_port1 -m state --state RELATED,ESTABLISHED -j RETURN\n\[0:0\] -A run.py-otap_port1 -j RETURN\n\[0:0\] -A run.py-otap_port1 -j run.py-sg-fallback\n\[0:0\] -A run.py-sg-chain -j ACCEPT\nCOMMIT\n# Completed by iptables_manager\n/

It does not happen for py27. It may be either py34 specific issue or a general issue triggered by the fact that py34 does not run full test suite.

Changed in neutron:
assignee: nobody → Cyril Roelandt (cyril-roelandt)
importance: Undecided → High
Revision history for this message
Ihar Hrachyshka (ihar-hrachyshka) wrote :

I suspect it's caused by https://review.openstack.org/#/c/184469/ Looking at logstash, it started failing around that time.

Revision history for this message
Ihar Hrachyshka (ihar-hrachyshka) wrote :
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix proposed to neutron (master)

Fix proposed to branch: master
Review: https://review.openstack.org/200494

Changed in neutron:
assignee: Cyril Roelandt (cyril-roelandt) → Ihar Hrachyshka (ihar-hrachyshka)
status: New → In Progress
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix merged to neutron (master)

Reviewed: https://review.openstack.org/200494
Committed: https://git.openstack.org/cgit/openstack/neutron/commit/?id=5b066a237ec0918d882ef2455aef4f2f9cb0606c
Submitter: Jenkins
Branch: master

commit 5b066a237ec0918d882ef2455aef4f2f9cb0606c
Author: Ihar Hrachyshka <email address hidden>
Date: Fri Jul 10 14:07:09 2015 +0200

    Enforce specific order for firewall.(un)filtered_ports and devices

    Lots of tests in the file rely on specific order of devices and ports
    with which they are iterated thru inside firewall implementation. This
    is needed to match a regexp against iptables output generated by the
    firewall driver.

    In production code, those .(un)filtered_ports dictionaries are
    unordered, and it would be not wise to enforce the order for them just
    for the sake of those unit tests.

    Instead, we 'patch' the agent firewall with ordered versions of dict for
    those attributes.

    Also enforce specific order for device_info dictionaries we pass into
    firewall.

    The failure was easily reproducible with PYTHONHASHSEED=111, and after
    the fix, it's gone.

    While at it, stop making assumptions about stable order of dict.values()
    between multiple dictionaries with the same keys. It may actually work
    for now, but it seems fragile. Overall simplified regex construction
    code a bit, f.e. killing some dead or redundant code.

    Closes-Bug: #1473413
    Change-Id: I170087426bc961592b4c4923c64a5fea30d51c21

Changed in neutron:
status: In Progress → Fix Committed
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix proposed to neutron (feature/pecan)

Fix proposed to branch: feature/pecan
Review: https://review.openstack.org/201131

Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix merged to neutron (feature/pecan)
Download full text (8.8 KiB)

Reviewed: https://review.openstack.org/201131
Committed: https://git.openstack.org/cgit/openstack/neutron/commit/?id=3a9975cbc30d9253b96cec9e079b411add184ec1
Submitter: Jenkins
Branch: feature/pecan

commit c27e66cc7c3427dfbc1e390693c6b0a3e656c783
Author: YAMAMOTO Takashi <email address hidden>
Date: Fri Jun 19 16:28:23 2015 +0900

    Reject router-interface-add with a port which doesn't have any addresses

    Fix a regression in commit I7d4e8194815e626f1cfa267f77a3f2475fdfa3d1 .

    Closes-Bug: #1466750
    Related-Bug: #1439824
    Change-Id: Ic0c4c0adbffe14b1f08d4b2dee91e1dff41cc770

commit 83cac810f00933d8b22f17cdcc20094e1d27a018
Author: OpenStack Proposal Bot <email address hidden>
Date: Sat Jul 11 06:09:29 2015 +0000

    Imported Translations from Transifex

    For more information about this automatic import see:
    https://wiki.openstack.org/wiki/Translations/Infrastructure

    Change-Id: I33a9e5a28666a295dd24f6c482b9805b33d0ca69

commit 5b066a237ec0918d882ef2455aef4f2f9cb0606c
Author: Ihar Hrachyshka <email address hidden>
Date: Fri Jul 10 14:07:09 2015 +0200

    Enforce specific order for firewall.(un)filtered_ports and devices

    Lots of tests in the file rely on specific order of devices and ports
    with which they are iterated thru inside firewall implementation. This
    is needed to match a regexp against iptables output generated by the
    firewall driver.

    In production code, those .(un)filtered_ports dictionaries are
    unordered, and it would be not wise to enforce the order for them just
    for the sake of those unit tests.

    Instead, we 'patch' the agent firewall with ordered versions of dict for
    those attributes.

    Also enforce specific order for device_info dictionaries we pass into
    firewall.

    The failure was easily reproducible with PYTHONHASHSEED=111, and after
    the fix, it's gone.

    While at it, stop making assumptions about stable order of dict.values()
    between multiple dictionaries with the same keys. It may actually work
    for now, but it seems fragile. Overall simplified regex construction
    code a bit, f.e. killing some dead or redundant code.

    Closes-Bug: #1473413
    Change-Id: I170087426bc961592b4c4923c64a5fea30d51c21

commit dfbe804994a576994768c95720b4f0ba53e313d7
Author: Dan Prince <email address hidden>
Date: Thu Jul 9 15:31:13 2015 -0400

    get_vif_ports: ignore non-Interface ports

    This patch updates get_vif_ports so that it skips
    ports which aren't in the 'Interfaces' table.

    This fixes an issue where neutron-ovs-cleanup would
    fail if any sort of OVS bond was on the bridge getting
    cleaned up. This is because bonds don't have the same
    attributes as ports, and thus fail subsequent ovs-vsctl
    queries.

    Change-Id: Ic9d30e5916122ce23c5dc8631fbb71115ae8a960
    Closes-bug: #1473179

commit 1025baec55235bf4981872390f1bb65f4e3ae7e6
Author: Wei Wang <email address hidden>
Date: Thu Sep 25 17:49:59 2014 +0800

    Fix duplicate entry catch for allowed address pairs

    If None is submitted as a MAC address in an allowed_address_pair,
 ...

Read more...

tags: added: in-feature-pecan
Changed in neutron:
milestone: none → liberty-2
status: Fix Committed → Fix Released
Thierry Carrez (ttx)
Changed in neutron:
milestone: liberty-2 → 7.0.0
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.