components/openstack/neutron/patches/07-ml2-ovs-support.patch
author Laszlo Peter <laszlo.peter@oracle.com>
Wed, 07 Sep 2016 14:48:41 -0700
changeset 6848 8e252a37ed0d
child 7238 96025c3f5cac
permissions -rw-r--r--
PSARC 2016/268 Neutron EVS Plugin EOF 24465835 Update Neutron for the Mitaka release 22271305 EOF monolithic neutron plugin for Openstack 18734794 port-create --fixed-ip accepts invalid argument, creates port with wrong IP
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6848
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
     1
Changes to Neutron Open vSwitch agent to port it to Solaris. These changes
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
     2
will eventually be proposed upstream.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
     3
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
     4
--- neutron-8.1.2/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py	2016-06-09 18:45:36.000000000 -0700
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
     5
+++ new/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py	2016-08-18 13:23:57.331696500 -0700
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
     6
@@ -15,12 +15,14 @@
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
     7
 
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
     8
 import collections
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
     9
 import functools
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    10
+import platform
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    11
 import signal
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    12
 import sys
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    13
 import time
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    14
 
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    15
 import netaddr
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    16
 from oslo_config import cfg
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    17
+from oslo_log import helpers as log_helpers
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    18
 from oslo_log import log as logging
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    19
 import oslo_messaging
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    20
 from oslo_service import loopingcall
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    21
@@ -36,6 +38,7 @@
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    22
 from neutron.agent.l2.extensions import manager as ext_manager
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    23
 from neutron.agent import rpc as agent_rpc
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    24
 from neutron.agent import securitygroups_rpc as sg_rpc
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    25
+from neutron.agent.solaris import net_lib
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    26
 from neutron.api.rpc.callbacks import resources
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    27
 from neutron.api.rpc.handlers import dvr_rpc
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    28
 from neutron.common import config
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    29
@@ -145,10 +148,16 @@
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    30
 
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    31
         self.fullsync = False
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    32
         # init bridge classes with configured datapath type.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    33
