Merge "Create 'simple' db driver"
This commit is contained in:
commit
c34b8de0ae
bin
glance
api/v2
common
db
simple
sqlalchemy
__init__.pyapi.py
migrate_repo
README__init__.pymanage.pymigrate.cfgschema.py
migration.pymodels.pyversions
001_add_images_table.py002_add_image_properties_table.py003_add_disk_format.py003_sqlite_downgrade.sql003_sqlite_upgrade.sql004_add_checksum.py005_size_big_integer.py006_key_to_name.py006_mysql_downgrade.sql006_mysql_upgrade.sql006_sqlite_downgrade.sql006_sqlite_upgrade.sql007_add_owner.py008_add_image_members_table.py009_add_mindisk_and_minram.py010_default_update_at.py011_make_mindisk_and_minram_notnull.py012_id_to_uuid.py013_add_protected.py013_sqlite_downgrade.sql014_add_image_tags_table.py015_quote_swift_credentials.py__init__.py
registry/api/v1
tests/unit
tools
@ -43,22 +43,21 @@ gettext.install('glance', unicode=1)
|
|||||||
from glance.common import config
|
from glance.common import config
|
||||||
from glance.common import exception
|
from glance.common import exception
|
||||||
from glance.openstack.common import cfg
|
from glance.openstack.common import cfg
|
||||||
import glance.db
|
import glance.db.sqlalchemy.api
|
||||||
import glance.db.api
|
import glance.db.sqlalchemy.migration
|
||||||
import glance.db.migration
|
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
|
|
||||||
|
|
||||||
def do_db_version(args):
|
def do_db_version(args):
|
||||||
"""Print database's current migration level"""
|
"""Print database's current migration level"""
|
||||||
print glance.db.migration.db_version(CONF)
|
print glance.db.sqlalchemy.migration.db_version(CONF)
|
||||||
|
|
||||||
|
|
||||||
def do_upgrade(args):
|
def do_upgrade(args):
|
||||||
"""Upgrade the database's migration level"""
|
"""Upgrade the database's migration level"""
|
||||||
version = args.pop(0) if args else None
|
version = args.pop(0) if args else None
|
||||||
glance.db.migration.upgrade(CONF, version)
|
glance.db.sqlalchemy.migration.upgrade(CONF, version)
|
||||||
|
|
||||||
|
|
||||||
def do_downgrade(args):
|
def do_downgrade(args):
|
||||||
@ -68,13 +67,13 @@ def do_downgrade(args):
|
|||||||
"downgrade requires a version argument")
|
"downgrade requires a version argument")
|
||||||
|
|
||||||
version = args.pop(0)
|
version = args.pop(0)
|
||||||
glance.db.migration.downgrade(CONF, version)
|
glance.db.sqlalchemy.migration.downgrade(CONF, version)
|
||||||
|
|
||||||
|
|
||||||
def do_version_control(args):
|
def do_version_control(args):
|
||||||
"""Place a database under migration control"""
|
"""Place a database under migration control"""
|
||||||
version = args.pop(0) if args else None
|
version = args.pop(0) if args else None
|
||||||
glance.db.migration.version_control(CONF, version)
|
glance.db.sqlalchemy.migration.version_control(CONF, version)
|
||||||
|
|
||||||
|
|
||||||
def do_db_sync(args):
|
def do_db_sync(args):
|
||||||
@ -85,10 +84,10 @@ def do_db_sync(args):
|
|||||||
# override auto-create flag, as complete DB should always
|
# override auto-create flag, as complete DB should always
|
||||||
# be created on sync if not already existing
|
# be created on sync if not already existing
|
||||||
CONF.db_auto_create = True
|
CONF.db_auto_create = True
|
||||||
glance.db.api.configure_db(CONF)
|
glance.db.sqlalchemy.api.configure_db(CONF)
|
||||||
version = args.pop(0) if args else None
|
version = args.pop(0) if args else None
|
||||||
current_version = args.pop(0) if args else None
|
current_version = args.pop(0) if args else None
|
||||||
glance.db.migration.db_sync(CONF, version, current_version)
|
glance.db.sqlalchemy.migration.db_sync(CONF, version, current_version)
|
||||||
|
|
||||||
|
|
||||||
def dispatch_cmd(args):
|
def dispatch_cmd(args):
|
||||||
|
@ -21,13 +21,13 @@ from glance.api.v2 import base
|
|||||||
from glance.common import exception
|
from glance.common import exception
|
||||||
from glance.common import utils
|
from glance.common import utils
|
||||||
from glance.common import wsgi
|
from glance.common import wsgi
|
||||||
import glance.db.api
|
import glance.db.sqlalchemy.api
|
||||||
|
|
||||||
|
|
||||||
class Controller(base.Controller):
|
class Controller(base.Controller):
|
||||||
def __init__(self, conf, db=None):
|
def __init__(self, conf, db=None):
|
||||||
super(Controller, self).__init__(conf)
|
super(Controller, self).__init__(conf)
|
||||||
self.db_api = db or glance.db.api
|
self.db_api = db or glance.db.sqlalchemy.api
|
||||||
self.db_api.configure_db(conf)
|
self.db_api.configure_db(conf)
|
||||||
|
|
||||||
def index(self, req, image_id):
|
def index(self, req, image_id):
|
||||||
|
@ -19,14 +19,14 @@ from glance.api.v2 import base
|
|||||||
from glance.common import exception
|
from glance.common import exception
|
||||||
from glance.common import utils
|
from glance.common import utils
|
||||||
from glance.common import wsgi
|
from glance.common import wsgi
|
||||||
import glance.db.api
|
import glance.db.sqlalchemy.api
|
||||||
import glance.store
|
import glance.store
|
||||||
|
|
||||||
|
|
||||||
class ImageDataController(base.Controller):
|
class ImageDataController(base.Controller):
|
||||||
def __init__(self, conf, db_api=None, store_api=None):
|
def __init__(self, conf, db_api=None, store_api=None):
|
||||||
super(ImageDataController, self).__init__(conf)
|
super(ImageDataController, self).__init__(conf)
|
||||||
self.db_api = db_api or glance.db.api
|
self.db_api = db_api or glance.db.sqlalchemy.api
|
||||||
self.db_api.configure_db(conf)
|
self.db_api.configure_db(conf)
|
||||||
self.store_api = store_api or glance.store
|
self.store_api = store_api or glance.store
|
||||||
self.store_api.create_stores(conf)
|
self.store_api.create_stores(conf)
|
||||||
|
@ -21,13 +21,13 @@ from glance.api.v2 import base
|
|||||||
from glance.common import exception
|
from glance.common import exception
|
||||||
from glance.common import utils
|
from glance.common import utils
|
||||||
from glance.common import wsgi
|
from glance.common import wsgi
|
||||||
import glance.db.api
|
import glance.db.sqlalchemy.api
|
||||||
|
|
||||||
|
|
||||||
class Controller(base.Controller):
|
class Controller(base.Controller):
|
||||||
def __init__(self, conf, db=None):
|
def __init__(self, conf, db=None):
|
||||||
super(Controller, self).__init__(conf)
|
super(Controller, self).__init__(conf)
|
||||||
self.db_api = db or glance.db.api
|
self.db_api = db or glance.db.sqlalchemy.api
|
||||||
self.db_api.configure_db(conf)
|
self.db_api.configure_db(conf)
|
||||||
|
|
||||||
def index(self, req, image_id):
|
def index(self, req, image_id):
|
||||||
|
@ -22,14 +22,14 @@ from glance.api.v2 import base
|
|||||||
from glance.common import exception
|
from glance.common import exception
|
||||||
from glance.common import utils
|
from glance.common import utils
|
||||||
from glance.common import wsgi
|
from glance.common import wsgi
|
||||||
import glance.db.api
|
import glance.db.sqlalchemy.api
|
||||||
from glance.openstack.common import timeutils
|
from glance.openstack.common import timeutils
|
||||||
|
|
||||||
|
|
||||||
class ImagesController(base.Controller):
|
class ImagesController(base.Controller):
|
||||||
def __init__(self, conf, db_api=None):
|
def __init__(self, conf, db_api=None):
|
||||||
super(ImagesController, self).__init__(conf)
|
super(ImagesController, self).__init__(conf)
|
||||||
self.db_api = db_api or glance.db.api
|
self.db_api = db_api or glance.db.sqlalchemy.api
|
||||||
self.db_api.configure_db(conf)
|
self.db_api.configure_db(conf)
|
||||||
|
|
||||||
def _normalize_properties(self, image):
|
def _normalize_properties(self, image):
|
||||||
|
@ -20,7 +20,7 @@ import webob.exc
|
|||||||
from glance.common import exception
|
from glance.common import exception
|
||||||
from glance.common import wsgi
|
from glance.common import wsgi
|
||||||
from glance.openstack.common import cfg
|
from glance.openstack.common import cfg
|
||||||
from glance.db import api as db_api
|
from glance.db.sqlalchemy import api as db_api
|
||||||
|
|
||||||
context_opts = [
|
context_opts = [
|
||||||
cfg.BoolOpt('owner_is_tenant', default=True),
|
cfg.BoolOpt('owner_is_tenant', default=True),
|
||||||
|
0
glance/db/simple/__init__.py
Normal file
0
glance/db/simple/__init__.py
Normal file
164
glance/db/simple/api.py
Normal file
164
glance/db/simple/api.py
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
# Copyright 2012 OpenStack, LLC
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
import logging
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
from glance.common import exception
|
||||||
|
|
||||||
|
|
||||||
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
DATA = {
|
||||||
|
'images': {},
|
||||||
|
'members': {},
|
||||||
|
'tags': {},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def configure_db(*args, **kwargs):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def get_session():
|
||||||
|
return DATA
|
||||||
|
|
||||||
|
|
||||||
|
def _image_member_format(image_id, tenant_id, can_share):
|
||||||
|
return {
|
||||||
|
'image_id': image_id,
|
||||||
|
'member': tenant_id,
|
||||||
|
'can_share': can_share,
|
||||||
|
'deleted': False,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def _image_format(image_id, **values):
|
||||||
|
dt = datetime.datetime.now()
|
||||||
|
image = {
|
||||||
|
'id': image_id,
|
||||||
|
'name': 'image-name',
|
||||||
|
'owner': None,
|
||||||
|
'location': None,
|
||||||
|
'status': 'queued',
|
||||||
|
'is_public': False,
|
||||||
|
'created_at': dt,
|
||||||
|
'updated_at': dt,
|
||||||
|
'tags': [],
|
||||||
|
'properties': [],
|
||||||
|
}
|
||||||
|
image.update(values)
|
||||||
|
return image
|
||||||
|
|
||||||
|
|
||||||
|
def image_get(context, image_id, session=None):
|
||||||
|
try:
|
||||||
|
image = DATA['images'][image_id]
|
||||||
|
LOG.info('Found image %s: %s' % (image_id, str(image)))
|
||||||
|
except KeyError:
|
||||||
|
LOG.info('Could not find image %s' % image_id)
|
||||||
|
raise exception.NotFound(image_id=image_id)
|
||||||
|
|
||||||
|
#NOTE(bcwaldon: this is a hack until we can get image members with
|
||||||
|
# a direct db call
|
||||||
|
image['members'] = DATA['members'].get(image_id, [])
|
||||||
|
|
||||||
|
return image
|
||||||
|
|
||||||
|
|
||||||
|
def image_get_all(context, filters=None):
|
||||||
|
images = DATA['images'].values()
|
||||||
|
LOG.info('Listing images: %s' % (images))
|
||||||
|
return images
|
||||||
|
|
||||||
|
|
||||||
|
def image_member_find(context, image_id, tenant_id):
|
||||||
|
image_get(context, image_id)
|
||||||
|
|
||||||
|
print DATA['members']
|
||||||
|
for member in DATA['members'].get(image_id, []):
|
||||||
|
if member['member'] == tenant_id:
|
||||||
|
return member
|
||||||
|
|
||||||
|
raise exception.NotFound()
|
||||||
|
|
||||||
|
|
||||||
|
def image_member_create(context, values):
|
||||||
|
member = _image_member_format(values['image_id'],
|
||||||
|
values['member'],
|
||||||
|
values['can_share'])
|
||||||
|
global DATA
|
||||||
|
DATA['members'].setdefault(values['image_id'], [])
|
||||||
|
DATA['members'][values['image_id']].append(member)
|
||||||
|
return member
|
||||||
|
|
||||||
|
|
||||||
|
def image_create(context, image_values):
|
||||||
|
image_id = image_values.get('id', str(uuid.uuid4()))
|
||||||
|
image = _image_format(image_id, **image_values)
|
||||||
|
DATA['images'][image_id] = image
|
||||||
|
DATA['tags'][image_id] = image.pop('tags', [])
|
||||||
|
LOG.info('Created image %s with values %s' %
|
||||||
|
(image_id, str(image_values)))
|
||||||
|
return image
|
||||||
|
|
||||||
|
|
||||||
|
def image_update(context, image_id, image_values):
|
||||||
|
LOG.info('Updating image %s with values %s' %
|
||||||
|
(image_id, str(image_values)))
|
||||||
|
global DATA
|
||||||
|
try:
|
||||||
|
image = DATA['images'][image_id]
|
||||||
|
LOG.info('Found image %s: %s' % (image_id, str(image)))
|
||||||
|
except KeyError:
|
||||||
|
raise exception.NotFound(image_id=image_id)
|
||||||
|
|
||||||
|
image.update(image_values)
|
||||||
|
DATA['images'][image_id] = image
|
||||||
|
LOG.info('Image %s updated to %s' % (image_id, str(image)))
|
||||||
|
return image
|
||||||
|
|
||||||
|
|
||||||
|
def image_tag_get_all(context, image_id):
|
||||||
|
image_get(context, image_id)
|
||||||
|
return DATA['tags'].get(image_id, [])
|
||||||
|
|
||||||
|
|
||||||
|
def image_tag_get(context, image_id, value):
|
||||||
|
tags = image_tag_get_all(context, image_id)
|
||||||
|
if value in tags:
|
||||||
|
return value
|
||||||
|
else:
|
||||||
|
raise exception.NotFound()
|
||||||
|
|
||||||
|
|
||||||
|
def image_tag_set_all(context, image_id, values):
|
||||||
|
global DATA
|
||||||
|
DATA['tags'][image_id] = values
|
||||||
|
|
||||||
|
|
||||||
|
def image_tag_create(context, image_id, value):
|
||||||
|
global DATA
|
||||||
|
DATA['tags'][image_id].append(value)
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def image_tag_delete(context, image_id, value):
|
||||||
|
global DATA
|
||||||
|
try:
|
||||||
|
DATA['tags'][image_id].remove(value)
|
||||||
|
except ValueError:
|
||||||
|
raise exception.NotFound()
|
0
glance/db/sqlalchemy/__init__.py
Normal file
0
glance/db/sqlalchemy/__init__.py
Normal file
@ -36,11 +36,12 @@ from sqlalchemy.sql import or_, and_
|
|||||||
|
|
||||||
from glance.common import exception
|
from glance.common import exception
|
||||||
from glance import db
|
from glance import db
|
||||||
from glance.db import migration
|
from glance.db.sqlalchemy import migration
|
||||||
from glance.db import models
|
from glance.db.sqlalchemy import models
|
||||||
from glance.openstack.common import cfg
|
from glance.openstack.common import cfg
|
||||||
from glance.openstack.common import timeutils
|
from glance.openstack.common import timeutils
|
||||||
|
|
||||||
|
|
||||||
_ENGINE = None
|
_ENGINE = None
|
||||||
_MAKER = None
|
_MAKER = None
|
||||||
_MAX_RETRIES = None
|
_MAX_RETRIES = None
|
@ -24,7 +24,7 @@ import logging
|
|||||||
import sqlalchemy.types
|
import sqlalchemy.types
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger('glance.db.migrate_repo.schema')
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
String = lambda length: sqlalchemy.types.String(
|
String = lambda length: sqlalchemy.types.String(
|
||||||
@ -85,7 +85,7 @@ def from_migration_import(module_name, fromlist):
|
|||||||
|
|
||||||
# Refer to images table
|
# Refer to images table
|
||||||
"""
|
"""
|
||||||
module_path = 'glance.db.migrate_repo.versions.%s' % module_name
|
module_path = 'glance.db.sqlalchemy.migrate_repo.versions.%s' % module_name
|
||||||
module = __import__(module_path, globals(), locals(), fromlist, -1)
|
module = __import__(module_path, globals(), locals(), fromlist, -1)
|
||||||
return [getattr(module, item) for item in fromlist]
|
return [getattr(module, item) for item in fromlist]
|
||||||
|
|
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
from sqlalchemy.schema import (Column, MetaData, Table)
|
from sqlalchemy.schema import (Column, MetaData, Table)
|
||||||
|
|
||||||
from glance.db.migrate_repo.schema import (
|
from glance.db.sqlalchemy.migrate_repo.schema import (
|
||||||
Boolean, DateTime, Integer, String, Text, create_tables, drop_tables)
|
Boolean, DateTime, Integer, String, Text, create_tables, drop_tables)
|
||||||
|
|
||||||
|
|
@ -18,7 +18,7 @@
|
|||||||
from sqlalchemy.schema import (
|
from sqlalchemy.schema import (
|
||||||
Column, ForeignKey, Index, MetaData, Table, UniqueConstraint)
|
Column, ForeignKey, Index, MetaData, Table, UniqueConstraint)
|
||||||
|
|
||||||
from glance.db.migrate_repo.schema import (
|
from glance.db.sqlalchemy.migrate_repo.schema import (
|
||||||
Boolean, DateTime, Integer, String, Text, create_tables, drop_tables,
|
Boolean, DateTime, Integer, String, Text, create_tables, drop_tables,
|
||||||
from_migration_import)
|
from_migration_import)
|
||||||
|
|
@ -19,7 +19,7 @@ from migrate.changeset import *
|
|||||||
from sqlalchemy import *
|
from sqlalchemy import *
|
||||||
from sqlalchemy.sql import and_, not_
|
from sqlalchemy.sql import and_, not_
|
||||||
|
|
||||||
from glance.db.migrate_repo.schema import (
|
from glance.db.sqlalchemy.migrate_repo.schema import (
|
||||||
Boolean, DateTime, Integer, String, Text, from_migration_import)
|
Boolean, DateTime, Integer, String, Text, from_migration_import)
|
||||||
|
|
||||||
|
|
@ -19,7 +19,7 @@ from migrate.changeset import *
|
|||||||
from sqlalchemy import *
|
from sqlalchemy import *
|
||||||
from sqlalchemy.sql import and_, not_
|
from sqlalchemy.sql import and_, not_
|
||||||
|
|
||||||
from glance.db.migrate_repo.schema import (
|
from glance.db.sqlalchemy.migrate_repo.schema import (
|
||||||
Boolean, DateTime, Integer, String, Text, from_migration_import)
|
Boolean, DateTime, Integer, String, Text, from_migration_import)
|
||||||
|
|
||||||
|
|
@ -18,7 +18,7 @@
|
|||||||
from migrate.changeset import *
|
from migrate.changeset import *
|
||||||
from sqlalchemy import *
|
from sqlalchemy import *
|
||||||
|
|
||||||
from glance.db.migrate_repo.schema import (
|
from glance.db.sqlalchemy.migrate_repo.schema import (
|
||||||
Boolean, DateTime, BigInteger, Integer, String,
|
Boolean, DateTime, BigInteger, Integer, String,
|
||||||
Text, from_migration_import)
|
Text, from_migration_import)
|
||||||
|
|
@ -19,7 +19,7 @@ from migrate.changeset import *
|
|||||||
from sqlalchemy import *
|
from sqlalchemy import *
|
||||||
from sqlalchemy.sql import and_, not_
|
from sqlalchemy.sql import and_, not_
|
||||||
|
|
||||||
from glance.db.migrate_repo.schema import (
|
from glance.db.sqlalchemy.migrate_repo.schema import (
|
||||||
Boolean, DateTime, Integer, String, Text, from_migration_import)
|
Boolean, DateTime, Integer, String, Text, from_migration_import)
|
||||||
|
|
||||||
|
|
@ -19,7 +19,7 @@ from migrate.changeset import *
|
|||||||
from sqlalchemy import *
|
from sqlalchemy import *
|
||||||
from sqlalchemy.sql import and_, not_
|
from sqlalchemy.sql import and_, not_
|
||||||
|
|
||||||
from glance.db.migrate_repo.schema import (
|
from glance.db.sqlalchemy.migrate_repo.schema import (
|
||||||
Boolean, DateTime, BigInteger, Integer, String,
|
Boolean, DateTime, BigInteger, Integer, String,
|
||||||
Text, from_migration_import)
|
Text, from_migration_import)
|
||||||
|
|
@ -18,7 +18,7 @@
|
|||||||
from migrate.changeset import *
|
from migrate.changeset import *
|
||||||
from sqlalchemy import *
|
from sqlalchemy import *
|
||||||
|
|
||||||
from glance.db.migrate_repo.schema import (
|
from glance.db.sqlalchemy.migrate_repo.schema import (
|
||||||
Boolean, DateTime, BigInteger, Integer, String, Text,
|
Boolean, DateTime, BigInteger, Integer, String, Text,
|
||||||
create_tables, drop_tables, from_migration_import)
|
create_tables, drop_tables, from_migration_import)
|
||||||
|
|
@ -19,7 +19,7 @@ from migrate.changeset import *
|
|||||||
from sqlalchemy import *
|
from sqlalchemy import *
|
||||||
from sqlalchemy.sql import and_, not_
|
from sqlalchemy.sql import and_, not_
|
||||||
|
|
||||||
from glance.db.migrate_repo.schema import (
|
from glance.db.sqlalchemy.migrate_repo.schema import (
|
||||||
Boolean, DateTime, Integer, String, Text, from_migration_import)
|
Boolean, DateTime, Integer, String, Text, from_migration_import)
|
||||||
|
|
||||||
|
|
@ -18,7 +18,7 @@
|
|||||||
from migrate.changeset import *
|
from migrate.changeset import *
|
||||||
from sqlalchemy import *
|
from sqlalchemy import *
|
||||||
|
|
||||||
from glance.db.migrate_repo.schema import from_migration_import
|
from glance.db.sqlalchemy.migrate_repo.schema import from_migration_import
|
||||||
|
|
||||||
|
|
||||||
def get_images_table(meta):
|
def get_images_table(meta):
|
@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
from sqlalchemy import schema
|
from sqlalchemy import schema
|
||||||
|
|
||||||
from glance.db.migrate_repo import schema as glance_schema
|
from glance.db.sqlalchemy.migrate_repo import schema as glance_schema
|
||||||
|
|
||||||
|
|
||||||
def define_image_tags_table(meta):
|
def define_image_tags_table(meta):
|
@ -30,7 +30,7 @@ from migrate.versioning import repository as versioning_repository
|
|||||||
from glance.common import exception
|
from glance.common import exception
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger('glance.db.migration')
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def db_version(conf):
|
def db_version(conf):
|
@ -27,7 +27,7 @@ from sqlalchemy import UniqueConstraint
|
|||||||
from sqlalchemy.ext.compiler import compiles
|
from sqlalchemy.ext.compiler import compiles
|
||||||
from sqlalchemy.ext.declarative import declarative_base
|
from sqlalchemy.ext.declarative import declarative_base
|
||||||
|
|
||||||
import glance.db.api
|
import glance.db.sqlalchemy.api
|
||||||
from glance.common import utils
|
from glance.common import utils
|
||||||
from glance.openstack.common import timeutils
|
from glance.openstack.common import timeutils
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ class ModelBase(object):
|
|||||||
|
|
||||||
def save(self, session=None):
|
def save(self, session=None):
|
||||||
"""Save this object"""
|
"""Save this object"""
|
||||||
session = session or glance.db.api.get_session()
|
session = session or glance.db.sqlalchemy.api.get_session()
|
||||||
session.add(self)
|
session.add(self)
|
||||||
session.flush()
|
session.flush()
|
||||||
|
|
@ -27,8 +27,9 @@ from glance.common import exception
|
|||||||
from glance.common import utils
|
from glance.common import utils
|
||||||
from glance.common import wsgi
|
from glance.common import wsgi
|
||||||
from glance.openstack.common import cfg
|
from glance.openstack.common import cfg
|
||||||
|
from glance.db.sqlalchemy import api as db_api
|
||||||
from glance.openstack.common import timeutils
|
from glance.openstack.common import timeutils
|
||||||
from glance.db import api as db_api
|
|
||||||
|
|
||||||
logger = logging.getLogger('glance.registry.api.v1.images')
|
logger = logging.getLogger('glance.registry.api.v1.images')
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ import webob.exc
|
|||||||
from glance.common import exception
|
from glance.common import exception
|
||||||
from glance.common import utils
|
from glance.common import utils
|
||||||
from glance.common import wsgi
|
from glance.common import wsgi
|
||||||
from glance.db import api as db_api
|
from glance.db.sqlalchemy import api as db_api
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger('glance.registry.api.v1.members')
|
logger = logging.getLogger('glance.registry.api.v1.members')
|
||||||
|
@ -24,13 +24,14 @@ from glance.common import client as base_client
|
|||||||
from glance.common import context
|
from glance.common import context
|
||||||
from glance.common import exception
|
from glance.common import exception
|
||||||
from glance.common import utils
|
from glance.common import utils
|
||||||
from glance.db import api as db_api
|
from glance.db.sqlalchemy import api as db_api
|
||||||
from glance.db import models as db_models
|
from glance.db.sqlalchemy import models as db_models
|
||||||
from glance.openstack.common import timeutils
|
from glance.openstack.common import timeutils
|
||||||
from glance.registry import client as rclient
|
from glance.registry import client as rclient
|
||||||
from glance.tests.unit import base
|
from glance.tests.unit import base
|
||||||
from glance.tests import utils as test_utils
|
from glance.tests import utils as test_utils
|
||||||
|
|
||||||
|
|
||||||
_gen_uuid = utils.generate_uuid
|
_gen_uuid = utils.generate_uuid
|
||||||
|
|
||||||
UUID1 = _gen_uuid()
|
UUID1 = _gen_uuid()
|
||||||
|
@ -22,11 +22,10 @@ import random
|
|||||||
from glance.common import context
|
from glance.common import context
|
||||||
from glance.common import exception
|
from glance.common import exception
|
||||||
from glance.common import utils
|
from glance.common import utils
|
||||||
from glance.db import api as db_api
|
from glance.db.sqlalchemy import api as db_api
|
||||||
from glance.db import models as db_models
|
from glance.db.sqlalchemy import models as db_models
|
||||||
from glance.openstack.common import timeutils
|
from glance.openstack.common import timeutils
|
||||||
from glance.tests.unit import base
|
from glance.tests.unit import base
|
||||||
from glance.tests import utils as test_utils
|
|
||||||
|
|
||||||
|
|
||||||
_gen_uuid = utils.generate_uuid
|
_gen_uuid = utils.generate_uuid
|
||||||
|
@ -21,7 +21,7 @@ import stubout
|
|||||||
|
|
||||||
from glance.common import config
|
from glance.common import config
|
||||||
from glance.common import exception, context
|
from glance.common import exception, context
|
||||||
from glance.db import api as db_api
|
from glance.db.sqlalchemy import api as db_api
|
||||||
from glance.registry import configure_registry_client
|
from glance.registry import configure_registry_client
|
||||||
from glance.store import (delete_from_backend,
|
from glance.store import (delete_from_backend,
|
||||||
schedule_delete_from_backend)
|
schedule_delete_from_backend)
|
||||||
|
@ -35,8 +35,8 @@ from sqlalchemy.pool import NullPool
|
|||||||
|
|
||||||
from glance.common import exception
|
from glance.common import exception
|
||||||
from glance.openstack.common import cfg
|
from glance.openstack.common import cfg
|
||||||
import glance.db.migration as migration_api
|
import glance.db.sqlalchemy.migration as migration_api
|
||||||
from glance.db import models
|
from glance.db.sqlalchemy import models
|
||||||
from glance.tests import utils
|
from glance.tests import utils
|
||||||
|
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ class TestMigrations(utils.BaseTestCase):
|
|||||||
CONFIG_FILE_PATH = os.environ.get('GLANCE_TEST_MIGRATIONS_CONF',
|
CONFIG_FILE_PATH = os.environ.get('GLANCE_TEST_MIGRATIONS_CONF',
|
||||||
os.path.join('glance', 'tests', 'unit',
|
os.path.join('glance', 'tests', 'unit',
|
||||||
'test_migrations.conf'))
|
'test_migrations.conf'))
|
||||||
REPOSITORY_PATH = os.path.join('glance', 'db', 'migrate_repo')
|
REPOSITORY_PATH = 'glance/db/sqlalchemy/migrate_repo'
|
||||||
REPOSITORY = Repository(REPOSITORY_PATH)
|
REPOSITORY = Repository(REPOSITORY_PATH)
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
|
@ -13,13 +13,13 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import datetime
|
|
||||||
import logging
|
import logging
|
||||||
import uuid
|
|
||||||
|
|
||||||
import glance.common.context
|
import glance.common.context
|
||||||
from glance.common import exception
|
from glance.common import exception
|
||||||
from glance.common import wsgi
|
from glance.common import wsgi
|
||||||
|
import glance.db.simple.api as simple_db
|
||||||
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -52,143 +52,35 @@ def get_fake_request(path='', method='POST'):
|
|||||||
class FakeDB(object):
|
class FakeDB(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.images = {
|
self.reset()
|
||||||
UUID1: self._image_format(UUID1, location=UUID1),
|
self.init_db()
|
||||||
UUID2: self._image_format(UUID2),
|
|
||||||
}
|
@staticmethod
|
||||||
self.members = {
|
def init_db():
|
||||||
UUID1: [
|
images = [
|
||||||
self._image_member_format(UUID1, TENANT1, True),
|
{'id': UUID1, 'owner': TENANT1, 'location': UUID1},
|
||||||
self._image_member_format(UUID1, TENANT2, False),
|
{'id': UUID2, 'owner': TENANT1},
|
||||||
],
|
]
|
||||||
UUID2: [],
|
[simple_db.image_create(None, image) for image in images]
|
||||||
}
|
|
||||||
self.tags = {
|
members = [
|
||||||
UUID1: ['ping', 'pong'],
|
{'image_id': UUID1, 'member': TENANT1, 'can_share': True},
|
||||||
UUID2: [],
|
{'image_id': UUID1, 'member': TENANT2, 'can_share': False},
|
||||||
|
]
|
||||||
|
[simple_db.image_member_create(None, member) for member in members]
|
||||||
|
|
||||||
|
simple_db.image_tag_set_all(None, UUID1, ['ping', 'pong'])
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def reset():
|
||||||
|
simple_db.DATA = {
|
||||||
|
'images': {},
|
||||||
|
'members': {},
|
||||||
|
'tags': {},
|
||||||
}
|
}
|
||||||
|
|
||||||
def reset(self):
|
def __getattr__(self, key):
|
||||||
self.images = {}
|
return getattr(simple_db, key)
|
||||||
self.members = {}
|
|
||||||
self.tags = {}
|
|
||||||
|
|
||||||
def configure_db(*args, **kwargs):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def get_session(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def _image_member_format(self, image_id, tenant_id, can_share):
|
|
||||||
return {
|
|
||||||
'image_id': image_id,
|
|
||||||
'member': tenant_id,
|
|
||||||
'can_share': can_share,
|
|
||||||
'deleted': False,
|
|
||||||
}
|
|
||||||
|
|
||||||
def _image_format(self, image_id, **values):
|
|
||||||
dt = datetime.datetime.now()
|
|
||||||
image = {
|
|
||||||
'id': image_id,
|
|
||||||
'name': 'image-name',
|
|
||||||
'owner': TENANT1,
|
|
||||||
'location': None,
|
|
||||||
'status': 'queued',
|
|
||||||
'is_public': False,
|
|
||||||
'created_at': dt,
|
|
||||||
'updated_at': dt,
|
|
||||||
'tags': [],
|
|
||||||
'properties': [],
|
|
||||||
}
|
|
||||||
image.update(values)
|
|
||||||
return image
|
|
||||||
|
|
||||||
def image_get(self, context, image_id, session=None):
|
|
||||||
try:
|
|
||||||
image = self.images[image_id]
|
|
||||||
LOG.info('Found image %s: %s' % (image_id, str(image)))
|
|
||||||
except KeyError:
|
|
||||||
raise exception.NotFound(image_id=image_id)
|
|
||||||
|
|
||||||
#NOTE(bcwaldon: this is a hack until we can get image members with
|
|
||||||
# a direct db call
|
|
||||||
image['members'] = self.members.get(image_id, [])
|
|
||||||
|
|
||||||
return image
|
|
||||||
|
|
||||||
def image_get_all(self, context, filters=None):
|
|
||||||
return self.images.values()
|
|
||||||
|
|
||||||
def image_member_find(self, context, image_id, tenant_id):
|
|
||||||
try:
|
|
||||||
self.images[image_id]
|
|
||||||
except KeyError:
|
|
||||||
raise exception.NotFound()
|
|
||||||
|
|
||||||
for member in self.members.get(image_id, []):
|
|
||||||
if member['member'] == tenant_id:
|
|
||||||
return member
|
|
||||||
|
|
||||||
raise exception.NotFound()
|
|
||||||
|
|
||||||
def image_member_create(self, context, values):
|
|
||||||
member = self._image_member_format(values['image_id'],
|
|
||||||
values['member'],
|
|
||||||
values['can_share'])
|
|
||||||
self.members[values['image_id']] = member
|
|
||||||
return member
|
|
||||||
|
|
||||||
def image_create(self, context, image_values):
|
|
||||||
new_uuid = str(uuid.uuid4())
|
|
||||||
image = self._image_format(new_uuid, **image_values)
|
|
||||||
self.images[new_uuid] = image
|
|
||||||
self.tags[new_uuid] = image.pop('tags', [])
|
|
||||||
LOG.info('Created image %s with values %s' %
|
|
||||||
(new_uuid, str(image_values)))
|
|
||||||
return image
|
|
||||||
|
|
||||||
def image_update(self, context, image_id, image_values):
|
|
||||||
LOG.info('Updating image %s with values %s' %
|
|
||||||
(image_id, str(image_values)))
|
|
||||||
try:
|
|
||||||
image = self.images[image_id]
|
|
||||||
LOG.info('Found image %s: %s' % (image_id, str(image)))
|
|
||||||
except KeyError:
|
|
||||||
raise exception.NotFound(image_id=image_id)
|
|
||||||
|
|
||||||
image.update(image_values)
|
|
||||||
self.images[image_id] = image
|
|
||||||
LOG.info('Image %s updated to %s' % (image_id, str(image)))
|
|
||||||
return image
|
|
||||||
|
|
||||||
def image_tag_get_all(self, context, image_id):
|
|
||||||
try:
|
|
||||||
return self.tags[image_id]
|
|
||||||
except KeyError:
|
|
||||||
raise exception.NotFound()
|
|
||||||
|
|
||||||
def image_tag_get(self, context, image_id, value):
|
|
||||||
tags = self.image_tag_get_all(context, image_id)
|
|
||||||
if value in tags:
|
|
||||||
return value
|
|
||||||
else:
|
|
||||||
raise exception.NotFound()
|
|
||||||
|
|
||||||
def image_tag_set_all(self, context, image_id, values):
|
|
||||||
self.tags[image_id] = values
|
|
||||||
|
|
||||||
def image_tag_create(self, context, image_id, value):
|
|
||||||
tags = self.image_tag_get_all(context, image_id)
|
|
||||||
tags.append(value)
|
|
||||||
return value
|
|
||||||
|
|
||||||
def image_tag_delete(self, context, image_id, value):
|
|
||||||
tags = self.image_tag_get_all(context, image_id)
|
|
||||||
try:
|
|
||||||
tags.remove(value)
|
|
||||||
except ValueError:
|
|
||||||
raise exception.NotFound()
|
|
||||||
|
|
||||||
|
|
||||||
class FakeStoreAPI(object):
|
class FakeStoreAPI(object):
|
||||||
|
@ -30,8 +30,8 @@ from glance.common import context
|
|||||||
from glance.common import utils
|
from glance.common import utils
|
||||||
from glance.openstack.common import timeutils
|
from glance.openstack.common import timeutils
|
||||||
from glance.registry.api import v1 as rserver
|
from glance.registry.api import v1 as rserver
|
||||||
from glance.db import api as db_api
|
from glance.db.sqlalchemy import api as db_api
|
||||||
from glance.db import models as db_models
|
from glance.db.sqlalchemy import models as db_models
|
||||||
from glance.tests import utils as test_utils
|
from glance.tests import utils as test_utils
|
||||||
from glance.tests.unit import base
|
from glance.tests.unit import base
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ import keystoneclient.v2_0.client
|
|||||||
import glance.common.context
|
import glance.common.context
|
||||||
from glance.openstack.common import cfg
|
from glance.openstack.common import cfg
|
||||||
import glance.registry.context
|
import glance.registry.context
|
||||||
import glance.db.api as db_api
|
import glance.db.sqlalchemy.api as db_api
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
Loading…
Reference in New Issue
Block a user