OSDN Git Service

16c4fb219c4537b76a7d193f046fbd32c4d5dcf8
[ti2/ti2.git] / linkpair / collect / agent / ovs.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 #
4
5 __version__ = '1.1'
6
7 import sys
8 import os
9 import re
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
20
21
22 class OVSAgent(object):
23     '''
24     Open vSwitch Collector Agent
25     '''
26
27     PEER_FOUND = 1
28
29     def __init__(self, runner, cu, linkpairs, port_to_br, iface_to_nss, formatter=GraphEasyFormatter()):
30         self._runner = runner
31         self._cu = cu
32         self._linkpairs = linkpairs
33         self._port_to_br = port_to_br
34         self._iface_to_nss = iface_to_nss
35         self._u = CommonUtils()
36
37         ''' set parameters '''
38         self._formatter = formatter
39
40     def run(self):
41             self.get_configuration()
42     
43     def get_configuration(self):
44         patch_peers = {}
45
46         result = self._runner.exec_cmd("ovs-vsctl list-br")
47         for br_src in result:
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()
52                 if self._u.d_push(
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
59
60                     if patch_dst + ":" + patch_src in patch_peers:
61                         continue
62
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),
70                             Port(patch_src),
71                             Port(patch_dst),
72                             self._formatter.PATCH_FORMAT)
73                     else:
74                         self._cu.add_linkpair(
75                             Device(br_src, Device.BR_TYPE),
76                             Device("NOT CONNECTED", Device.NOT_CONNECTED_TYPE),
77                             Port(patch_src),
78                             Port(patch_dst),
79                             self._formatter.PATCH_FORMAT)
80
81                 else:
82                     # Internal OVSPort.
83                     if self._u.d_push(
84                         re.search(
85                             r'port \d+: ' + br_src + ' \(internal\)',
86                             port_desc)) is None:
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),
96                                     Port(port),
97                                     Port(""))
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),
106                                     Port(port),
107                                     Port(""))
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),
115                                         Port(port),
116                                         Port(""),
117                                         self._formatter.NAMESPACE_FORMAT)
118                                 else:
119                                     self._cu.add_linkpair(
120                                         Device(br_src, Device.BR_TYPE),
121                                         Device(
122                                             "INTERNAL", Device.OS_ROUTE_TYPE),
123                                         Port(port),
124                                         Port(""))
125                             else:
126                                 ## Other OVSPort
127                                 self._cu._port_to_br[port] = br_src
128                         else:
129                             continue