36
36
from sqlalchemy import Integer
37
37
from sqlalchemy import MetaData
38
38
from sqlalchemy import or_
39
from sqlalchemy.orm import contains_eager
39
40
from sqlalchemy.orm import joinedload
40
41
from sqlalchemy.orm import joinedload_all
41
42
from sqlalchemy.schema import Table
1690
1691
# For other filters that don't match this, we will do regexp matching
1691
1692
exact_match_filter_names = ['project_id', 'user_id', 'image_ref',
1692
1693
'vm_state', 'instance_type_id', 'uuid',
1694
'metadata', 'task_state']
1695
1696
# Filter the query
1696
1697
query_prefix = exact_filter(query_prefix, models.Instance,
3558
3561
instance_type_get_by_flavor_id(context, values['flavorid'],
3562
read_deleted='no', session=session)
3560
3563
raise exception.InstanceTypeIdExists(flavor_id=values['flavorid'])
3561
3564
except exception.FlavorNotFound:
3600
3603
def _instance_type_get_query(context, session=None, read_deleted=None):
3601
return model_query(context, models.InstanceTypes, session=session,
3604
query = model_query(context, models.InstanceTypes, session=session,
3602
3605
read_deleted=read_deleted).\
3603
options(joinedload('extra_specs'))
3606
options(joinedload('extra_specs'))
3607
if not context.is_admin:
3608
the_filter = [models.InstanceTypes.is_public == True]
3610
models.InstanceTypes.projects.any(project_id=context.project_id)
3612
query = query.filter(or_(*the_filter))
3606
3616
@require_context
3677
3687
@require_context
3678
def instance_type_get_by_flavor_id(context, flavor_id, session=None):
3688
def instance_type_get_by_flavor_id(context, flavor_id, read_deleted,
3679
3690
"""Returns a dict describing specific flavor_id."""
3680
result = _instance_type_get_query(context, session=session).\
3691
result = _instance_type_get_query(context, read_deleted=read_deleted,
3681
3693
filter_by(flavorid=flavor_id).\
3727
3739
session = get_session()
3728
3740
with session.begin():
3729
3741
instance_type_ref = instance_type_get_by_flavor_id(context, flavor_id,
3742
read_deleted='no', session=session)
3731
3743
instance_type_id = instance_type_ref['id']
3732
3744
access_ref = _instance_type_access_query(context, session=session).\
3733
3745
filter_by(instance_type_id=instance_type_id).\
3750
3762
session = get_session()
3751
3763
with session.begin():
3752
3764
instance_type_ref = instance_type_get_by_flavor_id(context, flavor_id,
3765
read_deleted='no', session=session)
3754
3766
instance_type_id = instance_type_ref['id']
3755
3767
count = _instance_type_access_query(context, session=session).\
3756
3768
filter_by(instance_type_id=instance_type_id).\
4187
4199
'curr_write_bytes': 0,
4188
4200
'instance_id': instance_id}
4190
rows = model_query(context, models.VolumeUsage,
4191
session=session, read_deleted="yes").\
4192
filter_by(volume_id=id).\
4193
update(values, synchronize_session=False)
4202
current_usage = model_query(context, models.VolumeUsage,
4203
session=session, read_deleted="yes").\
4204
filter_by(volume_id=id).\
4207
if (rd_req < current_usage['curr_reads'] or
4208
rd_bytes < current_usage['curr_read_bytes'] or
4209
wr_req < current_usage['curr_writes'] or
4210
wr_bytes < current_usage['curr_write_bytes']):
4211
LOG.info(_("Volume(%s) has lower stats then what is in "
4212
"the database. Instance must have been rebooted "
4213
"or crashed. Updating totals.") % id)
4214
if not update_totals:
4215
values['tot_last_refreshed'] = last_refreshed
4216
values['tot_reads'] = (models.VolumeUsage.tot_reads +
4217
current_usage['curr_reads'])
4218
values['tot_read_bytes'] = (
4219
models.VolumeUsage.tot_read_bytes +
4220
current_usage['curr_read_bytes'])
4221
values['tot_writes'] = (models.VolumeUsage.tot_writes +
4222
current_usage['curr_writes'])
4223
values['tot_write_bytes'] = (
4224
models.VolumeUsage.tot_write_bytes +
4225
current_usage['curr_write_bytes'])
4227
values['tot_reads'] = (models.VolumeUsage.tot_reads +
4228
current_usage['curr_reads'] +
4230
values['tot_read_bytes'] = (
4231
models.VolumeUsage.tot_read_bytes +
4232
current_usage['curr_read_bytes'] + rd_bytes)
4233
values['tot_writes'] = (models.VolumeUsage.tot_writes +
4234
current_usage['curr_writes'] +
4236
values['tot_write_bytes'] = (
4237
models.VolumeUsage.tot_write_bytes +
4238
current_usage['curr_write_bytes'] + wr_bytes)
4240
current_usage.update(values)
4198
4243
vol_usage = models.VolumeUsage()
4316
4359
@require_admin_context
4317
4360
def aggregate_get_by_host(context, host, key=None):
4318
query = _aggregate_get_query(context, models.Aggregate,
4319
models.AggregateHost.host, host)
4361
"""Return rows that match host (mandatory) and metadata key (optional).
4363
:param host matches host, and is required.
4364
:param key Matches metadata key, if not None.
4366
query = model_query(context, models.Aggregate)
4367
query = query.options(joinedload('_hosts'))
4368
query = query.options(joinedload('_metadata'))
4369
query = query.join('_hosts')
4370
query = query.filter(models.AggregateHost.host == host)
4322
4373
query = query.join("_metadata").filter(
4327
4378
@require_admin_context
4328
4379
def aggregate_metadata_get_by_host(context, host, key=None):
4329
query = model_query(context, models.Aggregate).join(
4330
"_hosts").filter(models.AggregateHost.host == host).join(
4380
query = model_query(context, models.Aggregate)
4381
query = query.join("_hosts")
4382
query = query.join("_metadata")
4383
query = query.filter(models.AggregateHost.host == host)
4384
query = query.options(contains_eager("_metadata"))
4334
4387
query = query.filter(models.AggregateMetadata.key == key)
4335
4388
rows = query.all()
4336
4390
metadata = collections.defaultdict(set)
4337
4391
for agg in rows:
4338
4392
for kv in agg._metadata:
4343
4397
@require_admin_context
4344
4398
def aggregate_host_get_by_metadata_key(context, key):
4345
query = model_query(context, models.Aggregate).join(
4346
"_metadata").filter(models.AggregateMetadata.key == key)
4399
query = model_query(context, models.Aggregate)
4400
query = query.join("_metadata")
4401
query = query.filter(models.AggregateMetadata.key == key)
4402
query = query.options(contains_eager("_metadata"))
4403
query = query.options(joinedload("_hosts"))
4347
4404
rows = query.all()
4348
4406
metadata = collections.defaultdict(set)
4349
4407
for agg in rows:
4350
4408
for agghost in agg._hosts: