From 0befdbcba31dcd0fb43f93e1d48ac186a8f3e0b6 Mon Sep 17 00:00:00 2001 From: Jakub Libosvar Date: Thu, 26 Jun 2014 16:56:32 +0200 Subject: [PATCH] Freeze models for healing migration Take a snapshot of all models from the code base at the time when the healing migration merges. The healing migration needs this frozen view of the models to be available (even as the models change in the future) to compare with the current DB schema. The healing migration will use this comparison to heal the schema. partially implement bp: db-migration-refactor Change-Id: I438147c7961b1ecad47f6146cc7fc9396aee7bc5 --- neutron/db/migration/models/__init__.py | 0 neutron/db/migration/models/frozen.py | 1823 ++++++++++++++++++++ neutron/db/migration/models/head.py | 86 + neutron/tests/functional/db/__init__.py | 0 neutron/tests/functional/db/test_models.py | 42 + 5 files changed, 1951 insertions(+) create mode 100644 neutron/db/migration/models/__init__.py create mode 100644 neutron/db/migration/models/frozen.py create mode 100644 neutron/db/migration/models/head.py create mode 100644 neutron/tests/functional/db/__init__.py create mode 100644 neutron/tests/functional/db/test_models.py diff --git a/neutron/db/migration/models/__init__.py b/neutron/db/migration/models/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/neutron/db/migration/models/frozen.py b/neutron/db/migration/models/frozen.py new file mode 100644 index 000000000..4d379c442 --- /dev/null +++ b/neutron/db/migration/models/frozen.py @@ -0,0 +1,1823 @@ +# Copyright (c) 2014 OpenStack Foundation. +# 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. + +""" +The module provides all database models. + +Its purpose is to create comparable metadata with current database schema. +Based on this comparison database can be healed with healing migration. + +Current HEAD commit is 59da928e945ec58836d34fd561d30a8a446e2728 +""" + + +import sqlalchemy as sa +from sqlalchemy.ext import declarative +from sqlalchemy.ext.orderinglist import ordering_list +from sqlalchemy import orm +from sqlalchemy import schema + +from neutron.db import model_base +from neutron.openstack.common import uuidutils + + +#neutron/plugins/ml2/drivers/mech_arista/db.py +UUID_LEN = 36 +STR_LEN = 255 + +#neutron/plugins/cisco/common/cisco_constants.py +CISCO_CONSTANTS_NETWORK_TYPE_VLAN = 'vlan' +CISCO_CONSTANTS_NETWORK_TYPE_OVERLAY = 'overlay' +CISCO_CONSTANTS_NETWORK_TYPE_TRUNK = 'trunk' +CISCO_CONSTANTS_NETWORK_TYPE_MULTI_SEGMENT = 'multi-segment' +CISCO_CONSTANTS_NETWORK = 'network' +CISCO_CONSTANTS_POLICY = 'policy' +CISCO_CONSTANTS_TENANT_ID_NOT_SET = 'TENANT_ID_NOT_SET' + +#neutron/plugins/ml2/models.py +BINDING_PROFILE_LEN = 4095 + +#neutron/extensions/portbindings.py +VNIC_NORMAL = 'normal' + +#neutron/common/constants.py +IPV6_SLAAC = 'slaac' +DHCPV6_STATEFUL = 'dhcpv6-stateful' +DHCPV6_STATELESS = 'dhcpv6-stateless' + + +BASEV2 = declarative.declarative_base(cls=model_base.NeutronBaseV2) + + +#neutron/db/models_v2.py +class HasTenant(object): + tenant_id = sa.Column(sa.String(255)) + + +#neutron/db/models_v2.py +class HasId(object): + id = sa.Column(sa.String(36), + primary_key=True, + default=uuidutils.generate_uuid) + + +#neutron/db/models_v2.py +class HasStatusDescription(object): + status = sa.Column(sa.String(16), nullable=False) + status_description = sa.Column(sa.String(255)) + + +#neutron/db/models_v2.py +class IPAvailabilityRange(BASEV2): + allocation_pool_id = sa.Column(sa.String(36), + sa.ForeignKey('ipallocationpools.id', + ondelete="CASCADE"), + nullable=False, + primary_key=True) + first_ip = sa.Column(sa.String(64), nullable=False, primary_key=True) + last_ip = sa.Column(sa.String(64), nullable=False, primary_key=True) + + +#neutron/db/models_v2.py +class IPAllocationPool(BASEV2, HasId): + subnet_id = sa.Column(sa.String(36), sa.ForeignKey('subnets.id', + ondelete="CASCADE"), + nullable=True) + first_ip = sa.Column(sa.String(64), nullable=False) + last_ip = sa.Column(sa.String(64), nullable=False) + available_ranges = orm.relationship(IPAvailabilityRange, + backref='ipallocationpool', + lazy="joined", + cascade='all, delete-orphan') + + +#neutron/db/models_v2.py +class IPAllocation(BASEV2): + port_id = sa.Column(sa.String(36), sa.ForeignKey('ports.id', + ondelete="CASCADE"), + nullable=True) + ip_address = sa.Column(sa.String(64), nullable=False, primary_key=True) + subnet_id = sa.Column(sa.String(36), sa.ForeignKey('subnets.id', + ondelete="CASCADE"), + nullable=False, primary_key=True) + network_id = sa.Column(sa.String(36), sa.ForeignKey("networks.id", + ondelete="CASCADE"), + nullable=False, primary_key=True) + + +#neutron/db/models_v2.py +class Route(object): + destination = sa.Column(sa.String(64), nullable=False, primary_key=True) + nexthop = sa.Column(sa.String(64), nullable=False, primary_key=True) + + +#neutron/db/models_v2.py +class SubnetRoute(BASEV2, Route): + subnet_id = sa.Column(sa.String(36), + sa.ForeignKey('subnets.id', + ondelete="CASCADE"), + primary_key=True) + + +#neutron/db/models_v2.py +class Port(BASEV2, HasId, HasTenant): + name = sa.Column(sa.String(255)) + network_id = sa.Column(sa.String(36), sa.ForeignKey("networks.id"), + nullable=False) + fixed_ips = orm.relationship(IPAllocation, backref='ports', lazy='joined') + mac_address = sa.Column(sa.String(32), nullable=False) + admin_state_up = sa.Column(sa.Boolean(), nullable=False) + status = sa.Column(sa.String(16), nullable=False) + device_id = sa.Column(sa.String(255), nullable=False) + device_owner = sa.Column(sa.String(255), nullable=False) + + +#neutron/db/models_v2.py +class DNSNameServer(BASEV2): + address = sa.Column(sa.String(128), nullable=False, primary_key=True) + subnet_id = sa.Column(sa.String(36), + sa.ForeignKey('subnets.id', + ondelete="CASCADE"), + primary_key=True) + + +#neutron/db/models_v2.py +class Subnet(BASEV2, HasId, HasTenant): + name = sa.Column(sa.String(255)) + network_id = sa.Column(sa.String(36), sa.ForeignKey('networks.id')) + ip_version = sa.Column(sa.Integer, nullable=False) + cidr = sa.Column(sa.String(64), nullable=False) + gateway_ip = sa.Column(sa.String(64)) + allocation_pools = orm.relationship(IPAllocationPool, + backref='subnet', + lazy="joined", + cascade='delete') + enable_dhcp = sa.Column(sa.Boolean()) + dns_nameservers = orm.relationship(DNSNameServer, + backref='subnet', + cascade='all, delete, delete-orphan') + routes = orm.relationship(SubnetRoute, + backref='subnet', + cascade='all, delete, delete-orphan') + shared = sa.Column(sa.Boolean) + ipv6_ra_mode = sa.Column(sa.Enum(IPV6_SLAAC, + DHCPV6_STATEFUL, + DHCPV6_STATELESS, + name='ipv6_ra_modes'), nullable=True) + ipv6_address_mode = sa.Column(sa.Enum(IPV6_SLAAC, + DHCPV6_STATEFUL, + DHCPV6_STATELESS, + name='ipv6_address_modes'), + nullable=True) + + +#neutron/db/models_v2.py +class Network(BASEV2, HasId, HasTenant): + name = sa.Column(sa.String(255)) + ports = orm.relationship(Port, backref='networks') + subnets = orm.relationship(Subnet, backref='networks', + lazy="joined") + status = sa.Column(sa.String(16)) + admin_state_up = sa.Column(sa.Boolean) + shared = sa.Column(sa.Boolean) + + +#neutron/db/agents_db.py +class Agent(BASEV2, HasId): + __table_args__ = ( + sa.UniqueConstraint('agent_type', 'host', + name='uniq_agents0agent_type0host'), + ) + + agent_type = sa.Column(sa.String(255), nullable=False) + binary = sa.Column(sa.String(255), nullable=False) + topic = sa.Column(sa.String(255), nullable=False) + host = sa.Column(sa.String(255), nullable=False) + admin_state_up = sa.Column(sa.Boolean, default=True, + server_default=sa.sql.true(), nullable=False) + created_at = sa.Column(sa.DateTime, nullable=False) + started_at = sa.Column(sa.DateTime, nullable=False) + heartbeat_timestamp = sa.Column(sa.DateTime, nullable=False) + description = sa.Column(sa.String(255)) + configurations = sa.Column(sa.String(4095), nullable=False) + + +#neutron/db/agentschedulers_db.py +class NetworkDhcpAgentBinding(BASEV2): + network_id = sa.Column(sa.String(36), + sa.ForeignKey("networks.id", ondelete='CASCADE'), + primary_key=True) + dhcp_agent = orm.relation(Agent) + dhcp_agent_id = sa.Column(sa.String(36), + sa.ForeignKey("agents.id", + ondelete='CASCADE'), + primary_key=True) + + +#neutron/db/allowedaddresspairs_db.py +class AllowedAddressPair(BASEV2): + port_id = sa.Column(sa.String(36), + sa.ForeignKey('ports.id', ondelete="CASCADE"), + primary_key=True) + mac_address = sa.Column(sa.String(32), nullable=False, primary_key=True) + ip_address = sa.Column(sa.String(64), nullable=False, primary_key=True) + port = orm.relationship( + Port, + backref=orm.backref("allowed_address_pairs", + lazy="joined", cascade="delete")) + + +#neutron/db/external_net_db.py +class ExternalNetwork(BASEV2): + network_id = sa.Column(sa.String(36), + sa.ForeignKey('networks.id', ondelete="CASCADE"), + primary_key=True) + network = orm.relationship( + Network, + backref=orm.backref("external", lazy='joined', + uselist=False, cascade='delete')) + + +#neutron/db/extradhcpopt_db.py +class ExtraDhcpOpt(BASEV2, HasId): + port_id = sa.Column(sa.String(36), + sa.ForeignKey('ports.id', ondelete="CASCADE"), + nullable=False) + opt_name = sa.Column(sa.String(64), nullable=False) + opt_value = sa.Column(sa.String(255), nullable=False) + __table_args__ = (sa.UniqueConstraint('port_id', + 'opt_name', + name='uidx_portid_optname'), + BASEV2.__table_args__,) + ports = orm.relationship( + Port, + backref=orm.backref("dhcp_opts", lazy='joined', cascade='delete')) + + +#neutron/db/l3_db.py +class Router(BASEV2, HasId, HasTenant): + name = sa.Column(sa.String(255)) + status = sa.Column(sa.String(16)) + admin_state_up = sa.Column(sa.Boolean) + gw_port_id = sa.Column(sa.String(36), sa.ForeignKey('ports.id')) + gw_port = orm.relationship(Port, lazy='joined') + enable_snat = sa.Column(sa.Boolean, default=True, + server_default=sa.sql.true(), nullable=False) + + +#neutron/db/l3_db.py +class FloatingIP(BASEV2, HasId, HasTenant): + floating_ip_address = sa.Column(sa.String(64), nullable=False) + floating_network_id = sa.Column(sa.String(36), nullable=False) + floating_port_id = sa.Column(sa.String(36), sa.ForeignKey('ports.id'), + nullable=False) + fixed_port_id = sa.Column(sa.String(36), sa.ForeignKey('ports.id')) + fixed_ip_address = sa.Column(sa.String(64)) + router_id = sa.Column(sa.String(36), sa.ForeignKey('routers.id')) + last_known_router_id = sa.Column(sa.String(36)) + status = sa.Column(sa.String(16)) + + +#neutron/db/extraroute_db.py +class RouterRoute(BASEV2, Route): + router_id = sa.Column(sa.String(36), + sa.ForeignKey('routers.id', + ondelete="CASCADE"), + primary_key=True) + + router = orm.relationship(Router, + backref=orm.backref("route_list", + lazy='joined', + cascade='delete')) + + +#neutron/db/servicetype_db.py +class ProviderResourceAssociation(BASEV2): + provider_name = sa.Column(sa.String(255), + nullable=False, primary_key=True) + resource_id = sa.Column(sa.String(36), nullable=False, primary_key=True, + unique=True) + + +#neutron/db/firewall/firewall_db.py +class FirewallRule(BASEV2, HasId, HasTenant): + __tablename__ = 'firewall_rules' + name = sa.Column(sa.String(255)) + description = sa.Column(sa.String(1024)) + firewall_policy_id = sa.Column(sa.String(36), + sa.ForeignKey('firewall_policies.id'), + nullable=True) + shared = sa.Column(sa.Boolean) + protocol = sa.Column(sa.String(40)) + ip_version = sa.Column(sa.Integer, nullable=False) + source_ip_address = sa.Column(sa.String(46)) + destination_ip_address = sa.Column(sa.String(46)) + source_port_range_min = sa.Column(sa.Integer) + source_port_range_max = sa.Column(sa.Integer) + destination_port_range_min = sa.Column(sa.Integer) + destination_port_range_max = sa.Column(sa.Integer) + action = sa.Column(sa.Enum('allow', 'deny', name='firewallrules_action')) + enabled = sa.Column(sa.Boolean) + position = sa.Column(sa.Integer) + + +#neutron/db/firewall/firewall_db.py +class Firewall(BASEV2, HasId, HasTenant): + __tablename__ = 'firewalls' + name = sa.Column(sa.String(255)) + description = sa.Column(sa.String(1024)) + shared = sa.Column(sa.Boolean) + admin_state_up = sa.Column(sa.Boolean) + status = sa.Column(sa.String(16)) + firewall_policy_id = sa.Column(sa.String(36), + sa.ForeignKey('firewall_policies.id'), + nullable=True) + + +#neutron/db/firewall/firewall_db.py +class FirewallPolicy(BASEV2, HasId, HasTenant): + __tablename__ = 'firewall_policies' + name = sa.Column(sa.String(255)) + description = sa.Column(sa.String(1024)) + shared = sa.Column(sa.Boolean) + firewall_rules = orm.relationship( + FirewallRule, + backref=orm.backref('firewall_policies', cascade='all, delete'), + order_by='FirewallRule.position', + collection_class=ordering_list('position', count_from=1)) + audited = sa.Column(sa.Boolean) + firewalls = orm.relationship(Firewall, backref='firewall_policies') + + +#neutron/db/l3_agentschedulers_db.py +class RouterL3AgentBinding(BASEV2, HasId): + router_id = sa.Column(sa.String(36), + sa.ForeignKey("routers.id", ondelete='CASCADE')) + l3_agent = orm.relation(Agent) + l3_agent_id = sa.Column(sa.String(36), + sa.ForeignKey("agents.id", + ondelete='CASCADE')) + + +#neutron/db/loadbalancer/loadbalancer_db.py +class SessionPersistence(BASEV2): + vip_id = sa.Column(sa.String(36), + sa.ForeignKey("vips.id"), + primary_key=True) + type = sa.Column(sa.Enum("SOURCE_IP", + "HTTP_COOKIE", + "APP_COOKIE", + name="sesssionpersistences_type"), + nullable=False) + cookie_name = sa.Column(sa.String(1024)) + + +#neutron/db/loadbalancer/loadbalancer_db.py +class PoolStatistics(BASEV2): + pool_id = sa.Column(sa.String(36), sa.ForeignKey("pools.id"), + primary_key=True) + bytes_in = sa.Column(sa.BigInteger, nullable=False) + bytes_out = sa.Column(sa.BigInteger, nullable=False) + active_connections = sa.Column(sa.BigInteger, nullable=False) + total_connections = sa.Column(sa.BigInteger, nullable=False) + + +#neutron/db/loadbalancer/loadbalancer_db.py +class Vip(BASEV2, HasId, HasTenant, HasStatusDescription): + name = sa.Column(sa.String(255)) + description = sa.Column(sa.String(255)) + port_id = sa.Column(sa.String(36), sa.ForeignKey('ports.id')) + protocol_port = sa.Column(sa.Integer, nullable=False) + protocol = sa.Column(sa.Enum("HTTP", "HTTPS", "TCP", name="lb_protocols"), + nullable=False) + pool_id = sa.Column(sa.String(36), nullable=False, unique=True) + session_persistence = orm.relationship(SessionPersistence, + uselist=False, + backref="vips", + cascade="all, delete-orphan") + admin_state_up = sa.Column(sa.Boolean(), nullable=False) + connection_limit = sa.Column(sa.Integer) + port = orm.relationship(Port) + + +#neutron/db/loadbalancer/loadbalancer_db.py +class Member(BASEV2, HasId, HasTenant, HasStatusDescription): + __table_args__ = ( + sa.schema.UniqueConstraint('pool_id', 'address', 'protocol_port', + name='uniq_member0pool_id0address0port'), + ) + pool_id = sa.Column(sa.String(36), sa.ForeignKey("pools.id"), + nullable=False) + address = sa.Column(sa.String(64), nullable=False) + protocol_port = sa.Column(sa.Integer, nullable=False) + weight = sa.Column(sa.Integer, nullable=False) + admin_state_up = sa.Column(sa.Boolean(), nullable=False) + + +#neutron/db/loadbalancer/loadbalancer_db.py +class Pool(BASEV2, HasId, HasTenant, HasStatusDescription): + vip_id = sa.Column(sa.String(36), sa.ForeignKey("vips.id")) + name = sa.Column(sa.String(255)) + description = sa.Column(sa.String(255)) + subnet_id = sa.Column(sa.String(36), nullable=False) + protocol = sa.Column(sa.Enum("HTTP", "HTTPS", "TCP", name="lb_protocols"), + nullable=False) + lb_method = sa.Column(sa.Enum("ROUND_ROBIN", + "LEAST_CONNECTIONS", + "SOURCE_IP", + name="pools_lb_method"), + nullable=False) + admin_state_up = sa.Column(sa.Boolean(), nullable=False) + stats = orm.relationship(PoolStatistics, + uselist=False, + backref="pools", + cascade="all, delete-orphan") + members = orm.relationship(Member, backref="pools", + cascade="all, delete-orphan") + monitors = orm.relationship("PoolMonitorAssociation", backref="pools", + cascade="all, delete-orphan") + vip = orm.relationship(Vip, backref='pool') + + provider = orm.relationship( + ProviderResourceAssociation, + uselist=False, + lazy="joined", + primaryjoin="Pool.id==ProviderResourceAssociation.resource_id", + foreign_keys=[ProviderResourceAssociation.resource_id] + ) + + +#neutron/db/loadbalancer/loadbalancer_db.py +class HealthMonitor(BASEV2, HasId, HasTenant): + type = sa.Column(sa.Enum("PING", "TCP", "HTTP", "HTTPS", + name="healthmontiors_type"), + nullable=False) + delay = sa.Column(sa.Integer, nullable=False) + timeout = sa.Column(sa.Integer, nullable=False) + max_retries = sa.Column(sa.Integer, nullable=False) + http_method = sa.Column(sa.String(16)) + url_path = sa.Column(sa.String(255)) + expected_codes = sa.Column(sa.String(64)) + admin_state_up = sa.Column(sa.Boolean(), nullable=False) + + pools = orm.relationship( + "PoolMonitorAssociation", backref="healthmonitor", + cascade="all", lazy="joined" + ) + + +#neutron/db/loadbalancer/loadbalancer_db.py +class PoolMonitorAssociation(BASEV2, HasStatusDescription): + pool_id = sa.Column(sa.String(36), + sa.ForeignKey("pools.id"), + primary_key=True) + monitor_id = sa.Column(sa.String(36), + sa.ForeignKey("healthmonitors.id"), + primary_key=True) + + +#neutron/db/metering/metering_db.py +class MeteringLabelRule(BASEV2, HasId): + direction = sa.Column(sa.Enum('ingress', 'egress', + name='meteringlabels_direction')) + remote_ip_prefix = sa.Column(sa.String(64)) + metering_label_id = sa.Column(sa.String(36), + sa.ForeignKey("meteringlabels.id", + ondelete="CASCADE"), + nullable=False) + excluded = sa.Column(sa.Boolean, default=False, + server_default=sa.sql.false()) + + +#neutron/db/metering/metering_db.py +class MeteringLabel(BASEV2, HasId, HasTenant): + name = sa.Column(sa.String(255)) + description = sa.Column(sa.String(1024)) + rules = orm.relationship(MeteringLabelRule, backref="label", + cascade="delete", lazy="joined") + routers = orm.relationship( + Router, + primaryjoin="MeteringLabel.tenant_id==Router.tenant_id", + foreign_keys='MeteringLabel.tenant_id', + uselist=True) + + +#neutron/db/portbindings_db.py +class PortBindingPort(BASEV2): + port_id = sa.Column(sa.String(36), + sa.ForeignKey('ports.id', ondelete="CASCADE"), + primary_key=True) + host = sa.Column(sa.String(255), nullable=False) + port = orm.relationship( + Port, + backref=orm.backref("portbinding", + lazy='joined', uselist=False, + cascade='delete')) + + +#neutron/db/portsecurity_db.py +class PortSecurityBinding(BASEV2): + port_id = sa.Column(sa.String(36), + sa.ForeignKey('ports.id', ondelete="CASCADE"), + primary_key=True) + port_security_enabled = sa.Column(sa.Boolean(), nullable=False) + port = orm.relationship( + Port, + backref=orm.backref("port_security", uselist=False, + cascade='delete', lazy='joined')) + + +#neutron/db/portsecurity_db.py +class NetworkSecurityBinding(BASEV2): + network_id = sa.Column(sa.String(36), + sa.ForeignKey('networks.id', ondelete="CASCADE"), + primary_key=True) + port_security_enabled = sa.Column(sa.Boolean(), nullable=False) + network = orm.relationship( + Network, + backref=orm.backref("port_security", uselist=False, + cascade='delete', lazy='joined')) + + +#neutron/db/quota_db.py +class Quota(BASEV2, HasId): + tenant_id = sa.Column(sa.String(255), index=True) + resource = sa.Column(sa.String(255)) + limit = sa.Column(sa.Integer) + + +#neutron/db/routedserviceinsertion_db.py +class ServiceRouterBinding(BASEV2): + resource_id = sa.Column(sa.String(36), + primary_key=True) + resource_type = sa.Column(sa.String(36), + primary_key=True) + router_id = sa.Column(sa.String(36), + sa.ForeignKey('routers.id'), + nullable=False) + + +#neutron/db/routerservicetype_db.py +class RouterServiceTypeBinding(BASEV2): + router_id = sa.Column(sa.String(36), + sa.ForeignKey('routers.id', ondelete="CASCADE"), + primary_key=True) + service_type_id = sa.Column(sa.String(36), + nullable=False) + + +#neutron/db/securitygroups_db.py +class SecurityGroup(BASEV2, HasId, HasTenant): + name = sa.Column(sa.String(255)) + description = sa.Column(sa.String(255)) + + +#neutron/db/securitygroups_db.py +class SecurityGroupPortBinding(BASEV2): + port_id = sa.Column(sa.String(36), + sa.ForeignKey("ports.id", + ondelete='CASCADE'), + primary_key=True) + security_group_id = sa.Column(sa.String(36), + sa.ForeignKey("securitygroups.id"), + primary_key=True) + + # Add a relationship to the Port model in order to instruct SQLAlchemy to + # eagerly load security group bindings + ports = orm.relationship( + Port, + backref=orm.backref("security_groups", + lazy='joined', cascade='delete')) + + +#neutron/db/securitygroups_db.py +class SecurityGroupRule(BASEV2, HasId, + HasTenant): + security_group_id = sa.Column(sa.String(36), + sa.ForeignKey("securitygroups.id", + ondelete="CASCADE"), + nullable=False) + + remote_group_id = sa.Column(sa.String(36), + sa.ForeignKey("securitygroups.id", + ondelete="CASCADE"), + nullable=True) + + direction = sa.Column(sa.Enum('ingress', 'egress', + name='securitygrouprules_direction')) + ethertype = sa.Column(sa.String(40)) + protocol = sa.Column(sa.String(40)) + port_range_min = sa.Column(sa.Integer) + port_range_max = sa.Column(sa.Integer) + remote_ip_prefix = sa.Column(sa.String(255)) + security_group = orm.relationship( + SecurityGroup, + backref=orm.backref('rules', cascade='all,delete'), + primaryjoin="SecurityGroup.id==SecurityGroupRule.security_group_id") + source_group = orm.relationship( + SecurityGroup, + backref=orm.backref('source_rules', cascade='all,delete'), + primaryjoin="SecurityGroup.id==SecurityGroupRule.remote_group_id") + + +#neutron/db/vpn/vpn_db.py +class IPsecPeerCidr(BASEV2): + cidr = sa.Column(sa.String(32), nullable=False, primary_key=True) + ipsec_site_connection_id = sa.Column( + sa.String(36), + sa.ForeignKey('ipsec_site_connections.id', + ondelete="CASCADE"), + primary_key=True) + + +#neutron/db/vpn/vpn_db.py +class IPsecPolicy(BASEV2, HasId, HasTenant): + __tablename__ = 'ipsecpolicies' + name = sa.Column(sa.String(255)) + description = sa.Column(sa.String(255)) + transform_protocol = sa.Column(sa.Enum("esp", "ah", "ah-esp", + name="ipsec_transform_protocols"), + nullable=False) + auth_algorithm = sa.Column(sa.Enum("sha1", + name="vpn_auth_algorithms"), + nullable=False) + encryption_algorithm = sa.Column(sa.Enum("3des", "aes-128", + "aes-256", "aes-192", + name="vpn_encrypt_algorithms"), + nullable=False) + encapsulation_mode = sa.Column(sa.Enum("tunnel", "transport", + name="ipsec_encapsulations"), + nullable=False) + lifetime_units = sa.Column(sa.Enum("seconds", "kilobytes", + name="vpn_lifetime_units"), + nullable=False) + lifetime_value = sa.Column(sa.Integer, nullable=False) + pfs = sa.Column(sa.Enum("group2", "group5", "group14", + name="vpn_pfs"), nullable=False) + + +#neutron/db/vpn/vpn_db.py +class IKEPolicy(BASEV2, HasId, HasTenant): + __tablename__ = 'ikepolicies' + name = sa.Column(sa.String(255)) + description = sa.Column(sa.String(255)) + auth_algorithm = sa.Column(sa.Enum("sha1", + name="vpn_auth_algorithms"), + nullable=False) + encryption_algorithm = sa.Column(sa.Enum("3des", "aes-128", + "aes-256", "aes-192", + name="vpn_encrypt_algorithms"), + nullable=False) + phase1_negotiation_mode = sa.Column(sa.Enum("main", + name="ike_phase1_mode"), + nullable=False) + lifetime_units = sa.Column(sa.Enum("seconds", "kilobytes", + name="vpn_lifetime_units"), + nullable=False) + lifetime_value = sa.Column(sa.Integer, nullable=False) + ike_version = sa.Column(sa.Enum("v1", "v2", name="ike_versions"), + nullable=False) + pfs = sa.Column(sa.Enum("group2", "group5", "group14", + name="vpn_pfs"), nullable=False) + + +#neutron/db/vpn/vpn_db.py +class IPsecSiteConnection(BASEV2, + HasId, HasTenant): + __tablename__ = 'ipsec_site_connections' + name = sa.Column(sa.String(255)) + description = sa.Column(sa.String(255)) + peer_address = sa.Column(sa.String(255), nullable=False) + peer_id = sa.Column(sa.String(255), nullable=False) + route_mode = sa.Column(sa.String(8), nullable=False) + mtu = sa.Column(sa.Integer, nullable=False) + initiator = sa.Column(sa.Enum("bi-directional", "response-only", + name="vpn_initiators"), nullable=False) + auth_mode = sa.Column(sa.String(16), nullable=False) + psk = sa.Column(sa.String(255), nullable=False) + dpd_action = sa.Column(sa.Enum("hold", "clear", + "restart", "disabled", + "restart-by-peer", name="vpn_dpd_actions"), + nullable=False) + dpd_interval = sa.Column(sa.Integer, nullable=False) + dpd_timeout = sa.Column(sa.Integer, nullable=False) + status = sa.Column(sa.String(16), nullable=False) + admin_state_up = sa.Column(sa.Boolean(), nullable=False) + vpnservice_id = sa.Column(sa.String(36), + sa.ForeignKey('vpnservices.id'), + nullable=False) + ipsecpolicy_id = sa.Column(sa.String(36), + sa.ForeignKey('ipsecpolicies.id'), + nullable=False) + ikepolicy_id = sa.Column(sa.String(36), + sa.ForeignKey('ikepolicies.id'), + nullable=False) + ipsecpolicy = orm.relationship( + IPsecPolicy, backref='ipsec_site_connection') + ikepolicy = orm.relationship(IKEPolicy, backref='ipsec_site_connection') + peer_cidrs = orm.relationship(IPsecPeerCidr, + backref='ipsec_site_connection', + lazy='joined', + cascade='all, delete, delete-orphan') + + +#neutron/db/vpn/vpn_db.py +class VPNService(BASEV2, HasId, HasTenant): + name = sa.Column(sa.String(255)) + description = sa.Column(sa.String(255)) + status = sa.Column(sa.String(16), nullable=False) + admin_state_up = sa.Column(sa.Boolean(), nullable=False) + subnet_id = sa.Column(sa.String(36), sa.ForeignKey('subnets.id'), + nullable=False) + router_id = sa.Column(sa.String(36), sa.ForeignKey('routers.id'), + nullable=False) + subnet = orm.relationship(Subnet) + router = orm.relationship(Router) + ipsec_site_connections = orm.relationship( + IPsecSiteConnection, + backref='vpnservice', + cascade="all, delete-orphan") + + +#neutron/plugins/bigswitch/db/consistency_db.py +class ConsistencyHash(BASEV2): + __tablename__ = 'consistencyhashes' + hash_id = sa.Column(sa.String(255), + primary_key=True) + hash = sa.Column(sa.String(255), nullable=False) + + +#neutron/plugins/bigswitch/routerrule_db.py +class RouterRule(BASEV2): + id = sa.Column(sa.Integer, primary_key=True) + source = sa.Column(sa.String(64), nullable=False) + destination = sa.Column(sa.String(64), nullable=False) + nexthops = orm.relationship('NextHop', cascade='all,delete') + action = sa.Column(sa.String(10), nullable=False) + router_id = sa.Column(sa.String(36), + sa.ForeignKey('routers.id', + ondelete="CASCADE")) + + +#neutron/plugins/bigswitch/routerrule_db.py +class NextHop(BASEV2): + rule_id = sa.Column(sa.Integer, + sa.ForeignKey('routerrules.id', + ondelete="CASCADE"), + primary_key=True) + nexthop = sa.Column(sa.String(64), nullable=False, primary_key=True) + + +#neutron/plugins/brocade/db/models.py +class BrocadeNetwork(BASEV2, HasId): + vlan = sa.Column(sa.String(10)) + + +#neutron/plugins/brocade/db/models.py +class BrocadePort(BASEV2): + port_id = sa.Column(sa.String(36), primary_key=True, default="", + server_default='') + network_id = sa.Column(sa.String(36), + sa.ForeignKey("brocadenetworks.id"), + nullable=False) + admin_state_up = sa.Column(sa.Boolean, nullable=False) + physical_interface = sa.Column(sa.String(36)) + vlan_id = sa.Column(sa.String(36)) + tenant_id = sa.Column(sa.String(36)) + + +#neutron/plugins/cisco/db/n1kv_models_v2.py +class N1kvVlanAllocation(BASEV2): + __tablename__ = 'cisco_n1kv_vlan_allocations' + + physical_network = sa.Column(sa.String(64), + nullable=False, + primary_key=True) + vlan_id = sa.Column(sa.Integer, nullable=False, primary_key=True, + autoincrement=False) + allocated = sa.Column(sa.Boolean, nullable=False, default=False, + server_default=sa.sql.false()) + network_profile_id = sa.Column(sa.String(36), + sa.ForeignKey('cisco_network_profiles.id', + ondelete="CASCADE"), + nullable=False) + + +#neutron/plugins/cisco/db/n1kv_models_v2.py +class N1kvVxlanAllocation(BASEV2): + __tablename__ = 'cisco_n1kv_vxlan_allocations' + + vxlan_id = sa.Column(sa.Integer, nullable=False, primary_key=True, + autoincrement=False) + allocated = sa.Column(sa.Boolean, nullable=False, default=False, + server_default=sa.sql.false()) + network_profile_id = sa.Column(sa.String(36), + sa.ForeignKey('cisco_network_profiles.id', + ondelete="CASCADE"), + nullable=False) + + +#neutron/plugins/cisco/db/n1kv_models_v2.py +class N1kvPortBinding(BASEV2): + __tablename__ = 'cisco_n1kv_port_bindings' + + port_id = sa.Column(sa.String(36), + sa.ForeignKey('ports.id', ondelete="CASCADE"), + primary_key=True) + profile_id = sa.Column(sa.String(36), + sa.ForeignKey('cisco_policy_profiles.id')) + + +#neutron/plugins/cisco/db/n1kv_models_v2.py +class N1kvNetworkBinding(BASEV2): + __tablename__ = 'cisco_n1kv_network_bindings' + + network_id = sa.Column(sa.String(36), + sa.ForeignKey('networks.id', ondelete="CASCADE"), + primary_key=True) + network_type = sa.Column(sa.String(32), nullable=False) + physical_network = sa.Column(sa.String(64)) + segmentation_id = sa.Column(sa.Integer) + multicast_ip = sa.Column(sa.String(32)) + profile_id = sa.Column(sa.String(36), + sa.ForeignKey('cisco_network_profiles.id')) + + +#neutron/plugins/cisco/db/n1kv_models_v2.py +class N1kVmNetwork(BASEV2): + __tablename__ = 'cisco_n1kv_vmnetworks' + + name = sa.Column(sa.String(80), primary_key=True) + profile_id = sa.Column(sa.String(36), + sa.ForeignKey('cisco_policy_profiles.id')) + network_id = sa.Column(sa.String(36)) + port_count = sa.Column(sa.Integer) + + +#neutron/plugins/cisco/db/n1kv_models_v2.py +class NetworkProfile(BASEV2, HasId): + __tablename__ = 'cisco_network_profiles' + + name = sa.Column(sa.String(255)) + segment_type = sa.Column( + sa.Enum(CISCO_CONSTANTS_NETWORK_TYPE_VLAN, + CISCO_CONSTANTS_NETWORK_TYPE_OVERLAY, + CISCO_CONSTANTS_NETWORK_TYPE_TRUNK, + CISCO_CONSTANTS_NETWORK_TYPE_MULTI_SEGMENT, + name='segment_type'), + nullable=False) + sub_type = sa.Column(sa.String(255)) + segment_range = sa.Column(sa.String(255)) + multicast_ip_index = sa.Column(sa.Integer, default=0, + server_default='0') + multicast_ip_range = sa.Column(sa.String(255)) + physical_network = sa.Column(sa.String(255)) + + +#neutron/plugins/cisco/db/n1kv_models_v2.py +class PolicyProfile(BASEV2): + __tablename__ = 'cisco_policy_profiles' + + id = sa.Column(sa.String(36), primary_key=True) + name = sa.Column(sa.String(255)) + + +#neutron/plugins/cisco/db/n1kv_models_v2.py +class ProfileBinding(BASEV2): + __tablename__ = 'cisco_n1kv_profile_bindings' + + profile_type = sa.Column(sa.Enum(CISCO_CONSTANTS_NETWORK, + CISCO_CONSTANTS_POLICY, + name='profile_type')) + tenant_id = sa.Column(sa.String(36), + primary_key=True, + default=CISCO_CONSTANTS_TENANT_ID_NOT_SET, + server_default=CISCO_CONSTANTS_TENANT_ID_NOT_SET) + profile_id = sa.Column(sa.String(36), primary_key=True) + + +#neutron/plugins/cisco/db/n1kv_models_v2.py +class N1kvTrunkSegmentBinding(BASEV2): + __tablename__ = 'cisco_n1kv_trunk_segments' + + trunk_segment_id = sa.Column(sa.String(36), + sa.ForeignKey('networks.id', + ondelete="CASCADE"), + primary_key=True) + segment_id = sa.Column(sa.String(36), nullable=False, primary_key=True) + dot1qtag = sa.Column(sa.String(36), nullable=False, primary_key=True) + + +#neutron/plugins/cisco/db/n1kv_models_v2.py +class N1kvMultiSegmentNetworkBinding(BASEV2): + __tablename__ = 'cisco_n1kv_multi_segments' + + multi_segment_id = sa.Column(sa.String(36), + sa.ForeignKey('networks.id', + ondelete="CASCADE"), + primary_key=True) + segment1_id = sa.Column(sa.String(36), nullable=False, primary_key=True) + segment2_id = sa.Column(sa.String(36), nullable=False, primary_key=True) + encap_profile_name = sa.Column(sa.String(36)) + + +#neutron/plugins/cisco/db/network_models_v2.py +class QoS(BASEV2): + __tablename__ = 'cisco_qos_policies' + + qos_id = sa.Column(sa.String(255)) + tenant_id = sa.Column(sa.String(255), primary_key=True) + qos_name = sa.Column(sa.String(255), primary_key=True) + qos_desc = sa.Column(sa.String(255)) + + +#neutron/plugins/cisco/db/network_models_v2.py +class Credential(BASEV2): + __tablename__ = 'cisco_credentials' + + credential_id = sa.Column(sa.String(255)) + credential_name = sa.Column(sa.String(255), primary_key=True) + user_name = sa.Column(sa.String(255)) + password = sa.Column(sa.String(255)) + type = sa.Column(sa.String(255)) + + +#neutron/plugins/cisco/db/network_models_v2.py +class ProviderNetwork(BASEV2): + __tablename__ = 'cisco_provider_networks' + + network_id = sa.Column(sa.String(36), + sa.ForeignKey('networks.id', ondelete="CASCADE"), + primary_key=True) + network_type = sa.Column(sa.String(255), nullable=False) + segmentation_id = sa.Column(sa.Integer, nullable=False) + + +#neutron/plugins/cisco/db/nexus_models_v2.py +#class was renamed from NexusPortBinding to CiscoNexusPortBinding +class CiscoNexusPortBinding(BASEV2): + __tablename__ = "cisco_nexusport_bindings" + + id = sa.Column(sa.Integer, primary_key=True, autoincrement=True) + port_id = sa.Column(sa.String(255)) + vlan_id = sa.Column(sa.Integer, nullable=False) + switch_ip = sa.Column(sa.String(255), nullable=False) + instance_id = sa.Column(sa.String(255), nullable=False) + + +#neutron/plugins/hyperv/model.py +#class was renamed from VlanAllocation to HyperVVlanAllocation +class HyperVVlanAllocation(BASEV2): + __tablename__ = 'hyperv_vlan_allocations' + + physical_network = sa.Column(sa.String(64), + nullable=False, + primary_key=True) + vlan_id = sa.Column(sa.Integer, nullable=False, primary_key=True, + autoincrement=False) + allocated = sa.Column(sa.Boolean, nullable=False) + + +#neutron/plugins/hyperv/model.py +#class was renamed from NetworkBinding to HyperVNetworkBinding +class HyperVNetworkBinding(BASEV2): + __tablename__ = 'hyperv_network_bindings' + + network_id = sa.Column(sa.String(36), + sa.ForeignKey('networks.id', ondelete="CASCADE"), + primary_key=True) + network_type = sa.Column(sa.String(32), nullable=False) + physical_network = sa.Column(sa.String(64)) + segmentation_id = sa.Column(sa.Integer) + + +#neutron/plugins/linuxbridge/db/l2network_models_v2.py +class NetworkState(BASEV2): + __tablename__ = 'network_states' + + physical_network = sa.Column(sa.String(64), nullable=False, + primary_key=True) + vlan_id = sa.Column(sa.Integer, nullable=False, primary_key=True, + autoincrement=False) + allocated = sa.Column(sa.Boolean, nullable=False) + + +#neutron/plugins/linuxbridge/db/l2network_models_v2.py +class NetworkBinding(BASEV2): + __tablename__ = 'network_bindings' + + network_id = sa.Column(sa.String(36), + sa.ForeignKey('networks.id', ondelete="CASCADE"), + primary_key=True) + physical_network = sa.Column(sa.String(64)) + vlan_id = sa.Column(sa.Integer, nullable=False) + + +#neutron/plugins/metaplugin/meta_models_v2.py +class NetworkFlavor(BASEV2): + flavor = sa.Column(sa.String(255)) + network_id = sa.Column(sa.String(36), sa.ForeignKey('networks.id', + ondelete="CASCADE"), + primary_key=True) + + +#neutron/plugins/metaplugin/meta_models_v2.py +class RouterFlavor(BASEV2): + flavor = sa.Column(sa.String(255)) + router_id = sa.Column(sa.String(36), sa.ForeignKey('routers.id', + ondelete="CASCADE"), + primary_key=True) + + +#neutron/plugins/ml2/drivers/brocade/db/models.py +class ML2_BrocadeNetwork(BASEV2, HasId, + HasTenant): + vlan = sa.Column(sa.String(10)) + segment_id = sa.Column(sa.String(36)) + network_type = sa.Column(sa.String(10)) + + +#neutron/plugins/ml2/drivers/brocade/db/models.py +class ML2_BrocadePort(BASEV2, HasId, + HasTenant): + network_id = sa.Column(sa.String(36), + sa.ForeignKey("ml2_brocadenetworks.id"), + nullable=False) + admin_state_up = sa.Column(sa.Boolean, nullable=False) + physical_interface = sa.Column(sa.String(36)) + vlan_id = sa.Column(sa.String(36)) + + +#neutron/plugins/ml2/drivers/cisco/apic/apic_model.py +class NetworkEPG(BASEV2): + __tablename__ = 'cisco_ml2_apic_epgs' + + network_id = sa.Column(sa.String(255), nullable=False, primary_key=True) + epg_id = sa.Column(sa.String(64), nullable=False) + segmentation_id = sa.Column(sa.String(64), nullable=False) + provider = sa.Column(sa.Boolean, default=False, + server_default=sa.sql.false(), nullable=False) + + +#neutron/plugins/ml2/drivers/cisco/apic/apic_model.py +class PortProfile(BASEV2): + __tablename__ = 'cisco_ml2_apic_port_profiles' + + node_id = sa.Column(sa.String(255), nullable=False, primary_key=True) + profile_id = sa.Column(sa.String(64), nullable=False) + hpselc_id = sa.Column(sa.String(64), nullable=False) + module = sa.Column(sa.String(10), nullable=False) + from_port = sa.Column(sa.Integer(), nullable=False) + to_port = sa.Column(sa.Integer(), nullable=False) + + +#neutron/plugins/ml2/drivers/cisco/apic/apic_model.py +class TenantContract(BASEV2, HasTenant): + __tablename__ = 'cisco_ml2_apic_contracts' + + __table_args__ = (sa.PrimaryKeyConstraint('tenant_id'),) + contract_id = sa.Column(sa.String(64), nullable=False) + filter_id = sa.Column(sa.String(64), nullable=False) + + +#neutron/plugins/ml2/drivers/cisco/nexus/nexus_models_v2.py +#class was renamed from NexusPortBinding to CiscoMl2NexusPortBinding +class CiscoMl2NexusPortBinding(BASEV2): + __tablename__ = "cisco_ml2_nexusport_bindings" + + binding_id = sa.Column(sa.Integer, primary_key=True, autoincrement=True) + port_id = sa.Column(sa.String(255)) + vlan_id = sa.Column(sa.Integer, nullable=False) + switch_ip = sa.Column(sa.String(255)) + instance_id = sa.Column(sa.String(255)) + + +#neutron/plugins/ml2/drivers/mech_arista/db.py +class AristaProvisionedNets(BASEV2, HasId, + HasTenant): + __tablename__ = 'arista_provisioned_nets' + + network_id = sa.Column(sa.String(UUID_LEN)) + segmentation_id = sa.Column(sa.Integer) + + +#neutron/plugins/ml2/drivers/mech_arista/db.py +class AristaProvisionedVms(BASEV2, HasId, + HasTenant): + __tablename__ = 'arista_provisioned_vms' + + vm_id = sa.Column(sa.String(STR_LEN)) + host_id = sa.Column(sa.String(STR_LEN)) + port_id = sa.Column(sa.String(UUID_LEN)) + network_id = sa.Column(sa.String(UUID_LEN)) + + +#neutron/plugins/ml2/drivers/mech_arista/db.py +class AristaProvisionedTenants(BASEV2, HasId, + HasTenant): + __tablename__ = 'arista_provisioned_tenants' + + +#neutron/plugins/ml2/drivers/type_flat.py +class FlatAllocation(BASEV2): + __tablename__ = 'ml2_flat_allocations' + + physical_network = sa.Column(sa.String(64), nullable=False, + primary_key=True) + + +#neutron/plugins/ml2/drivers/type_gre.py +class GreAllocation(BASEV2): + __tablename__ = 'ml2_gre_allocations' + + gre_id = sa.Column(sa.Integer, nullable=False, primary_key=True, + autoincrement=False) + allocated = sa.Column(sa.Boolean, nullable=False, default=False, + server_default=sa.sql.false()) + + +#neutron/plugins/ml2/drivers/type_gre.py +class GreEndpoints(BASEV2): + __tablename__ = 'ml2_gre_endpoints' + + ip_address = sa.Column(sa.String(64), primary_key=True) + + +#neutron/plugins/ml2/drivers/type_vlan.py +#class was renamed from VlanAllocation to Ml2VlanAllocation +class Ml2VlanAllocation(BASEV2): + __tablename__ = 'ml2_vlan_allocations' + + physical_network = sa.Column(sa.String(64), nullable=False, + primary_key=True) + vlan_id = sa.Column(sa.Integer, nullable=False, primary_key=True, + autoincrement=False) + allocated = sa.Column(sa.Boolean, nullable=False) + + +#neutron/plugins/ml2/drivers/type_vxlan.py +class VxlanAllocation(BASEV2): + __tablename__ = 'ml2_vxlan_allocations' + + vxlan_vni = sa.Column(sa.Integer, nullable=False, primary_key=True, + autoincrement=False) + allocated = sa.Column(sa.Boolean, nullable=False, default=False, + server_default=sa.sql.false()) + + +#neutron/plugins/ml2/drivers/type_vxlan.py +class VxlanEndpoints(BASEV2): + __tablename__ = 'ml2_vxlan_endpoints' + + ip_address = sa.Column(sa.String(64), primary_key=True) + udp_port = sa.Column(sa.Integer, primary_key=True, nullable=False, + autoincrement=False) + + +#neutron/plugins/ml2/models.py +class NetworkSegment(BASEV2, HasId): + __tablename__ = 'ml2_network_segments' + + network_id = sa.Column(sa.String(36), + sa.ForeignKey('networks.id', ondelete="CASCADE"), + nullable=False) + network_type = sa.Column(sa.String(32), nullable=False) + physical_network = sa.Column(sa.String(64)) + segmentation_id = sa.Column(sa.Integer) + + +#neutron/plugins/ml2/models.py +class PortBinding(BASEV2): + __tablename__ = 'ml2_port_bindings' + + port_id = sa.Column(sa.String(36), + sa.ForeignKey('ports.id', ondelete="CASCADE"), + primary_key=True) + host = sa.Column(sa.String(255), nullable=False, default='', + server_default='') + vnic_type = sa.Column(sa.String(64), nullable=False, + default=VNIC_NORMAL, server_default=VNIC_NORMAL) + profile = sa.Column(sa.String(BINDING_PROFILE_LEN), nullable=False, + default='', server_default='') + vif_type = sa.Column(sa.String(64), nullable=False) + vif_details = sa.Column(sa.String(4095), nullable=False, default='', + server_default='') + driver = sa.Column(sa.String(64)) + segment = sa.Column(sa.String(36), + sa.ForeignKey('ml2_network_segments.id', + ondelete="SET NULL")) + port = orm.relationship( + Port, + backref=orm.backref("port_binding", + lazy='joined', uselist=False, + cascade='delete')) + + +#neutron/plugins/mlnx/db/mlnx_models_v2.py +class SegmentationIdAllocation(BASEV2): + __tablename__ = 'segmentation_id_allocation' + + physical_network = sa.Column(sa.String(64), nullable=False, + primary_key=True) + segmentation_id = sa.Column(sa.Integer, nullable=False, primary_key=True, + autoincrement=False) + allocated = sa.Column(sa.Boolean, nullable=False, default=False, + server_default=sa.sql.false()) + + +#neutron/plugins/mlnx/db/mlnx_models_v2.py +#class was renamed from NetworkBinding to MlnxNetworkBinding +class MlnxNetworkBinding(BASEV2): + __tablename__ = 'mlnx_network_bindings' + + network_id = sa.Column(sa.String(36), + sa.ForeignKey('networks.id', ondelete="CASCADE"), + primary_key=True) + network_type = sa.Column(sa.String(32), nullable=False) + physical_network = sa.Column(sa.String(64)) + segmentation_id = sa.Column(sa.Integer, nullable=False) + + +#neutron/plugins/mlnx/db/mlnx_models_v2.py +class PortProfileBinding(BASEV2): + __tablename__ = 'port_profile' + + port_id = sa.Column(sa.String(36), + sa.ForeignKey('ports.id', ondelete="CASCADE"), + primary_key=True) + vnic_type = sa.Column(sa.String(32), nullable=False) + + +#neutron/plugins/nec/db/models.py +class OFCId(object): + ofc_id = sa.Column(sa.String(255), unique=True, nullable=False) + + +#neutron/plugins/nec/db/models.py +class NeutronId(object): + neutron_id = sa.Column(sa.String(36), primary_key=True) + + +#neutron/plugins/nec/db/models.py +class OFCTenantMapping(BASEV2, NeutronId, OFCId): + """Represents a Tenant on OpenFlow Network/Controller.""" + + +#neutron/plugins/nec/db/models.py +class OFCNetworkMapping(BASEV2, NeutronId, OFCId): + """Represents a Network on OpenFlow Network/Controller.""" + + +#neutron/plugins/nec/db/models.py +class OFCPortMapping(BASEV2, NeutronId, OFCId): + """Represents a Port on OpenFlow Network/Controller.""" + + +#neutron/plugins/nec/db/models.py +class OFCRouterMapping(BASEV2, NeutronId, OFCId): + """Represents a router on OpenFlow Network/Controller.""" + + +#neutron/plugins/nec/db/models.py +class OFCFilterMapping(BASEV2, NeutronId, OFCId): + """Represents a Filter on OpenFlow Network/Controller.""" + + +#neutron/plugins/nec/db/models.py +class PortInfo(BASEV2): + id = sa.Column(sa.String(36), + sa.ForeignKey('ports.id', ondelete="CASCADE"), + primary_key=True) + datapath_id = sa.Column(sa.String(36), nullable=False) + port_no = sa.Column(sa.Integer, nullable=False) + vlan_id = sa.Column(sa.Integer, nullable=False) + mac = sa.Column(sa.String(32), nullable=False) + port = orm.relationship( + Port, + backref=orm.backref("portinfo", + lazy='joined', uselist=False, + cascade='delete')) + + +#neutron/plugins/nec/db/packetfilter.py +class PacketFilter(BASEV2, HasId, HasTenant): + name = sa.Column(sa.String(255)) + network_id = sa.Column(sa.String(36), + sa.ForeignKey('networks.id', ondelete="CASCADE"), + nullable=False) + priority = sa.Column(sa.Integer, nullable=False) + action = sa.Column(sa.String(16), nullable=False) + in_port = sa.Column(sa.String(36), + sa.ForeignKey('ports.id', ondelete="CASCADE"), + nullable=True) + src_mac = sa.Column(sa.String(32), nullable=False) + dst_mac = sa.Column(sa.String(32), nullable=False) + eth_type = sa.Column(sa.Integer, nullable=False) + src_cidr = sa.Column(sa.String(64), nullable=False) + dst_cidr = sa.Column(sa.String(64), nullable=False) + protocol = sa.Column(sa.String(16), nullable=False) + src_port = sa.Column(sa.Integer, nullable=False) + dst_port = sa.Column(sa.Integer, nullable=False) + admin_state_up = sa.Column(sa.Boolean(), nullable=False) + status = sa.Column(sa.String(16), nullable=False) + + network = orm.relationship( + Network, + backref=orm.backref('packetfilters', lazy='joined', cascade='delete'), + uselist=False) + in_port_ref = orm.relationship( + Port, + backref=orm.backref('packetfilters', lazy='joined', cascade='delete'), + primaryjoin="Port.id==PacketFilter.in_port", + uselist=False) + + +#neutron/plugins/nec/db/router.py +class RouterProvider(BASEV2): + provider = sa.Column(sa.String(255)) + router_id = sa.Column(sa.String(36), + sa.ForeignKey('routers.id', ondelete="CASCADE"), + primary_key=True) + + router = orm.relationship(Router, uselist=False, + backref=orm.backref('provider', uselist=False, + lazy='joined', + cascade='delete')) + + +#neutron/plugins/nuage/nuage_models.py +class NetPartition(BASEV2, HasId): + __tablename__ = 'nuage_net_partitions' + name = sa.Column(sa.String(64)) + l3dom_tmplt_id = sa.Column(sa.String(36)) + l2dom_tmplt_id = sa.Column(sa.String(36)) + + +#neutron/plugins/nuage/nuage_models.py +class NetPartitionRouter(BASEV2): + __tablename__ = "nuage_net_partition_router_mapping" + net_partition_id = sa.Column(sa.String(36), + sa.ForeignKey('nuage_net_partitions.id', + ondelete="CASCADE"), + primary_key=True) + router_id = sa.Column(sa.String(36), + sa.ForeignKey('routers.id', ondelete="CASCADE"), + primary_key=True) + nuage_router_id = sa.Column(sa.String(36)) + + +#neutron/plugins/nuage/nuage_models.py +class RouterZone(BASEV2): + __tablename__ = "nuage_router_zone_mapping" + router_id = sa.Column(sa.String(36), + sa.ForeignKey('routers.id', ondelete="CASCADE"), + primary_key=True) + nuage_zone_id = sa.Column(sa.String(36)) + nuage_user_id = sa.Column(sa.String(36)) + nuage_group_id = sa.Column(sa.String(36)) + + +#neutron/plugins/nuage/nuage_models.py +class SubnetL2Domain(BASEV2): + __tablename__ = 'nuage_subnet_l2dom_mapping' + subnet_id = sa.Column(sa.String(36), + sa.ForeignKey('subnets.id', ondelete="CASCADE"), + primary_key=True) + net_partition_id = sa.Column(sa.String(36), + sa.ForeignKey('nuage_net_partitions.id', + ondelete="CASCADE")) + nuage_subnet_id = sa.Column(sa.String(36)) + nuage_l2dom_tmplt_id = sa.Column(sa.String(36)) + nuage_user_id = sa.Column(sa.String(36)) + nuage_group_id = sa.Column(sa.String(36)) + + +#neutron/plugins/nuage/nuage_models.py +class PortVPortMapping(BASEV2): + __tablename__ = 'nuage_port_mapping' + port_id = sa.Column(sa.String(36), + sa.ForeignKey('ports.id', ondelete="CASCADE"), + primary_key=True) + nuage_vport_id = sa.Column(sa.String(36)) + nuage_vif_id = sa.Column(sa.String(36)) + static_ip = sa.Column(sa.Boolean()) + + +#neutron/plugins/nuage/nuage_models.py +class RouterRoutesMapping(BASEV2, Route): + __tablename__ = 'nuage_routerroutes_mapping' + router_id = sa.Column(sa.String(36), + sa.ForeignKey('routers.id', + ondelete="CASCADE"), + primary_key=True, + nullable=False) + nuage_route_id = sa.Column(sa.String(36)) + + +#neutron/plugins/nuage/nuage_models.py +class FloatingIPPoolMapping(BASEV2): + __tablename__ = "nuage_floatingip_pool_mapping" + fip_pool_id = sa.Column(sa.String(36), primary_key=True) + net_id = sa.Column(sa.String(36), + sa.ForeignKey('networks.id', ondelete="CASCADE")) + router_id = sa.Column(sa.String(36)) + + +#neutron/plugins/nuage/nuage_models.py +class FloatingIPMapping(BASEV2): + __tablename__ = 'nuage_floatingip_mapping' + fip_id = sa.Column(sa.String(36), + sa.ForeignKey('floatingips.id', + ondelete="CASCADE"), + primary_key=True) + router_id = sa.Column(sa.String(36)) + nuage_fip_id = sa.Column(sa.String(36)) + + +#neutron/plugins/openvswitch/ovs_models_v2.py +#class was renamed from VlanAllocation to OvsVlanAllocation +class OvsVlanAllocation(BASEV2): + __tablename__ = 'ovs_vlan_allocations' + + physical_network = sa.Column(sa.String(64), + nullable=False, + primary_key=True) + vlan_id = sa.Column(sa.Integer, nullable=False, primary_key=True, + autoincrement=False) + allocated = sa.Column(sa.Boolean, nullable=False) + + +#neutron/plugins/openvswitch/ovs_models_v2.py +class TunnelAllocation(BASEV2): + __tablename__ = 'ovs_tunnel_allocations' + + tunnel_id = sa.Column(sa.Integer, nullable=False, primary_key=True, + autoincrement=False) + allocated = sa.Column(sa.Boolean, nullable=False) + + +#neutron/plugins/openvswitch/ovs_models_v2.py +#class was renamed from NetworkBinding to OvsNetworkBinding +class OvsNetworkBinding(BASEV2): + __tablename__ = 'ovs_network_bindings' + + network_id = sa.Column(sa.String(36), + sa.ForeignKey('networks.id', ondelete="CASCADE"), + primary_key=True) + # 'gre', 'vlan', 'flat', 'local' + network_type = sa.Column(sa.String(32), nullable=False) + physical_network = sa.Column(sa.String(64)) + segmentation_id = sa.Column(sa.Integer) # tunnel_id or vlan_id + + network = orm.relationship( + Network, + backref=orm.backref("binding", lazy='joined', + uselist=False, cascade='delete')) + + +#neutron/plugins/openvswitch/ovs_models_v2.py +class TunnelEndpoint(BASEV2): + __tablename__ = 'ovs_tunnel_endpoints' + __table_args__ = ( + schema.UniqueConstraint('id', name='uniq_ovs_tunnel_endpoints0id'), + BASEV2.__table_args__, + ) + + ip_address = sa.Column(sa.String(64), primary_key=True) + id = sa.Column(sa.Integer, nullable=False) + + +#neutron/plugins/ryu/db/models_v2.py +class TunnelKeyLast(BASEV2): + last_key = sa.Column(sa.Integer, primary_key=True) + + +#neutron/plugins/ryu/db/models_v2.py +class TunnelKey(BASEV2): + network_id = sa.Column(sa.String(36), sa.ForeignKey("networks.id"), + nullable=False) + tunnel_key = sa.Column(sa.Integer, primary_key=True, + nullable=False, autoincrement=False) + + +#neutron/plugins/vmware/dbexts/lsn_db.py +class LsnPort(BASEV2): + __tablename__ = 'lsn_port' + + lsn_port_id = sa.Column(sa.String(36), primary_key=True) + + lsn_id = sa.Column(sa.String(36), sa.ForeignKey('lsn.lsn_id', + ondelete="CASCADE"), + nullable=False) + sub_id = sa.Column(sa.String(36), nullable=False, unique=True) + mac_addr = sa.Column(sa.String(32), nullable=False, unique=True) + + +#neutron/plugins/vmware/dbexts/lsn_db.py +class Lsn(BASEV2): + __tablename__ = 'lsn' + + lsn_id = sa.Column(sa.String(36), primary_key=True) + net_id = sa.Column(sa.String(36), nullable=False) + + +#neutron/plugins/vmware/dbexts/maclearning.py +class MacLearningState(BASEV2): + port_id = sa.Column(sa.String(36), + sa.ForeignKey('ports.id', ondelete="CASCADE"), + primary_key=True) + mac_learning_enabled = sa.Column(sa.Boolean(), nullable=False) + port = orm.relationship( + Port, + backref=orm.backref("mac_learning_state", lazy='joined', + uselist=False, cascade='delete')) + + +#neutron/plugins/vmware/dbexts/models.py +class TzNetworkBinding(BASEV2): + __tablename__ = 'tz_network_bindings' + + network_id = sa.Column(sa.String(36), + sa.ForeignKey('networks.id', ondelete="CASCADE"), + primary_key=True) + binding_type = sa.Column(sa.Enum('flat', 'vlan', 'stt', 'gre', 'l3_ext', + name='tz_network_bindings_binding_type'), + nullable=False, primary_key=True) + phy_uuid = sa.Column(sa.String(36), primary_key=True, nullable=True) + vlan_id = sa.Column(sa.Integer, primary_key=True, nullable=True, + autoincrement=False) + + +#neutron/plugins/vmware/dbexts/models.py +class NeutronNsxNetworkMapping(BASEV2): + __tablename__ = 'neutron_nsx_network_mappings' + neutron_id = sa.Column(sa.String(36), + sa.ForeignKey('networks.id', ondelete='CASCADE'), + primary_key=True) + nsx_id = sa.Column(sa.String(36), primary_key=True) + + +#neutron/plugins/vmware/dbexts/models.py +class NeutronNsxSecurityGroupMapping(BASEV2): + __tablename__ = 'neutron_nsx_security_group_mappings' + neutron_id = sa.Column(sa.String(36), + sa.ForeignKey('securitygroups.id', + ondelete="CASCADE"), + primary_key=True) + nsx_id = sa.Column(sa.String(36), primary_key=True) + + +#neutron/plugins/vmware/dbexts/models.py +class NeutronNsxPortMapping(BASEV2): + __tablename__ = 'neutron_nsx_port_mappings' + neutron_id = sa.Column(sa.String(36), + sa.ForeignKey('ports.id', ondelete="CASCADE"), + primary_key=True) + nsx_switch_id = sa.Column(sa.String(36)) + nsx_port_id = sa.Column(sa.String(36), nullable=False) + + +#neutron/plugins/vmware/dbexts/models.py +class NeutronNsxRouterMapping(BASEV2): + __tablename__ = 'neutron_nsx_router_mappings' + neutron_id = sa.Column(sa.String(36), + sa.ForeignKey('routers.id', ondelete='CASCADE'), + primary_key=True) + nsx_id = sa.Column(sa.String(36)) + + +#neutron/plugins/vmware/dbexts/models.py +class MultiProviderNetworks(BASEV2): + __tablename__ = 'multi_provider_networks' + network_id = sa.Column(sa.String(36), + sa.ForeignKey('networks.id', ondelete="CASCADE"), + primary_key=True) + + +#neutron/plugins/vmware/dbexts/models.py +class NSXRouterExtAttributes(BASEV2): + router_id = sa.Column(sa.String(36), + sa.ForeignKey('routers.id', ondelete="CASCADE"), + primary_key=True) + distributed = sa.Column(sa.Boolean, default=False, + server_default=sa.sql.false(), nullable=False) + service_router = sa.Column(sa.Boolean, default=False, + server_default=sa.sql.false(), nullable=False) + router = orm.relationship( + Router, + backref=orm.backref("nsx_attributes", lazy='joined', + uselist=False, cascade='delete')) + + +#neutron/plugins/vmware/dbexts/networkgw_db.py +class NetworkConnection(BASEV2, HasTenant): + network_gateway_id = sa.Column(sa.String(36), + sa.ForeignKey('networkgateways.id', + ondelete='CASCADE')) + network_id = sa.Column(sa.String(36), + sa.ForeignKey('networks.id', ondelete='CASCADE')) + segmentation_type = sa.Column( + sa.Enum('flat', 'vlan', + name='networkconnections_segmentation_type')) + segmentation_id = sa.Column(sa.Integer) + __table_args__ = (sa.UniqueConstraint(network_gateway_id, + segmentation_type, + segmentation_id),) + port_id = sa.Column(sa.String(36), + sa.ForeignKey('ports.id', ondelete='CASCADE'), + primary_key=True) + + +#neutron/plugins/vmware/dbexts/networkgw_db.py +class NetworkGatewayDeviceReference(BASEV2): + id = sa.Column(sa.String(36), primary_key=True) + network_gateway_id = sa.Column(sa.String(36), + sa.ForeignKey('networkgateways.id', + ondelete='CASCADE'), + primary_key=True) + interface_name = sa.Column(sa.String(64), primary_key=True) + + +#neutron/plugins/vmware/dbexts/networkgw_db.py +class NetworkGatewayDevice(BASEV2, HasId, + HasTenant): + nsx_id = sa.Column(sa.String(36)) + # Optional name for the gateway device + name = sa.Column(sa.String(255)) + # Transport connector type. Not using enum as range of + # connector types might vary with backend version + connector_type = sa.Column(sa.String(10)) + # Transport connector IP Address + connector_ip = sa.Column(sa.String(64)) + # operational status + status = sa.Column(sa.String(16)) + + +#neutron/plugins/vmware/dbexts/networkgw_db.py +class NetworkGateway(BASEV2, HasId, + HasTenant): + name = sa.Column(sa.String(255)) + # Tenant id is nullable for this resource + tenant_id = sa.Column(sa.String(36)) + default = sa.Column(sa.Boolean()) + devices = orm.relationship(NetworkGatewayDeviceReference, + backref='networkgateways', + cascade='all,delete') + network_connections = orm.relationship(NetworkConnection, lazy='joined') + + +#neutron/plugins/vmware/dbexts/qos_db.py +class QoSQueue(BASEV2, HasId, HasTenant): + name = sa.Column(sa.String(255)) + default = sa.Column(sa.Boolean, default=False, + server_default=sa.sql.false()) + min = sa.Column(sa.Integer, nullable=False) + max = sa.Column(sa.Integer, nullable=True) + qos_marking = sa.Column(sa.Enum('untrusted', 'trusted', + name='qosqueues_qos_marking')) + dscp = sa.Column(sa.Integer) + + +#neutron/plugins/vmware/dbexts/qos_db.py +class PortQueueMapping(BASEV2): + port_id = sa.Column(sa.String(36), + sa.ForeignKey("ports.id", ondelete="CASCADE"), + primary_key=True) + + queue_id = sa.Column(sa.String(36), sa.ForeignKey("qosqueues.id"), + primary_key=True) + + # Add a relationship to the Port model adding a backref which will + # allow SQLAlchemy for eagerly load the queue binding + port = orm.relationship( + Port, + backref=orm.backref("qos_queue", uselist=False, + cascade='delete', lazy='joined')) + + +#neutron/plugins/vmware/dbexts/qos_db.py +class NetworkQueueMapping(BASEV2): + network_id = sa.Column(sa.String(36), + sa.ForeignKey("networks.id", ondelete="CASCADE"), + primary_key=True) + + queue_id = sa.Column(sa.String(36), sa.ForeignKey("qosqueues.id", + ondelete="CASCADE")) + + # Add a relationship to the Network model adding a backref which will + # allow SQLAlcremy for eagerly load the queue binding + network = orm.relationship( + Network, + backref=orm.backref("qos_queue", uselist=False, + cascade='delete', lazy='joined')) + + +#neutron/plugins/vmware/dbexts/vcns_models.py +class VcnsRouterBinding(BASEV2, HasStatusDescription): + __tablename__ = 'vcns_router_bindings' + + # no sa.ForeignKey to routers.id because for now, a router can be removed + # from routers when delete_router is executed, but the binding is only + # removed after the Edge is deleted + router_id = sa.Column(sa.String(36), + primary_key=True) + edge_id = sa.Column(sa.String(16), + nullable=True) + lswitch_id = sa.Column(sa.String(36), + nullable=False) + + +#neutron/plugins/vmware/dbexts/vcns_models.py +class VcnsEdgeFirewallRuleBinding(BASEV2): + __tablename__ = 'vcns_firewall_rule_bindings' + + rule_id = sa.Column(sa.String(36), + sa.ForeignKey("firewall_rules.id"), + primary_key=True) + edge_id = sa.Column(sa.String(36), primary_key=True) + rule_vseid = sa.Column(sa.String(36)) + + +#neutron/plugins/vmware/dbexts/vcns_models.py +class VcnsEdgePoolBinding(BASEV2): + __tablename__ = 'vcns_edge_pool_bindings' + + pool_id = sa.Column(sa.String(36), + sa.ForeignKey("pools.id", ondelete="CASCADE"), + primary_key=True) + edge_id = sa.Column(sa.String(36), primary_key=True) + pool_vseid = sa.Column(sa.String(36)) + + +#neutron/plugins/vmware/dbexts/vcns_models.py +class VcnsEdgeVipBinding(BASEV2): + __tablename__ = 'vcns_edge_vip_bindings' + + vip_id = sa.Column(sa.String(36), + sa.ForeignKey("vips.id", ondelete="CASCADE"), + primary_key=True) + edge_id = sa.Column(sa.String(36)) + vip_vseid = sa.Column(sa.String(36)) + app_profileid = sa.Column(sa.String(36)) + + +#neutron/plugins/vmware/dbexts/vcns_models.py +class VcnsEdgeMonitorBinding(BASEV2): + __tablename__ = 'vcns_edge_monitor_bindings' + + monitor_id = sa.Column(sa.String(36), + sa.ForeignKey("healthmonitors.id", + ondelete="CASCADE"), + primary_key=True) + edge_id = sa.Column(sa.String(36), primary_key=True) + monitor_vseid = sa.Column(sa.String(36)) + + +#neutron/services/loadbalancer/agent_scheduler.py +class PoolLoadbalancerAgentBinding(BASEV2): + pool_id = sa.Column(sa.String(36), + sa.ForeignKey("pools.id", ondelete='CASCADE'), + primary_key=True) + agent = orm.relation(Agent) + agent_id = sa.Column(sa.String(36), sa.ForeignKey("agents.id", + ondelete='CASCADE'), + nullable=False) + + +#neutron/services/loadbalancer/drivers/embrane/models.py +class PoolPort(BASEV2): + __tablename__ = 'embrane_pool_port' + + pool_id = sa.Column(sa.String(36), sa.ForeignKey('pools.id'), + primary_key=True) + port_id = sa.Column(sa.String(36), sa.ForeignKey('ports.id'), + nullable=False) + + +#neutron/services/vpn/service_drivers/cisco_csr_db.py +class IdentifierMap(BASEV2, HasTenant): + __tablename__ = 'cisco_csr_identifier_map' + + ipsec_site_conn_id = sa.Column(sa.String(64), + sa.ForeignKey('ipsec_site_connections.id', + ondelete="CASCADE"), + primary_key=True) + csr_tunnel_id = sa.Column(sa.Integer, nullable=False) + csr_ike_policy_id = sa.Column(sa.Integer, nullable=False) + csr_ipsec_policy_id = sa.Column(sa.Integer, nullable=False) + + +def get_metadata(): + return BASEV2.metadata diff --git a/neutron/db/migration/models/head.py b/neutron/db/migration/models/head.py new file mode 100644 index 000000000..8bbfe21a7 --- /dev/null +++ b/neutron/db/migration/models/head.py @@ -0,0 +1,86 @@ +# Copyright (c) 2014 OpenStack Foundation. +# 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. + +""" +The module provides all database models at current HEAD. + +Its purpose is to create comparable metadata with current database schema. +Based on this comparison database can be healed with healing migration. + +""" + +from neutron.db import agents_db # noqa +from neutron.db import agentschedulers_db # noqa +from neutron.db import allowedaddresspairs_db # noqa +from neutron.db import external_net_db # noqa +from neutron.db import extradhcpopt_db # noqa +from neutron.db import extraroute_db # noqa +from neutron.db.firewall import firewall_db # noqa +from neutron.db import l3_agentschedulers_db # noqa +from neutron.db import l3_db # noqa +from neutron.db import l3_gwmode_db # noqa +from neutron.db.loadbalancer import loadbalancer_db # noqa +from neutron.db.metering import metering_db # noqa +from neutron.db import model_base +from neutron.db import models_v2 # noqa +from neutron.db import portbindings_db # noqa +from neutron.db import portsecurity_db # noqa +from neutron.db import quota_db # noqa +from neutron.db import routedserviceinsertion_db # noqa +from neutron.db import routerservicetype_db # noqa +from neutron.db import securitygroups_db # noqa +from neutron.db import servicetype_db # noqa +from neutron.db.vpn import vpn_db # noqa +from neutron.plugins.bigswitch.db import consistency_db # noqa +from neutron.plugins.bigswitch import routerrule_db # noqa +from neutron.plugins.brocade.db import models as brocade_models # noqa +from neutron.plugins.cisco.db import n1kv_models_v2 # noqa +from neutron.plugins.cisco.db import network_models_v2 # noqa +from neutron.plugins.cisco.db import nexus_models_v2 # noqa +from neutron.plugins.hyperv import model # noqa +from neutron.plugins.linuxbridge.db import l2network_models_v2 # noqa +from neutron.plugins.metaplugin import meta_models_v2 # noqa +from neutron.plugins.ml2.drivers.brocade.db import ( # noqa + models as ml2_brocade_models) +from neutron.plugins.ml2.drivers.cisco.apic import apic_model # noqa +from neutron.plugins.ml2.drivers.cisco.nexus import ( # noqa + nexus_models_v2 as ml2_nexus_models_v2) +from neutron.plugins.ml2.drivers.mech_arista import db # noqa +from neutron.plugins.ml2.drivers import type_flat # noqa +from neutron.plugins.ml2.drivers import type_gre # noqa +from neutron.plugins.ml2.drivers import type_vlan # noqa +from neutron.plugins.ml2.drivers import type_vxlan # noqa +from neutron.plugins.ml2 import models # noqa +from neutron.plugins.mlnx.db import mlnx_models_v2 # noqa +from neutron.plugins.nec.db import models as nec_models # noqa +from neutron.plugins.nec.db import packetfilter as nec_packetfilter # noqa +from neutron.plugins.nec.db import router # noqa +from neutron.plugins.nuage import nuage_models # noqa +from neutron.plugins.openvswitch import ovs_models_v2 # noqa +from neutron.plugins.ryu.db import models_v2 as ryu_models_v2 # noqa +from neutron.plugins.vmware.dbexts import lsn_db # noqa +from neutron.plugins.vmware.dbexts import maclearning # noqa +from neutron.plugins.vmware.dbexts import models as vmware_models # noqa +from neutron.plugins.vmware.dbexts import networkgw_db # noqa +from neutron.plugins.vmware.dbexts import qos_db # noqa +from neutron.plugins.vmware.dbexts import vcns_models # noqa +from neutron.services.loadbalancer import agent_scheduler # noqa +from neutron.services.loadbalancer.drivers.embrane import ( # noqa + models as embrane_models) +from neutron.services.vpn.service_drivers import cisco_csr_db # noqa + + +def get_metadata(): + return model_base.BASEV2.metadata diff --git a/neutron/tests/functional/db/__init__.py b/neutron/tests/functional/db/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/neutron/tests/functional/db/test_models.py b/neutron/tests/functional/db/test_models.py new file mode 100644 index 000000000..939617177 --- /dev/null +++ b/neutron/tests/functional/db/test_models.py @@ -0,0 +1,42 @@ +# Copyright (c) 2014 OpenStack Foundation. +# 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. + +import sqlalchemy + +from neutron.tests import base + + +class TestDBCreation(base.BaseTestCase): + """Check database schema can be created without conflicts. + + For each test case is created a SQLite memory database. + + """ + + def setUp(self): + super(TestDBCreation, self).setUp() + self.engine = sqlalchemy.create_engine('sqlite://') + + def _test_creation(self, module): + metadata = module.get_metadata() + metadata.create_all(self.engine) + + def test_head_creation(self): + from neutron.db.migration.models import head + self._test_creation(head) + + def test_frozen_creation(self): + from neutron.db.migration.models import frozen + self._test_creation(frozen) -- 2.45.2