~ubuntu-cloud-archive/ubuntu/precise/nova/trunk

« back to all changes in this revision

Viewing changes to nova/db/sqlalchemy/api.py

  • Committer: Package Import Robot
  • Author(s): Chuck Short, Adam Gandelman, Chuck Short
  • Date: 2012-07-06 10:18:33 UTC
  • mfrom: (1.1.58)
  • Revision ID: package-import@ubuntu.com-20120706101833-wp2nv392mpe9re8p
Tags: 2012.2~f2-0ubuntu1
[ Adam Gandelman ]
* Use new rootwrap configuration structure:
  - debian/nova-{compute, network, volume}.{pyinstall, pyremove}: Dropped.
  - debian/nova-common.dirs: Add /etc/nova/rootwrap.d/.
  - debian/nova-common.install: Install /etc/nova/rootwrap.conf.
  - debian/debian/nova.conf: Reference rootwrap.conf in calls to
    nova-rootwrap.
  - debian/nova-{compute, network, volume}.install: Install corresponding
    filter in /etc/nova/rootwrap.d/
* debian/rules: Install logging_sample.conf to /etc/nova/logging.conf
  as part of nova-common.
* debian/pydist-overrides: Add setuptools-git.
* debian/control: Add python-setuptools-git as a Build-Depends.
* debian/rules: Do not remove nova.egg-info during auto_clean.  Now that
  upstream has moved to setuptools-git, doing so results in missing files
  from built package.

[ Chuck Short ]
* New upstream release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
from nova.db.sqlalchemy.session import get_session
34
34
from nova import exception
35
35
from nova import flags
36
 
from nova import log as logging
 
36
from nova.openstack.common import log as logging
37
37
from nova.openstack.common import timeutils
38
38
from nova import utils
39
39
from sqlalchemy import and_
473
473
 
474
474
###################
475
475
 
476
 
def _compute_node_get(context, compute_id, session=None):
 
476
def compute_node_get(context, compute_id, session=None):
477
477
    result = model_query(context, models.ComputeNode, session=session).\
478
478
                     filter_by(id=compute_id).\
479
479
                     first()
491
491
                    all()
492
492
 
493
493
 
 
494
@require_admin_context
 
495
def compute_node_search_by_hypervisor(context, hypervisor_match):
 
496
    field = models.ComputeNode.hypervisor_hostname
 
497
    return model_query(context, models.ComputeNode).\
 
498
                    options(joinedload('service')).\
 
499
                    filter(field.like('%%%s%%' % hypervisor_match)).\
 
500
                    all()
 
501
 
 
502
 
494
503
def _get_host_utilization(context, host, ram_mb, disk_gb):
495
504
    """Compute the current utilization of a given host."""
496
505
    instances = instance_get_all_by_host(context, host)
503
512
        free_ram_mb -= instance.memory_mb
504
513
        free_disk_gb -= instance.root_gb
505
514
        free_disk_gb -= instance.ephemeral_gb
506
 
        if instance.vm_state in [vm_states.BUILDING, vm_states.REBUILDING,
507
 
                                 vm_states.MIGRATING, vm_states.RESIZING]:
 
515
        if instance.task_state is not None:
508
516
            work += 1
