88cd4f8504
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
112 lines
3.9 KiB
Python
112 lines
3.9 KiB
Python
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
# Copyright 2011 Nicira Networks, Inc.
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
# @author: Aaron Rosen, Nicira Networks, Inc.
|
|
# @author: Bob Kukura, Red Hat, Inc.
|
|
|
|
|
|
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
|
|
|
|
from quantum.db.models_v2 import model_base
|
|
|
|
|
|
class VlanAllocation(model_base.BASEV2):
|
|
"""Represents allocation state of vlan_id on physical network"""
|
|
__tablename__ = 'ovs_vlan_allocations'
|
|
|
|
physical_network = Column(String(64), nullable=False, primary_key=True)
|
|
vlan_id = Column(Integer, nullable=False, primary_key=True,
|
|
autoincrement=False)
|
|
allocated = Column(Boolean, nullable=False)
|
|
|
|
def __init__(self, physical_network, vlan_id):
|
|
self.physical_network = physical_network
|
|
self.vlan_id = vlan_id
|
|
self.allocated = False
|
|
|
|
def __repr__(self):
|
|
return "<VlanAllocation(%s,%d,%s)>" % (self.physical_network,
|
|
self.vlan_id, self.allocated)
|
|
|
|
|
|
class TunnelAllocation(model_base.BASEV2):
|
|
"""Represents allocation state of tunnel_id"""
|
|
__tablename__ = 'ovs_tunnel_allocations'
|
|
|
|
tunnel_id = Column(Integer, nullable=False, primary_key=True,
|
|
autoincrement=False)
|
|
allocated = Column(Boolean, nullable=False)
|
|
|
|
def __init__(self, tunnel_id):
|
|
self.tunnel_id = tunnel_id
|
|
self.allocated = False
|
|
|
|
def __repr__(self):
|
|
return "<TunnelAllocation(%d,%s)>" % (self.tunnel_id, self.allocated)
|
|
|
|
|
|
class NetworkBinding(model_base.BASEV2):
|
|
"""Represents binding of virtual network to physical realization"""
|
|
__tablename__ = 'ovs_network_bindings'
|
|
|
|
network_id = Column(String(36),
|
|
ForeignKey('networks.id', ondelete="CASCADE"),
|
|
primary_key=True)
|
|
# 'gre', 'vlan', 'flat', 'local'
|
|
network_type = Column(String(32), nullable=False)
|
|
physical_network = Column(String(64))
|
|
segmentation_id = Column(Integer) # tunnel_id or vlan_id
|
|
|
|
def __init__(self, network_id, network_type, physical_network,
|
|
segmentation_id):
|
|
self.network_id = network_id
|
|
self.network_type = network_type
|
|
self.physical_network = physical_network
|
|
self.segmentation_id = segmentation_id
|
|
|
|
def __repr__(self):
|
|
return "<NetworkBinding(%s,%s,%s,%d)>" % (self.network_id,
|
|
self.network_type,
|
|
self.physical_network,
|
|
self.segmentation_id)
|
|
|
|
|
|
class TunnelIP(model_base.BASEV2):
|
|
"""Represents tunnel endpoint in DB mode"""
|
|
__tablename__ = 'ovs_tunnel_ips'
|
|
|
|
ip_address = Column(String(255), primary_key=True)
|
|
|
|
def __init__(self, ip_address):
|
|
self.ip_address = ip_address
|
|
|
|
def __repr__(self):
|
|
return "<TunnelIP(%s)>" % (self.ip_address)
|
|
|
|
|
|
class TunnelEndpoint(model_base.BASEV2):
|
|
"""Represents tunnel endpoint in RPC mode"""
|
|
__tablename__ = 'ovs_tunnel_endpoints'
|
|
|
|
ip_address = Column(String(64), primary_key=True)
|
|
id = Column(Integer, nullable=False)
|
|
|
|
def __init__(self, ip_address, id):
|
|
self.ip_address = ip_address
|
|
self.id = id
|
|
|
|
def __repr__(self):
|
|
return "<TunnelEndpoint(%s,%s)>" % (self.ip_address, self.id)
|