add local network type and use by default for tenant networks
Fixes bug 1045142. This patch adds 'local' as a new value for provider:network_type, supported by the openvswitch and linuxbridge plugins. Networks of this type provide connectivity through a bridge for VMs and agents local to the host, but no external connectivity. They do not require provider:physical_network or provider:segmentation_id values. These local networks are intended mainly to support single-box zero-configuration testing (including quantum gating), but may have other uses as well. For openvswitch, the new OVS.tenant_network_type configuration variable selects what type of networks are allocated as tenant (i.e. non-provider) networks. It defaults to 'local', but must be changed to 'vlan' or 'gre' for openvswitch tenant networks to have external connectivity. The default value is intended to support single-box zero-configuration testing without any need to allocate physical network resources or configure bridges, and without requiring the operating system to support OVS GRE tunneling. It can also be set to 'none' to completely disable creation of tenant networks. For linuxbridge, the new VLANS.tenant_network_type configuration variable works similarly, with a value of 'vlan' supporting tenant networks with external connectivity. With either plugin, administrators can create provider local networks by specifying "--provider:network_type local". Additionally, with openvswitch, provider GRE networks can now be created by specifying "--provider:network_type gre --provider:segmentation_id <tunnel-id>". A corresponding devstack patch is available at https://review.openstack.org/#/c/12456/. With this patch, the openvswitch and linuxbridge plugins are by default configured to support only local networks. A set of shell variables, documented in stack.sh, can be set in localrc to configure remote connectivity, including bridges/interfaces available for provider networks. Change-Id: I2812548326141d2212d04f34d5448fb974d298e0
This commit is contained in:
parent
363a0579db
commit
88cd4f8504
@ -1,9 +1,24 @@
|
|||||||
[VLANS]
|
[VLANS]
|
||||||
|
# (StrOpt) Type of network to allocate for tenant networks. The
|
||||||
|
# default value 'local' is useful only for single-box testing and
|
||||||
|
# provides no connectivity between hosts. You MUST change this to
|
||||||
|
# 'vlan' and configure network_vlan_ranges below in order for tenant
|
||||||
|
# networks to provide connectivity between hosts. Set to 'none' to
|
||||||
|
# disable creation of tenant networks.
|
||||||
|
#
|
||||||
|
# Default: tenant_network_type = local
|
||||||
|
# Example: tenant_network_type = vlan
|
||||||
|
|
||||||
# (ListOpt) Comma-separated list of
|
# (ListOpt) Comma-separated list of
|
||||||
# <physical_network>:<vlan_min>:<vlan_max> tuples enumerating ranges
|
# <physical_network>[:<vlan_min>:<vlan_max>] tuples enumerating ranges
|
||||||
# of VLAN IDs on named physical networks that are available for
|
# of VLAN IDs on named physical networks that are available for
|
||||||
# allocation.
|
# allocation. All physical networks listed are available for flat and
|
||||||
# network_vlan_ranges = default:1000:2999
|
# VLAN provider network creation. Specified ranges of VLAN IDs are
|
||||||
|
# available for tenant network allocation if tenant_network_type is
|
||||||
|
# 'vlan'. If empty, only local networks may be created.
|
||||||
|
#
|
||||||
|
# Default: network_vlan_ranges =
|
||||||
|
# Example: network_vlan_ranges = physnet1:1000:2999
|
||||||
|
|
||||||
[DATABASE]
|
[DATABASE]
|
||||||
# This line MUST be changed to actually run the plugin.
|
# This line MUST be changed to actually run the plugin.
|
||||||
@ -21,10 +36,13 @@ reconnect_interval = 2
|
|||||||
[LINUX_BRIDGE]
|
[LINUX_BRIDGE]
|
||||||
# (ListOpt) Comma-separated list of
|
# (ListOpt) Comma-separated list of
|
||||||
# <physical_network>:<physical_interface> tuples mapping physical
|
# <physical_network>:<physical_interface> tuples mapping physical
|
||||||
# network names to agent's node-specific physical network
|
# network names to the agent's node-specific physical network
|
||||||
# interfaces. Server uses physical network names for validation but
|
# interfaces to be used for flat and VLAN networks. All physical
|
||||||
# ignores interfaces.
|
# networks listed in network_vlan_ranges on the server should have
|
||||||
# physical_interface_mappings = default:eth1
|
# mappings to appropriate interfaces on each agent.
|
||||||
|
#
|
||||||
|
# Default: physical_interface_mappings =
|
||||||
|
# Example: physical_interface_mappings = physnet1:eth1
|
||||||
|
|
||||||
[AGENT]
|
[AGENT]
|
||||||
# Agent's polling interval in seconds
|
# Agent's polling interval in seconds
|
||||||
|
@ -12,37 +12,63 @@ sql_connection = sqlite://
|
|||||||
reconnect_interval = 2
|
reconnect_interval = 2
|
||||||
|
|
||||||
[OVS]
|
[OVS]
|
||||||
|
# (StrOpt) Type of network to allocate for tenant networks. The
|
||||||
|
# default value 'local' is useful only for single-box testing and
|
||||||
|
# provides no connectivity between hosts. You MUST either change this
|
||||||
|
# to 'vlan' and configure network_vlan_ranges below or change this to
|
||||||
|
# 'gre' and configure tunnel_id_ranges below in order for tenant
|
||||||
|
# networks to provide connectivity between hosts. Set to 'none' to
|
||||||
|
# disable creation of tenant networks.
|
||||||
|
#
|
||||||
|
# Default: tenant_network_type = local
|
||||||
|
# Example: tenant_network_type = gre
|
||||||
|
|
||||||
# (ListOpt) Comma-separated list of
|
# (ListOpt) Comma-separated list of
|
||||||
# <physical_network>:<vlan_min>:<vlan_max> tuples enumerating ranges
|
# <physical_network>[:<vlan_min>:<vlan_max>] tuples enumerating ranges
|
||||||
# of VLAN IDs on named physical networks that are available for
|
# of VLAN IDs on named physical networks that are available for
|
||||||
# allocation.
|
# allocation. All physical networks listed are available for flat and
|
||||||
# network_vlan_ranges = default:1000:2999
|
# VLAN provider network creation. Specified ranges of VLAN IDs are
|
||||||
|
# available for tenant network allocation if tenant_network_type is
|
||||||
|
# 'vlan'. If empty, only gre and local networks may be created.
|
||||||
|
#
|
||||||
|
# Default: network_vlan_ranges =
|
||||||
|
# Example: network_vlan_ranges = physnet1:1000:2999
|
||||||
|
|
||||||
# (ListOpt) Comma-separated list of <tun_min>:<tun_max> tuples
|
# (ListOpt) Comma-separated list of <tun_min>:<tun_max> tuples
|
||||||
# enumerating ranges of GRE tunnel IDs that are available for
|
# enumerating ranges of GRE tunnel IDs that are available for tenant
|
||||||
# allocation.
|
# network allocation if tenant_network_type is 'gre'.
|
||||||
# tunnel_id_ranges =
|
#
|
||||||
|
# Default: tunnel_id_ranges =
|
||||||
|
# Example: tunnel_id_ranges = 1:1000
|
||||||
|
|
||||||
# Do not change this parameter unless you have a good reason to.
|
# Do not change this parameter unless you have a good reason to.
|
||||||
# This is the name of the OVS integration bridge. There is one per hypervisor.
|
# This is the name of the OVS integration bridge. There is one per hypervisor.
|
||||||
# The integration bridge acts as a virtual "patch port". All VM VIFs are
|
# The integration bridge acts as a virtual "patch bay". All VM VIFs are
|
||||||
# attached to this bridge and then "patched" according to their network
|
# attached to this bridge and then "patched" according to their network
|
||||||
# connectivity.
|
# connectivity.
|
||||||
# integration_bridge = br-int
|
#
|
||||||
|
# Default: integration_bridge = br-int
|
||||||
|
|
||||||
# Only used if tunnel_id_ranges (above) is not empty.
|
# Only used for the agent if tunnel_id_ranges (above) is not empty for
|
||||||
# In most cases, the default value should be fine.
|
# the server. In most cases, the default value should be fine.
|
||||||
# tunnel_bridge = br-tun
|
#
|
||||||
|
# Default: tunnel_bridge = br-tun
|
||||||
|
|
||||||
|
# Uncomment this line for the agent if tunnel_id_ranges (above) is not
|
||||||
|
# empty for the server. Set local-ip to be the local IP address of
|
||||||
|
# this hypervisor.
|
||||||
|
#
|
||||||
|
# Default: local_ip = 10.0.0.3
|
||||||
|
|
||||||
# (ListOpt) Comma-separated list of <physical_network>:<bridge> tuples
|
# (ListOpt) Comma-separated list of <physical_network>:<bridge> tuples
|
||||||
# mapping physical network names to agent's node-specific OVS bridge
|
# mapping physical network names to the agent's node-specific OVS
|
||||||
# names. Each bridge must exist, and should have physical network
|
# bridge names to be used for flat and VLAN networks. Each bridge must
|
||||||
# interface configured as a port.
|
# exist, and should have a physical network interface configured as a
|
||||||
# bridge_mappings = default:br-eth1
|
# port. All physical networks listed in network_vlan_ranges on the
|
||||||
|
# server should have mappings to appropriate bridges on each agent.
|
||||||
# Uncomment this line if tunnel_id_ranges (above) is not empty.
|
#
|
||||||
# Set local-ip to be the local IP address of this hypervisor.
|
# Default: bridge_mappings =
|
||||||
# local_ip = 10.0.0.3
|
# Example: bridge_mappings = physnet1:br-eth1
|
||||||
|
|
||||||
[AGENT]
|
[AGENT]
|
||||||
# Agent's polling interval in seconds
|
# Agent's polling interval in seconds
|
||||||
|
@ -137,6 +137,10 @@ class TunnelIdInUse(InUse):
|
|||||||
"The tunnel ID %(tunnel_id)s is in use.")
|
"The tunnel ID %(tunnel_id)s is in use.")
|
||||||
|
|
||||||
|
|
||||||
|
class TenantNetworksDisabled(QuantumException):
|
||||||
|
message = _("Tenant network creation is not enabled.")
|
||||||
|
|
||||||
|
|
||||||
class ResourceExhausted(QuantumException):
|
class ResourceExhausted(QuantumException):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -19,11 +19,12 @@ NETWORK_TYPE = 'provider:network_type'
|
|||||||
PHYSICAL_NETWORK = 'provider:physical_network'
|
PHYSICAL_NETWORK = 'provider:physical_network'
|
||||||
SEGMENTATION_ID = 'provider:segmentation_id'
|
SEGMENTATION_ID = 'provider:segmentation_id'
|
||||||
|
|
||||||
|
NETWORK_TYPE_VALUES = ['flat', 'gre', 'local', 'vlan']
|
||||||
|
|
||||||
EXTENDED_ATTRIBUTES_2_0 = {
|
EXTENDED_ATTRIBUTES_2_0 = {
|
||||||
'networks': {
|
'networks': {
|
||||||
NETWORK_TYPE: {'allow_post': True, 'allow_put': True,
|
NETWORK_TYPE: {'allow_post': True, 'allow_put': True,
|
||||||
'validate': {'type:values': ['flat',
|
'validate': {'type:values': NETWORK_TYPE_VALUES},
|
||||||
'vlan']},
|
|
||||||
'default': attributes.ATTR_NOT_SPECIFIED,
|
'default': attributes.ATTR_NOT_SPECIFIED,
|
||||||
'is_visible': True},
|
'is_visible': True},
|
||||||
PHYSICAL_NETWORK: {'allow_post': True, 'allow_put': True,
|
PHYSICAL_NETWORK: {'allow_post': True, 'allow_put': True,
|
||||||
@ -49,6 +50,8 @@ class Providernet(object):
|
|||||||
To create a provider VLAN network using the CLI with admin rights:
|
To create a provider VLAN network using the CLI with admin rights:
|
||||||
|
|
||||||
(shell) net-create --tenant_id <tenant-id> <net-name> \
|
(shell) net-create --tenant_id <tenant-id> <net-name> \
|
||||||
|
--provider:network_type vlan \
|
||||||
|
--provider:physical_network <physical-net> \
|
||||||
--provider:segmentation_id <vlan-id>
|
--provider:segmentation_id <vlan-id>
|
||||||
|
|
||||||
With admin rights, network dictionaries returned from CLI commands
|
With admin rights, network dictionaries returned from CLI commands
|
||||||
@ -65,7 +68,7 @@ class Providernet(object):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_description(cls):
|
def get_description(cls):
|
||||||
return "Expose mapping of virtual networks to VLANs and flat networks"
|
return "Expose mapping of virtual networks to physical networks"
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_namespace(cls):
|
def get_namespace(cls):
|
||||||
@ -73,7 +76,7 @@ class Providernet(object):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_updated(cls):
|
def get_updated(cls):
|
||||||
return "2012-07-23T10:00:00-00:00"
|
return "2012-09-07T10:00:00-00:00"
|
||||||
|
|
||||||
def get_extended_resources(self, version):
|
def get_extended_resources(self, version):
|
||||||
if version == "2.0":
|
if version == "2.0":
|
||||||
|
@ -192,6 +192,11 @@ class LinuxBridge:
|
|||||||
self.ensure_bridge(bridge_name, physical_interface, ips, gateway)
|
self.ensure_bridge(bridge_name, physical_interface, ips, gateway)
|
||||||
return physical_interface
|
return physical_interface
|
||||||
|
|
||||||
|
def ensure_local_bridge(self, network_id):
|
||||||
|
"""Create a local bridge unless it already exists."""
|
||||||
|
bridge_name = self.get_bridge_name(network_id)
|
||||||
|
self.ensure_bridge(bridge_name)
|
||||||
|
|
||||||
def ensure_vlan(self, physical_interface, vlan_id):
|
def ensure_vlan(self, physical_interface, vlan_id):
|
||||||
"""Create a vlan unless it already exists."""
|
"""Create a vlan unless it already exists."""
|
||||||
interface = self.get_subinterface_name(physical_interface, vlan_id)
|
interface = self.get_subinterface_name(physical_interface, vlan_id)
|
||||||
@ -237,7 +242,8 @@ class LinuxBridge:
|
|||||||
src_device.addr.delete(ip_version=ip['ip_version'],
|
src_device.addr.delete(ip_version=ip['ip_version'],
|
||||||
cidr=ip['cidr'])
|
cidr=ip['cidr'])
|
||||||
|
|
||||||
def ensure_bridge(self, bridge_name, interface, ips=None, gateway=None):
|
def ensure_bridge(self, bridge_name, interface=None, ips=None,
|
||||||
|
gateway=None):
|
||||||
"""
|
"""
|
||||||
Create a bridge unless it already exists.
|
Create a bridge unless it already exists.
|
||||||
"""
|
"""
|
||||||
@ -259,6 +265,9 @@ class LinuxBridge:
|
|||||||
LOG.debug("Done starting bridge %s for subinterface %s" %
|
LOG.debug("Done starting bridge %s for subinterface %s" %
|
||||||
(bridge_name, interface))
|
(bridge_name, interface))
|
||||||
|
|
||||||
|
if not interface:
|
||||||
|
return
|
||||||
|
|
||||||
# Update IP info if necessary
|
# Update IP info if necessary
|
||||||
self.update_interface_ip_details(bridge_name, interface, ips, gateway)
|
self.update_interface_ip_details(bridge_name, interface, ips, gateway)
|
||||||
|
|
||||||
@ -272,7 +281,7 @@ class LinuxBridge:
|
|||||||
bridge_name, e)
|
bridge_name, e)
|
||||||
return
|
return
|
||||||
|
|
||||||
def add_tap_interface(self, network_id, physical_interface, vlan_id,
|
def add_tap_interface(self, network_id, physical_network, vlan_id,
|
||||||
tap_device_name):
|
tap_device_name):
|
||||||
"""
|
"""
|
||||||
If a VIF has been plugged into a network, this function will
|
If a VIF has been plugged into a network, this function will
|
||||||
@ -297,13 +306,25 @@ class LinuxBridge:
|
|||||||
tap_device_name], root_helper=self.root_helper):
|
tap_device_name], root_helper=self.root_helper):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
if int(vlan_id) == lconst.LOCAL_VLAN_ID:
|
||||||
|
self.ensure_local_bridge(network_id)
|
||||||
|
else:
|
||||||
|
physical_interface = self.interface_mappings.get(physical_network)
|
||||||
|
if not physical_interface:
|
||||||
|
LOG.error("No mapping for physical network %s" %
|
||||||
|
physical_network)
|
||||||
|
return False
|
||||||
|
|
||||||
if int(vlan_id) == lconst.FLAT_VLAN_ID:
|
if int(vlan_id) == lconst.FLAT_VLAN_ID:
|
||||||
self.ensure_flat_bridge(network_id, physical_interface)
|
self.ensure_flat_bridge(network_id, physical_interface)
|
||||||
else:
|
else:
|
||||||
self.ensure_vlan_bridge(network_id, physical_interface, vlan_id)
|
self.ensure_vlan_bridge(network_id, physical_interface,
|
||||||
|
vlan_id)
|
||||||
|
|
||||||
if utils.execute(['brctl', 'addif', bridge_name, tap_device_name],
|
if utils.execute(['brctl', 'addif', bridge_name, tap_device_name],
|
||||||
root_helper=self.root_helper):
|
root_helper=self.root_helper):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
LOG.debug("Done adding device %s to bridge %s" % (tap_device_name,
|
LOG.debug("Done adding device %s to bridge %s" % (tap_device_name,
|
||||||
bridge_name))
|
bridge_name))
|
||||||
return True
|
return True
|
||||||
@ -317,19 +338,14 @@ class LinuxBridge:
|
|||||||
"""
|
"""
|
||||||
return False
|
return False
|
||||||
|
|
||||||
physical_interface = self.interface_mappings.get(physical_network)
|
|
||||||
if not physical_interface:
|
|
||||||
LOG.error("No mapping for physical network %s" % physical_network)
|
|
||||||
return False
|
|
||||||
|
|
||||||
if interface_id.startswith(GATEWAY_INTERFACE_PREFIX):
|
if interface_id.startswith(GATEWAY_INTERFACE_PREFIX):
|
||||||
return self.add_tap_interface(network_id,
|
return self.add_tap_interface(network_id,
|
||||||
physical_interface, vlan_id,
|
physical_network, vlan_id,
|
||||||
interface_id)
|
interface_id)
|
||||||
else:
|
else:
|
||||||
tap_device_name = self.get_tap_device_name(interface_id)
|
tap_device_name = self.get_tap_device_name(interface_id)
|
||||||
return self.add_tap_interface(network_id,
|
return self.add_tap_interface(network_id,
|
||||||
physical_interface, vlan_id,
|
physical_network, vlan_id,
|
||||||
tap_device_name)
|
tap_device_name)
|
||||||
|
|
||||||
def delete_vlan_bridge(self, bridge_name):
|
def delete_vlan_bridge(self, bridge_name):
|
||||||
@ -613,9 +629,18 @@ class LinuxBridgeQuantumAgentRPC:
|
|||||||
self.setup_rpc(interface_mappings.values())
|
self.setup_rpc(interface_mappings.values())
|
||||||
|
|
||||||
def setup_rpc(self, physical_interfaces):
|
def setup_rpc(self, physical_interfaces):
|
||||||
# REVISIT try until one succeeds?
|
if physical_interfaces:
|
||||||
mac = utils.get_interface_mac(physical_interfaces[0])
|
mac = utils.get_interface_mac(physical_interfaces[0])
|
||||||
|
else:
|
||||||
|
devices = ip_lib.IPWrapper(self.root_helper).get_devices(True)
|
||||||
|
if devices:
|
||||||
|
mac = utils.get_interface_mac(devices[0].name)
|
||||||
|
else:
|
||||||
|
LOG.error("Unable to obtain MAC of any device for agent_id")
|
||||||
|
exit(1)
|
||||||
self.agent_id = '%s%s' % ('lb', (mac.replace(":", "")))
|
self.agent_id = '%s%s' % ('lb', (mac.replace(":", "")))
|
||||||
|
LOG.info("RPC agent_id: %s" % self.agent_id)
|
||||||
|
|
||||||
self.topic = topics.AGENT
|
self.topic = topics.AGENT
|
||||||
self.plugin_rpc = agent_rpc.PluginApi(topics.PLUGIN)
|
self.plugin_rpc = agent_rpc.PluginApi(topics.PLUGIN)
|
||||||
|
|
||||||
|
@ -19,11 +19,14 @@
|
|||||||
|
|
||||||
from quantum.openstack.common import cfg
|
from quantum.openstack.common import cfg
|
||||||
|
|
||||||
DEFAULT_VLAN_RANGES = ['default:1000:2999']
|
DEFAULT_VLAN_RANGES = []
|
||||||
DEFAULT_INTERFACE_MAPPINGS = ['default:eth1']
|
DEFAULT_INTERFACE_MAPPINGS = []
|
||||||
|
|
||||||
|
|
||||||
vlan_opts = [
|
vlan_opts = [
|
||||||
|
cfg.StrOpt('tenant_network_type', default='local',
|
||||||
|
help="Network type for tenant networks "
|
||||||
|
"(local, vlan, or none)"),
|
||||||
cfg.ListOpt('network_vlan_ranges',
|
cfg.ListOpt('network_vlan_ranges',
|
||||||
default=DEFAULT_VLAN_RANGES,
|
default=DEFAULT_VLAN_RANGES,
|
||||||
help="List of <physical_network>:<vlan_min>:<vlan_max> "
|
help="List of <physical_network>:<vlan_min>:<vlan_max> "
|
||||||
|
@ -18,10 +18,10 @@
|
|||||||
|
|
||||||
|
|
||||||
FLAT_VLAN_ID = -1
|
FLAT_VLAN_ID = -1
|
||||||
|
LOCAL_VLAN_ID = -2
|
||||||
|
|
||||||
PORT_UP = "ACTIVE"
|
# Values for network_type
|
||||||
PORT_DOWN = "DOWN"
|
TYPE_FLAT = 'flat'
|
||||||
|
TYPE_VLAN = 'vlan'
|
||||||
VLANID = 'vlan_id'
|
TYPE_LOCAL = 'local'
|
||||||
PORT_ID = 'port-id'
|
TYPE_NONE = 'none'
|
||||||
NET_ID = 'net-id'
|
|
||||||
|
@ -45,7 +45,7 @@ class NetworkBinding(model_base.BASEV2):
|
|||||||
network_id = sa.Column(sa.String(36),
|
network_id = sa.Column(sa.String(36),
|
||||||
sa.ForeignKey('networks.id', ondelete="CASCADE"),
|
sa.ForeignKey('networks.id', ondelete="CASCADE"),
|
||||||
primary_key=True)
|
primary_key=True)
|
||||||
physical_network = sa.Column(sa.String(64), nullable=False)
|
physical_network = sa.Column(sa.String(64))
|
||||||
vlan_id = sa.Column(sa.Integer, nullable=False)
|
vlan_id = sa.Column(sa.Integer, nullable=False)
|
||||||
|
|
||||||
def __init__(self, network_id, physical_network, vlan_id):
|
def __init__(self, network_id, physical_network, vlan_id):
|
||||||
|
@ -17,7 +17,7 @@ import logging
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
from quantum.api.v2 import attributes
|
from quantum.api.v2 import attributes
|
||||||
from quantum.common import constants
|
from quantum.common import constants as q_const
|
||||||
from quantum.common import exceptions as q_exc
|
from quantum.common import exceptions as q_exc
|
||||||
from quantum.common import topics
|
from quantum.common import topics
|
||||||
from quantum.db import api as db_api
|
from quantum.db import api as db_api
|
||||||
@ -31,7 +31,7 @@ from quantum.openstack.common import cfg
|
|||||||
from quantum.openstack.common import rpc
|
from quantum.openstack.common import rpc
|
||||||
from quantum.openstack.common.rpc import dispatcher
|
from quantum.openstack.common.rpc import dispatcher
|
||||||
from quantum.openstack.common.rpc import proxy
|
from quantum.openstack.common.rpc import proxy
|
||||||
from quantum.plugins.linuxbridge.common import constants as lconst
|
from quantum.plugins.linuxbridge.common import constants
|
||||||
from quantum.plugins.linuxbridge.db import l2network_db_v2 as db
|
from quantum.plugins.linuxbridge.db import l2network_db_v2 as db
|
||||||
from quantum import policy
|
from quantum import policy
|
||||||
|
|
||||||
@ -73,7 +73,7 @@ class LinuxBridgeRpcCallbacks(dhcp_rpc_base.DhcpRpcCallbackMixin):
|
|||||||
'port_id': port['id'],
|
'port_id': port['id'],
|
||||||
'admin_state_up': port['admin_state_up']}
|
'admin_state_up': port['admin_state_up']}
|
||||||
# Set the port status to UP
|
# Set the port status to UP
|
||||||
db.set_port_status(port['id'], constants.PORT_STATUS_ACTIVE)
|
db.set_port_status(port['id'], q_const.PORT_STATUS_ACTIVE)
|
||||||
else:
|
else:
|
||||||
entry = {'device': device}
|
entry = {'device': device}
|
||||||
LOG.debug("%s can not be found in database", device)
|
LOG.debug("%s can not be found in database", device)
|
||||||
@ -90,7 +90,7 @@ class LinuxBridgeRpcCallbacks(dhcp_rpc_base.DhcpRpcCallbackMixin):
|
|||||||
entry = {'device': device,
|
entry = {'device': device,
|
||||||
'exists': True}
|
'exists': True}
|
||||||
# Set port status to DOWN
|
# Set port status to DOWN
|
||||||
db.set_port_status(port['id'], constants.PORT_STATUS_DOWN)
|
db.set_port_status(port['id'], q_const.PORT_STATUS_DOWN)
|
||||||
else:
|
else:
|
||||||
entry = {'device': device,
|
entry = {'device': device,
|
||||||
'exists': False}
|
'exists': False}
|
||||||
@ -159,6 +159,13 @@ class LinuxBridgePluginV2(db_base_plugin_v2.QuantumDbPluginV2,
|
|||||||
db.initialize()
|
db.initialize()
|
||||||
self._parse_network_vlan_ranges()
|
self._parse_network_vlan_ranges()
|
||||||
db.sync_network_states(self.network_vlan_ranges)
|
db.sync_network_states(self.network_vlan_ranges)
|
||||||
|
self.tenant_network_type = cfg.CONF.VLANS.tenant_network_type
|
||||||
|
if self.tenant_network_type not in [constants.TYPE_LOCAL,
|
||||||
|
constants.TYPE_VLAN,
|
||||||
|
constants.TYPE_NONE]:
|
||||||
|
LOG.error("Invalid tenant_network_type: %s" %
|
||||||
|
self.tenant_network_type)
|
||||||
|
sys.exit(1)
|
||||||
self.agent_rpc = cfg.CONF.AGENT.rpc
|
self.agent_rpc = cfg.CONF.AGENT.rpc
|
||||||
self._setup_rpc()
|
self._setup_rpc()
|
||||||
LOG.debug("Linux Bridge Plugin initialization complete")
|
LOG.debug("Linux Bridge Plugin initialization complete")
|
||||||
@ -218,12 +225,17 @@ class LinuxBridgePluginV2(db_base_plugin_v2.QuantumDbPluginV2,
|
|||||||
def _extend_network_dict_provider(self, context, network):
|
def _extend_network_dict_provider(self, context, network):
|
||||||
if self._check_provider_view_auth(context, network):
|
if self._check_provider_view_auth(context, network):
|
||||||
binding = db.get_network_binding(context.session, network['id'])
|
binding = db.get_network_binding(context.session, network['id'])
|
||||||
|
if binding.vlan_id == constants.FLAT_VLAN_ID:
|
||||||
|
network[provider.NETWORK_TYPE] = constants.TYPE_FLAT
|
||||||
network[provider.PHYSICAL_NETWORK] = binding.physical_network
|
network[provider.PHYSICAL_NETWORK] = binding.physical_network
|
||||||
if binding.vlan_id == lconst.FLAT_VLAN_ID:
|
network[provider.SEGMENTATION_ID] = None
|
||||||
network[provider.NETWORK_TYPE] = 'flat'
|
elif binding.vlan_id == constants.LOCAL_VLAN_ID:
|
||||||
|
network[provider.NETWORK_TYPE] = constants.TYPE_LOCAL
|
||||||
|
network[provider.PHYSICAL_NETWORK] = None
|
||||||
network[provider.SEGMENTATION_ID] = None
|
network[provider.SEGMENTATION_ID] = None
|
||||||
else:
|
else:
|
||||||
network[provider.NETWORK_TYPE] = 'vlan'
|
network[provider.NETWORK_TYPE] = constants.TYPE_VLAN
|
||||||
|
network[provider.PHYSICAL_NETWORK] = binding.physical_network
|
||||||
network[provider.SEGMENTATION_ID] = binding.vlan_id
|
network[provider.SEGMENTATION_ID] = binding.vlan_id
|
||||||
|
|
||||||
def _process_provider_create(self, context, attrs):
|
def _process_provider_create(self, context, attrs):
|
||||||
@ -245,13 +257,13 @@ class LinuxBridgePluginV2(db_base_plugin_v2.QuantumDbPluginV2,
|
|||||||
if not network_type_set:
|
if not network_type_set:
|
||||||
msg = _("provider:network_type required")
|
msg = _("provider:network_type required")
|
||||||
raise q_exc.InvalidInput(error_message=msg)
|
raise q_exc.InvalidInput(error_message=msg)
|
||||||
elif network_type == 'flat':
|
elif network_type == constants.TYPE_FLAT:
|
||||||
if segmentation_id_set:
|
if segmentation_id_set:
|
||||||
msg = _("provider:segmentation_id specified for flat network")
|
msg = _("provider:segmentation_id specified for flat network")
|
||||||
raise q_exc.InvalidInput(error_message=msg)
|
raise q_exc.InvalidInput(error_message=msg)
|
||||||
else:
|
else:
|
||||||
segmentation_id = lconst.FLAT_VLAN_ID
|
segmentation_id = constants.FLAT_VLAN_ID
|
||||||
elif network_type == 'vlan':
|
elif network_type == constants.TYPE_VLAN:
|
||||||
if not segmentation_id_set:
|
if not segmentation_id_set:
|
||||||
msg = _("provider:segmentation_id required")
|
msg = _("provider:segmentation_id required")
|
||||||
raise q_exc.InvalidInput(error_message=msg)
|
raise q_exc.InvalidInput(error_message=msg)
|
||||||
@ -259,10 +271,24 @@ class LinuxBridgePluginV2(db_base_plugin_v2.QuantumDbPluginV2,
|
|||||||
msg = _("provider:segmentation_id out of range "
|
msg = _("provider:segmentation_id out of range "
|
||||||
"(1 through 4094)")
|
"(1 through 4094)")
|
||||||
raise q_exc.InvalidInput(error_message=msg)
|
raise q_exc.InvalidInput(error_message=msg)
|
||||||
|
elif network_type == constants.TYPE_LOCAL:
|
||||||
|
if physical_network_set:
|
||||||
|
msg = _("provider:physical_network specified for local "
|
||||||
|
"network")
|
||||||
|
raise q_exc.InvalidInput(error_message=msg)
|
||||||
else:
|
else:
|
||||||
msg = _("invalid provider:network_type %s" % network_type)
|
physical_network = None
|
||||||
|
if segmentation_id_set:
|
||||||
|
msg = _("provider:segmentation_id specified for local "
|
||||||
|
"network")
|
||||||
|
raise q_exc.InvalidInput(error_message=msg)
|
||||||
|
else:
|
||||||
|
segmentation_id = constants.LOCAL_VLAN_ID
|
||||||
|
else:
|
||||||
|
msg = _("provider:network_type %s not supported" % network_type)
|
||||||
raise q_exc.InvalidInput(error_message=msg)
|
raise q_exc.InvalidInput(error_message=msg)
|
||||||
|
|
||||||
|
if network_type in [constants.TYPE_VLAN, constants.TYPE_FLAT]:
|
||||||
if physical_network_set:
|
if physical_network_set:
|
||||||
if physical_network not in self.network_vlan_ranges:
|
if physical_network not in self.network_vlan_ranges:
|
||||||
msg = _("unknown provider:physical_network %s" %
|
msg = _("unknown provider:physical_network %s" %
|
||||||
@ -303,9 +329,20 @@ class LinuxBridgePluginV2(db_base_plugin_v2.QuantumDbPluginV2,
|
|||||||
session = context.session
|
session = context.session
|
||||||
with session.begin(subtransactions=True):
|
with session.begin(subtransactions=True):
|
||||||
if not network_type:
|
if not network_type:
|
||||||
|
# tenant network
|
||||||
|
network_type = self.tenant_network_type
|
||||||
|
if network_type == constants.TYPE_NONE:
|
||||||
|
raise q_exc.TenantNetworksDisabled()
|
||||||
|
elif network_type == constants.TYPE_VLAN:
|
||||||
physical_network, vlan_id = db.reserve_network(session)
|
physical_network, vlan_id = db.reserve_network(session)
|
||||||
|
else: # TYPE_LOCAL
|
||||||
|
vlan_id = constants.LOCAL_VLAN_ID
|
||||||
else:
|
else:
|
||||||
db.reserve_specific_network(session, physical_network, vlan_id)
|
# provider network
|
||||||
|
if network_type in [constants.TYPE_VLAN, constants.TYPE_FLAT]:
|
||||||
|
db.reserve_specific_network(session, physical_network,
|
||||||
|
vlan_id)
|
||||||
|
# no reservation needed for TYPE_LOCAL
|
||||||
net = super(LinuxBridgePluginV2, self).create_network(context,
|
net = super(LinuxBridgePluginV2, self).create_network(context,
|
||||||
network)
|
network)
|
||||||
db.add_network_binding(session, net['id'],
|
db.add_network_binding(session, net['id'],
|
||||||
@ -334,6 +371,7 @@ class LinuxBridgePluginV2(db_base_plugin_v2.QuantumDbPluginV2,
|
|||||||
binding = db.get_network_binding(session, id)
|
binding = db.get_network_binding(session, id)
|
||||||
result = super(LinuxBridgePluginV2, self).delete_network(context,
|
result = super(LinuxBridgePluginV2, self).delete_network(context,
|
||||||
id)
|
id)
|
||||||
|
if binding.vlan_id != constants.LOCAL_VLAN_ID:
|
||||||
db.release_network(session, binding.physical_network,
|
db.release_network(session, binding.physical_network,
|
||||||
binding.vlan_id, self.network_vlan_ranges)
|
binding.vlan_id, self.network_vlan_ranges)
|
||||||
# the network_binding record is deleted via cascade from
|
# the network_binding record is deleted via cascade from
|
||||||
|
@ -229,7 +229,7 @@ class OVSQuantumAgent(object):
|
|||||||
'''Provisions a local VLAN.
|
'''Provisions a local VLAN.
|
||||||
|
|
||||||
:param net_uuid: the uuid of the network associated with this vlan.
|
:param net_uuid: the uuid of the network associated with this vlan.
|
||||||
:param network_type: the type of the network ('gre', 'vlan', 'flat')
|
:param network_type: the network type ('gre', 'vlan', 'flat', 'local')
|
||||||
:param physical_network: the physical network for 'vlan' or 'flat'
|
:param physical_network: the physical network for 'vlan' or 'flat'
|
||||||
:param segmentation_id: the VID for 'vlan' or tunnel ID for 'tunnel'
|
:param segmentation_id: the VID for 'vlan' or tunnel ID for 'tunnel'
|
||||||
'''
|
'''
|
||||||
@ -277,6 +277,9 @@ class OVSQuantumAgent(object):
|
|||||||
in_port=self.int_ofports[physical_network],
|
in_port=self.int_ofports[physical_network],
|
||||||
dl_vlan=segmentation_id,
|
dl_vlan=segmentation_id,
|
||||||
actions="mod_vlan_vid:%s,normal" % lvid)
|
actions="mod_vlan_vid:%s,normal" % lvid)
|
||||||
|
elif network_type == constants.TYPE_LOCAL:
|
||||||
|
# no flows needed for local networks
|
||||||
|
pass
|
||||||
else:
|
else:
|
||||||
LOG.error("provisioning unknown network type %s for net-id=%s" %
|
LOG.error("provisioning unknown network type %s for net-id=%s" %
|
||||||
(network_type, net_uuid))
|
(network_type, net_uuid))
|
||||||
@ -311,6 +314,9 @@ class OVSQuantumAgent(object):
|
|||||||
br = self.int_br
|
br = self.int_br
|
||||||
br.delete_flows(in_port=self.int_ofports[lvm.physical_network],
|
br.delete_flows(in_port=self.int_ofports[lvm.physical_network],
|
||||||
dl_vlan=lvm.segmentation_id)
|
dl_vlan=lvm.segmentation_id)
|
||||||
|
elif lvm.network_type == constants.TYPE_LOCAL:
|
||||||
|
# no flows needed for local networks
|
||||||
|
pass
|
||||||
else:
|
else:
|
||||||
LOG.error("reclaiming unknown network type %s for net-id=%s" %
|
LOG.error("reclaiming unknown network type %s for net-id=%s" %
|
||||||
(lvm.network_type, net_uuid))
|
(lvm.network_type, net_uuid))
|
||||||
@ -325,7 +331,7 @@ class OVSQuantumAgent(object):
|
|||||||
|
|
||||||
:param port: a ovslib.VifPort object.
|
:param port: a ovslib.VifPort object.
|
||||||
:param net_uuid: the net_uuid this port is to be associated with.
|
:param net_uuid: the net_uuid this port is to be associated with.
|
||||||
:param network_type: the type of the network ('gre', 'vlan', 'flat')
|
:param network_type: the network type ('gre', 'vlan', 'flat', 'local')
|
||||||
:param physical_network: the physical network for 'vlan' or 'flat'
|
:param physical_network: the physical network for 'vlan' or 'flat'
|
||||||
:param segmentation_id: the VID for 'vlan' or tunnel ID for 'tunnel'
|
:param segmentation_id: the VID for 'vlan' or tunnel ID for 'tunnel'
|
||||||
'''
|
'''
|
||||||
|
@ -17,8 +17,8 @@
|
|||||||
from quantum.openstack.common import cfg
|
from quantum.openstack.common import cfg
|
||||||
|
|
||||||
|
|
||||||
DEFAULT_BRIDGE_MAPPINGS = ['default:br-eth1']
|
DEFAULT_BRIDGE_MAPPINGS = []
|
||||||
DEFAULT_VLAN_RANGES = ['default:1000:2999']
|
DEFAULT_VLAN_RANGES = []
|
||||||
DEFAULT_TUNNEL_RANGES = []
|
DEFAULT_TUNNEL_RANGES = []
|
||||||
|
|
||||||
database_opts = [
|
database_opts = [
|
||||||
@ -34,6 +34,9 @@ ovs_opts = [
|
|||||||
cfg.ListOpt('bridge_mappings',
|
cfg.ListOpt('bridge_mappings',
|
||||||
default=DEFAULT_BRIDGE_MAPPINGS,
|
default=DEFAULT_BRIDGE_MAPPINGS,
|
||||||
help="List of <physical_network>:<bridge>"),
|
help="List of <physical_network>:<bridge>"),
|
||||||
|
cfg.StrOpt('tenant_network_type', default='local',
|
||||||
|
help="Network type for tenant networks "
|
||||||
|
"(local, vlan, gre, or none)"),
|
||||||
cfg.ListOpt('network_vlan_ranges',
|
cfg.ListOpt('network_vlan_ranges',
|
||||||
default=DEFAULT_VLAN_RANGES,
|
default=DEFAULT_VLAN_RANGES,
|
||||||
help="List of <physical_network>:<vlan_min>:<vlan_max> "
|
help="List of <physical_network>:<vlan_min>:<vlan_max> "
|
||||||
|
@ -23,6 +23,8 @@ TUNNEL = 'tunnel'
|
|||||||
TYPE_FLAT = 'flat'
|
TYPE_FLAT = 'flat'
|
||||||
TYPE_VLAN = 'vlan'
|
TYPE_VLAN = 'vlan'
|
||||||
TYPE_GRE = 'gre'
|
TYPE_GRE = 'gre'
|
||||||
|
TYPE_LOCAL = 'local'
|
||||||
|
TYPE_NONE = 'none'
|
||||||
|
|
||||||
# Name prefixes for veth device pair linking the integration bridge
|
# Name prefixes for veth device pair linking the integration bridge
|
||||||
# with the physical bridge for a physical network
|
# with the physical bridge for a physical network
|
||||||
|
@ -64,7 +64,8 @@ class NetworkBinding(model_base.BASEV2):
|
|||||||
network_id = Column(String(36),
|
network_id = Column(String(36),
|
||||||
ForeignKey('networks.id', ondelete="CASCADE"),
|
ForeignKey('networks.id', ondelete="CASCADE"),
|
||||||
primary_key=True)
|
primary_key=True)
|
||||||
network_type = Column(String(32), nullable=False) # 'gre', 'vlan', 'flat'
|
# 'gre', 'vlan', 'flat', 'local'
|
||||||
|
network_type = Column(String(32), nullable=False)
|
||||||
physical_network = Column(String(64))
|
physical_network = Column(String(64))
|
||||||
segmentation_id = Column(Integer) # tunnel_id or vlan_id
|
segmentation_id = Column(Integer) # tunnel_id or vlan_id
|
||||||
|
|
||||||
|
@ -197,6 +197,14 @@ class OVSQuantumPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
|
|||||||
ovs_db_v2.sync_vlan_allocations(self.network_vlan_ranges)
|
ovs_db_v2.sync_vlan_allocations(self.network_vlan_ranges)
|
||||||
self._parse_tunnel_id_ranges()
|
self._parse_tunnel_id_ranges()
|
||||||
ovs_db_v2.sync_tunnel_allocations(self.tunnel_id_ranges)
|
ovs_db_v2.sync_tunnel_allocations(self.tunnel_id_ranges)
|
||||||
|
self.tenant_network_type = cfg.CONF.OVS.tenant_network_type
|
||||||
|
if self.tenant_network_type not in [constants.TYPE_LOCAL,
|
||||||
|
constants.TYPE_VLAN,
|
||||||
|
constants.TYPE_GRE,
|
||||||
|
constants.TYPE_NONE]:
|
||||||
|
LOG.error("Invalid tenant_network_type: %s" %
|
||||||
|
self.tenant_network_type)
|
||||||
|
sys.exit(1)
|
||||||
self.agent_rpc = cfg.CONF.AGENT.rpc
|
self.agent_rpc = cfg.CONF.AGENT.rpc
|
||||||
self.setup_rpc()
|
self.setup_rpc()
|
||||||
|
|
||||||
@ -280,6 +288,9 @@ class OVSQuantumPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
|
|||||||
elif binding.network_type == constants.TYPE_VLAN:
|
elif binding.network_type == constants.TYPE_VLAN:
|
||||||
network[provider.PHYSICAL_NETWORK] = binding.physical_network
|
network[provider.PHYSICAL_NETWORK] = binding.physical_network
|
||||||
network[provider.SEGMENTATION_ID] = binding.segmentation_id
|
network[provider.SEGMENTATION_ID] = binding.segmentation_id
|
||||||
|
elif binding.network_type == constants.TYPE_LOCAL:
|
||||||
|
network[provider.PHYSICAL_NETWORK] = None
|
||||||
|
network[provider.SEGMENTATION_ID] = None
|
||||||
|
|
||||||
def _process_provider_create(self, context, attrs):
|
def _process_provider_create(self, context, attrs):
|
||||||
network_type = attrs.get(provider.NETWORK_TYPE)
|
network_type = attrs.get(provider.NETWORK_TYPE)
|
||||||
@ -314,10 +325,34 @@ class OVSQuantumPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
|
|||||||
msg = _("provider:segmentation_id out of range "
|
msg = _("provider:segmentation_id out of range "
|
||||||
"(1 through 4094)")
|
"(1 through 4094)")
|
||||||
raise q_exc.InvalidInput(error_message=msg)
|
raise q_exc.InvalidInput(error_message=msg)
|
||||||
|
elif network_type == constants.TYPE_GRE:
|
||||||
|
if physical_network_set:
|
||||||
|
msg = _("provider:physical_network specified for GRE "
|
||||||
|
"network")
|
||||||
|
raise q_exc.InvalidInput(error_message=msg)
|
||||||
else:
|
else:
|
||||||
msg = _("invalid provider:network_type %s" % network_type)
|
physical_network = None
|
||||||
|
if not segmentation_id_set:
|
||||||
|
msg = _("provider:segmentation_id required")
|
||||||
|
raise q_exc.InvalidInput(error_message=msg)
|
||||||
|
elif network_type == constants.TYPE_LOCAL:
|
||||||
|
if physical_network_set:
|
||||||
|
msg = _("provider:physical_network specified for local "
|
||||||
|
"network")
|
||||||
|
raise q_exc.InvalidInput(error_message=msg)
|
||||||
|
else:
|
||||||
|
physical_network = None
|
||||||
|
if segmentation_id_set:
|
||||||
|
msg = _("provider:segmentation_id specified for local "
|
||||||
|
"network")
|
||||||
|
raise q_exc.InvalidInput(error_message=msg)
|
||||||
|
else:
|
||||||
|
segmentation_id = None
|
||||||
|
else:
|
||||||
|
msg = _("provider:network_type %s not supported" % network_type)
|
||||||
raise q_exc.InvalidInput(error_message=msg)
|
raise q_exc.InvalidInput(error_message=msg)
|
||||||
|
|
||||||
|
if network_type in [constants.TYPE_VLAN, constants.TYPE_FLAT]:
|
||||||
if physical_network_set:
|
if physical_network_set:
|
||||||
if physical_network not in self.network_vlan_ranges:
|
if physical_network not in self.network_vlan_ranges:
|
||||||
msg = _("unknown provider:physical_network %s" %
|
msg = _("unknown provider:physical_network %s" %
|
||||||
@ -358,16 +393,24 @@ class OVSQuantumPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
|
|||||||
session = context.session
|
session = context.session
|
||||||
with session.begin(subtransactions=True):
|
with session.begin(subtransactions=True):
|
||||||
if not network_type:
|
if not network_type:
|
||||||
try:
|
# tenant network
|
||||||
|
network_type = self.tenant_network_type
|
||||||
|
if network_type == constants.TYPE_NONE:
|
||||||
|
raise q_exc.TenantNetworksDisabled()
|
||||||
|
elif network_type == constants.TYPE_VLAN:
|
||||||
(physical_network,
|
(physical_network,
|
||||||
segmentation_id) = ovs_db_v2.reserve_vlan(session)
|
segmentation_id) = ovs_db_v2.reserve_vlan(session)
|
||||||
network_type = constants.TYPE_VLAN
|
elif network_type == constants.TYPE_GRE:
|
||||||
except q_exc.NoNetworkAvailable:
|
|
||||||
segmentation_id = ovs_db_v2.reserve_tunnel(session)
|
segmentation_id = ovs_db_v2.reserve_tunnel(session)
|
||||||
network_type = constants.TYPE_GRE
|
# no reservation needed for TYPE_LOCAL
|
||||||
else:
|
else:
|
||||||
|
# provider network
|
||||||
|
if network_type in [constants.TYPE_VLAN, constants.TYPE_FLAT]:
|
||||||
ovs_db_v2.reserve_specific_vlan(session, physical_network,
|
ovs_db_v2.reserve_specific_vlan(session, physical_network,
|
||||||
segmentation_id)
|
segmentation_id)
|
||||||
|
elif network_type == constants.TYPE_GRE:
|
||||||
|
ovs_db_v2.reserve_specific_tunnel(session, segmentation_id)
|
||||||
|
# no reservation needed for TYPE_LOCAL
|
||||||
net = super(OVSQuantumPluginV2, self).create_network(context,
|
net = super(OVSQuantumPluginV2, self).create_network(context,
|
||||||
network)
|
network)
|
||||||
ovs_db_v2.add_network_binding(session, net['id'], network_type,
|
ovs_db_v2.add_network_binding(session, net['id'], network_type,
|
||||||
@ -400,7 +443,8 @@ class OVSQuantumPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
|
|||||||
if binding.network_type == constants.TYPE_GRE:
|
if binding.network_type == constants.TYPE_GRE:
|
||||||
ovs_db_v2.release_tunnel(session, binding.segmentation_id,
|
ovs_db_v2.release_tunnel(session, binding.segmentation_id,
|
||||||
self.tunnel_id_ranges)
|
self.tunnel_id_ranges)
|
||||||
else:
|
elif binding.network_type in [constants.TYPE_VLAN,
|
||||||
|
constants.TYPE_FLAT]:
|
||||||
ovs_db_v2.release_vlan(session, binding.physical_network,
|
ovs_db_v2.release_vlan(session, binding.physical_network,
|
||||||
binding.segmentation_id,
|
binding.segmentation_id,
|
||||||
self.network_vlan_ranges)
|
self.network_vlan_ranges)
|
||||||
|
@ -32,11 +32,10 @@ class ConfigurationTest(unittest.TestCase):
|
|||||||
cfg.CONF.AGENT.polling_interval)
|
cfg.CONF.AGENT.polling_interval)
|
||||||
self.assertEqual('sudo',
|
self.assertEqual('sudo',
|
||||||
cfg.CONF.AGENT.root_helper)
|
cfg.CONF.AGENT.root_helper)
|
||||||
|
self.assertEqual('local',
|
||||||
ranges = cfg.CONF.VLANS.network_vlan_ranges
|
cfg.CONF.VLANS.tenant_network_type)
|
||||||
self.assertEqual(1, len(ranges))
|
self.assertEqual(0,
|
||||||
self.assertEqual('default:1000:2999', ranges[0])
|
len(cfg.CONF.VLANS.network_vlan_ranges))
|
||||||
|
self.assertEqual(0,
|
||||||
mappings = cfg.CONF.LINUX_BRIDGE.physical_interface_mappings
|
len(cfg.CONF.LINUX_BRIDGE.
|
||||||
self.assertEqual(1, len(mappings))
|
physical_interface_mappings))
|
||||||
self.assertEqual('default:eth1', mappings[0])
|
|
||||||
|
@ -29,14 +29,7 @@ class ConfigurationTest(unittest.TestCase):
|
|||||||
self.assertEqual(2, cfg.CONF.DATABASE.reconnect_interval)
|
self.assertEqual(2, cfg.CONF.DATABASE.reconnect_interval)
|
||||||
self.assertEqual(2, cfg.CONF.AGENT.polling_interval)
|
self.assertEqual(2, cfg.CONF.AGENT.polling_interval)
|
||||||
self.assertEqual('sudo', cfg.CONF.AGENT.root_helper)
|
self.assertEqual('sudo', cfg.CONF.AGENT.root_helper)
|
||||||
|
self.assertEqual('local', cfg.CONF.OVS.tenant_network_type)
|
||||||
mappings = cfg.CONF.OVS.bridge_mappings
|
self.assertEqual(0, len(cfg.CONF.OVS.bridge_mappings))
|
||||||
self.assertEqual(1, len(mappings))
|
self.assertEqual(0, len(cfg.CONF.OVS.network_vlan_ranges))
|
||||||
self.assertEqual('default:br-eth1', mappings[0])
|
self.assertEqual(0, len(cfg.CONF.OVS.tunnel_id_ranges))
|
||||||
|
|
||||||
ranges = cfg.CONF.OVS.network_vlan_ranges
|
|
||||||
self.assertEqual(1, len(ranges))
|
|
||||||
self.assertEqual('default:1000:2999', ranges[0])
|
|
||||||
|
|
||||||
ranges = cfg.CONF.OVS.tunnel_id_ranges
|
|
||||||
self.assertEqual(0, len(ranges))
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user