509
517
    return dict(free_ram_mb=free_ram_mb,
510
518
                free_disk_gb=free_disk_gb,
543
551
    if auto_adjust:
544
552
        _adjust_compute_node_values_for_utilization(context, values, session)
545
553
    with session.begin(subtransactions=True):
546
 
        compute_ref = _compute_node_get(context, compute_id, session=session)
 
554
        compute_ref = compute_node_get(context, compute_id, session=session)
547
555
        compute_ref.update(values)
548
556
        compute_ref.save(session=session)
549
557
 
612
620
            raise exception.NotFound(_("No ComputeNode for %(host)s") %
613
621
                                     locals())
614
622
 
615
 
        if free_ram_mb != None:
 
623
        if free_ram_mb is not None:
616
624
            compute_node.free_ram_mb = free_ram_mb
617
 
        if free_disk_gb != None:
 
625
        if free_disk_gb is not None:
618
626
            compute_node.free_disk_gb = free_disk_gb
619
 
        if work != None:
 
627
        if work is not None:
620
628
            compute_node.current_workload = work
621
 
        if vms != None:
 
629
        if vms is not None:
622
630
            compute_node.running_vms = vms
623
631
 
624
632
    return compute_node
1116
1124
 
1117
1125
@require_context
1118
1126
def fixed_ip_get_by_address(context, address, session=None):
1119
 
    result = model_query(context, models.FixedIp, session=session,
1120
 
                         read_deleted=context.read_deleted).\
 
1127
    result = model_query(context, models.FixedIp, session=session).\
1121
1128
                     filter_by(address=address).\
1122
1129
                     first()
1123
1130
    if not result:
1330
1337
    instance_ref = models.Instance()
1331
1338
    if not values.get('uuid'):
1332
1339
        values['uuid'] = str(utils.gen_uuid())
 
1340
    instance_ref['info_cache'] = models.InstanceInfoCache()
 
1341
    info_cache = values.pop('info_cache', None)
 
1342
    if info_cache is not None:
 
1343
        instance_ref['info_cache'].update(info_cache)
 
1344
    security_groups = values.pop('security_groups', [])
1333
1345
    instance_ref.update(values)
1334
1346
 
 
1347
    def _get_sec_group_models(session, security_groups):
 
1348
        models = []
 
1349
        default_group = security_group_ensure_default(context,
 
1350
                session=session)
 
1351
        if 'default' in security_groups:
 
1352
            models.append(default_group)
 
1353
            # Generate a new list, so we don't modify the original
 
1354
            security_groups = [x for x in security_groups if x != 'default']
 
1355
        if security_groups:
 
1356
            models.extend(_security_group_get_by_names(context,
 
1357
                    session, context.project_id, security_groups))
 
1358
        return models
 
1359
 
1335
1360
    session = get_session()
1336
1361
    with session.begin():
 
1362
        instance_ref.security_groups = _get_sec_group_models(session,
 
1363
                security_groups)
1337
1364
        instance_ref.save(session=session)
 
1365
        # NOTE(comstud): This forces instance_type to be loaded so it
 
1366
        # exists in the ref when we return.  Fixes lazy loading issues.
 
1367
        instance_ref.instance_type
1338
1368
 
1339
 
    # and creat the info_cache table entry for instance
1340
 
    instance_info_cache_create(context, {'instance_id': instance_ref['uuid']})
 
1369
    # create the instance uuid to ec2_id mapping entry for instance
 
1370
    ec2_instance_create(context, instance_ref['uuid'])
1341
1371
 
1342
1372
    return instance_ref
1343
1373
 
1436
1466
 
1437
1467
 
1438
1468
@require_admin_context
1439
 
def instance_get_all(context):
1440
 
    return model_query(context, models.Instance).\
1441
 
                   options(joinedload('info_cache')).\
1442
 
                   options(joinedload('security_groups')).\
1443
 
                   options(joinedload('metadata')).\
1444
 
                   options(joinedload('instance_type')).\
1445
 
                   all()
 
1469
def instance_get_all(context, columns_to_join=None):
 
1470
    if columns_to_join is None:
 
1471
        columns_to_join = ['info_cache', 'security_groups',
 
1472
                           'metadata', 'instance_type']
 
1473
    query = model_query(context, models.Instance)
 
1474
    for column in columns_to_join:
 
1475
        query = query.options(joinedload(column))
 
1476
    return query.all()
1446
1477
 
1447
1478
 
1448
1479
@require_context
1497
1528
        # include or exclude both
1498
1529
        if filters.pop('deleted'):
1499
1530
            deleted = or_(models.Instance.deleted == True,
1500
 
                          models.Instance.vm_state == vm_states.SOFT_DELETE)
 
1531
                          models.Instance.vm_state == vm_states.SOFT_DELETED)
