--- /dev/null
+# 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, PickleType
+from sqlalchemy.schema import UniqueConstraint
+
+from neutron.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 PortForwarding(model_base.BASEV2):
+ """Ports to be forwarded through NAT """
+ __tablename__ = 'ovs_port_forwarding'
+
+ port_id = Column(String(36),
+ ForeignKey('ports.id', ondelete="CASCADE"),
+ primary_key=True)
+ forward_ports = Column(PickleType)
+
+ def __init__(self, port_id, forward_ports):
+ self.port_id = port_id
+ self.forward_ports = forward_ports
+
+ def __repr__(self):
+ return "<PortForwarding(%s,%s)>" % (self.port_id, self.forward_ports)
+
+class TunnelEndpoint(model_base.BASEV2):
+ """Represents tunnel endpoint in RPC mode."""
+ __tablename__ = 'ovs_tunnel_endpoints'
+ __table_args__ = (
+ UniqueConstraint('id', name='uniq_ovs_tunnel_endpoints0id'),
+ )
+
+ 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)
+