-        self.br_int_cls, self.br_phys_cls, self.br_tun_cls = (
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    34
-            functools.partial(bridge_classes[b],
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    35
-                              datapath_type=ovs_conf.datapath_type)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    36
-            for b in ('br_int', 'br_phys', 'br_tun'))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    37
+        if platform.system() == "SunOS":
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    38
+            self.br_int_cls = functools.partial(bridge_classes['br_int'],
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    39
+                datapath_type=ovs_conf.datapath_type)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    40
+            self.br_phys_cls = None
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    41
+            self.br_tun_cls = None
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    42
+        else:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    43
+            self.br_int_cls, self.br_phys_cls, self.br_tun_cls = (
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    44
+                functools.partial(bridge_classes[b],
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    45
+                datapath_type=ovs_conf.datapath_type)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    46
+                for b in ('br_int', 'br_phys', 'br_tun'))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    47
 
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    48
         self.use_veth_interconnection = ovs_conf.use_veth_interconnection
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    49
         self.veth_mtu = agent_conf.veth_mtu
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    50
@@ -2081,9 +2090,489 @@
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    51
                                "in both the Agent and Server side."))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    52
 
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    53
 
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    54
+class SolarisOVSNeutronAgent(OVSNeutronAgent):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    55
+    """Solaris implementation of OVS L2 Agent"""
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    56
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    57
+    def __init__(self, bridge_classes, conf=None):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    58
+        '''Constructor.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    59
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    60
+        :param bridge_classes: a dict for bridge classes.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    61
+        :param conf: an instance of ConfigOpts
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    62
+        '''
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    63
+        self.tun_ofport = None
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    64
+        # mapping of VNIC's OpenFlow Port Number (ofport) to
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    65
+        # VXLAN segmentation id.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    66
+        self.br_port_segid = {}
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    67
+        # mapping of VXLAN sgementation id to set of ports on that segment.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    68
+        # The port is a ovs_lib.VifPort object.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    69
+        self.br_segid_ports = {}
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    70
+        # mapping of Neutron port UUID to ovs_lib.VifPort object.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    71
+        self.vif_ports = {}
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    72
+        super(SolarisOVSNeutronAgent, self).__init__(bridge_classes, conf)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    73
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    74
+    def _parse_bridge_mappings(self, bridge_mappings):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    75
+        try:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    76
+            return n_utils.parse_mappings(bridge_mappings, unique_values=False)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    77
+        except ValueError as e:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    78
+            raise ValueError(_("Parsing bridge_mappings failed: %s.") % e)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    79
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    80
+    def check_changed_vlans(self):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    81
+        # Not applicable to Solaris
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    82
+        return []
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    83
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    84
+    def _setup_tunnel_port(self, br, port_name, remote_ip, tunnel_type):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    85
+        LOG.debug(_("Setting up tunnel(%s) for remote_ip: %s") %
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    86
+                  (tunnel_type, remote_ip))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    87
+        if tunnel_type != p_const.TYPE_VXLAN:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    88
+            return
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    89
+        self.tun_br_ofports[tunnel_type][remote_ip] = remote_ip
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    90
+        remote_ips = self.tun_br_ofports[tunnel_type].values()
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    91
+        LOG.debug(_("current list of remote_ips: %s"), remote_ips)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    92
+        for ofport, segmentation_id in self.br_port_segid.iteritems():
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    93
+            flood_local_ofports = self.br_segid_ports[segmentation_id]
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    94
+            self._mod_flood_to_tun_flows(ofport, remote_ips, segmentation_id,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    95
+                                         flood_local_ofports - set([ofport]))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    96
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    97
+    def cleanup_tunnel_port(self, br, remote_ip, tunnel_type):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    98
+        LOG.debug(_("Cleaning up tunnel(%s) for remote_ip: %s") %
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
    99
+                  (tunnel_type, remote_ip))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   100
+        if tunnel_type != p_const.TYPE_VXLAN:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   101
+            return
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   102
+        self.tun_br_ofports[tunnel_type].pop(remote_ip, None)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   103
+        remote_ips = self.tun_br_ofports[tunnel_type].values()
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   104
+        for ofport, segmentation_id in self.br_port_segid.iteritems():
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   105
+            flood_local_ofports = self.br_segid_ports[segmentation_id]
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   106
+            self._mod_flood_to_tun_flows(ofport, remote_ips, segmentation_id,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   107
+                                         flood_local_ofports - set([ofport]))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   108
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   109
+    # The following methods are called through RPC.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   110
+    #     add_fdb_entries(), remove_fdb_entries(), update_fdb_entries()
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   111
+    # These methods are overridden from L2populationRpcCallBackMixin class.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   112
+    @log_helpers.log_method_call
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   113
+    def add_fdb_entries(self, context, fdb_entries, host=None):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   114
+        # Needed for L2 Population support. Will be added later
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   115
+        pass
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   116
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   117
+    @log_helpers.log_method_call
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   118
+    def remove_fdb_entries(self, context, fdb_entries, host=None):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   119
+        # Needed for L2 Population support. Will be added later
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   120
+        pass
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   121
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   122
+    @log_helpers.log_method_call
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   123
+    def update_fdb_entries(self, context, fdb_entries, host=None):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   124
+        # Needed for L2 Population support. Will be added later
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   125
+        pass
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   126
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   127
+    def port_dead(self, port, log_errors=True):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   128
+        '''Once a port has no binding or it is administratively disabled,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   129
+           add a flow to drop packets coming from that port.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   130
+        '''
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   131
+        cur_tag = self.int_br.db_get_val("Port", port.port_name, "tag",
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   132
+                                         log_errors=log_errors)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   133
+        if cur_tag:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   134
+            self.int_br.clear_db_attribute("Port", port.port_name, "tag")
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   135
+        if port.ofport != -1:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   136
+            self.int_br.drop_port(in_port=port.ofport)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   137
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   138
+    def setup_integration_br(self):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   139
+        '''Setup the integration bridge and remove all existing flows.'''
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   140
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   141
+        # Ensure the integration bridge is created.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   142
+        # ovs_lib.OVSBridge.create() will run
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   143
+        #   ovs-vsctl -- --may-exist add-br BRIDGE_NAME
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   144
+        # which does nothing if bridge already exists.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   145
+        self.int_br.create()
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   146
+        self.int_br.set_secure_mode()
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   147
+        self.int_br.setup_controllers(self.conf)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   148
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   149
+        if self.conf.AGENT.drop_flows_on_start:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   150
+            self.int_br.delete_flows()
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   151
+        # Switch all traffic using normal-mode OVS only if tunneling
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   152
+        # is disabled. Otherwise, we will need to add various OpenFlow tables
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   153
+        # and flows to switch traffic.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   154
+        if not self.enable_tunneling:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   155
+            self.int_br.install_normal()
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   156
+        # Add a canary flow to int_br to track OVS restarts
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   157
+        self.int_br.setup_canary_table()
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   158
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   159
+    def setup_physical_bridges(self, bridge_mappings):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   160
+        '''Makes sure that the uplink port for a given physical network
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   161
+        exists in the integration bridge.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   162
+        '''
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   163
+        self.phys_brs = {}
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   164
+        # We do not use either int_ofports or phys_ofports below, however
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   165
+        # we need to initialize them to empty values since it is used in
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   166
+        # the common code which is mostly no-op for us.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   167
+        self.int_ofports = {}
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   168
+        self.phys_ofports = {}
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   169
+        ovs = ovs_lib.BaseOVS()
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   170
+        for physical_network, uplink_port in bridge_mappings.iteritems():
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   171
+            LOG.info(_LI("Mapping physical network %(physical_network)s to "
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   172
+                         "uplink port %(uplink_port)s"),
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   173
+                     {'physical_network': physical_network,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   174
+                      'uplink_port': uplink_port})
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   175
+            if not ovs.port_exists(uplink_port):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   176
+                LOG.error(_LE("Uplink port %(uplink_port)s for physical "
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   177
+                              "network %(physical_network)s does not exist. "
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   178
+                              "Agent terminated!"),
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   179
+                          {'physical_network': physical_network,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   180
+                           'uplink_port': uplink_port})
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   181
+                sys.exit(1)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   182
+            self.phys_brs[physical_network] = uplink_port
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   183
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   184
+    def setup_ancillary_bridges(self, integ_br, tun_br):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   185
+        '''Setup ancillary bridges - for example br-ex.'''
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   186
+        ovs = ovs_lib.BaseOVS()
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   187
+        ovs_bridges = set(ovs.get_bridges())
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   188
+        # Remove all known bridges
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   189
+        ovs_bridges.remove(integ_br)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   190
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   191
+        # Filter list of bridges to those that have external
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   192
+        # bridge-id's configured
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   193
+        br_names = []
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   194
+        for bridge in ovs_bridges:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   195
+            bridge_id = ovs.get_bridge_external_bridge_id(bridge)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   196
+            if bridge_id != bridge:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   197
+                br_names.append(bridge)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   198
+        ovs_bridges.difference_update(br_names)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   199
+        ancillary_bridges = []
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   200
+        for bridge in ovs_bridges:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   201
+            br = ovs_lib.OVSBridge(bridge)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   202
+            LOG.info(_LI('Adding %s to list of bridges.'), bridge)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   203
+            ancillary_bridges.append(br)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   204
+        return ancillary_bridges
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   205
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   206
+    def setup_tunnel_br(self, tun_br_name=None):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   207
+        '''(re)initialize the tunnel bridge.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   208
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   209
+        :param tun_br_name: the name of the tunnel bridge.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   210
+        '''
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   211
+        # Solaris doesn't have a separate tunnel bridge, instead we
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   212
+        # re-use the integration bridge itself.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   213
+        if self.tun_br is None:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   214
+            self.tun_br = self.int_br
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   215
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   216
+        # create ovs.vxlan1 datalink and add it to integration bridge
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   217
+        if not self.local_ip:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   218
+            LOG.error(_LE("local_ip parameter is not set. Cannot have "
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   219
+                          "tunneling enabled without it. Agent terminated!"))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   220
+            exit(1)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   221
+        if not net_lib.Datalink.datalink_exists("ovs.vxlan1"):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   222
+            # create the required vxlan
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   223
+            cmd = ['/usr/sbin/dladm', 'create-vxlan', '-t', '-p',
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   224
+                   'addr=%s,vni=flow' % (self.local_ip), 'ovs.vxlan1']
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   225
+            try:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   226
+                utils.execute(cmd)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   227
+            except Exception as e:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   228
+                LOG.error(_LE("failed to create VXLAN tunnel end point "
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   229
+                              "ovs.vxlan1: %s. Agent terminated!") % (e))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   230
+                exit(1)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   231
+        # set openvswitch property to on
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   232
+        try:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   233
+            cmd = ['/usr/sbin/dladm', 'show-linkprop', '-p',
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   234
+                   'openvswitch', '-co', 'value', 'ovs.vxlan1']
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   235
+            stdout = utils.execute(cmd)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   236
+            if stdout.strip() == 'off':
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   237
+                cmd = ['/usr/sbin/dladm', 'set-linkprop', '-t', '-p',
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   238
+                       'openvswitch=on', 'ovs.vxlan1']
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   239
+                utils.execute(cmd)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   240
+        except Exception as e:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   241
+            LOG.error(_LE("failed to set 'openvswitch' property on "
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   242
+                          "ovs.vxlan1: %s. Agent terminated!") % (e))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   243
+            exit(1)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   244
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   245
+        attrs = [('type', 'vxlan'),
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   246
+                 ('options', {'remote_ip': 'flow'}),
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   247
+                 ('options', {'key': 'flow'})]
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   248
+        self.tun_br.replace_port('ovs.vxlan1', *attrs)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   249
+        self.tun_ofport = self.tun_br.get_port_ofport('ovs.vxlan1')
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   250
+        if self.tun_ofport == constants.OFPORT_INVALID:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   251
+            LOG.error(_LE("Failed to add ovs.vxlan1 to integration bridge. "
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   252
+                          "Cannot have tunneling enabled on this agent. "
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   253
+                          "Agent terminated!"))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   254
+            exit(1)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   255
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   256
+    def setup_tunnel_br_flows(self):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   257
+        '''Setup the tunnel bridge
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   258
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   259
+        Add all flows to the tunnel bridge.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   260
+        '''
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   261
+        self.tun_br.setup_default_tunnel_table(self.tun_ofport,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   262
+                                               self.arp_responder_enabled)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   263
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   264
+    def _mod_flood_to_tun_flows(self, ofport, remote_ips, segmentation_id,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   265
+                                local_ofports):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   266
+        LOG.debug(_("Modifying flooding for %s to all %s for VNI %s on %s") %
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   267
+                  (ofport, remote_ips, segmentation_id, local_ofports))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   268
+        if not local_ofports and not remote_ips:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   269
+            return
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   270
+        action_prefix = ""
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   271
+        if local_ofports:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   272
+            action_prefix = ("output:%s" %
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   273
+                             self.tun_br._ofport_set_to_str(local_ofports))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   274
+        if not remote_ips:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   275
+            assert local_ofports
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   276
+            self.tun_br.mod_flow(table=constants.FLOOD_TO_TUN,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   277
+                                 in_port="%s" % ofport,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   278
+                                 actions="%s" % action_prefix)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   279
+            return
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   280
+        action_str = ""
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   281
+        if action_prefix:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   282
+            action_str = "%s," % action_prefix
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   283
+        action_str += "set_tunnel:%s" % segmentation_id
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   284
+        # for each of the remote_ip
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   285
+        for remote_ip in remote_ips:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   286
+            action_str += ",set_field:%s->tun_dst,output:%s" % \
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   287
+                (remote_ip, self.tun_ofport)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   288
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   289
+        self.tun_br.mod_flow(table=constants.FLOOD_TO_TUN,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   290
+                             in_port="%s" % ofport,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   291
+                             actions="%s" % action_str)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   292
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   293
+    def port_bound(self, port, net_uuid,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   294
+                   network_type, physical_network,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   295
+                   segmentation_id, fixed_ips, device_owner,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   296
+                   ovs_restarted):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   297
+        '''Bind port to net_uuid/lsw_id and install flow for inbound traffic
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   298
+        to vm.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   299
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   300
+        :param port: a ovslib.VifPort object.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   301
+        :param net_uuid: the net_uuid this port is to be associated with.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   302
+        :param network_type: the network type ('gre', 'vlan', 'flat', 'local')
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   303
+        :param physical_network: the physical network for 'vlan' or 'flat'
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   304
+        :param segmentation_id: the VID for 'vlan' or tunnel ID for 'tunnel'
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   305
+        :param fixed_ips: the ip addresses assigned to this port
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   306
+        :param device_owner: the string indicative of owner of this port
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   307
+        :param ovs_restarted: indicates if this is called for an OVS restart.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   308
+        '''
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   309
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   310
+        LOG.info(_LI("Setting up datapath for port: %s connected to "
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   311
+                     "network: %s of type: %s") % (port.vif_id, net_uuid,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   312
+                                                   network_type))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   313
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   314
+        if network_type in constants.TUNNEL_NETWORK_TYPES:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   315
+            if self.enable_tunneling:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   316
+                # delete any drop flows
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   317
+                self.int_br.delete_flows(in_port=port.ofport)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   318
+                remote_ips = self.tun_br_ofports[network_type].values()
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   319
+                # add a flow to flood Broadcast/Unknown Unicast/Multicast
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   320
+                # packets from this port to all the remote_ips and local
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   321
+                # ports on port's segmentation_id.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   322
+                self._mod_flood_to_tun_flows(port.ofport, remote_ips,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   323
+                    segmentation_id, self.br_segid_ports.get(segmentation_id))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   324
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   325
+                # add segmentation id for all the packets from this port and
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   326
+                # send it to table 2 for learning.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   327
+                self.tun_br.add_flow(priority=1,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   328
+                                     in_port="%s" % (port.ofport),
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   329
+                                     actions="set_tunnel:%s,"
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   330
+                                     "resubmit(,%s)" %
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   331
+                                     (segmentation_id,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   332
+                                      constants.LEARN_FROM_PORTS))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   333
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   334
+                # update flow that steers inbound broadcast/unknown/multicast
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   335
+                # packets on this segmentation id to all of the ports
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   336
+                # (including this port)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   337
+                self.br_port_segid[port.ofport] = segmentation_id
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   338
+                if self.br_segid_ports.get(segmentation_id):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   339
+                    self.br_segid_ports[segmentation_id].add(port.ofport)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   340
+                else:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   341
+                    self.br_segid_ports[segmentation_id] = set([port.ofport])
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   342
+                ofports_str = self.tun_br._ofport_set_to_str(
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   343
+                    self.br_segid_ports[segmentation_id])
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   344
+                self.tun_br.mod_flow(table=constants.INBOUND_BUM_TABLE,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   345
+                                     tun_id=segmentation_id,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   346
+                                     actions="output:%s" % ofports_str)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   347
+                # we need to modify flows for other ports that are part of
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   348
+                # this segmentation ID
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   349
+                ofports = self.br_segid_ports[segmentation_id]
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   350
+                for ofport in ofports:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   351
+                    if ofport == port.ofport:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   352
+                        continue
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   353
+                    self._mod_flood_to_tun_flows(ofport, remote_ips,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   354
+                                                 segmentation_id,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   355
+                                                 ofports - set([ofport]))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   356
+                self.vif_ports[port.vif_id] = port
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   357
+            else:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   358
+                LOG.error(_LE("Cannot provision %(network_type)s network for "
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   359
+                              "net-id=%(net_uuid)s - tunneling disabled"),
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   360
+                          {'network_type': network_type,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   361
+                           'net_uuid': net_uuid})
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   362
+                return False
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   363
+        elif network_type == p_const.TYPE_FLAT:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   364
+            if physical_network not in self.phys_brs:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   365
+                LOG.error(_LE("Cannot provision flat network for "
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   366
+                              "net-id=%(net_uuid)s - no uplink port for "
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   367
+                              "physical_network %(physical_network)s"),
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   368
+                          {'net_uuid': net_uuid,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   369
+                           'physical_network': physical_network})
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   370
+                return False
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   371
+            self.vif_ports[port.vif_id] = port
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   372
+            # delete any drop flows
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   373
+            self.int_br.delete_flows(in_port=port.ofport)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   374
+        elif network_type == p_const.TYPE_VLAN:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   375
+            if physical_network in self.phys_brs:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   376
+                # Do not bind a port if it's already bound
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   377
+                cur_tag = self.int_br.db_get_val("Port", port.port_name, "tag")
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   378
+                if cur_tag != segmentation_id:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   379
+                    self.int_br.set_db_attribute("Port", port.port_name, "tag",
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   380
+                                                 segmentation_id)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   381
+                if port.ofport != -1:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   382
+                    self.int_br.delete_flows(in_port=port.ofport)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   383
+                self.vif_ports[port.vif_id] = port
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   384
+            else:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   385
+                LOG.error(_LE("Cannot provision VLAN network for "
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   386
+                              "net-id=%(net_uuid)s - no uplink-port for "
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   387
+                              "physical_network %(physical_network)s"),
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   388
+                          {'net_uuid': net_uuid,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   389
+                           'physical_network': physical_network})
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   390
+                return False
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   391
+        else:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   392
+            LOG.error(_LE("Cannot provision unknown network type "
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   393
+                          "%(network_type)s for net-id=%(net_uuid)s"),
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   394
+                      {'network_type': network_type, 'net_uuid': net_uuid})
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   395
+            return False
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   396
+        return True
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   397
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   398
+    def _add_port_tag_info(self, need_binding_ports):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   399
+        pass
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   400
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   401
+    def _bind_devices(self, need_binding_ports):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   402
+        devices_up = []
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   403
+        devices_down = []
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   404
+        failed_devices = []
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   405
+        for port_detail in need_binding_ports:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   406
+            device = port_detail['device']
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   407
+            # update plugin about port status
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   408
+            # FIXME(salv-orlando): Failures while updating device status
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   409
+            # must be handled appropriately. Otherwise this might prevent
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   410
+            # neutron server from sending network-vif-* events to the nova
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   411
+            # API server, thus possibly preventing instance spawn.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   412
+            if port_detail.get('admin_state_up'):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   413
+                LOG.debug("Setting status for %s to UP", device)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   414
+                devices_up.append(device)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   415
+            else:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   416
+                LOG.debug("Setting status for %s to DOWN", device)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   417
+                devices_down.append(device)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   418
+        if devices_up or devices_down:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   419
+            devices_set = self.plugin_rpc.update_device_list(
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   420
+                self.context, devices_up, devices_down, self.agent_id,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   421
+                self.conf.host)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   422
+            failed_devices = (devices_set.get('failed_devices_up') +
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   423
+                devices_set.get('failed_devices_down'))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   424
+            if failed_devices:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   425
+                LOG.error(_LE("Configuration for devices %s failed!"),
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   426
+                          failed_devices)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   427
+        LOG.info(_LI("Configuration for devices up %(up)s and devices "
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   428
+                     "down %(down)s completed."),
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   429
+                 {'up': devices_up, 'down': devices_down})
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   430
+        return set(failed_devices)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   431
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   432
+    def port_unbound(self, vif_id, net_uuid=None):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   433
+        '''Unbind port.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   434
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   435
+        Removes all the OpenFlow rules associated with the port going away.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   436
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   437
+        :param vif_id: the id of the vif
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   438
+        :param net_uuid: the net_uuid this port is associated with.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   439
+        '''
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   440
+        LOG.info(_LI("Removing flows for port: %s" % (vif_id)))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   441
+        port = self.vif_ports.pop(vif_id, None)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   442
+        if port is None:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   443
+            return
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   444
+        if self.enable_tunneling:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   445
+            # remove all the OpenFlows that we have added for this port
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   446
+            # across all the tables.
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   447
+            self.tun_br.delete_flows(in_port=port.ofport)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   448
+            self.tun_br.delete_flows(table=constants.FLOOD_TO_TUN,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   449
+                                     in_port=port.ofport)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   450
+            segid = self.br_port_segid.pop(port.ofport, None)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   451
+            if segid is None:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   452
+                return
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   453
+            self.tun_br.delete_flows(table=constants.INBOUND_UCAST_TABLE,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   454
+                                     tun_id=segid, dl_dst=port.vif_mac)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   455
+            self.tun_br.delete_flows(table=constants.UCAST_TO_TUN,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   456
+                                     tun_id=segid, dl_dst=port.vif_mac)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   457
+            if self.br_segid_ports.get(segid) is None:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   458
+                return
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   459
+            self.br_segid_ports[segid].discard(port.ofport)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   460
+            ofports = self.br_segid_ports[segid]
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   461
+            if ofports:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   462
+                # update brodcast/multicast table to not to include this port
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   463
+                ofportstr = self.tun_br._ofport_set_to_str(ofports)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   464
+                self.tun_br.mod_flow(table=constants.INBOUND_BUM_TABLE,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   465
+                                     tun_id=segid,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   466
+                                     actions="output:%s" % ofportstr)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   467
+                for ofport in ofports:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   468
+                    remote_ips = \
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   469
+                        self.tun_br_ofports[p_const.TYPE_VXLAN].values()
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   470
+                    self._mod_flood_to_tun_flows(ofport, remote_ips, segid,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   471
+                                                 ofports - set([ofport]))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   472
+            else:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   473
+                # if this was the last port for that segmentation ID, then
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   474
+                # remove all associated flows from broadcast/multicast table
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   475
+                self.tun_br.delete_flows(table=constants.INBOUND_BUM_TABLE,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   476
+                                         tun_id=segid)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   477
+        else:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   478
+            self.int_br.delete_flows(in_port=port.ofport)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   479
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   480
+    def update_stale_ofport_rules(self):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   481
+        # Not required for Solaris since we don't support ARP spoofing
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   482
+        # protection yet
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   483
+        pass
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   484
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   485
+    def _rewire_zones_anet(self):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   486
+        port_names = self.int_br.get_port_name_list()
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   487
+        for port_name in port_names:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   488
+            if '/' not in port_name:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   489
+                continue
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   490
+            cmd = ['/usr/sbin/dladm', 'show-linkprop', '-p', 'ofport',
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   491
+                   '-co', 'value', port_name]
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   492
+            try:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   493
+                stdout = utils.execute(cmd, log_fail_as_error=False)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   494
+            except:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   495
+                continue
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   496
+            if stdout.strip() != '0':
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   497
+                continue
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   498
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   499
+            LOG.debug(_LE("Zone's anet '%s' was rebooted from within the zone,"
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   500
+                          " so we need to delete and add the corresponding"
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   501
+                          " OVS port") % (port_name))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   502
+            # needs re-wiring. So delete and add the port
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   503
+            external_ids = self.int_br.db_get_val('Interface', port_name,
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   504
+                                                  'external_ids')
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   505
+            self.int_br.delete_port(port_name)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   506
+            self.int_br.add_port(port_name, ('external_ids', external_ids))
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   507
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   508
+    def _agent_has_updates(self, polling_manager):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   509
+        # check if any anet ports on OVS bridge requires re-wiring. This is
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   510
+        # needed if an user reboots the zone from inside the zone. This
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   511
+        # workaround is needed until OVS is integrated with Zones and is only
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   512
+        # needed on nova compute
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   513
+        cmd = ['/usr/bin/pgrep', 'nova-compute']
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   514
+        try:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   515
+            stdout = utils.execute(cmd, log_fail_as_error=False)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   516
+        except:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   517
+            stdout = ""
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   518
+        if stdout:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   519
+            self._rewire_zones_anet()
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   520
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   521
+        return super(SolarisOVSNeutronAgent, self)._agent_has_updates(
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   522
+            polling_manager)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   523
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   524
+    def cleanup_stale_flows(self):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   525
+        LOG.info(_LI("Cleaning stale %s flows"), self.int_br.br_name)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   526
+        self.int_br.cleanup_flows()
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   527
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   528
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   529
 def validate_local_ip(local_ip):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   530
     """Verify if the ip exists on the agent's host."""
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   531
-    if not ip_lib.IPWrapper().get_device_by_ip(local_ip):
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   532
+    if platform.system() == "SunOS":
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   533
+        local_ip_valid = net_lib.IPInterface.ipaddr_exists(local_ip)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   534
+    else:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   535
+        local_ip_valid = ip_lib.IPWrapper().get_device_by_ip(local_ip)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   536
+
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   537
+    if not local_ip_valid:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   538
         LOG.error(_LE("Tunneling can't be enabled with invalid local_ip '%s'."
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   539
                       " IP couldn't be found on this host's interfaces."),
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   540
                   local_ip)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   541
@@ -2116,7 +2605,10 @@
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   542
     validate_tunnel_config(cfg.CONF.AGENT.tunnel_types, cfg.CONF.OVS.local_ip)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   543
 
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   544
     try:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   545
-        agent = OVSNeutronAgent(bridge_classes, cfg.CONF)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   546
+        if platform.system() == "SunOS":
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   547
+            agent = SolarisOVSNeutronAgent(bridge_classes, cfg.CONF)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   548
+        else:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   549
+            agent = OVSNeutronAgent(bridge_classes, cfg.CONF)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   550
     except (RuntimeError, ValueError) as e:
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   551
         LOG.error(_LE("%s Agent terminated!"), e)
8e252a37ed0d PSARC 2016/268 Neutron EVS Plugin EOF
Laszlo Peter <laszlo.peter@oracle.com>
parents:
diff changeset
   552
         sys.exit(1)