1501
1532
            query_prefix = query_prefix.filter(deleted)
1502
1533
        else:
1503
1534
            query_prefix = query_prefix.\
1504
1535
                    filter_by(deleted=False).\
1505
 
                    filter(models.Instance.vm_state != vm_states.SOFT_DELETE)
 
1536
                    filter(models.Instance.vm_state != vm_states.SOFT_DELETED)
1506
1537
 
1507
1538
    if not context.is_admin:
1508
1539
        # If we're not admin context, add appropriate filter..
1812
1843
    session = session or get_session()
1813
1844
 
1814
1845
    info_cache = session.query(models.InstanceInfoCache).\
1815
 
                         filter_by(instance_id=instance_uuid).\
 
1846
                         filter_by(instance_uuid=instance_uuid).\
1816
1847
                         first()
1817
1848
    return info_cache
1818
1849
 
1836
1867
    else:
1837
1868
        # NOTE(tr3buchet): just in case someone blows away an instance's
1838
1869
        #                  cache entry
1839
 
        values['instance_id'] = instance_uuid
 
1870
        values['instance_uuid'] = instance_uuid
1840
1871
        info_cache = instance_info_cache_create(context, values)
1841
1872
 
1842
1873
    return info_cache
2869
2900
    with session.begin():
2870
2901
        volume_ref.save(session=session)
2871
2902
 
2872
 
    ec2_volume_create(context, volume_ref['id'])
2873
2903
    return volume_ref
2874
2904
 
2875
2905
 
2929
2959
 
2930
2960
 
2931
2961
@require_context
2932
 
def _ec2_volume_get_query(context, session=None, project_only=False):
2933
 
    return model_query(context, models.VolumeIdMapping, session=session,
2934
 
                       project_only=project_only)
 
2962
def _ec2_volume_get_query(context, session=None):
 
2963
    return model_query(context, models.VolumeIdMapping, session=session)
2935
2964
 
2936
2965
 
2937
2966
@require_context
2938
 
def _ec2_snapshot_get_query(context, session=None, project_only=False):
2939
 
    return model_query(context, models.SnapshotIdMapping, session=session,
2940
 
                       project_only=project_only)
 
2967
def _ec2_snapshot_get_query(context, session=None):
 
2968
    return model_query(context, models.SnapshotIdMapping, session=session)
2941
2969
 
2942
2970
 
2943
2971
@require_context
3026
3054
 
3027
3055
@require_context
3028
3056
def get_ec2_volume_id_by_uuid(context, volume_id, session=None):
3029
 
    result = _ec2_volume_get_query(context,
3030
 
                                   session=session,
3031
 
                                   project_only=True).\
 
3057
    result = _ec2_volume_get_query(context, session=session).\
3032
3058
                    filter_by(uuid=volume_id).\
3033
3059
                    first()
3034
3060
 
3040
3066
 
3041
3067
@require_context
3042
3068
def get_volume_uuid_by_ec2_id(context, ec2_id, session=None):
3043
 
    result = _ec2_volume_get_query(context,
3044
 
                                   session=session,
3045
 
                                   project_only=True).\
 
3069
    result = _ec2_volume_get_query(context, session=session).\
3046
3070
                    filter_by(id=ec2_id).\
3047
3071
                    first()
3048
3072
 
3067
3091
 
3068
3092
@require_context
3069
3093
def get_ec2_snapshot_id_by_uuid(context, snapshot_id, session=None):
3070
 
    result = _ec2_snapshot_get_query(context,
3071
 
                                   session=session,
3072
 
                                   project_only=True).\
 
3094
    result = _ec2_snapshot_get_query(context, session=session).\
