Skip to content

Commit

Permalink
Show iptables rules when use at the network node with the router gate…
Browse files Browse the repository at this point in the history
…way IP.
yeasy committed Apr 11, 2014
1 parent d497a84 commit f620bb2
Showing 7 changed files with 259 additions and 208 deletions.
2 changes: 1 addition & 1 deletion bin/easyovs
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@ import os
import sys
import time

from easyovs.bridge import br_addflow, br_delflow, br_dump, br_list, br_show
from easyovs.bridge_ctrl import br_addflow, br_delflow, br_dump, br_list, br_show
from easyovs.cli import CLI
from easyovs.clean import cleanup
from easyovs.iptables import show_iptables_rules
158 changes: 3 additions & 155 deletions easyovs/bridge.py
Original file line number Diff line number Diff line change
@@ -4,10 +4,11 @@
import sys
import termios

from easyovs.util import get_bridges
from easyovs.flow import Flow
from easyovs.log import output, debug
from easyovs.neutron import get_neutron_ports
from easyovs.util import get_numstr_after, get_str_before, get_str_between
from flow import Flow
from neutron import get_neutron_ports


def check_exist(func):
@@ -222,156 +223,3 @@ def get_ports(self):
tag, intf_type = '', ''
ports[intf] = {'port': port, 'addr': addr, 'vlan': tag, 'type': intf_type}
return ports


def br_addflow(bridge, flow):
if 'actions=' in flow and len(flow.split()) == 2:
return Bridge(bridge).add_flow(flow)
else:
return False


def br_delflow(bridge, ids):
debug('br_delflow: %s: %s\n' % (bridge, ','.join(ids)))
if type(ids) == str and ids.isdigit():
return Bridge(bridge).del_flow([ids])
else:
return Bridge(bridge).del_flow(ids)


def br_getflows(bridge):
if isinstance(bridge, str):
return Bridge(bridge).get_flows()
else:
return None


def br_exists(bridge):
"""
Return True of False of a bridge's existence.
"""
if isinstance(bridge, str):
return Bridge(bridge).exists()
else:
return False


def br_getports(bridge):
"""
Return a dict of all available bridges.
"""
if isinstance(bridge, str):
return Bridge(bridge).get_ports()
else:
return {}


def br_list():
"""
List available bridges.
"""
bridges = get_bridges()
if not bridges:
output('None bridge exists.\n')
return
br_info = ''
for br in sorted(bridges.keys()):
br_info += "%s\n" % br
if bridges[br]['Port']:
br_info += " Port:\t\t%s\n" % (' '.join(sorted(bridges[br]['Port'].keys())))
if bridges[br]['Controller']:
br_info += " Controller:\t%s\n" % (' '.join(bridges[br]['Controller']))
if bridges[br]['fail_mode']:
br_info += " Fail_Mode:\t%s\n" % (bridges[br]['fail_mode'])
output(br_info)


def br_dump(bridge):
"""
Dump the port information of a given bridges.
"""
flows = br_getflows(bridge)
debug('br_dump: len flows=%u\n' % len(flows))
if flows:
Flow.banner_output()
for f in flows:
f.fmt_output()


def br_show(bridge):
"""
Show information of a given bridges.
"""
ovs_ports = br_getports(bridge)
if not ovs_ports:
return
neutron_ports = get_neutron_ports()
content = []
mac_ip_show = False
for intf in ovs_ports: # e.g., qvo-xxx, int-br-eth0, qr-xxx, tapxxx
port, tag, intf_type = ovs_ports[intf]['port'], ovs_ports[intf]['vlan'], ovs_ports[intf]['type']
if neutron_ports and intf[3:] in neutron_ports:
vm_ip, vm_mac = neutron_ports[intf[3:]]['ip_address'], neutron_ports[intf[3:]]['mac']
mac_ip_show = True
else:
vm_ip, vm_mac = '', ''
content.append((intf, port, tag, intf_type, vm_ip, vm_mac))
#output('%-20s%-8s%-16s%-24s%-8s\n' %(intf,port,vmIP,vmMac,tag))
content.sort(key=lambda x: x[0])
content.sort(key=lambda x: x[3])
output('%-20s%-12s%-8s%-12s' % ('Intf', 'Port', 'Vlan', 'Type'))
if mac_ip_show:
output('%-16s%-24s\n' % ('vmIP', 'vmMAC'))
else:
output('\n')
for _ in content:
output('%-20s%-12s%-8s%-12s' % (_[0], _[1], _[2], _[3]))
if mac_ip_show:
output('%-16s%-24s\n' % (_[4], _[5]))
else:
output('\n')


