1e6d178b578e1b71d7445c32cd9ef34319923cff
[netvirt.git] / docs / openstack-guide / openstack-with-netvirt.rst
1 OpenStack with NetVirt
2 ======================
3 .. contents:: Table of Contents
4       :depth: 2
5
6 **Prerequisites**: OpenDaylight requires Java 1.8.0 and Open vSwitch >= 2.5.0
7
8 Installing OpenDaylight on an existing OpenStack
9 ------------------------------------------------
10 * On the control host, `Download the latest OpenDaylight release <https://www.opendaylight.org/software/downloads>`_
11 * Uncompress it as root, and start OpenDaylight (you can start OpenDaylight
12   by running karaf directly, but exiting from the shell will shut it down):
13
14   .. code-block:: bash
15
16       tar xvfz distribution-karaf-0.5.1-Boron-SR1.tar.gz
17       cd distribution-karaf-0.5.1-Boron-SR1
18       ./bin/start # Start OpenDaylight as a server process
19
20 * Connect to the Karaf shell, and install the odl-netvirt-openstack bundle
21   and their dependencies:
22
23   .. code-block:: bash
24
25       ./bin/client # Connect to OpenDaylight with the client
26       opendaylight-user@root> feature:install odl-netvirt-openstack odl-mdsal-apidocs
27
28 Optional - Advanced OpenDaylight Installation - Configurations and Clustering
29 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
30 * ACL Implementation - Security Groups - Stateful:
31
32   * Default implementation used is stateful, requiring OVS compiled with conntrack modules.
33   * This requires using a linux kernel that is >= 4.3
34   * To check if OVS is running with conntrack support:
35
36     .. code-block:: bash
37
38        root@devstack:~/# lsmod | grep conntrack | grep openvswitch
39          nf_conntrack          106496  9 xt_CT,openvswitch,nf_nat,nf_nat_ipv4,xt_conntrack,nf_conntrack_netlink,xt_connmark,nf_conntrack_ipv4,nf_conntrack_ipv6
40
41   * If the conntrack modules are not installed for OVS, either recompile/install an OVS version with conntrack support, or alternatively configure OpenDaylight to use a non-stateful implementation.
42   * OpenvSwitch 2.5 with conntrack support can be acquired from this repository for yum based linux distributions:
43
44     .. code-block:: bash
45
46        yum install -y http://rdoproject.org/repos/openstack-newton/rdo-release-newton.rpm
47        yum install -y --nogpgcheck openvswitch
48   * To spwan a VM with security groups disabled:
49
50     .. code-block:: bash
51
52        crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 extension_drivers port_security
53
54        openstack port create --network=net1 --disable-port-security port1
55        openstack server create --flavor m1.tiny --image cirros --port port1 vm1
56
57
58 * Running multiple OpenDaylight controllers in a cluster:
59
60   * For redundancy, it is possible to run OpenDaylight in a 3-node cluster.
61   * More info on Clustering available `here <http://docs.opendaylight.org/en/latest/getting-started-guide/common-features/clustering.html>`_.
62   * To configure OpenDaylight in clustered mode, run <ODL_FOLDER>/bin/configure_cluster.sh on each node prior to running OpenDaylight.
63     This script is used to configure cluster parameters on this controller. The user should restart controller to apply changes.
64
65     .. code-block:: bash
66
67        Usage: ./configure_cluster.sh <index> <seed_nodes_list>
68        - index: Integer within 1..N, where N is the number of seed nodes.
69        - seed_nodes_list: List of seed nodes, separated by comma or space.
70
71   * The address at the provided index should belong this controller.
72     When running this script on multiple seed nodes, keep the seed_node_list same,
73     and vary the index from 1 through N.
74
75   * Optionally, shards can be configured in a more granular way by modifying the file
76     "custom_shard_configs.txt" in the same folder as this tool.
77     Please see that file for more details.
78
79   .. note::
80      OpenDaylight should be restarted after applying any of the above changes via configuration files.
81
82 Ensuring OpenStack network state is clean
83 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
84 When using OpenDaylight as the Neutron back-end, OpenDaylight expects to be the only source of
85 truth for Neutron configurations. Because of this, it is necessary to remove existing OpenStack
86 configurations to give OpenDaylight a clean slate.
87
88 * Delete instances:
89
90   .. code-block:: bash
91
92       nova list
93       nova delete <instance names>
94
95 * Remove links from subnets to routers:
96
97   .. code-block:: bash
98
99       neutron subnet-list
100       neutron router-list
101       neutron router-port-list <router name>
102       neutron router-interface-delete <router name> <subnet ID or name>
103
104 * Delete subnets, networks, routers:
105
106   .. code-block:: bash
107
108       neutron subnet-delete <subnet name>
109       neutron net-list
110       neutron net-delete <net name>
111       neutron router-delete <router name>
112
113 * Check that all ports have been cleared - at this point, this should be an
114   empty list:
115
116   .. code-block:: bash
117
118       neutron port-list
119
120
121 Ensure Neutron is stopped
122 ^^^^^^^^^^^^^^^^^^^^^^^^^
123 While Neutron is managing the OVS instances on compute and control nodes,
124 OpenDaylight and Neutron can be in conflict. To prevent issues, we turn off
125 Neutron server on the network controller, and Neutron's Open vSwitch agents
126 on all hosts.
127
128 * Turn off neutron-server on control node:
129
130   .. code-block:: bash
131
132       systemctl stop neutron-server
133       systemctl stop neutron-l3-agent
134
135 * On each node in the cluster, shut down and disable Neutron's agent services to
136   ensure that they do not restart after a reboot:
137
138   .. code-block:: bash
139
140       systemctl stop neutron-openvswitch-agent
141       systemctl disable
142       neutron-openvswitch-agent
143       systemctl stop neutron-l3-agent
144       systemctl disable neutron-l3-agent
145
146
147 Configuring Open vSwitch to be managed by OpenDaylight
148 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
149 On each host (both compute and control nodes) we will clear the pre-existing
150 Open vSwitch config and set OpenDaylight to manage the switch:
151
152 * Stop the Open vSwitch service, and clear existing OVSDB (OpenDaylight expects to
153   manage vSwitches completely):
154
155   .. code-block:: bash
156
157       systemctl stop openvswitch
158       rm -rf /var/log/openvswitch/*
159       rm -rf /etc/openvswitch/conf.db
160       systemctl start openvswitch
161
162 * At this stage, your Open vSwitch configuration should be empty:
163
164   .. code-block:: bash
165
166       [root@odl-compute2 ~]# ovs-vsctl show
167       9f3b38cb-eefc-4bc7-828b-084b1f66fbfd
168           ovs_version: "2.5.1"
169
170 * Set OpenDaylight as the manager on all nodes:
171
172   .. code-block:: bash
173
174       ovs-vsctl set-manager tcp:{CONTROL_HOST}:6640
175
176 * Set the IP to be used for VXLAN connectivity on all nodes.
177   This IP must correspond to an actual linux interface on each machine.
178
179   .. code-block:: bash
180
181       sudo ovs-vsctl set Open_vSwitch . other_config:local_ip=<ip>
182
183 * You should now see a new section in your Open vSwitch configuration
184   showing that you are connected to the OpenDaylight server via OVSDB,
185   and OpenDaylight will automatically create a br-int bridge that is
186   connected via OpenFlow to the controller:
187
188   .. code-block:: bash
189      :emphasize-lines: 4,6-7
190
191      [root@odl-compute2 ~]# ovs-vsctl show
192      9f3b38cb-eefc-4bc7-828b-084b1f66fbfd
193           Manager "tcp:172.16.21.56:6640"
194               is_connected: true
195           Bridge br-int
196               Controller "tcp:172.16.21.56:6633"
197                   is_connected: true
198               fail_mode: secure
199               Port br-int
200                   Interface br-int
201           ovs_version: "2.5.1"
202
203       [root@odl-compute2 ~]# ovs-vsctl get Open_vSwitch . other_config
204       {local_ip="10.0.42.161"}
205
206 * If you do not see the result above (specifically, if you do not see "is_connected: true" in the Manager section or in the Controller section), you may not have a security policies in place to allow Open vSwitch remote administration.
207
208   .. note::
209      | There might be iptables restrictions - if so the relevant ports should be opened (6640, 6653).
210      | If SELinux is running on your linux, set to permissive mode on all nodes and ensure it stays that way after boot.
211
212      .. code-block:: bash
213
214         setenforce 0
215         sed -i -e 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
216
217 * Make sure all nodes, including the control node, are connected to OpenDaylight.
218
219 * If something has gone wrong, check ``data/log/karaf.log`` under
220   the OpenDaylight distribution directory. If you do not see any interesting
221   log entries, set logging for netvirt to TRACE level inside Karaf and try again:
222
223   .. code-block:: bash
224
225      log:set TRACE netvirt
226
227 Configuring Neutron to use OpenDaylight
228 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
229 Once you have configured the vSwitches to connect to OpenDaylight, you can
230 now ensure that OpenStack Neutron is using OpenDaylight.
231
232 This requires the neutron networking-odl module to be installed.
233 | ``pip install networking-odl``
234
235 First, ensure that port 8080 (which will be used by OpenDaylight to listen
236 for REST calls) is available. By default, swift-proxy-service listens on the
237 same port, and you may need to move it (to another port or another host), or
238 disable that service. It can be moved to a different port (e.g. 8081) by editing
239 ``/etc/swift/proxy-server.conf`` and ``/etc/cinder/cinder.conf``,
240 modifying iptables appropriately, and restarting swift-proxy-service.
241 Alternatively, OpenDaylight can be configured to listen on a different port,
242 by modifying the ``jetty.port`` property value in ``etc/jetty.conf``.
243
244 .. code-block:: bash
245
246    <Set name="port">
247        <Property name="jetty.port" default="8080" />
248    </Set>
249
250 * Configure Neutron to use OpenDaylight's ML2 driver:
251
252   .. code-block:: bash
253
254      crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 mechanism_drivers opendaylight
255      crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 tenant_network_types vxlan
256
257      cat <<EOT>> /etc/neutron/plugins/ml2/ml2_conf.ini
258      [ml2_odl]
259      url = http://{CONTROL_HOST}:8080/controller/nb/v2/neutron
260      password = admin
261      username = admin
262      EOT
263
264 * Configure Neutron to use OpenDaylight's odl-router service plugin for L3 connectivity:
265
266   .. code-block:: bash
267
268      crudini --set /etc/neutron/plugins/neutron.conf DEFAULT service_plugins odl-router
269
270 * Configure Neutron DHCP agent to provide metadata services:
271
272   .. code-block:: bash
273
274      crudini --set /etc/neutron/plugins/dhcp_agent.ini DEFAULT force_metadata True
275
276   .. note::
277      | If the OpenStack version being used is Newton, this workaround should be applied,
278      | configuring the Neutron DHCP agent to use vsctl as the OVSDB interface:
279
280      .. code-block:: bash
281
282         crudini --set /etc/neutron/plugins/dhcp_agent.ini OVS ovsdb_interface vsctl
283
284 * Reset Neutron's database
285
286   .. code-block:: bash
287
288      mysql -e "DROP DATABASE IF EXISTS neutron;"
289      mysql -e "CREATE DATABASE neutron CHARACTER SET utf8;"
290      /usr/local/bin/neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head
291
292 * Restart neutron-server:
293
294   .. code-block:: bash
295
296      systemctl start neutron-server
297
298 Verifying it works
299 ^^^^^^^^^^^^^^^^^^
300 * Verify that OpenDaylight's ML2 interface is working:
301
302   .. code-block:: bash
303
304      curl -u admin:admin http://{CONTROL_HOST}:8080/controller/nb/v2/neutron/networks
305
306      {
307         "networks" : [ ]
308      }
309
310   | If this does not work or gives an error, check Neutron's log file in ``/var/log/neutron/server.log``.
311   | Error messages here should give some clue as to what the problem is in the connection with OpenDaylight.
312
313 * Create a network, subnet, router, connect ports, and start an instance using the Neutron CLI:
314
315   .. code-block:: bash
316
317      neutron router-create router1
318      neutron net-create private
319      neutron subnet-create private --name=private_subnet 10.10.5.0/24
320      neutron router-interface-add router1 private_subnet
321      nova boot --flavor <flavor> --image <image id> --nic net-id=<network id> test1
322      nova boot --flavor <flavor> --image <image id> --nic net-id=<network id> test2
323
324 At this point, you have confirmed that OpenDaylight is creating network
325 end-points for instances on your network and managing traffic to them.
326
327 | VMs can be reached using Horizon console, or alternatively by issuing ``nova get-vnc-console <vm> novnc``
328 | Through the console, connectivity between VMs can be verified.
329
330 Adding an external network for floating IP connectivity
331 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
332 * In order to connect to the VM using a floating IP, we need to configure external network connectivity, by creating an external network and subnet. This external network must be linked to a physical port on the machine, which will provide connectivity to an external gateway.
333
334   .. code-block:: bash
335
336      sudo ovs-vsctl set Open_vSwitch . other_config:provider_mappings=physnet1:eth1
337      neutron net-create public-net -- --router:external --is-default --provider:network_type=flat --provider:physical_network=physnet1
338      neutron subnet-create --allocation-pool start=10.10.10.2,end=10.10.10.254 --gateway 10.10.10.1 --name public-subnet public-net 10.10.0.0/16 -- --enable_dhcp=False
339      neutron router-gateway-set router1 public-net
340
341      neutron floatingip-create public-net
342      nova floating-ip-associate test1 <floating_ip>
343
344 Installing OpenStack and OpenDaylight using DevStack
345 ----------------------------------------------------
346 The easiest way to load and OpenStack setup using OpenDaylight is by using devstack, which does all the steps mentioned in previous sections.
347 | ``git clone https://git.openstack.org/openstack-dev/devstack``
348
349 * The following lines need to be added to your local.conf:
350
351   .. code-block:: bash
352
353    enable_plugin networking-odl http://git.openstack.org/openstack/networking-odl <branch>
354    ODL_MODE=allinone
355    Q_ML2_PLUGIN_MECHANISM_DRIVERS=opendaylight,logger
356    ODL_GATE_SERVICE_PROVIDER=vpnservice
357    disable_service q-l3
358    ML2_L3_PLUGIN=odl-router
359    ODL_PROVIDER_MAPPINGS={PUBLIC_PHYSICAL_NETWORK}:<external linux interface>
360
361 * More details on using devstack can be found in the following links:
362
363   * `Devstack All-In-One Single Machine Tutorial <http://docs.openstack.org/developer/devstack/guides/single-machine.html>`_
364   * `Devstack networking-odl README <https://github.com/openstack/networking-odl/blob/master/devstack/README.rst>`_
365
366 Troubleshooting
367 ---------------
368 VM DHCP Issues
369 ^^^^^^^^^^^^^^
370 * Trigger DHCP requests - access VM console:
371
372   * View log: ``nova console-log <vm>``
373   * Access using VNC console: nova get-vnc-console <vm> novnc
374   * Trigger DHCP requests:
375     ``sudo ifdown eth0 ; sudo ifup eth0``
376
377     .. code-block:: bash
378
379        udhcpc (v1.20.1) started
380        Sending discover...
381        Sending select for 10.0.123.3...
382        Lease of 10.0.123.3 obtained, lease time 86400 # This only happens when DHCP is properly obtained.
383
384 * Check if the DHCP requests are reaching the qdhcp agent using the following commands on the OpenStack controller:
385
386   .. code-block:: bash
387
388      sudo ip netns
389      sudo ip netns exec qdhcp-xxxxx ifconfig # xxxx is the neutron network id
390      sudo ip netns exec qdhcp-xxxxx tcpdump -nei tapxxxxx # xxxxx is the neutron port id
391
392      # Valid request and response:
393      15:08:41.684932 fa:16:3e:02:14:bb > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 329: 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from fa:16:3e:02:14:bb, length 287
394      15:08:41.685152 fa:16:3e:79:07:98 > fa:16:3e:02:14:bb, ethertype IPv4 (0x0800), length 354: 10.0.123.2.67 > 10.0.123.3.68: BOOTP/DHCP, Reply, length 312
395
396 * If the requests aren't reaching qdhcp:
397
398   * Verify VXLAN tunnels exist between compute and control nodes by using ``ovs-vsctl show``
399   * | Run the following commands to debug the OVS processing of the DHCP request packet:
400     | ``ovs-ofctl -OOpenFlow13 dump-ports-desc br-int`` # retrieve VMs ofport and MAC
401     | ``ovs-appctl ofproto/trace br-int in_port=<ofport>,dl_src=<mac>,dl_dst=ff:ff:ff:ff:ff:ff,udp,ip_src=0.0.0.0,ip_dst=255.255.255.255 | grep "Rule\|action"``
402
403     .. code-block:: bash
404
405        root@devstack:~# ovs-appctl ofproto/trace br-int in_port=1,dl_src=fe:16:3e:33:8b:d8,dl_dst=ff:ff:ff:ff:ff:ff,udp,ip_src=0.0.0.0,ip_dst=255.255.255.255 | grep "Rule\|action"
406            Rule: table=0 cookie=0x8000000 priority=1,in_port=1
407            OpenFlow actions=write_metadata:0x20000000001/0xffffff0000000001,goto_table:17
408                Rule: table=17 cookie=0x8000001 priority=5,metadata=0x20000000000/0xffffff0000000000
409                OpenFlow actions=write_metadata:0xc0000200000222e2/0xfffffffffffffffe,goto_table:19
410                    Rule: table=19 cookie=0x1080000 priority=0
411                    OpenFlow actions=resubmit(,17)
412                        Rule: table=17 cookie=0x8040000 priority=6,metadata=0xc000020000000000/0xffffff0000000000
413                        OpenFlow actions=write_metadata:0xe00002138a000000/0xfffffffffffffffe,goto_table:50
414                            Rule: table=50 cookie=0x8050000 priority=0
415                            OpenFlow actions=CONTROLLER:65535,goto_table:51
416                                Rule: table=51 cookie=0x8030000 priority=0
417                                OpenFlow actions=goto_table:52
418                                    Rule: table=52 cookie=0x870138a priority=5,metadata=0x138a000001/0xffff000001
419                                    OpenFlow actions=write_actions(group:210003)
420            Datapath actions: drop
421
422        root@devstack:~# ovs-ofctl -OOpenFlow13 dump-groups br-int | grep 'group_id=210003'
423            group_id=210003,type=all
424
425 * If the requests are reaching qdhcp, but the response isn't arriving to the VM:
426
427   * Locate the compute the VM is residing on (can use ``nova show <vm>``).
428
429     * | If the VM is on the same node as the qdhcp namespace, ``ofproto/trace`` can be used to track the packet:
430       | ``ovs-appctl ofproto/trace br-int in_port=<dhcp_ofport>,dl_src=<dhcp_port_mac>,dl_dst=<vm_port_mac>,udp,ip_src=<dhcp_port_ip>,ip_dst=<vm_port_ip> | grep "Rule\|action"``
431
432       .. code-block:: bash
433
434          root@devstack:~# ovs-appctl ofproto/trace br-int in_port=2,dl_src=fa:16:3e:79:07:98,dl_dst=fa:16:3e:02:14:bb,udp,ip_src=10.0.123.2,ip_dst=10.0.123.3 | grep "Rule\|action"
435              Rule: table=0 cookie=0x8000000 priority=4,in_port=2
436              OpenFlow actions=write_metadata:0x10000000000/0xffffff0000000001,goto_table:17
437                  Rule: table=17 cookie=0x8000001 priority=5,metadata=0x10000000000/0xffffff0000000000
438                  OpenFlow actions=write_metadata:0x60000100000222e0/0xfffffffffffffffe,goto_table:19
439                      Rule: table=19 cookie=0x1080000 priority=0
440                      OpenFlow actions=resubmit(,17)
441                          Rule: table=17 cookie=0x8040000 priority=6,metadata=0x6000010000000000/0xffffff0000000000
442                          OpenFlow actions=write_metadata:0x7000011389000000/0xfffffffffffffffe,goto_table:50
443                              Rule: table=50 cookie=0x8051389 priority=20,metadata=0x11389000000/0xfffffffff000000,dl_src=fa:16:3e:79:07:98
444                              OpenFlow actions=goto_table:51
445                                  Rule: table=51 cookie=0x8031389 priority=20,metadata=0x1389000000/0xffff000000,dl_dst=fa:16:3e:02:14:bb
446                                  OpenFlow actions=load:0x300->NXM_NX_REG6[],resubmit(,220)
447                                      Rule: table=220 cookie=0x8000007 priority=7,reg6=0x300
448                                      OpenFlow actions=output:3
449
450     * If the VM isn't on the same node as the qdhcp namepsace:
451
452       * Check if the packet is arriving via VXLAN by running ``tcpdump -nei <vxlan_port> port 4789``
453       * If it is arriving via VXLAN, the packet can be tracked on the compute node rules, using ``ofproto/trace``
454         in a similiar manner to the previous section. Note that packets arriving from a tunnels have a unique
455         tunnel_id (VNI) that should be used as well in the trace, due to the special processing of packets arriving
456         from a VXLAN tunnel.
457
458 Floating IP Issues
459 ^^^^^^^^^^^^^^^^^^
460 *  If you have assigned an external network and associated a floating IP to a VM but there is still no connectivity:
461
462    * Verify the external gateway IP is reachable through the provided provider network port.
463    * Verify OpenDaylight has successfully resolved the MAC address of the external gateway IP.
464      This can be verified by searching for the line "Installing ext-net group" in the karaf.log.
465    * Locate the compute the VM is residing on (can use ``nova show <vm>``).
466    * Run a ping to the VM floating IP.
467    * If the ping fails, execute a flow dump of br-int, and search for the flows that are relevant to the VM's floating IP address:
468      ``ovs-ofctl -OOpenFlow13 dump-flows br-int | grep "<floating_ip>"``
469
470      * | Are there packets on the incoming flow (matching dst_ip=<floating_ip>)?
471        | If not this probably means the provider network has not been set up properly, verify provider_mappings configuration and the configured external network physical_network value match. Also verify that the Flat/VLAN network configured is actually reachable via the configured port.
472      * | Are there packets on the outgoing flow (matching src_ip=<floating_ip>)?
473        | If not, this probably means that OpenDaylight is failing to resolve the MAC of the provided external gateway, required for forwarding packets to the external network.
474      * | Are there packets being sent on the external network port?
475        | This can be checked using ``tcpdump <port>`` or by viewing the appropriate OpenFlow rules. The mapping between the OpenFlow port number and the linux interface can be acquired using ``ovs-ofctl dump-ports-desc br-int``
476
477        .. code-block:: bash
478
479           ovs-ofctl -OOpenFlow13 dump-flows br-int | grep "<floating_ip>"
480           cookie=0x8000003, duration=436.710s, table=21, n_packets=190, n_bytes=22602, priority=42,ip,metadata=0x222e2/0xfffffffe,nw_dst=10.64.98.17 actions=goto_table:25
481           cookie=0x8000004, duration=436.739s, table=25, n_packets=190, n_bytes=22602, priority=10,ip,nw_dst=10.64.98.17 actions=set_field:10.0.123.3->ip_dst,write_metadata:0x222e0/0xfffffffe,goto_table:27
482           cookie=0x8000004, duration=436.730s, table=26, n_packets=120, n_bytes=15960, priority=10,ip,metadata=0x222e0/0xfffffffe,nw_src=10.0.123.3 actions=set_field:10.64.98.17->ip_src,write_metadata:0x222e2/0xfffffffe,goto_table:28
483           cookie=0x8000004, duration=436.728s, table=28, n_packets=120, n_bytes=15960, priority=10,ip,metadata=0x222e2/0xfffffffe,nw_src=10.64.98.17 actions=set_field:fa:16:3e:ec:a8:84->eth_src,group:200000
484
485 Useful Links
486 ------------
487 * `NetVirt Tables Pipeline <https://docs.google.com/presentation/d/15h4ZjPxblI5Pz9VWIYnzfyRcQrXYxA1uUoqJsgA53KM>`_
488 * `NetVirt Wiki Page <https://wiki.opendaylight.org/view/NetVirt>`_
489 * `NetVirt Basic Tutorial (OpenDaylight Summit 2016) <https://docs.google.com/presentation/d/1VLzRIOEptSOY1b0w4PezRIQ0gF5vx7GyLKECWXRV5mE>`_
490 * `NetVirt Advanced Tutorial (OpenDaylight Summit 2016) <https://docs.google.com/presentation/d/13K8Z1kl5XFZrWqBToMwFISSAPOKfzd3m9BtVcb-YAWs>`_
491 * `Other OpenDaylight Documentation <http://docs.opendaylight.org/>`_