1f745f82a5
Implements: blueprint cisco-routing-service-vm Change-Id: Ifd021fa06ce34d622e61734aab94b4da32649c4a
100 lines
4.4 KiB
Python
100 lines
4.4 KiB
Python
# Copyright 2014 Cisco Systems, 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: Bob Melander, Cisco Systems, Inc.
|
|
|
|
import sqlalchemy as sa
|
|
from sqlalchemy import orm
|
|
|
|
from neutron.db import agents_db
|
|
from neutron.db import l3_db
|
|
from neutron.db import model_base
|
|
from neutron.db import models_v2
|
|
|
|
|
|
class HostingDevice(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):
|
|
"""Represents an appliance hosting Neutron router(s).
|
|
|
|
When the hosting device is a Nova VM 'id' is uuid of that VM.
|
|
"""
|
|
__tablename__ = 'cisco_hosting_devices'
|
|
|
|
# complementary id to enable identification of associated Neutron resources
|
|
complementary_id = sa.Column(sa.String(36))
|
|
# manufacturer id of the device, e.g., its serial number
|
|
device_id = sa.Column(sa.String(255))
|
|
admin_state_up = sa.Column(sa.Boolean, nullable=False, default=True)
|
|
# 'management_port_id' is the Neutron Port used for management interface
|
|
management_port_id = sa.Column(sa.String(36),
|
|
sa.ForeignKey('ports.id',
|
|
ondelete="SET NULL"))
|
|
management_port = orm.relationship(models_v2.Port)
|
|
# 'protocol_port' is udp/tcp port of hosting device. May be empty.
|
|
protocol_port = sa.Column(sa.Integer)
|
|
cfg_agent_id = sa.Column(sa.String(36),
|
|
sa.ForeignKey('agents.id'),
|
|
nullable=True)
|
|
cfg_agent = orm.relationship(agents_db.Agent)
|
|
# Service VMs take time to boot so we store creation time
|
|
# so we can give preference to older ones when scheduling
|
|
created_at = sa.Column(sa.DateTime, nullable=False)
|
|
status = sa.Column(sa.String(16))
|
|
|
|
|
|
class HostedHostingPortBinding(model_base.BASEV2):
|
|
"""Represents binding of logical resource's port to its hosting port."""
|
|
__tablename__ = 'cisco_port_mappings'
|
|
|
|
logical_resource_id = sa.Column(sa.String(36), primary_key=True)
|
|
logical_port_id = sa.Column(sa.String(36),
|
|
sa.ForeignKey('ports.id',
|
|
ondelete="CASCADE"),
|
|
primary_key=True)
|
|
logical_port = orm.relationship(
|
|
models_v2.Port,
|
|
primaryjoin='Port.id==HostedHostingPortBinding.logical_port_id',
|
|
backref=orm.backref('hosting_info', cascade='all', uselist=False))
|
|
# type of hosted port, e.g., router_interface, ..._gateway, ..._floatingip
|
|
port_type = sa.Column(sa.String(32))
|
|
# type of network the router port belongs to
|
|
network_type = sa.Column(sa.String(32))
|
|
hosting_port_id = sa.Column(sa.String(36),
|
|
sa.ForeignKey('ports.id',
|
|
ondelete='CASCADE'))
|
|
hosting_port = orm.relationship(
|
|
models_v2.Port,
|
|
primaryjoin='Port.id==HostedHostingPortBinding.hosting_port_id')
|
|
# VLAN tag for trunk ports
|
|
segmentation_id = sa.Column(sa.Integer, autoincrement=False)
|
|
|
|
|
|
class RouterHostingDeviceBinding(model_base.BASEV2):
|
|
"""Represents binding between Neutron routers and their hosting devices."""
|
|
__tablename__ = 'cisco_router_mappings'
|
|
|
|
router_id = sa.Column(sa.String(36),
|
|
sa.ForeignKey('routers.id', ondelete='CASCADE'),
|
|
primary_key=True)
|
|
router = orm.relationship(
|
|
l3_db.Router,
|
|
backref=orm.backref('hosting_info', cascade='all', uselist=False))
|
|
# If 'auto_schedule' is True then router is automatically scheduled
|
|
# if it lacks a hosting device or its hosting device fails.
|
|
auto_schedule = sa.Column(sa.Boolean, default=True, nullable=False)
|
|
# id of hosting device hosting this router, None/NULL if unscheduled.
|
|
hosting_device_id = sa.Column(sa.String(36),
|
|
sa.ForeignKey('cisco_hosting_devices.id',
|
|
ondelete='SET NULL'))
|
|
hosting_device = orm.relationship(HostingDevice)
|