15
15
# under the License.
16
16
# @author: Rohit Agarwalla, Cisco Systems, Inc.
18
from sqlalchemy.orm import exc
18
from sqlalchemy import create_engine
19
from sqlalchemy.orm import sessionmaker, exc, joinedload
20
21
import l2network_models
21
import quantum.db.api as db
22
import quantum.db.models as models
24
from quantum.common import exceptions as q_exc
29
BASE = l2network_models.BASE
32
def configure_db(options):
34
Establish the database, create an engine if needed, and
37
:param options: Mapping of configuration options
41
_ENGINE = create_engine(options['sql_connection'],
51
for table in reversed(BASE.metadata.sorted_tables):
52
_ENGINE.execute(table.delete())
55
def get_session(autocommit=True, expire_on_commit=False):
56
"""Helper method to grab session"""
57
global _MAKER, _ENGINE
60
_MAKER = sessionmaker(bind=_ENGINE,
61
autocommit=autocommit,
62
expire_on_commit=expire_on_commit)
66
def register_models():
67
"""Register Models and create properties"""
70
BASE.metadata.create_all(_ENGINE)
73
def unregister_models():
74
"""Unregister Models, useful clearing out data before testing"""
77
BASE.metadata.drop_all(_ENGINE)
80
def _check_duplicate_net_name(tenant_id, net_name):
81
session = get_session()
83
net = session.query(l2network_models.Network).\
84
filter_by(tenant_id=tenant_id, name=net_name).\
86
raise q_exc.NetworkNameExists(tenant_id=tenant_id,
87
net_name=net_name, net_id=net.uuid)
88
except exc.NoResultFound:
89
# this is the "normal" path, as API spec specifies
90
# that net-names are unique within a tenant
94
def network_create(tenant_id, name):
95
session = get_session()
97
_check_duplicate_net_name(tenant_id, name)
99
net = l2network_models.Network(tenant_id, name)
105
def network_list(tenant_id):
106
session = get_session()
107
return session.query(l2network_models.Network).\
108
options(joinedload(l2network_models.Network.ports)). \
109
filter_by(tenant_id=tenant_id).\
113
def network_get(net_id):
114
session = get_session()
116
return session.query(l2network_models.Network).\
117
filter_by(uuid=net_id).\
119
except exc.NoResultFound, e:
120
raise q_exc.NetworkNotFound(net_id=net_id)
123
def network_rename(net_id, tenant_id, new_name):
124
session = get_session()
125
net = network_get(net_id)
126
_check_duplicate_net_name(tenant_id, new_name)
133
def network_destroy(net_id):
134
session = get_session()
136
net = session.query(l2network_models.Network).\
137
filter_by(uuid=net_id).\
142
except exc.NoResultFound:
143
raise q_exc.NetworkNotFound(net_id=net_id)
146
def port_create(net_id, state=None):
147
# confirm network exists
150
session = get_session()
151
with session.begin():
152
port = l2network_models.Port(net_id)
153
port['state'] = state or 'DOWN'
159
def port_list(net_id):
160
session = get_session()
161
return session.query(l2network_models.Port).\
162
options(joinedload(l2network_models.Port.network)). \
163
filter_by(network_id=net_id).\
167
def port_get(port_id, net_id):
168
# confirm network exists
170
session = get_session()
172
return session.query(l2network_models.Port).\
173
filter_by(uuid=port_id).\
174
filter_by(network_id=net_id).\
176
except exc.NoResultFound:
177
raise q_exc.PortNotFound(net_id=net_id, port_id=port_id)
180
def port_set_state(port_id, net_id, new_state):
181
if new_state not in ('ACTIVE', 'DOWN'):
182
raise q_exc.StateInvalid(port_state=new_state)
184
# confirm network exists
187
port = port_get(port_id, net_id)
188
session = get_session()
189
port.state = new_state
195
def port_set_attachment(port_id, net_id, new_interface_id):
196
# confirm network exists
199
session = get_session()
200
port = port_get(port_id, net_id)
202
if new_interface_id != "":
203
# We are setting, not clearing, the attachment-id
204
if port['interface_id']:
205
raise q_exc.PortInUse(net_id=net_id, port_id=port_id,
206
att_id=port['interface_id'])
209
port = session.query(l2network_models.Port).\
210
filter_by(interface_id=new_interface_id).\
212
raise q_exc.AlreadyAttached(net_id=net_id,
214
att_id=new_interface_id,
215
att_port_id=port['uuid'])
216
except exc.NoResultFound:
217
# this is what should happen
219
port.interface_id = new_interface_id
225
def port_unset_attachment(port_id, net_id):
226
# confirm network exists
229
session = get_session()
230
port = port_get(port_id, net_id)
231
port.interface_id = None
236
def port_destroy(port_id, net_id):
237
# confirm network exists
240
session = get_session()
242
port = session.query(l2network_models.Port).\
243
filter_by(uuid=port_id).\
244
filter_by(network_id=net_id).\
246
if port['interface_id']:
247
raise q_exc.PortInUse(net_id=net_id, port_id=port_id,
248
att_id=port['interface_id'])
252
except exc.NoResultFound:
253
raise q_exc.PortNotFound(port_id=port_id)
25
256
def get_all_vlan_bindings():
26
257
"""Lists all the vlan to network associations"""
27
session = db.get_session()
258
session = get_session()
29
260
bindings = session.query(l2network_models.VlanBinding).\