Browse code

lib/quantum: refactor quantum plugins and third party

As quantum plugin support is coming like floodlight, nvp and nec,
it's worth while to refactor quantum plugin logic so that each plugin can
be modified/enhanced intervening with other quantum plugin.
And new plugin support can be added easily (hopefully) without modifying
core logic.

Change-Id: Ic5ab5b993272fdd3b4e779823323777a845ee681

Isaku Yamahata authored on 2012/12/28 13:15:31
Showing 14 changed files
... ...
@@ -19,6 +19,7 @@ Gabriel Hurley <gabriel@strikeawe.com>
19 19
 Gary Kotton <gkotton@redhat.com>
20 20
 Hengqing Hu <hudayou@hotmail.com>
21 21
 Hua ZHANG <zhuadl@cn.ibm.com>
22
+Isaku Yamahata <yamahata@private.email.ne.jp>
22 23
 Jake Dahn <admin@jakedahn.com>
23 24
 James E. Blair <james.blair@rackspace.com>
24 25
 Jason Cannavale <jason.cannavale@rackspace.com>
25 26
deleted file mode 100644
... ...
@@ -1,50 +0,0 @@
1
-# Big Switch/FloodLight  OpenFlow Controller
2
-# ------------------------------------------
3
-
4
-# Save trace setting
5
-XTRACE=$(set +o | grep xtrace)
6
-set +o xtrace
7
-
8
-BS_FL_CONTROLLERS_PORT=${BS_FL_CONTROLLERS_PORT:-localhost:80}
9
-BS_FL_OF_PORT=${BS_FL_OF_PORT:-6633}
10
-OVS_BRIDGE=${OVS_BRIDGE:-br-int}
11
-
12
-function configure_bigswitch_floodlight() {
13
-    :
14
-}
15
-
16
-function init_bigswitch_floodlight() {
17
-    install_quantum_agent_packages
18
-
19
-    echo -n "Installing OVS managed by the openflow controllers:"
20
-    echo ${BS_FL_CONTROLLERS_PORT}
21
-
22
-    # Create local OVS bridge and configure it
23
-    sudo ovs-vsctl --no-wait -- --if-exists del-br ${OVS_BRIDGE}
24
-    sudo ovs-vsctl --no-wait add-br ${OVS_BRIDGE}
25
-    sudo ovs-vsctl --no-wait br-set-external-id ${OVS_BRIDGE} bridge-id ${OVS_BRIDGE}
26
-
27
-    ctrls=
28
-    for ctrl in `echo ${BS_FL_CONTROLLERS_PORT} | tr ',' ' '`
29
-    do
30
-        ctrl=${ctrl%:*}
31
-        ctrls="${ctrls} tcp:${ctrl}:${BS_FL_OF_PORT}"
32
-    done
33
-    echo "Adding Network conttrollers: " ${ctrls}
34
-    sudo ovs-vsctl --no-wait set-controller ${OVS_BRIDGE} ${ctrls}
35
-}
36
-
37
-function install_bigswitch_floodlight() {
38
-    :
39
-}
40
-
41
-function start_bigswitch_floodlight() {
42
-    :
43
-}
44
-
45
-function stop_bigswitch_floodlight() {
46
-    :
47
-}
48
-
49
-# Restore xtrace
50
-$XTRACE
... ...
@@ -229,7 +229,7 @@ function configure_nova() {
229 229
             configure_baremetal_nova_dirs
230 230
         fi
231 231
 
232
-        if is_service_enabled quantum && is_quantum_ovs_base_plugin "$Q_PLUGIN" && ! sudo grep -q '^cgroup_device_acl' $QEMU_CONF ; then
232
+        if is_service_enabled quantum && is_quantum_ovs_base_plugin && ! sudo grep -q '^cgroup_device_acl' $QEMU_CONF ; then
233 233
             # Add /dev/net/tun to cgroup_device_acls, needed for type=ethernet interfaces
234 234
             cat <<EOF | sudo tee -a $QEMU_CONF
235 235
 cgroup_device_acl = [
... ...
@@ -171,6 +171,11 @@ if is_service_enabled quantum; then
171 171
     OVS_ENABLE_TUNNELING=${OVS_ENABLE_TUNNELING:-$ENABLE_TENANT_TUNNELS}
172 172
 fi
173 173
 
174
+# Quantum plugin specific functions
175
+# ---------------------------------
176
+# Please refer to lib/quantum_plugins/README.md for details.
177
+source $TOP_DIR/lib/quantum_plugins/$Q_PLUGIN
178
+
174 179
 # Entry Points
175 180
 # ------------
176 181
 
... ...
@@ -210,22 +215,9 @@ function create_nova_conf_quantum() {
210 210
     iniset $NOVA_CONF DEFAULT quantum_admin_tenant_name "$SERVICE_TENANT_NAME"
211 211
     iniset $NOVA_CONF DEFAULT quantum_url "http://$Q_HOST:$Q_PORT"
212 212
 
213
-    if [[ "$Q_PLUGIN" = "openvswitch" ]]; then
214
-        NOVA_VIF_DRIVER=${NOVA_VIF_DRIVER:-"nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver"}
215
-        if [ "$VIRT_DRIVER" = 'xenserver' ]; then
216
-            add_nova_opt "xenapi_vif_driver=nova.virt.xenapi.vif.XenAPIOpenVswitchDriver"
217
-            add_nova_opt "xenapi_ovs_integration_bridge=$FLAT_NETWORK_BRIDGE"
218
-        fi
219
-    elif [[ "$Q_PLUGIN" = "linuxbridge" ]]; then
220
-        NOVA_VIF_DRIVER=${NOVA_VIF_DRIVER:-"nova.virt.libvirt.vif.QuantumLinuxBridgeVIFDriver"}
221
-    elif [[ "$Q_PLUGIN" = "ryu" ]]; then
222
-        NOVA_VIF_DRIVER=${NOVA_VIF_DRIVER:-"quantum.plugins.ryu.nova.vif.LibvirtOpenVswitchOFPRyuDriver"}
223
-        iniset $NOVA_CONF DEFAULT libvirt_ovs_integration_bridge "$OVS_BRIDGE"
224
-        iniset $NOVA_CONF DEFAULT linuxnet_ovs_ryu_api_host "$RYU_API_HOST:$RYU_API_PORT"
225
-        iniset $NOVA_CONF DEFAULT libvirt_ovs_ryu_api_host "$RYU_API_HOST:$RYU_API_PORT"
226
-    elif [[ "$Q_PLUGIN" = "bigswitch_floodlight" ]]; then
227
-        NOVA_VIF_DRIVER=${NOVA_VIF_DRIVER:-"nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver"}
228
-    fi
213
+    # set NOVA_VIF_DRIVER and optionally set options in nova_conf
214
+    quantum_plugin_create_nova_conf
215
+
229 216
     iniset $NOVA_CONF DEFAULT libvirt_vif_driver "$NOVA_VIF_DRIVER"
230 217
     iniset $NOVA_CONF DEFAULT linuxnet_interface_driver "$LINUXNET_VIF_DRIVER"
231 218
     if is_service_enabled q-meta; then
... ...
@@ -297,7 +289,7 @@ function create_quantum_initial_network() {
297 297
         EXT_GW_IP=$(quantum subnet-create --ip_version 4 $EXT_NET_ID $FLOATING_RANGE -- --enable_dhcp=False | grep 'gateway_ip' | get_field 2)
298 298
         quantum router-gateway-set $ROUTER_ID $EXT_NET_ID
299 299
 
300
-        if is_quantum_ovs_base_plugin "$Q_PLUGIN" && [[ "$Q_USE_NAMESPACE" = "True" ]]; then
300
+        if is_quantum_ovs_base_plugin && [[ "$Q_USE_NAMESPACE" = "True" ]]; then
301 301
             CIDR_LEN=${FLOATING_RANGE#*/}
302 302
             sudo ip addr add $EXT_GW_IP/$CIDR_LEN dev $PUBLIC_BRIDGE
303 303
             sudo ip link set $PUBLIC_BRIDGE up
... ...
@@ -328,29 +320,8 @@ function install_quantumclient() {
328 328
 
329 329
 # install_quantum_agent_packages() - Collect source and prepare
330 330
 function install_quantum_agent_packages() {
331
-    if is_quantum_ovs_base_plugin "$Q_PLUGIN"; then
332
-        # Install deps
333
-        # FIXME add to ``files/apts/quantum``, but don't install if not needed!
334
-        if is_ubuntu; then
335
-            kernel_version=`cat /proc/version | cut -d " " -f3`
336
-            install_package make fakeroot dkms openvswitch-switch openvswitch-datapath-dkms linux-headers-$kernel_version
337
-        else
338
-            ### FIXME(dtroyer): Find RPMs for OpenVSwitch
339
-            echo "OpenVSwitch packages need to be located"
340
-            # Fedora does not started OVS by default
341
-            restart_service openvswitch
342
-        fi
343
-    elif [[ "$Q_PLUGIN" = "linuxbridge" ]]; then
344
-       install_package bridge-utils
345
-    fi
346
-}
347
-
348
-function is_quantum_ovs_base_plugin() {
349
-    local plugin=$1
350
-    if [[ ",openvswitch,ryu,bigswitch_floodlight," =~ ,${plugin}, ]]; then
351
-        return 0
352
-    fi
353
-    return 1
331
+    # install packages that is specific to plugin agent
332
+    quantum_plugin_install_agent_packages
354 333
 }
355 334
 
356 335
 function setup_quantum() {
... ...
@@ -407,29 +378,9 @@ function _configure_quantum_common() {
407 407
 
408 408
     cp $QUANTUM_DIR/etc/quantum.conf $QUANTUM_CONF
409 409
 
410
-    if [[ "$Q_PLUGIN" = "openvswitch" ]]; then
411
-        Q_PLUGIN_CONF_PATH=etc/quantum/plugins/openvswitch
412
-        Q_PLUGIN_CONF_FILENAME=ovs_quantum_plugin.ini
413
-        Q_DB_NAME="ovs_quantum"
414
-        Q_PLUGIN_CLASS="quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPluginV2"
415
-    elif [[ "$Q_PLUGIN" = "linuxbridge" ]]; then
416
-        Q_PLUGIN_CONF_PATH=etc/quantum/plugins/linuxbridge
417
-        Q_PLUGIN_CONF_FILENAME=linuxbridge_conf.ini
418
-        Q_DB_NAME="quantum_linux_bridge"
419
-        Q_PLUGIN_CLASS="quantum.plugins.linuxbridge.lb_quantum_plugin.LinuxBridgePluginV2"
420
-    elif [[ "$Q_PLUGIN" = "ryu" ]]; then
421
-        Q_PLUGIN_CONF_PATH=etc/quantum/plugins/ryu
422
-        Q_PLUGIN_CONF_FILENAME=ryu.ini
423
-        Q_DB_NAME="ovs_quantum"
424
-        Q_PLUGIN_CLASS="quantum.plugins.ryu.ryu_quantum_plugin.RyuQuantumPluginV2"
425
-    elif [[ "$Q_PLUGIN" = "bigswitch_floodlight" ]]; then
426
-        Q_PLUGIN_CONF_PATH=etc/quantum/plugins/bigswitch
427
-        Q_PLUGIN_CONF_FILENAME=restproxy.ini
428
-        Q_DB_NAME="restproxy_quantum"
429
-        Q_PLUGIN_CLASS="quantum.plugins.bigswitch.plugin.QuantumRestProxyV2"
430
-        BS_FL_CONTROLLERS_PORT=${BS_FL_CONTROLLERS_PORT:-localhost:80}
431
-        BS_FL_CONTROLLER_TIMEOUT=${BS_FL_CONTROLLER_TIMEOUT:-10}
432
-    fi
410
+    # set plugin-specific variables
411
+    # Q_PLUGIN_CONF_PATH, Q_PLUGIN_CONF_FILENAME, Q_DB_NAME, Q_PLUGIN_CLASS
412
+    quantum_plugin_configure_common
433 413
 
434 414
     if [[ $Q_PLUGIN_CONF_PATH == '' || $Q_PLUGIN_CONF_FILENAME == '' || $Q_PLUGIN_CLASS == '' ]]; then
435 415
         echo "Quantum plugin not set.. exiting"
... ...
@@ -463,15 +414,7 @@ function _configure_quantum_debug_command() {
463 463
     _quantum_setup_keystone $QUANTUM_TEST_CONFIG_FILE DEFAULT set_auth_url
464 464
     _quantum_setup_interface_driver $QUANTUM_TEST_CONFIG_FILE
465 465
 
466
-    if is_quantum_ovs_base_plugin "$Q_PLUGIN"; then
467
-        iniset $QUANTUM_TEST_CONFIG_FILE DEFAULT external_network_bridge $PUBLIC_BRIDGE
468
-    elif [[ "$Q_PLUGIN" = "linuxbridge" ]]; then
469
-        iniset $QUANTUM_TEST_CONFIG_FILE DEFAULT external_network_bridge ''
470
-    fi
471
-
472
-    if [[ "$Q_PLUGIN" = "ryu" ]]; then
473
-        iniset $QUANTUM_TEST_CONFIG_FILE DEFAULT ryu_api_host $RYU_API_HOST:$RYU_API_PORT
474
-    fi
466
+    quantum_plugin_configure_debug_command
475 467
 }
476 468
 
477 469
 function _configure_quantum_dhcp_agent() {
... ...
@@ -489,9 +432,7 @@ function _configure_quantum_dhcp_agent() {
489 489
     _quantum_setup_keystone $Q_DHCP_CONF_FILE DEFAULT set_auth_url
490 490
     _quantum_setup_interface_driver $Q_DHCP_CONF_FILE
491 491
 
492
-    if [[ "$Q_PLUGIN" = "ryu" ]]; then
493
-        iniset $Q_DHCP_CONF_FILE DEFAULT ryu_api_host $RYU_API_HOST:$RYU_API_PORT
494
-    fi
492
+    quantum_plugin_configure_dhcp_agent
495 493
 }
496 494
 
497 495
 function _configure_quantum_l3_agent() {
... ...
@@ -510,16 +451,7 @@ function _configure_quantum_l3_agent() {
510 510
     _quantum_setup_keystone $Q_L3_CONF_FILE DEFAULT set_auth_url
511 511
     _quantum_setup_interface_driver $Q_L3_CONF_FILE
512 512
 
513
-    if is_quantum_ovs_base_plugin "$Q_PLUGIN"; then
514
-        iniset $Q_L3_CONF_FILE DEFAULT external_network_bridge $PUBLIC_BRIDGE
515
-        _quantum_setup_external_bridge $PUBLIC_BRIDGE
516
-    elif [[ "$Q_PLUGIN" = "linuxbridge" ]]; then
517
-        iniset $Q_L3_CONF_FILE DEFAULT external_network_bridge ''
518
-    fi
519
-
520
-    if [[ "$Q_PLUGIN" = "ryu" ]]; then
521
-        iniset $Q_L3_CONF_FILE DEFAULT ryu_api_host $RYU_API_HOST:$RYU_API_PORT
522
-    fi
513
+    quantum_plugin_configure_l3_agent
523 514
 }
524 515
 
525 516
 function _configure_quantum_metadata_agent() {
... ...
@@ -546,105 +478,7 @@ function _configure_quantum_plugin_agent() {
546 546
     iniset /$Q_PLUGIN_CONF_FILE AGENT root_helper "$Q_RR_COMMAND"
547 547
 
548 548
     # Configure agent for plugin
549
-    if [[ "$Q_PLUGIN" = "openvswitch" ]]; then
550
-        _configure_quantum_plugin_agent_openvswitch
551
-    elif [[ "$Q_PLUGIN" = "linuxbridge" ]]; then
552
-        _configure_quantum_plugin_agent_linuxbridge
553
-    elif [[ "$Q_PLUGIN" = "ryu" ]]; then
554
-        _configure_quantum_plugin_agent_ryu
555
-    fi
556
-}
557
-
558
-function _configure_quantum_plugin_agent_linuxbridge() {
559
-    # Setup physical network interface mappings.  Override
560
-    # ``LB_VLAN_RANGES`` and ``LB_INTERFACE_MAPPINGS`` in ``localrc`` for more
561
-    # complex physical network configurations.
562
-    if [[ "$LB_INTERFACE_MAPPINGS" = "" ]] && [[ "$PHYSICAL_NETWORK" != "" ]] && [[ "$LB_PHYSICAL_INTERFACE" != "" ]]; then
563
-        LB_INTERFACE_MAPPINGS=$PHYSICAL_NETWORK:$LB_PHYSICAL_INTERFACE
564
-    fi
565
-    if [[ "$LB_INTERFACE_MAPPINGS" != "" ]]; then
566
-        iniset /$Q_PLUGIN_CONF_FILE LINUX_BRIDGE physical_interface_mappings $LB_INTERFACE_MAPPINGS
567
-    fi
568
-    AGENT_BINARY="$QUANTUM_DIR/bin/quantum-linuxbridge-agent"
569
-}
570
-
571
-function _configure_quantum_plugin_agent_openvswitch() {
572
-    # Setup integration bridge
573
-    OVS_BRIDGE=${OVS_BRIDGE:-br-int}
574
-    _quantum_setup_ovs_bridge $OVS_BRIDGE
575
-
576
-    # Setup agent for tunneling
577
-    if [[ "$OVS_ENABLE_TUNNELING" = "True" ]]; then
578
-        # Verify tunnels are supported
579
-        # REVISIT - also check kernel module support for GRE and patch ports
580
-        OVS_VERSION=`ovs-vsctl --version | head -n 1 | awk '{print $4;}'`
581
-        if [ $OVS_VERSION \< "1.4" ] && ! is_service_enabled q-svc ; then
582
-            echo "You are running OVS version $OVS_VERSION."
583
-            echo "OVS 1.4+ is required for tunneling between multiple hosts."
584
-            exit 1
585
-        fi
586
-        iniset /$Q_PLUGIN_CONF_FILE OVS enable_tunneling True
587
-        iniset /$Q_PLUGIN_CONF_FILE OVS local_ip $HOST_IP
588
-    fi
589
-
590
-    # Setup physical network bridge mappings.  Override
591
-    # ``OVS_VLAN_RANGES`` and ``OVS_BRIDGE_MAPPINGS`` in ``localrc`` for more
592
-    # complex physical network configurations.
593
-    if [[ "$OVS_BRIDGE_MAPPINGS" = "" ]] && [[ "$PHYSICAL_NETWORK" != "" ]] && [[ "$OVS_PHYSICAL_BRIDGE" != "" ]]; then
594
-        OVS_BRIDGE_MAPPINGS=$PHYSICAL_NETWORK:$OVS_PHYSICAL_BRIDGE
595
-
596
-        # Configure bridge manually with physical interface as port for multi-node
597
-        sudo ovs-vsctl --no-wait -- --may-exist add-br $OVS_PHYSICAL_BRIDGE
598
-    fi
599
-    if [[ "$OVS_BRIDGE_MAPPINGS" != "" ]]; then
600
-        iniset /$Q_PLUGIN_CONF_FILE OVS bridge_mappings $OVS_BRIDGE_MAPPINGS
601
-    fi
602
-    AGENT_BINARY="$QUANTUM_DIR/bin/quantum-openvswitch-agent"
603
-
604
-    if [ "$VIRT_DRIVER" = 'xenserver' ]; then
605
-        # Nova will always be installed along with quantum for a domU
606
-        # devstack install, so it should be safe to rely on nova.conf
607
-        # for xenapi configuration.
608
-        Q_RR_DOM0_COMMAND="$QUANTUM_DIR/bin/quantum-rootwrap-dom0 $NOVA_CONF"
609
-        # Under XS/XCP, the ovs agent needs to target the dom0
610
-        # integration bridge.  This is enabled by using a root wrapper
611
-        # that executes commands on dom0 via a XenAPI plugin.
612
-        iniset /$Q_PLUGIN_CONF_FILE AGENT root_helper "$Q_RR_DOM0_COMMAND"
613
-
614
-        # FLAT_NETWORK_BRIDGE is the dom0 integration bridge.  To
615
-        # ensure the bridge lacks direct connectivity, set
616
-        # VM_VLAN=-1;VM_DEV=invalid in localrc
617
-        iniset /$Q_PLUGIN_CONF_FILE OVS integration_bridge $FLAT_NETWORK_BRIDGE
618
-
619
-        # The ovs agent needs to ensure that the ports associated with
620
-        # a given network share the same local vlan tag.  On
621
-        # single-node XS/XCP, this requires monitoring both the dom0
622
-        # bridge, where VM's are attached, and the domU bridge, where
623
-        # dhcp servers are attached.
624
-        if is_service_enabled q-dhcp; then
625
-            iniset /$Q_PLUGIN_CONF_FILE OVS domu_integration_bridge $OVS_BRIDGE
626
-            # DomU will use the regular rootwrap
627
-            iniset /$Q_PLUGIN_CONF_FILE AGENT domu_root_helper "$Q_RR_COMMAND"
628
-            # Plug the vm interface into the domU integration bridge.
629
-            sudo ip addr flush dev $GUEST_INTERFACE_DEFAULT
630
-            sudo ip link set $OVS_BRIDGE up
631
-            # Assign the VM IP only if it has been set explicitly
632
-            if [[ "$VM_IP" != "" ]]; then
633
-                sudo ip addr add $VM_IP dev $OVS_BRIDGE
634
-            fi
635
-            sudo ovs-vsctl add-port $OVS_BRIDGE $GUEST_INTERFACE_DEFAULT
636
-        fi
637
-    fi
638
-}
639
-
640
-function _configure_quantum_plugin_agent_ryu() {
641
-    # Set up integration bridge
642
-    OVS_BRIDGE=${OVS_BRIDGE:-br-int}
643
-    _quantum_setup_ovs_bridge $OVS_BRIDGE
644
-    if [ -n "$RYU_INTERNAL_INTERFACE" ]; then
645
-        sudo ovs-vsctl --no-wait -- --may-exist add-port $OVS_BRIDGE $RYU_INTERNAL_INTERFACE
646
-    fi
647
-    AGENT_BINARY="$QUANTUM_DIR/quantum/plugins/ryu/agent/ryu_quantum_agent.py"
549
+    quantum_plugin_configure_plugin_agent
648 550
 }
649 551
 
650 552
 # _configure_quantum_service() - Set config files for quantum service
... ...
@@ -674,57 +508,7 @@ function _configure_quantum_service() {
674 674
     _quantum_setup_keystone $Q_API_PASTE_FILE filter:authtoken
675 675
 
676 676
     # Configure plugin
677
-    if [[ "$Q_PLUGIN" = "openvswitch" ]]; then
678
-        if [[ "$ENABLE_TENANT_TUNNELS" = "True" ]]; then
679
-            iniset /$Q_PLUGIN_CONF_FILE OVS tenant_network_type gre
680
-            iniset /$Q_PLUGIN_CONF_FILE OVS tunnel_id_ranges $TENANT_TUNNEL_RANGES
681
-        elif [[ "$ENABLE_TENANT_VLANS" = "True" ]]; then
682
-            iniset /$Q_PLUGIN_CONF_FILE OVS tenant_network_type vlan
683
-        else
684
-            echo "WARNING - The openvswitch plugin is using local tenant networks, with no connectivity between hosts."
685
-        fi
686
-
687
-        # Override ``OVS_VLAN_RANGES`` and ``OVS_BRIDGE_MAPPINGS`` in ``localrc``
688
-        # for more complex physical network configurations.
689
-        if [[ "$OVS_VLAN_RANGES" = "" ]] && [[ "$PHYSICAL_NETWORK" != "" ]]; then
690
-            OVS_VLAN_RANGES=$PHYSICAL_NETWORK
691
-            if [[ "$TENANT_VLAN_RANGE" != "" ]]; then
692
-                OVS_VLAN_RANGES=$OVS_VLAN_RANGES:$TENANT_VLAN_RANGE
693
-            fi
694
-        fi
695
-        if [[ "$OVS_VLAN_RANGES" != "" ]]; then
696
-            iniset /$Q_PLUGIN_CONF_FILE OVS network_vlan_ranges $OVS_VLAN_RANGES
697
-        fi
698
-
699
-        # Enable tunnel networks if selected
700
-        if [[ $OVS_ENABLE_TUNNELING = "True" ]]; then
701
-            iniset /$Q_PLUGIN_CONF_FILE OVS enable_tunneling True
702
-        fi
703
-    elif [[ "$Q_PLUGIN" = "linuxbridge" ]]; then
704
-        if [[ "$ENABLE_TENANT_VLANS" = "True" ]]; then
705
-            iniset /$Q_PLUGIN_CONF_FILE VLANS tenant_network_type vlan
706
-        else
707
-            echo "WARNING - The linuxbridge plugin is using local tenant networks, with no connectivity between hosts."
708
-        fi
709
-
710
-        # Override ``LB_VLAN_RANGES`` and ``LB_INTERFACE_MAPPINGS`` in ``localrc``
711
-        # for more complex physical network configurations.
712
-        if [[ "$LB_VLAN_RANGES" = "" ]] && [[ "$PHYSICAL_NETWORK" != "" ]]; then
713
-            LB_VLAN_RANGES=$PHYSICAL_NETWORK
714
-            if [[ "$TENANT_VLAN_RANGE" != "" ]]; then
715
-                LB_VLAN_RANGES=$LB_VLAN_RANGES:$TENANT_VLAN_RANGE
716
-            fi
717
-        fi
718
-        if [[ "$LB_VLAN_RANGES" != "" ]]; then
719
-            iniset /$Q_PLUGIN_CONF_FILE VLANS network_vlan_ranges $LB_VLAN_RANGES
720
-        fi
721
-    elif [[ "$Q_PLUGIN" = "ryu" ]]; then
722
-        iniset /$Q_PLUGIN_CONF_FILE OVS openflow_controller $RYU_OFP_HOST:$RYU_OFP_PORT
723
-        iniset /$Q_PLUGIN_CONF_FILE OVS openflow_rest_api $RYU_API_HOST:$RYU_API_PORT
724
-    elif [[ "$Q_PLUGIN" = "bigswitch_floodlight" ]]; then
725
-        iniset /$Q_PLUGIN_CONF_FILE RESTPROXY servers $BS_FL_CONTROLLERS_PORT
726
-        iniset /$Q_PLUGIN_CONF_FILE RESTPROXY servertimeout $BS_FL_CONTROLLER_TIMEOUT
727
-    fi
677
+    quantum_plugin_configure_service
728 678
 }
729 679
 
730 680
 # Utility Functions
... ...
@@ -784,32 +568,8 @@ function _quantum_setup_keystone() {
784 784
     rm -f $QUANTUM_AUTH_CACHE_DIR/*
785 785
 }
786 786
 
787
-function _quantum_setup_ovs_bridge() {
788
-    local bridge=$1
789
-    quantum-ovs-cleanup --ovs_integration_bridge $bridge
790
-    sudo ovs-vsctl --no-wait -- --may-exist add-br $bridge
791
-    sudo ovs-vsctl --no-wait br-set-external-id $bridge bridge-id $bridge
792
-}
793
-
794 787
 function _quantum_setup_interface_driver() {
795
-    local conf_file=$1
796
-    if [[ "$Q_PLUGIN" == "openvswitch" ]]; then
797
-        iniset $conf_file DEFAULT interface_driver quantum.agent.linux.interface.OVSInterfaceDriver
798
-    elif [[ "$Q_PLUGIN" = "linuxbridge" ]]; then
799
-        iniset $conf_file DEFAULT interface_driver quantum.agent.linux.interface.BridgeInterfaceDriver
800
-    elif [[ "$Q_PLUGIN" = "ryu" ]]; then
801
-        iniset $conf_file DEFAULT interface_driver quantum.agent.linux.interface.RyuInterfaceDriver
802
-    elif [[ "$Q_PLUGIN" = "bigswitch_floodlight" ]]; then
803
-        iniset $conf_file DEFAULT interface_driver quantum.agent.linux.interface.OVSInterfaceDriver
804
-    fi
805
-}
806
-
807
-function _quantum_setup_external_bridge() {
808
-    local bridge=$1
809
-    quantum-ovs-cleanup --external_network_bridge $bridge
810
-    sudo ovs-vsctl --no-wait -- --may-exist add-br $bridge
811
-    # ensure no IP is configured on the public bridge
812
-    sudo ip addr flush dev $bridge
788
+    quantum_plugin_setup_interface_driver $1
813 789
 }
814 790
 
815 791
 # Functions for Quantum Exercises
... ...
@@ -886,55 +646,45 @@ function _ssh_check_quantum() {
886 886
 
887 887
 # Quantum 3rd party programs
888 888
 #---------------------------
889
-# A comma-separated list of 3rd party programs
890
-QUANTUM_THIRD_PARTIES="ryu,bigswitch_floodlight"
891
-for third_party in ${QUANTUM_THIRD_PARTIES//,/ }; do
892
-    source lib/$third_party
889
+# please refer to lib/quantum_thirdparty/README.md for details
890
+QUANTUM_THIRD_PARTIES=""
891
+for f in $TOP_DIR/lib/quantum_thirdparty/*; do
892
+     third_party=$(basename $f)
893
+     if is_service_enabled $third_party; then
894
+         source $TOP_DIR/lib/quantum_thirdparty/$third_party
895
+         QUANTUM_THIRD_PARTIES="$QUANTUM_THIRD_PARTIES,$third_party"
896
+     fi
893 897
 done
894 898
 
895
-# configure_quantum_third_party() - Set config files, create data dirs, etc
896
-function configure_quantum_third_party() {
899
+function _quantum_third_party_do() {
897 900
     for third_party in ${QUANTUM_THIRD_PARTIES//,/ }; do
898
-        if is_service_enabled $third_party; then
899
-            configure_${third_party}
900
-        fi
901
+        ${1}_${third_party}
901 902
     done
902 903
 }
903 904
 
905
+# configure_quantum_third_party() - Set config files, create data dirs, etc
906
+function configure_quantum_third_party() {
907
+    _quantum_third_party_do configure
908
+}
909
+
904 910
 # init_quantum_third_party() - Initialize databases, etc.
905 911
 function init_quantum_third_party() {
906
-    for third_party in ${QUANTUM_THIRD_PARTIES//,/ }; do
907
-        if is_service_enabled $third_party; then
908
-            init_${third_party}
909
-        fi
910
-    done
912
+    _quantum_third_party_do init
911 913
 }
912 914
 
913 915
 # install_quantum_third_party() - Collect source and prepare
914 916
 function install_quantum_third_party() {
915
-    for third_party in ${QUANTUM_THIRD_PARTIES//,/ }; do
916
-        if is_service_enabled $third_party; then
917
-            install_${third_party}
918
-        fi
919
-    done
917
+    _quantum_third_party_do install
920 918
 }
921 919
 
922 920
 # start_quantum_third_party() - Start running processes, including screen
923 921
 function start_quantum_third_party() {
924
-    for third_party in ${QUANTUM_THIRD_PARTIES//,/ }; do
925
-        if is_service_enabled $third_party; then
926
-            start_${third_party}
927
-        fi
928
-    done
922
+    _quantum_third_party_do start
929 923
 }
930 924
 
931 925
 # stop_quantum_third_party - Stop running processes (non-screen)
932 926
 function stop_quantum_third_party() {
933
-    for third_party in ${QUANTUM_THIRD_PARTIES//,/ }; do
934
-        if is_service_enabled $third_party; then
935
-            stop_${third_party}
936
-        fi
937
-    done
927
+    _quantum_third_party_do stop
938 928
 }
939 929
 
940 930
 
941 931
new file mode 100644
... ...
@@ -0,0 +1,34 @@
0
+Quantum plugin specific files
1
+=============================
2
+Quantum plugins require plugin specific behavior.
3
+The files under the directory, ``lib/quantum_plugins/``, will be used
4
+when their service is enabled.
5
+Each plugin has ``lib/quantum_plugins/$Q_PLUGIN`` and define the following
6
+functions.
7
+Plugin specific configuration variables should be in this file.
8
+
9
+* filename: ``$Q_PLUGIN``
10
+  * The corresponding file name MUST be the same to plugin name ``$Q_PLUGIN``.
11
+    Plugin specific configuration variables should be in this file.
12
+
13
+functions
14
+---------
15
+``lib/quantum`` calls the following functions when the ``$Q_PLUGIN`` is enabled
16
+
17
+* ``quantum_plugin_create_nova_conf`` :
18
+  set ``NOVA_VIF_DRIVER`` and optionally set options in nova_conf
19
+  e.g.
20
+  NOVA_VIF_DRIVER=${NOVA_VIF_DRIVER:-"nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver"}
21
+* ``quantum_plugin_install_agent_packages`` :
22
+  install packages that is specific to plugin agent
23
+  e.g.
24
+  install_package bridge-utils
25
+* ``quantum_plugin_configure_common`` :
26
+  set plugin-specific variables, ``Q_PLUGIN_CONF_PATH``, ``Q_PLUGIN_CONF_FILENAME``,
27
+  ``Q_DB_NAME``, ``Q_PLUGIN_CLASS``
28
+* ``quantum_plugin_configure_debug_command``
29
+* ``quantum_plugin_configure_dhcp_agent``
30
+* ``quantum_plugin_configure_l3_agent``
31
+* ``quantum_plugin_configure_plugin_agent``
32
+* ``quantum_plugin_configure_service``
33
+* ``quantum_plugin_setup_interface_driver``
0 34
new file mode 100644
... ...
@@ -0,0 +1,55 @@
0
+# Quantum Big Switch/FloodLight plugin
1
+# ------------------------------------
2
+
3
+# Save trace setting
4
+XTRACE=$(set +o | grep xtrace)
5
+set +o xtrace
6
+
7
+source $TOP_DIR/lib/quantum_plugins/ovs_base
8
+source $TOP_DIR/lib/quantum_thirdparty/bigswitch_floodlight     # for third party service specific configuration values
9
+
10
+function quantum_plugin_create_nova_conf() {
11
+    NOVA_VIF_DRIVER=${NOVA_VIF_DRIVER:-"nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver"}
12
+}
13
+
14
+function quantum_plugin_install_agent_packages() {
15
+    _quantum_ovs_base_install_agent_packages
16
+}
17
+
18
+function quantum_plugin_configure_common() {
19
+    Q_PLUGIN_CONF_PATH=etc/quantum/plugins/bigswitch
20
+    Q_PLUGIN_CONF_FILENAME=restproxy.ini
21
+    Q_DB_NAME="restproxy_quantum"
22
+    Q_PLUGIN_CLASS="quantum.plugins.bigswitch.plugin.QuantumRestProxyV2"
23
+    BS_FL_CONTROLLERS_PORT=${BS_FL_CONTROLLERS_PORT:-localhost:80}
24
+    BS_FL_CONTROLLER_TIMEOUT=${BS_FL_CONTROLLER_TIMEOUT:-10}
25
+}
26
+
27
+function quantum_plugin_configure_debug_command() {
28
+    _quantum_ovs_base_configure_debug_command
29
+}
30
+
31
+function quantum_plugin_configure_dhcp_agent() {
32
+    :
33
+}
34
+
35
+function quantum_plugin_configure_l3_agent() {
36
+    _quantum_ovs_base_configure_l3_agent
37
+}
38
+
39
+function quantum_plugin_configure_plugin_agent() {
40
+    :
41
+}
42
+
43
+function quantum_plugin_configure_service() {
44
+    iniset /$Q_PLUGIN_CONF_FILE RESTPROXY servers $BS_FL_CONTROLLERS_PORT
45
+    iniset /$Q_PLUGIN_CONF_FILE RESTPROXY servertimeout $BS_FL_CONTROLLER_TIMEOUT
46
+}
47
+
48
+function quantum_plugin_setup_interface_driver() {
49
+    local conf_file=$1
50
+    iniset $conf_file DEFAULT interface_driver quantum.agent.linux.interface.OVSInterfaceDriver
51
+}
52
+
53
+# Restore xtrace
54
+$XTRACE
0 55
new file mode 100644
... ...
@@ -0,0 +1,79 @@
0
+# Quantum Linux Bridge plugin
1
+# ---------------------------
2
+
3
+# Save trace setting
4
+XTRACE=$(set +o | grep xtrace)
5
+set +o xtrace
6
+
7
+function is_quantum_ovs_base_plugin() {
8
+    # linuxbridge doesn't use OVS
9
+    return 1
10
+}
11
+
12
+function quantum_plugin_create_nova_conf() {
13
+    NOVA_VIF_DRIVER=${NOVA_VIF_DRIVER:-"nova.virt.libvirt.vif.QuantumLinuxBridgeVIFDriver"}
14
+}
15
+
16
+function quantum_plugin_install_agent_packages() {
17
+    install_package bridge-utils
18
+}
19
+
20
+function quantum_plugin_configure_common() {
21
+    Q_PLUGIN_CONF_PATH=etc/quantum/plugins/linuxbridge
22
+    Q_PLUGIN_CONF_FILENAME=linuxbridge_conf.ini
23
+    Q_DB_NAME="quantum_linux_bridge"
24
+    Q_PLUGIN_CLASS="quantum.plugins.linuxbridge.lb_quantum_plugin.LinuxBridgePluginV2"
25
+}
26
+
27
+function quantum_plugin_configure_debug_command() {
28
+    iniset $QUANTUM_TEST_CONFIG_FILE DEFAULT external_network_bridge
29
+}
30
+
31
+function quantum_plugin_configure_dhcp_agent() {
32
+    :
33
+}
34
+
35
+function quantum_plugin_configure_l3_agent() {
36
+    iniset $Q_L3_CONF_FILE DEFAULT external_network_bridge
37
+}
38
+
39
+function quantum_plugin_configure_plugin_agent() {
40
+    # Setup physical network interface mappings.  Override
41
+    # ``LB_VLAN_RANGES`` and ``LB_INTERFACE_MAPPINGS`` in ``localrc`` for more
42
+    # complex physical network configurations.
43
+    if [[ "$LB_INTERFACE_MAPPINGS" = "" ]] && [[ "$PHYSICAL_NETWORK" != "" ]] && [[ "$LB_PHYSICAL_INTERFACE" != "" ]]; then
44
+        LB_INTERFACE_MAPPINGS=$PHYSICAL_NETWORK:$LB_PHYSICAL_INTERFACE
45
+    fi
46
+    if [[ "$LB_INTERFACE_MAPPINGS" != "" ]]; then
47
+        iniset /$Q_PLUGIN_CONF_FILE LINUX_BRIDGE physical_interface_mappings $LB_INTERFACE_MAPPINGS
48
+    fi
49
+    AGENT_BINARY="$QUANTUM_DIR/bin/quantum-linuxbridge-agent"
50
+}
51
+
52
+function quantum_plugin_configure_service() {
53
+    if [[ "$ENABLE_TENANT_VLANS" = "True" ]]; then
54
+        iniset /$Q_PLUGIN_CONF_FILE VLANS tenant_network_type vlan
55
+    else
56
+        echo "WARNING - The linuxbridge plugin is using local tenant networks, with no connectivity between hosts."
57
+    fi
58
+
59
+    # Override ``LB_VLAN_RANGES`` and ``LB_INTERFACE_MAPPINGS`` in ``localrc``
60
+    # for more complex physical network configurations.
61
+    if [[ "$LB_VLAN_RANGES" = "" ]] && [[ "$PHYSICAL_NETWORK" != "" ]]; then
62
+        LB_VLAN_RANGES=$PHYSICAL_NETWORK
63
+        if [[ "$TENANT_VLAN_RANGE" != "" ]]; then
64
+            LB_VLAN_RANGES=$LB_VLAN_RANGES:$TENANT_VLAN_RANGE
65
+        fi
66
+    fi
67
+    if [[ "$LB_VLAN_RANGES" != "" ]]; then
68
+        iniset /$Q_PLUGIN_CONF_FILE VLANS network_vlan_ranges $LB_VLAN_RANGES
69
+    fi
70
+}
71
+
72
+function quantum_plugin_setup_interface_driver() {
73
+    local conf_file=$1
74
+    iniset $conf_file DEFAULT interface_driver quantum.agent.linux.interface.BridgeInterfaceDriver
75
+}
76
+
77
+# Restore xtrace
78
+$XTRACE
0 79
new file mode 100644
... ...
@@ -0,0 +1,144 @@
0
+# Quantum Open vSwtich plugin
1
+# ---------------------------
2
+
3
+# Save trace setting
4
+XTRACE=$(set +o | grep xtrace)
5
+set +o xtrace
6
+
7
+source $TOP_DIR/lib/quantum_plugins/ovs_base
8
+
9
+function quantum_plugin_create_nova_conf() {
10
+    NOVA_VIF_DRIVER=${NOVA_VIF_DRIVER:-"nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver"}
11
+    if [ "$VIRT_DRIVER" = 'xenserver' ]; then
12
+        iniset $NOVA_CONF DEFAULT xenapi_vif_driver nova.virt.xenapi.vif.XenAPIOpenVswitchDriver
13
+        iniset $NOVA_CONF DEFAULT xenapi_ovs_integration_bridge $FLAT_NETWORK_BRIDGE
14
+    fi
15
+}
16
+
17
+function quantum_plugin_install_agent_packages() {
18
+    _quantum_ovs_base_install_agent_packages
19
+}
20
+
21
+function quantum_plugin_configure_common() {
22
+    Q_PLUGIN_CONF_PATH=etc/quantum/plugins/openvswitch
23
+    Q_PLUGIN_CONF_FILENAME=ovs_quantum_plugin.ini
24
+    Q_DB_NAME="ovs_quantum"
25
+    Q_PLUGIN_CLASS="quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPluginV2"
26
+}
27
+
28
+function quantum_plugin_configure_debug_command() {
29
+    _quantum_ovs_base_configure_debug_command
30
+}
31
+
32
+function quantum_plugin_configure_dhcp_agent() {
33
+    :
34
+}
35
+
36
+function quantum_plugin_configure_l3_agent() {
37
+    _quantum_ovs_base_configure_l3_agent
38
+}
39
+
40
+function quantum_plugin_configure_plugin_agent() {
41
+    # Setup integration bridge
42
+    OVS_BRIDGE=${OVS_BRIDGE:-br-int}
43
+    _quantum_ovs_base_setup_bridge $OVS_BRIDGE
44
+
45
+    # Setup agent for tunneling
46
+    if [[ "$OVS_ENABLE_TUNNELING" = "True" ]]; then
47
+        # Verify tunnels are supported
48
+        # REVISIT - also check kernel module support for GRE and patch ports
49
+        OVS_VERSION=`ovs-vsctl --version | head -n 1 | awk '{print $4;}'`
50
+        if [ $OVS_VERSION \< "1.4" ] && ! is_service_enabled q-svc ; then
51
+            echo "You are running OVS version $OVS_VERSION."
52
+            echo "OVS 1.4+ is required for tunneling between multiple hosts."
53
+            exit 1
54
+        fi
55
+        iniset /$Q_PLUGIN_CONF_FILE OVS enable_tunneling True
56
+        iniset /$Q_PLUGIN_CONF_FILE OVS local_ip $HOST_IP
57
+    fi
58
+
59
+    # Setup physical network bridge mappings.  Override
60
+    # ``OVS_VLAN_RANGES`` and ``OVS_BRIDGE_MAPPINGS`` in ``localrc`` for more
61
+    # complex physical network configurations.
62
+    if [[ "$OVS_BRIDGE_MAPPINGS" = "" ]] && [[ "$PHYSICAL_NETWORK" != "" ]] && [[ "$OVS_PHYSICAL_BRIDGE" != "" ]]; then
63
+        OVS_BRIDGE_MAPPINGS=$PHYSICAL_NETWORK:$OVS_PHYSICAL_BRIDGE
64
+
65
+        # Configure bridge manually with physical interface as port for multi-node
66
+        sudo ovs-vsctl --no-wait -- --may-exist add-br $OVS_PHYSICAL_BRIDGE
67
+    fi
68
+    if [[ "$OVS_BRIDGE_MAPPINGS" != "" ]]; then
69
+        iniset /$Q_PLUGIN_CONF_FILE OVS bridge_mappings $OVS_BRIDGE_MAPPINGS
70
+    fi
71
+    AGENT_BINARY="$QUANTUM_DIR/bin/quantum-openvswitch-agent"
72
+
73
+    if [ "$VIRT_DRIVER" = 'xenserver' ]; then
74
+        # Nova will always be installed along with quantum for a domU
75
+        # devstack install, so it should be safe to rely on nova.conf
76
+        # for xenapi configuration.
77
+        Q_RR_DOM0_COMMAND="$QUANTUM_DIR/bin/quantum-rootwrap-dom0 $NOVA_CONF"
78
+        # Under XS/XCP, the ovs agent needs to target the dom0
79
+        # integration bridge.  This is enabled by using a root wrapper
80
+        # that executes commands on dom0 via a XenAPI plugin.
81
+        iniset /$Q_PLUGIN_CONF_FILE AGENT root_helper "$Q_RR_DOM0_COMMAND"
82
+
83
+        # FLAT_NETWORK_BRIDGE is the dom0 integration bridge.  To
84
+        # ensure the bridge lacks direct connectivity, set
85
+        # VM_VLAN=-1;VM_DEV=invalid in localrc
86
+        iniset /$Q_PLUGIN_CONF_FILE OVS integration_bridge $FLAT_NETWORK_BRIDGE
87
+
88
+        # The ovs agent needs to ensure that the ports associated with
89
+        # a given network share the same local vlan tag.  On
90
+        # single-node XS/XCP, this requires monitoring both the dom0
91
+        # bridge, where VM's are attached, and the domU bridge, where
92
+        # dhcp servers are attached.
93
+        if is_service_enabled q-dhcp; then
94
+            iniset /$Q_PLUGIN_CONF_FILE OVS domu_integration_bridge $OVS_BRIDGE
95
+            # DomU will use the regular rootwrap
96
+            iniset /$Q_PLUGIN_CONF_FILE AGENT domu_root_helper "$Q_RR_COMMAND"
97
+            # Plug the vm interface into the domU integration bridge.
98
+            sudo ip addr flush dev $GUEST_INTERFACE_DEFAULT
99
+            sudo ip link set $OVS_BRIDGE up
100
+            # Assign the VM IP only if it has been set explicitly
101
+            if [[ "$VM_IP" != "" ]]; then
102
+                sudo ip addr add $VM_IP dev $OVS_BRIDGE
103
+            fi
104
+            sudo ovs-vsctl add-port $OVS_BRIDGE $GUEST_INTERFACE_DEFAULT
105
+        fi
106
+    fi
107
+}
108
+
109
+function quantum_plugin_configure_service() {
110
+    if [[ "$ENABLE_TENANT_TUNNELS" = "True" ]]; then
111
+        iniset /$Q_PLUGIN_CONF_FILE OVS tenant_network_type gre
112
+        iniset /$Q_PLUGIN_CONF_FILE OVS tunnel_id_ranges $TENANT_TUNNEL_RANGES
113
+    elif [[ "$ENABLE_TENANT_VLANS" = "True" ]]; then
114
+        iniset /$Q_PLUGIN_CONF_FILE OVS tenant_network_type vlan
115
+    else
116
+        echo "WARNING - The openvswitch plugin is using local tenant networks, with no connectivity between hosts."
117
+    fi
118
+
119
+    # Override ``OVS_VLAN_RANGES`` and ``OVS_BRIDGE_MAPPINGS`` in ``localrc``
120
+    # for more complex physical network configurations.
121
+    if [[ "$OVS_VLAN_RANGES" = "" ]] && [[ "$PHYSICAL_NETWORK" != "" ]]; then
122
+        OVS_VLAN_RANGES=$PHYSICAL_NETWORK
123
+        if [[ "$TENANT_VLAN_RANGE" != "" ]]; then
124
+            OVS_VLAN_RANGES=$OVS_VLAN_RANGES:$TENANT_VLAN_RANGE
125
+        fi
126
+    fi
127
+    if [[ "$OVS_VLAN_RANGES" != "" ]]; then
128
+        iniset /$Q_PLUGIN_CONF_FILE OVS network_vlan_ranges $OVS_VLAN_RANGES
129
+    fi
130
+
131
+    # Enable tunnel networks if selected
132
+    if [[ $OVS_ENABLE_TUNNELING = "True" ]]; then
133
+        iniset /$Q_PLUGIN_CONF_FILE OVS enable_tunneling True
134
+    fi
135
+}
136
+
137
+function quantum_plugin_setup_interface_driver() {
138
+    local conf_file=$1
139
+    iniset $conf_file DEFAULT interface_driver quantum.agent.linux.interface.OVSInterfaceDriver
140
+}
141
+
142
+# Restore xtrace
143
+$XTRACE
0 144
new file mode 100644
... ...
@@ -0,0 +1,49 @@
0
+# common functions for ovs based plugin
1
+# -------------------------------------
2
+
3
+# Save trace setting
4
+XTRACE=$(set +o | grep xtrace)
5
+set +o xtrace
6
+
7
+function is_quantum_ovs_base_plugin() {
8
+    # Yes, we use OVS.
9
+    return 0
10
+}
11
+
12
+function _quantum_ovs_base_setup_bridge() {
13
+    local bridge=$1
14
+    quantum-ovs-cleanup --ovs_integration_bridge $bridge
15
+    sudo ovs-vsctl --no-wait -- --may-exist add-br $bridge
16
+    sudo ovs-vsctl --no-wait br-set-external-id $bridge bridge-id $bridge
17
+}
18
+
19
+function _quantum_ovs_base_install_agent_packages() {
20
+    local kernel_version
21
+    # Install deps
22
+    # FIXME add to ``files/apts/quantum``, but don't install if not needed!
23
+    if is_ubuntu; then
24
+        kernel_version=`cat /proc/version | cut -d " " -f3`
25
+        install_package make fakeroot dkms openvswitch-switch openvswitch-datapath-dkms linux-headers-$kernel_version
26
+    else
27
+        ### FIXME(dtroyer): Find RPMs for OpenVSwitch
28
+        echo "OpenVSwitch packages need to be located"
29
+        # Fedora does not started OVS by default
30
+        restart_service openvswitch
31
+    fi
32
+}
33
+
34
+function _quantum_ovs_base_configure_debug_command() {
35
+    iniset $QUANTUM_TEST_CONFIG_FILE DEFAULT external_network_bridge $PUBLIC_BRIDGE
36
+}
37
+
38
+function _quantum_ovs_base_configure_l3_agent() {
39
+    iniset $Q_L3_CONF_FILE DEFAULT external_network_bridge $PUBLIC_BRIDGE
40
+
41
+    quantum-ovs-cleanup --external_network_bridge $PUBLIC_BRIDGE
42
+    sudo ovs-vsctl --no-wait -- --may-exist add-br $PUBLIC_BRIDGE
43
+    # ensure no IP is configured on the public bridge
44
+    sudo ip addr flush dev $PUBLIC_BRIDGE
45
+}
46
+
47
+# Restore xtrace
48
+$XTRACE
0 49
new file mode 100644
... ...
@@ -0,0 +1,63 @@
0
+# Quantum Ryu plugin
1
+# ------------------
2
+
3
+# Save trace setting
4
+XTRACE=$(set +o | grep xtrace)
5
+set +o xtrace
6
+
7
+source $TOP_DIR/lib/quantum_plugins/ovs_base
8
+source $TOP_DIR/lib/quantum_thirdparty/ryu      # for configuration value
9
+
10
+function quantum_plugin_create_nova_conf() {
11
+    NOVA_VIF_DRIVER=${NOVA_VIF_DRIVER:-"nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver"}
12
+    iniset $NOVA_CONF DEFAULT libvirt_ovs_integration_bridge "$OVS_BRIDGE"
13
+}
14
+
15
+function quantum_plugin_install_agent_packages() {
16
+    _quantum_ovs_base_install_agent_packages
17
+}
18
+
19
+function quantum_plugin_configure_common() {
20
+    Q_PLUGIN_CONF_PATH=etc/quantum/plugins/ryu
21
+    Q_PLUGIN_CONF_FILENAME=ryu.ini
22
+    Q_DB_NAME="ovs_quantum"
23
+    Q_PLUGIN_CLASS="quantum.plugins.ryu.ryu_quantum_plugin.RyuQuantumPluginV2"
24
+}
25
+
26
+function quantum_plugin_configure_debug_command() {
27
+    _quantum_ovs_base_configure_debug_command
28
+    iniset $QUANTUM_TEST_CONFIG_FILE DEFAULT ryu_api_host $RYU_API_HOST:$RYU_API_PORT
29
+}
30
+
31
+function quantum_plugin_configure_dhcp_agent() {
32
+    iniset $Q_DHCP_CONF_FILE DEFAULT ryu_api_host $RYU_API_HOST:$RYU_API_PORT
33
+}
34
+
35
+function quantum_plugin_configure_l3_agent() {
36
+    iniset $Q_L3_CONF_FILE DEFAULT ryu_api_host $RYU_API_HOST:$RYU_API_PORT
37
+    _quantum_ovs_base_configure_l3_agent
38
+}
39
+
40
+function quantum_plugin_configure_plugin_agent() {
41
+    # Set up integration bridge
42
+    OVS_BRIDGE=${OVS_BRIDGE:-br-int}
43
+    _quantum_ovs_base_setup_bridge $OVS_BRIDGE
44
+    if [ -n "$RYU_INTERNAL_INTERFACE" ]; then
45
+        sudo ovs-vsctl --no-wait -- --may-exist add-port $OVS_BRIDGE $RYU_INTERNAL_INTERFACE
46
+    fi
47
+    iniset /$Q_PLUGIN_CONF_FILE OVS integration_bridge $OVS_BRIDGE
48
+    AGENT_BINARY="$QUANTUM_DIR/quantum/plugins/ryu/agent/ryu_quantum_agent.py"
49
+}
50
+
51
+function quantum_plugin_configure_service() {
52
+    iniset /$Q_PLUGIN_CONF_FILE OVS openflow_rest_api $RYU_API_HOST:$RYU_API_PORT
53
+}
54
+
55
+function quantum_plugin_setup_interface_driver() {
56
+    local conf_file=$1
57
+    iniset $conf_file DEFAULT interface_driver quantum.agent.linux.interface.OVSInterfaceDriver
58
+    iniset $conf_file DEFAULT ovs_use_veth True
59
+}
60
+
61
+# Restore xtrace
62
+$XTRACE
0 63
new file mode 100644
... ...
@@ -0,0 +1,36 @@
0
+Quantum third party specific files
1
+==================================
2
+Some Quantum plugins require third party programs to function.
3
+The files under the directory, ``lib/quantum_thirdparty/``, will be used
4
+when their service are enabled.
5
+Third party program specific configuration variables should be in this file.
6
+
7
+* filename: ``<third_party>``
8
+  * The corresponding file name should be same to service name, ``<third_party>``.
9
+
10
+functions
11
+---------
12
+``lib/quantum`` calls the following functions when the ``<third_party>`` is enabled
13
+
14
+functions to be implemented
15
+* ``configure_<third_party>``:
16
+  set config files, create data dirs, etc
17
+  e.g.
18
+  sudo python setup.py deploy
19
+  iniset $XXXX_CONF...
20
+
21
+* ``init_<third_party>``:
22
+  initialize databases, etc
23
+
24
+* ``install_<third_party>``:
25
+  collect source and prepare
26
+  e.g.
27
+  git clone xxx
28
+
29
+* ``start_<third_party>``:
30
+  start running processes, including screen
31
+  e.g.
32
+  screen_it XXXX "cd $XXXXY_DIR && $XXXX_DIR/bin/XXXX-bin"
33
+
34
+* ``stop_<third_party>``:
35
+  stop running processes (non-screen)
0 36
new file mode 100644
... ...
@@ -0,0 +1,50 @@
0
+# Big Switch/FloodLight  OpenFlow Controller
1
+# ------------------------------------------
2
+
3
+# Save trace setting
4
+XTRACE=$(set +o | grep xtrace)
5
+set +o xtrace
6
+
7
+BS_FL_CONTROLLERS_PORT=${BS_FL_CONTROLLERS_PORT:-localhost:80}
8
+BS_FL_OF_PORT=${BS_FL_OF_PORT:-6633}
9
+OVS_BRIDGE=${OVS_BRIDGE:-br-int}
10
+
11
+function configure_bigswitch_floodlight() {
12
+    :
13
+}
14
+
15
+function init_bigswitch_floodlight() {
16
+    install_quantum_agent_packages
17
+
18
+    echo -n "Installing OVS managed by the openflow controllers:"
19
+    echo ${BS_FL_CONTROLLERS_PORT}
20
+
21
+    # Create local OVS bridge and configure it
22
+    sudo ovs-vsctl --no-wait -- --if-exists del-br ${OVS_BRIDGE}
23
+    sudo ovs-vsctl --no-wait add-br ${OVS_BRIDGE}
24
+    sudo ovs-vsctl --no-wait br-set-external-id ${OVS_BRIDGE} bridge-id ${OVS_BRIDGE}
25
+
26
+    ctrls=
27
+    for ctrl in `echo ${BS_FL_CONTROLLERS_PORT} | tr ',' ' '`
28
+    do
29
+        ctrl=${ctrl%:*}
30
+        ctrls="${ctrls} tcp:${ctrl}:${BS_FL_OF_PORT}"
31
+    done
32
+    echo "Adding Network conttrollers: " ${ctrls}
33
+    sudo ovs-vsctl --no-wait set-controller ${OVS_BRIDGE} ${ctrls}
34
+}
35
+
36
+function install_bigswitch_floodlight() {
37
+    :
38
+}
39
+
40
+function start_bigswitch_floodlight() {
41
+    :
42
+}
43
+
44
+function stop_bigswitch_floodlight() {
45
+    :
46
+}
47
+
48
+# Restore xtrace
49
+$XTRACE
0 50
new file mode 100644
... ...
@@ -0,0 +1,65 @@
0
+# Ryu OpenFlow Controller
1
+# -----------------------
2
+
3
+# Save trace setting
4
+XTRACE=$(set +o | grep xtrace)
5
+set +o xtrace
6
+
7
+
8
+RYU_DIR=$DEST/ryu
9
+# Ryu API Host
10
+RYU_API_HOST=${RYU_API_HOST:-127.0.0.1}
11
+# Ryu API Port
12
+RYU_API_PORT=${RYU_API_PORT:-8080}
13
+# Ryu OFP Host
14
+RYU_OFP_HOST=${RYU_OFP_HOST:-127.0.0.1}
15
+# Ryu OFP Port
16
+RYU_OFP_PORT=${RYU_OFP_PORT:-6633}
17
+# Ryu Applications
18
+RYU_APPS=${RYU_APPS:-ryu.app.simple_isolation,ryu.app.rest}
19
+# Ryu configuration
20
+RYU_CONF_CONTENTS=${RYU_CONF_CONTENTS:-"
21
+--app_lists=$RYU_APPS
22
+--wsapi_host=$RYU_API_HOST
23
+--wsapi_port=$RYU_API_PORT
24
+--ofp_listen_host=$RYU_OFP_HOST
25
+--ofp_tcp_listen_port=$RYU_OFP_PORT
26
+--quantum_url=http://$Q_HOST:$Q_PORT
27
+--quantum_admin_username=$Q_ADMIN_USERNAME
28
+--quantum_admin_password=$SERVICE_PASSWORD
29
+--quantum_admin_tenant_name=$SERVICE_TENANT_NAME
30
+--quantum_admin_auth_url=$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_AUTH_PORT/v2.0
31
+--quantum_auth_strategy=$Q_AUTH_STRATEGY
32
+--quantum_controller_addr=tcp:$RYU_OFP_HOST:$RYU_OFP_PORT
33
+"}
34
+
35
+function configure_ryu() {
36
+    setup_develop $RYU_DIR
37
+}
38
+
39
+function init_ryu() {
40
+    RYU_CONF_DIR=/etc/ryu
41
+    if [[ ! -d $RYU_CONF_DIR ]]; then
42
+        sudo mkdir -p $RYU_CONF_DIR
43
+    fi
44
+    sudo chown $STACK_USER $RYU_CONF_DIR
45
+    RYU_CONF=$RYU_CONF_DIR/ryu.conf
46
+    sudo rm -rf $RYU_CONF
47
+
48
+    echo "${RYU_CONF_CONTENTS}" > $RYU_CONF
49
+}
50
+
51
+function install_ryu() {
52
+    git_clone $RYU_REPO $RYU_DIR $RYU_BRANCH
53
+}
54
+
55
+function start_ryu() {
56
+    screen_it ryu "cd $RYU_DIR && $RYU_DIR/bin/ryu-manager --flagfile $RYU_CONF"
57
+}
58
+
59
+function stop_ryu() {
60
+    :
61
+}
62
+
63
+# Restore xtrace
64
+$XTRACE
0 65
deleted file mode 100644
... ...
@@ -1,63 +0,0 @@
1
-# Ryu OpenFlow Controller
2
-# -----------------------
3
-
4
-# Save trace setting
5
-XTRACE=$(set +o | grep xtrace)
6
-set +o xtrace
7
-
8
-
9
-RYU_DIR=$DEST/ryu
10
-# Ryu API Host
11
-RYU_API_HOST=${RYU_API_HOST:-127.0.0.1}
12
-# Ryu API Port
13
-RYU_API_PORT=${RYU_API_PORT:-8080}
14
-# Ryu OFP Host
15
-RYU_OFP_HOST=${RYU_OFP_HOST:-127.0.0.1}
16
-# Ryu OFP Port
17
-RYU_OFP_PORT=${RYU_OFP_PORT:-6633}
18
-# Ryu Applications
19
-RYU_APPS=${RYU_APPS:-ryu.app.simple_isolation,ryu.app.rest}
20
-
21
-function configure_ryu() {
22
-    setup_develop $RYU_DIR
23
-}
24
-
25
-function init_ryu() {
26
-    RYU_CONF_DIR=/etc/ryu
27
-    if [[ ! -d $RYU_CONF_DIR ]]; then
28
-        sudo mkdir -p $RYU_CONF_DIR
29
-    fi
30
-    sudo chown $STACK_USER $RYU_CONF_DIR
31
-    RYU_CONF=$RYU_CONF_DIR/ryu.conf
32
-    sudo rm -rf $RYU_CONF
33
-
34
-    cat <<EOF > $RYU_CONF
35
-EOF
36
-}
37
-
38
-function install_ryu() {
39
-    git_clone $RYU_REPO $RYU_DIR $RYU_BRANCH
40
-}
41
-
42
-function is_ryu_required() {
43
-    if is_service_enabled ryu || (is_service_enabled quantum && [[ "$Q_PLUGIN" = "ryu" ]]); then
44
-        return 0
45
-    fi
46
-    return 1
47
-}
48
-
49
-function start_ryu() {
50
-    screen_it ryu "cd $RYU_DIR && $RYU_DIR/bin/ryu-manager --flagfile $RYU_CONF"
51
-}
52
-
53
-function stop_ryu() {
54
-    :
55
-}
56
-
57
-# Restore xtrace
58
-$XTRACE