3073
3095
                    filter_by(uuid=snapshot_id).\
3074
3096
                    first()
3075
3097
 
3081
3103
 
3082
3104
@require_context
3083
3105
def get_snapshot_uuid_by_ec2_id(context, ec2_id, session=None):
3084
 
    result = _ec2_snapshot_get_query(context,
3085
 
                                   session=session,
3086
 
                                   project_only=True).\
 
3106
    result = _ec2_snapshot_get_query(context, session=session).\
3087
3107
                    filter_by(id=ec2_id).\
3088
3108
                    first()
3089
3109
 
3184
3204
    session = get_session()
3185
3205
    with session.begin():
3186
3206
        snapshot_ref.save(session=session)
3187
 
    ec2_snapshot_create(context, snapshot_ref['id'])
3188
3207
    return snapshot_ref
3189
3208
 
3190
3209
 
3332
3351
###################
3333
3352
 
3334
3353
def _security_group_get_query(context, session=None, read_deleted=None,
3335
 
                              project_only=False):
3336
 
    return model_query(context, models.SecurityGroup, session=session,
3337
 
                       read_deleted=read_deleted, project_only=project_only).\
3338
 
                   options(joinedload_all('rules'))
 
3354
                              project_only=False, join_rules=True):
 
3355
    query = model_query(context, models.SecurityGroup, session=session,
 
3356
            read_deleted=read_deleted, project_only=project_only)
 
3357
    if join_rules:
 
3358
        query = query.options(joinedload_all('rules'))
 
3359
    return query
 
3360
 
 
3361
 
 
3362
def _security_group_get_by_names(context, session, project_id, group_names):
 
3363
    """
 
3364
    Get security group models for a project by a list of names.
 
3365
    Raise SecurityGroupNotFoundForProject for a name not found.
 
3366
    """
 
3367
    query = _security_group_get_query(context, session=session,
 
3368
            read_deleted="no", join_rules=False).\
 
3369
            filter_by(project_id=project_id).\
 
3370
            filter(models.SecurityGroup.name.in_(group_names))
 
3371
    sg_models = query.all()
 
3372
    if len(sg_models) == len(group_names):
 
3373
        return sg_models
 
3374
    # Find the first one missing and raise
 
3375
    group_names_from_models = [x.name for x in sg_models]
 
3376
    for group_name in group_names:
 
3377
        if group_name not in group_names_from_models:
 
3378
            raise exception.SecurityGroupNotFoundForProject(
 
3379
                    project_id=project_id, security_group_id=group_name)
 
3380
    # Not Reached
3339
3381
 
3340
3382
 
3341
3383
@require_context
3359
3401
 
3360
3402
 
3361
3403
@require_context
3362
 
def security_group_get_by_name(context, project_id, group_name):
3363
 
    result = _security_group_get_query(context, read_deleted="no").\
3364
 
                        filter_by(project_id=project_id).\
3365
 
                        filter_by(name=group_name).\
3366
 
                        options(joinedload_all('instances')).\
3367
 
                        first()
3368
 
 
 
3404
def security_group_get_by_name(context, project_id, group_name,
 
3405
        columns_to_join=None, session=None):
 
3406
    if session is None:
 
3407
        session = get_session()
 
3408
 
 
3409
    query = _security_group_get_query(context, session=session,
 
3410
            read_deleted="no", join_rules=False).\
 
3411
            filter_by(project_id=project_id).\
 
3412
            filter_by(name=group_name)
 
3413
 
 
3414
    if columns_to_join is None:
 
3415
        columns_to_join = ['instances', 'rules']
 
3416
 
 
3417
    for column in columns_to_join:
 
3418
        query = query.options(joinedload_all(column))
 
3419
 
 
3420
    result = query.first()
3369
3421
    if not result:
3370
3422
        raise exception.SecurityGroupNotFoundForProject(
3371
3423
                project_id=project_id, security_group_id=group_name)