def get_bridges():
"""
Return a dict of all available bridges, looks like
{
'br-int':{
'Controller':[],
'fail_mode':'',
'Port':{
'qvoxxx': {
'tag':'1', //tagid
'type':'internal', //tagid
}
},
}
"""
bridges, br = {}, ''
cmd = 'ovs-vsctl show'
result, error = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=True).communicate()
if error:
return {}
for l in result.split('\n'):
l = l.strip().replace('"', '')
if l.startswith('Bridge '):
br = l.lstrip('Bridge ')
bridges[br] = {}
bridges[br]['Controller'] = []
bridges[br]['Port'] = {}
bridges[br]['fail_mode'] = ''
else:
if l.startswith('Controller '):
bridges[br]['Controller'].append(l.replace('Controller ', ''))
elif l.startswith('fail_mode: '):
bridges[br]['fail_mode'] = l.replace('fail_mode: ', '')
elif l.startswith('Port '):
phy_port = l.replace('Port ', '') # e.g., br-eth0
bridges[br]['Port'][phy_port] = {'vlan': '', 'type': ''}
elif l.startswith('tag: '):
bridges[br]['Port'][phy_port]['vlan'] = l.replace('tag: ', '')
elif l.startswith('Interface '):
bridges[br]['Port'][phy_port]['intf'] = l.replace('Interface ', '')
elif l.startswith('type: '):
bridges[br]['Port'][phy_port]['type'] = l.replace('type: ', '')
return bridges
125 changes: 125 additions & 0 deletions easyovs/bridge_ctrl.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
__author__ = 'baohua'

from subprocess import Popen, PIPE

from easyovs.bridge import Bridge
from easyovs.flow import Flow
from easyovs.log import debug, output
from easyovs.neutron import get_neutron_ports
from easyovs.util import get_bridges


def br_addflow(bridge, flow):
if 'actions=' in flow and len(flow.split()) == 2:
return Bridge(bridge).add_flow(flow)
else:
return False


def br_delflow(bridge, ids):
debug('br_delflow: %s: %s\n' % (bridge, ','.join(ids)))
if type(ids) == str and ids.isdigit():
return Bridge(bridge).del_flow([ids])
else:
return Bridge(bridge).del_flow(ids)


def br_getflows(bridge):
if isinstance(bridge, str):
return Bridge(bridge).get_flows()
else:
return None


def br_exists(bridge):
"""
Return True of False of a bridge's existence.
"""
if isinstance(bridge, str):
return Bridge(bridge).exists()
else:
return False


def br_getports(bridge):
"""
Return a dict of the ports (port, addr, tag, type) on the bridge, looks like
{
'qvoxxx':{
'port':2,
'addr':08:91:ff:ff:f3,
'vlan':1,
'type':internal,
}
}
"""
if isinstance(bridge, str):
return Bridge(bridge).get_ports()
else:
return {}


def br_list():
"""
List available bridges.
"""
bridges = get_bridges()
if not bridges:
output('None bridge exists.\n')
return
br_info = ''
for br in sorted(bridges.keys()):
br_info += "%s\n" % br
if bridges[br]['Port']:
br_info += " Port:\t\t%s\n" % (' '.join(sorted(bridges[br]['Port'].keys())))
if bridges[br]['Controller']:
br_info += " Controller:\t%s\n" % (' '.join(bridges[br]['Controller']))
if bridges[br]['fail_mode']:
br_info += " Fail_Mode:\t%s\n" % (bridges[br]['fail_mode'])
output(br_info)


def br_dump(bridge):
"""
Dump the port information of a given bridges.
"""
flows = br_getflows(bridge)
debug('br_dump: len flows=%u\n' % len(flows))
if flows:
Flow.banner_output()
for f in flows:
f.fmt_output()


def br_show(bridge):
"""
Show information of a given bridges.
"""
ovs_ports = br_getports(bridge)
if not ovs_ports:
return
neutron_ports = get_neutron_ports()
content = []
mac_ip_show = False
for intf in ovs_ports: # e.g., qvo-xxx, int-br-eth0, qr-xxx, tapxxx
port, tag, intf_type = ovs_ports[intf]['port'], ovs_ports[intf]['vlan'], ovs_ports[intf]['type']
if neutron_ports and intf[3:] in neutron_ports:
vm_ip, vm_mac = neutron_ports[intf[3:]]['ip_address'], neutron_ports[intf[3:]]['mac']
mac_ip_show = True
else:
vm_ip, vm_mac = '', ''
content.append((intf, port, tag, intf_type, vm_ip, vm_mac))
#output('%-20s%-8s%-16s%-24s%-8s\n' %(intf,port,vmIP,vmMac,tag))
content.sort(key=lambda x: x[0])
content.sort(key=lambda x: x[3])
output('%-20s%-12s%-8s%-12s' % ('Intf', 'Port', 'Vlan', 'Type'))
if mac_ip_show:
output('%-16s%-24s\n' % ('vmIP', 'vmMAC'))
else:
output('\n')
for _ in content:
output('%-20s%-12s%-8s%-12s' % (_[0], _[1], _[2], _[3]))
if mac_ip_show:
output('%-16s%-24s\n' % (_[4], _[5]))
else:
output('\n')
2 changes: 1 addition & 1 deletion easyovs/cli.py
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@
from subprocess import call
import sys

from easyovs.bridge import br_addflow, br_delflow, br_dump, br_exists, br_list, br_show
from easyovs.bridge_ctrl import br_addflow, br_delflow, br_dump, br_exists, br_list, br_show
from easyovs.iptables import show_iptables_rules
from easyovs.log import info, output, error
from easyovs.util import color_str, fmt_flow_str
Loading
Oops, something went wrong.

0 comments on commit f620bb2

Please sign in to comment.