2 # -*- coding: utf-8 -*-
10 from xml.dom import minidom
11 from subprocess import Popen, PIPE
12 from socket import gethostname
13 from linkpair.device import Device
14 from linkpair.port import Port
15 from linkpair.linkpair import LinkPair
16 from linkpair.collect.utils import CollectUtils
17 from linkpair.collect.agent.commandrunner import CommandRunner
18 from linkpair.formatter.grapheasy import GraphEasyFormatter
19 from linkpair.commonutils import CommonUtils
22 class OVSAgent(object):
24 Open vSwitch Collector Agent
29 def __init__(self, runner, cu, linkpairs, port_to_br, iface_to_nss, formatter=GraphEasyFormatter()):
32 self._linkpairs = linkpairs
33 self._port_to_br = port_to_br
34 self._iface_to_nss = iface_to_nss
35 self._u = CommonUtils()
37 ''' set parameters '''
38 self._formatter = formatter
41 self.get_configuration()
43 def get_configuration(self):
46 result = self._runner.exec_cmd("ovs-vsctl list-br")
48 br_src = br_src.rstrip()
49 result2 = self._runner.exec_cmd("ovs-dpctl show " + br_src)
50 for port_desc in result2:
51 port_desc = port_desc.rstrip()
53 re.search(r'port \d+: (.*?) \(patch: peer=(.*?)\)',
54 port_desc)) is not None:
55 match = self._u.d_pop()
56 patch_src = match.group(1)
57 patch_dst = match.group(2)
58 patch_peers[patch_src + ":" + patch_dst] = self.PEER_FOUND
60 if patch_dst + ":" + patch_src in patch_peers:
63 result3 = self._runner.exec_cmd(
64 "ovs-vsctl port-to-br " + patch_dst)
65 if result3 is not None and len(result3) > 0:
66 br_dst = result3[0].rstrip()
67 self._cu.add_linkpair(
68 Device(br_src, Device.BR_TYPE),
69 Device(br_dst, Device.BR_TYPE),
72 self._formatter.PATCH_FORMAT)
74 self._cu.add_linkpair(
75 Device(br_src, Device.BR_TYPE),
76 Device("NOT CONNECTED", Device.NOT_CONNECTED_TYPE),
79 self._formatter.PATCH_FORMAT)
85 r'port \d+: ' + br_src + ' \(internal\)',
87 if self._u.d_push(re.search(r'port \d+: (.*)', port_desc)) is not None:
88 port = self._u.d_pop().group(1).rstrip()
89 if self._u.d_push(re.match(r'^eth\d+$', port)) \
90 or self._u.d_push(re.match(r'^em\d+$', port)) \
91 or self._u.d_push(re.match(r'^igb\d+$', port)):
92 self._cu._port_to_br[port] = br_src
93 self._cu.add_linkpair(
94 Device(br_src, Device.BR_TYPE),
95 Device("Physical NW", Device.PHYNET_TYPE),
98 elif self._u.d_push(re.match(r'(vxlan\d+)', port)) \
99 or self._u.d_push(re.match(r'(gre\d+)', port)) \
100 or self._u.d_push(re.match(r'(gre-\d+)', port)):
101 port2 = self._u.d_pop().group(1)
102 self._cu._port_to_br[port2] = br_src
103 self._cu.add_linkpair(
104 Device(br_src, Device.BR_TYPE),
105 Device("OS Routing", Device.OS_ROUTE_TYPE),
108 elif re.search(r' \(internal\)', port):
109 port = re.sub(r' \(internal\)', '', port)
110 if port in self._iface_to_nss:
111 self._cu.add_linkpair(
112 Device(br_src, Device.BR_TYPE),
113 Device(self._iface_to_nss[
114 port], Device.NAMESPACE_TYPE),
117 self._formatter.NAMESPACE_FORMAT)
119 self._cu.add_linkpair(
120 Device(br_src, Device.BR_TYPE),
122 "INTERNAL", Device.OS_ROUTE_TYPE),
127 self._cu._port_to_br[port] = br_src