3419
3471
 
3420
3472
 
3421
3473
@require_context
3422
 
def security_group_create(context, values):
 
3474
def security_group_create(context, values, session=None):
3423
3475
    security_group_ref = models.SecurityGroup()
3424
3476
    # FIXME(devcamcar): Unless I do this, rules fails with lazy load exception
3425
3477
    # once save() is called.  This will get cleaned up in next orm pass.
3426
3478
    security_group_ref.rules
3427
3479
    security_group_ref.update(values)
3428
 
    security_group_ref.save()
 
3480
    if session is None:
 
3481
        session = get_session()
 
3482
    security_group_ref.save(session=session)
3429
3483
    return security_group_ref
3430
3484
 
3431
3485
 
 
3486
def security_group_ensure_default(context, session=None):
 
3487
    """Ensure default security group exists for a project_id."""
 
3488
    try:
 
3489
        default_group = security_group_get_by_name(context,
 
3490
                context.project_id, 'default',
 
3491
                columns_to_join=[], session=session)
 
3492
    except exception.NotFound:
 
3493
        values = {'name': 'default',
 
3494
                  'description': 'default',
 
3495
                  'user_id': context.user_id,
 
3496
                  'project_id': context.project_id}
 
3497
        default_group = security_group_create(context, values,
 
3498
                session=session)
 
3499
    return default_group
 
3500
 
 
3501
 
3432
3502
@require_context
3433
3503
def security_group_destroy(context, security_group_id):
3434
3504
    session = get_session()
4167
4237
# System-owned metadata
4168
4238
 
4169
4239
def _instance_system_metadata_get_query(context, instance_uuid, session=None):
4170
 
    return model_query(context, models.InstanceSystemMetadata, session=session,
4171
 
                       read_deleted="no").\
 
4240
    return model_query(context, models.InstanceSystemMetadata,
 
4241
                       session=session).\
4172
4242
                    filter_by(instance_uuid=instance_uuid)
4173
4243
 
4174
4244
 
5093
5163
        output[row['instance_uuid']].append(data)
5094
5164
 
5095
5165
    return output
 
5166
 
 
5167
 
 
5168
##################
 
5169
 
 
5170
 
 
5171
@require_context
 
5172
def ec2_instance_create(context, instance_uuid, id=None):
 
5173
    """Create ec2 compatable instance by provided uuid"""
 
5174
    ec2_instance_ref = models.InstanceIdMapping()
 
5175
    ec2_instance_ref.update({'uuid': instance_uuid})
 
5176
    if id is not None:
 
5177
        ec2_instance_ref.update({'id': id})
 
5178
 
 
5179
    ec2_instance_ref.save()
 
5180
 
 
5181
    return ec2_instance_ref
 
5182
 
 
5183
 
 
5184
@require_context
 
5185
def get_ec2_instance_id_by_uuid(context, instance_id, session=None):
 
5186
    result = _ec2_instance_get_query(context,
 
5187
                                     session=session).\
 
5188
                    filter_by(uuid=instance_id).\
 
5189
                    first()
 
5190
 
 
5191
    if not result:
 
5192
        raise exception.InstanceNotFound(uuid=instance_id)
 
5193
 
 
5194
    return result['id']
 
5195
 
 
5196
 
 
5197
@require_context
 
5198
def get_instance_uuid_by_ec2_id(context, instance_id, session=None):
 
5199
    result = _ec2_instance_get_query(context,
 
5200
                                     session=session).\
 
5201
                    filter_by(id=instance_id).\
 
5202
                    first()
 
5203
 
 
5204
    if not result:
 
5205
        raise exception.InstanceNotFound(id=instance_id)
 
5206
 
 
5207
    return result['uuid']
 
5208
 
 
5209
 
 
5210
@require_context
 
5211
def _ec2_instance_get_query(context, session=None):
 
5212
    return model_query(context, models.InstanceIdMapping, session=session)