
SQLAlchemy Query.all() method doesn't raise NoResultFound exception in case if no result is found but rather returns an empty list. So this pattern which is common for our code doesn't make sense and should be fixed: try: dns_qry = context.session.query(models_v2.DNSNameServer) return dns_qry.filter_by(subnet_id=subnet_id).all() except exc.NoResultFound: return [] Fixes bug 1173131. Change-Id: I19b64eecd6edac0dba7dd0bf2ab32690c46e4f8b
351 lines
11 KiB
Python
351 lines
11 KiB
Python
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
|
|
# Copyright 2011, Cisco Systems, Inc.
|
|
#
|
|
# 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: Rohit Agarwalla, Cisco Systems, Inc.
|
|
|
|
from sqlalchemy.orm import exc
|
|
|
|
from quantum.common import exceptions as q_exc
|
|
from quantum.openstack.common import log as logging
|
|
from quantum.plugins.cisco.common import cisco_exceptions as c_exc
|
|
from quantum.plugins.cisco.common import config
|
|
from quantum.plugins.cisco.db import l2network_models
|
|
|
|
import quantum.plugins.cisco.db.api as db
|
|
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
def initialize():
|
|
"""Establish database connection and load models."""
|
|
db.configure_db()
|
|
|
|
|
|
def create_vlanids():
|
|
"""Prepopulates the vlan_bindings table."""
|
|
LOG.debug(_("create_vlanids() called"))
|
|
session = db.get_session()
|
|
try:
|
|
vlanid = session.query(l2network_models.VlanID).one()
|
|
except exc.MultipleResultsFound:
|
|
pass
|
|
except exc.NoResultFound:
|
|
start = int(config.CISCO.vlan_start)
|
|
end = int(config.CISCO.vlan_end)
|
|
while start <= end:
|
|
vlanid = l2network_models.VlanID(start)
|
|
session.add(vlanid)
|
|
start += 1
|
|
session.flush()
|
|
return
|
|
|
|
|
|
def get_all_vlanids():
|
|
"""Gets all the vlanids."""
|
|
LOG.debug(_("get_all_vlanids() called"))
|
|
session = db.get_session()
|
|
return session.query(l2network_models.VlanID).all()
|
|
|
|
|
|
def is_vlanid_used(vlan_id):
|
|
"""Checks if a vlanid is in use."""
|
|
LOG.debug(_("is_vlanid_used() called"))
|
|
session = db.get_session()
|
|
try:
|
|
vlanid = (session.query(l2network_models.VlanID).
|
|
filter_by(vlan_id=vlan_id).one())
|
|
return vlanid["vlan_used"]
|
|
except exc.NoResultFound:
|
|
raise c_exc.VlanIDNotFound(vlan_id=vlan_id)
|
|
|
|
|
|
def release_vlanid(vlan_id):
|
|
"""Sets the vlanid state to be unused."""
|
|
LOG.debug(_("release_vlanid() called"))
|
|
session = db.get_session()
|
|
try:
|
|
vlanid = (session.query(l2network_models.VlanID).
|
|
filter_by(vlan_id=vlan_id).one())
|
|
vlanid["vlan_used"] = False
|
|
session.merge(vlanid)
|
|
session.flush()
|
|
return vlanid["vlan_used"]
|
|
except exc.NoResultFound:
|
|
raise c_exc.VlanIDNotFound(vlan_id=vlan_id)
|
|
return
|
|
|
|
|
|
def delete_vlanid(vlan_id):
|
|
"""Deletes a vlanid entry from db."""
|
|
LOG.debug(_("delete_vlanid() called"))
|
|
session = db.get_session()
|
|
try:
|
|
vlanid = (session.query(l2network_models.VlanID).
|
|
filter_by(vlan_id=vlan_id).one())
|
|
session.delete(vlanid)
|
|
session.flush()
|
|
return vlanid
|
|
except exc.NoResultFound:
|
|
pass
|
|
|
|
|
|
def reserve_vlanid():
|
|
"""Reserves the first unused vlanid."""
|
|
LOG.debug(_("reserve_vlanid() called"))
|
|
session = db.get_session()
|
|
try:
|
|
rvlan = (session.query(l2network_models.VlanID).
|
|
filter_by(vlan_used=False).first())
|
|
if not rvlan:
|
|
raise exc.NoResultFound
|
|
rvlanid = (session.query(l2network_models.VlanID).
|
|
filter_by(vlan_id=rvlan["vlan_id"]).one())
|
|
rvlanid["vlan_used"] = True
|
|
session.merge(rvlanid)
|
|
session.flush()
|
|
return rvlan["vlan_id"]
|
|
except exc.NoResultFound:
|
|
raise c_exc.VlanIDNotAvailable()
|
|
|
|
|
|
def get_all_vlanids_used():
|
|
"""Gets all the vlanids used."""
|
|
LOG.debug(_("get_all_vlanids() called"))
|
|
session = db.get_session()
|
|
return (session.query(l2network_models.VlanID).
|
|
filter_by(vlan_used=True).all())
|
|
|
|
|
|
def get_all_vlan_bindings():
|
|
"""Lists all the vlan to network associations."""
|
|
LOG.debug(_("get_all_vlan_bindings() called"))
|
|
session = db.get_session()
|
|
return session.query(l2network_models.VlanBinding).all()
|
|
|
|
|
|
def get_vlan_binding(netid):
|
|
"""Lists the vlan given a network_id."""
|
|
LOG.debug(_("get_vlan_binding() called"))
|
|
session = db.get_session()
|
|
try:
|
|
binding = (session.query(l2network_models.VlanBinding).
|
|
filter_by(network_id=netid).one())
|
|
return binding
|
|
except exc.NoResultFound:
|
|
raise q_exc.NetworkNotFound(net_id=netid)
|
|
|
|
|
|
def add_vlan_binding(vlanid, vlanname, netid):
|
|
"""Adds a vlan to network association."""
|
|
LOG.debug(_("add_vlan_binding() called"))
|
|
session = db.get_session()
|
|
try:
|
|
binding = (session.query(l2network_models.VlanBinding).
|
|
filter_by(vlan_id=vlanid).one())
|
|
raise c_exc.NetworkVlanBindingAlreadyExists(vlan_id=vlanid,
|
|
network_id=netid)
|
|
except exc.NoResultFound:
|
|
binding = l2network_models.VlanBinding(vlanid, vlanname, netid)
|
|
session.add(binding)
|
|
session.flush()
|
|
return binding
|
|
|
|
|
|
def remove_vlan_binding(netid):
|
|
"""Removes a vlan to network association."""
|
|
LOG.debug(_("remove_vlan_binding() called"))
|
|
session = db.get_session()
|
|
try:
|
|
binding = (session.query(l2network_models.VlanBinding).
|
|
filter_by(network_id=netid).one())
|
|
session.delete(binding)
|
|
session.flush()
|
|
return binding
|
|
except exc.NoResultFound:
|
|
pass
|
|
|
|
|
|
def update_vlan_binding(netid, newvlanid=None, newvlanname=None):
|
|
"""Updates a vlan to network association."""
|
|
LOG.debug(_("update_vlan_binding() called"))
|
|
session = db.get_session()
|
|
try:
|
|
binding = (session.query(l2network_models.VlanBinding).
|
|
filter_by(network_id=netid).one())
|
|
if newvlanid:
|
|
binding["vlan_id"] = newvlanid
|
|
if newvlanname:
|
|
binding["vlan_name"] = newvlanname
|
|
session.merge(binding)
|
|
session.flush()
|
|
return binding
|
|
except exc.NoResultFound:
|
|
raise q_exc.NetworkNotFound(net_id=netid)
|
|
|
|
|
|
def get_all_qoss(tenant_id):
|
|
"""Lists all the qos to tenant associations."""
|
|
LOG.debug(_("get_all_qoss() called"))
|
|
session = db.get_session()
|
|
return (session.query(l2network_models.QoS).
|
|
filter_by(tenant_id=tenant_id).all())
|
|
|
|
|
|
def get_qos(tenant_id, qos_id):
|
|
"""Lists the qos given a tenant_id and qos_id."""
|
|
LOG.debug(_("get_qos() called"))
|
|
session = db.get_session()
|
|
try:
|
|
qos = (session.query(l2network_models.QoS).
|
|
filter_by(tenant_id=tenant_id).
|
|
filter_by(qos_id=qos_id).one())
|
|
return qos
|
|
except exc.NoResultFound:
|
|
raise c_exc.QosNotFound(qos_id=qos_id,
|
|
tenant_id=tenant_id)
|
|
|
|
|
|
def add_qos(tenant_id, qos_name, qos_desc):
|
|
"""Adds a qos to tenant association."""
|
|
LOG.debug(_("add_qos() called"))
|
|
session = db.get_session()
|
|
try:
|
|
qos = (session.query(l2network_models.QoS).
|
|
filter_by(tenant_id=tenant_id).
|
|
filter_by(qos_name=qos_name).one())
|
|
raise c_exc.QosNameAlreadyExists(qos_name=qos_name,
|
|
tenant_id=tenant_id)
|
|
except exc.NoResultFound:
|
|
qos = l2network_models.QoS(tenant_id, qos_name, qos_desc)
|
|
session.add(qos)
|
|
session.flush()
|
|
return qos
|
|
|
|
|
|
def remove_qos(tenant_id, qos_id):
|
|
"""Removes a qos to tenant association."""
|
|
session = db.get_session()
|
|
try:
|
|
qos = (session.query(l2network_models.QoS).
|
|
filter_by(tenant_id=tenant_id).
|
|
filter_by(qos_id=qos_id).one())
|
|
session.delete(qos)
|
|
session.flush()
|
|
return qos
|
|
except exc.NoResultFound:
|
|
pass
|
|
|
|
|
|
def update_qos(tenant_id, qos_id, new_qos_name=None):
|
|
"""Updates a qos to tenant association."""
|
|
session = db.get_session()
|
|
try:
|
|
qos = (session.query(l2network_models.QoS).
|
|
filter_by(tenant_id=tenant_id).
|
|
filter_by(qos_id=qos_id).one())
|
|
if new_qos_name:
|
|
qos["qos_name"] = new_qos_name
|
|
session.merge(qos)
|
|
session.flush()
|
|
return qos
|
|
except exc.NoResultFound:
|
|
raise c_exc.QosNotFound(qos_id=qos_id,
|
|
tenant_id=tenant_id)
|
|
|
|
|
|
def get_all_credentials(tenant_id):
|
|
"""Lists all the creds for a tenant."""
|
|
session = db.get_session()
|
|
return (session.query(l2network_models.Credential).
|
|
filter_by(tenant_id=tenant_id).all())
|
|
|
|
|
|
def get_credential(tenant_id, credential_id):
|
|
"""Lists the creds for given a cred_id and tenant_id."""
|
|
session = db.get_session()
|
|
try:
|
|
cred = (session.query(l2network_models.Credential).
|
|
filter_by(tenant_id=tenant_id).
|
|
filter_by(credential_id=credential_id).one())
|
|
return cred
|
|
except exc.NoResultFound:
|
|
raise c_exc.CredentialNotFound(credential_id=credential_id,
|
|
tenant_id=tenant_id)
|
|
|
|
|
|
def get_credential_name(tenant_id, credential_name):
|
|
"""Lists the creds for given a cred_name and tenant_id."""
|
|
session = db.get_session()
|
|
try:
|
|
cred = (session.query(l2network_models.Credential).
|
|
filter_by(tenant_id=tenant_id).
|
|
filter_by(credential_name=credential_name).one())
|
|
return cred
|
|
except exc.NoResultFound:
|
|
raise c_exc.CredentialNameNotFound(credential_name=credential_name,
|
|
tenant_id=tenant_id)
|
|
|
|
|
|
def add_credential(tenant_id, credential_name, user_name, password):
|
|
"""Adds a qos to tenant association."""
|
|
session = db.get_session()
|
|
try:
|
|
cred = (session.query(l2network_models.Credential).
|
|
filter_by(tenant_id=tenant_id).
|
|
filter_by(credential_name=credential_name).one())
|
|
raise c_exc.CredentialAlreadyExists(credential_name=credential_name,
|
|
tenant_id=tenant_id)
|
|
except exc.NoResultFound:
|
|
cred = l2network_models.Credential(tenant_id, credential_name,
|
|
user_name, password)
|
|
session.add(cred)
|
|
session.flush()
|
|
return cred
|
|
|
|
|
|
def remove_credential(tenant_id, credential_id):
|
|
"""Removes a credential from a tenant."""
|
|
session = db.get_session()
|
|
try:
|
|
cred = (session.query(l2network_models.Credential).
|
|
filter_by(tenant_id=tenant_id).
|
|
filter_by(credential_id=credential_id).one())
|
|
session.delete(cred)
|
|
session.flush()
|
|
return cred
|
|
except exc.NoResultFound:
|
|
pass
|
|
|
|
|
|
def update_credential(tenant_id, credential_id,
|
|
new_user_name=None, new_password=None):
|
|
"""Updates a credential for a tenant."""
|
|
session = db.get_session()
|
|
try:
|
|
cred = (session.query(l2network_models.Credential).
|
|
filter_by(tenant_id=tenant_id).
|
|
filter_by(credential_id=credential_id).one())
|
|
if new_user_name:
|
|
cred["user_name"] = new_user_name
|
|
if new_password:
|
|
cred["password"] = new_password
|
|
session.merge(cred)
|
|
session.flush()
|
|
return cred
|
|
except exc.NoResultFound:
|
|
raise c_exc.CredentialNotFound(credential_id=credential_id,
|
|
tenant_id=tenant_id)
|