Decouple the config dependence on glance domain

Move the configurations which core domain objects depend on to
common/config.py, and add a argument "task_time_to_live" of Task's
 __init__ method and TaskFactory's new_task method for delivering
the CONF.task.task_time_to_live value.
For convenience,the argument "task_time_to_live" is set a default value 48.

Change-Id: Iffda1ecd25470824c812d66a27fa64ebbaabcf07
Closes-Bug: #1250633
This commit is contained in:
Jia Dong 2013-12-27 16:33:41 +08:00
parent 1d35a88b85
commit f035efd043
8 changed files with 57 additions and 45 deletions

View File

@ -57,8 +57,9 @@ SUPPORTED_FILTERS = glance.api.v1.SUPPORTED_FILTERS
ACTIVE_IMMUTABLE = glance.api.v1.ACTIVE_IMMUTABLE
CONF = cfg.CONF
CONF.import_opt('disk_formats', 'glance.domain')
CONF.import_opt('container_formats', 'glance.domain')
CONF.import_opt('disk_formats', 'glance.common.config', group='image_format')
CONF.import_opt('container_formats', 'glance.common.config',
group='image_format')
CONF.import_opt('image_property_quota', 'glance.common.config')
@ -69,12 +70,12 @@ def validate_image_meta(req, values):
container_format = values.get('container_format')
if 'disk_format' in values:
if disk_format not in CONF.disk_formats:
if disk_format not in CONF.image_format.disk_formats:
msg = "Invalid disk format '%s' for image." % disk_format
raise HTTPBadRequest(explanation=msg, request=req)
if 'container_format' in values:
if container_format not in CONF.container_formats:
if container_format not in CONF.image_format.container_formats:
msg = "Invalid container format '%s' for image." % container_format
raise HTTPBadRequest(explanation=msg, request=req)

View File

@ -35,8 +35,9 @@ import glance.store
LOG = logging.getLogger(__name__)
CONF = cfg.CONF
CONF.import_opt('disk_formats', 'glance.domain')
CONF.import_opt('container_formats', 'glance.domain')
CONF.import_opt('disk_formats', 'glance.common.config', group='image_format')
CONF.import_opt('container_formats', 'glance.common.config',
group='image_format')
class ImagesController(object):
@ -677,13 +678,13 @@ def _get_base_properties():
'type': 'string',
'description': _('Format of the container'),
'type': 'string',
'enum': CONF.container_formats,
'enum': CONF.image_format.container_formats,
},
'disk_format': {
'type': 'string',
'description': _('Format of the disk'),
'type': 'string',
'enum': CONF.disk_formats,
'enum': CONF.image_format.disk_formats,
},
'created_at': {
'type': 'string',

View File

@ -35,6 +35,7 @@ import glance.schema
import glance.store
CONF = cfg.CONF
CONF.import_opt('task_time_to_live', 'glance.common.config', group='task')
class TasksController(object):
@ -52,10 +53,12 @@ class TasksController(object):
def create(self, req, task):
task_factory = self.gateway.get_task_factory(req.context)
task_repo = self.gateway.get_task_repo(req.context)
live_time = CONF.task.task_time_to_live
try:
new_task = task_factory.new_task(task_type=task['type'],
task_input=task['input'],
owner=req.context.owner)
owner=req.context.owner,
task_time_to_live=live_time)
task_repo.add(new_task)
except exception.Forbidden as e:
raise webob.exc.HTTPForbidden(explanation=unicode(e))

View File

@ -40,6 +40,29 @@ paste_deploy_opts = [
cfg.StrOpt('config_file',
help=_('Name of the paste configuration file.')),
]
image_format_opts = [
cfg.ListOpt('container_formats',
default=['ami', 'ari', 'aki', 'bare', 'ovf'],
help=_("Supported values for the 'container_format' "
"image attribute"),
deprecated_opts=[cfg.DeprecatedOpt('container_formats',
group='DEFAULT')]),
cfg.ListOpt('disk_formats',
default=['ami', 'ari', 'aki', 'vhd', 'vmdk', 'raw', 'qcow2',
'vdi', 'iso'],
help=_("Supported values for the 'disk_format' "
"image attribute"),
deprecated_opts=[cfg.DeprecatedOpt('disk_formats',
group='DEFAULT')]),
]
task_opts = [
cfg.IntOpt('task_time_to_live',
default=48,
help=_("Time in hours for which a task lives after, either "
"succeeding or failing"),
deprecated_opts=[cfg.DeprecatedOpt('task_time_to_live',
group='DEFAULT')]),
]
common_opts = [
cfg.BoolOpt('allow_additional_image_properties', default=True,
help=_('Whether to allow users to specify image properties '
@ -97,6 +120,8 @@ common_opts = [
CONF = cfg.CONF
CONF.register_opts(paste_deploy_opts, group='paste_deploy')
CONF.register_opts(image_format_opts, group='image_format')
CONF.register_opts(task_opts, group='task')
CONF.register_opts(common_opts)

View File

@ -18,8 +18,6 @@ import collections
import datetime
import uuid
from oslo.config import cfg
from glance.common import exception
import glance.openstack.common.log as logging
from glance.openstack.common import timeutils
@ -28,27 +26,6 @@ from glance.openstack.common import timeutils
LOG = logging.getLogger(__name__)
image_format_opts = [
cfg.ListOpt('container_formats',
default=['ami', 'ari', 'aki', 'bare', 'ovf'],
help=_("Supported values for the 'container_format' "
"image attribute")),
cfg.ListOpt('disk_formats',
default=['ami', 'ari', 'aki', 'vhd', 'vmdk', 'raw', 'qcow2',
'vdi', 'iso'],
help=_("Supported values for the 'disk_format' "
"image attribute")),
cfg.IntOpt('task_time_to_live',
default=48,
help=_("Time in hours for which a task lives after, either "
"succeeding or failing")),
]
CONF = cfg.CONF
CONF.register_opts(image_format_opts)
class ImageFactory(object):
_readonly_properties = ['created_at', 'updated_at', 'status', 'checksum',
'size']
@ -288,7 +265,7 @@ class Task(object):
_supported_task_status = ('pending', 'processing', 'success', 'failure')
def __init__(self, task_id, type, status, input, result, owner, message,
expires_at, created_at, updated_at):
expires_at, created_at, updated_at, task_time_to_live=48):
if type not in self._supported_task_type:
raise exception.InvalidTaskType(type)
@ -306,7 +283,7 @@ class Task(object):
self.expires_at = expires_at
# NOTE(nikhil): We use '_time_to_live' to determine how long a
# task should live from the time it succeeds or fails.
self._time_to_live = datetime.timedelta(hours=CONF.task_time_to_live)
self._time_to_live = datetime.timedelta(hours=task_time_to_live)
self.created_at = created_at
self.updated_at = updated_at
@ -366,7 +343,7 @@ class Task(object):
class TaskFactory(object):
def new_task(self, task_type, task_input, owner):
def new_task(self, task_type, task_input, owner, task_time_to_live=48):
task_id = str(uuid.uuid4())
status = 'pending'
result = None
@ -386,5 +363,6 @@ class TaskFactory(object):
message,
expires_at,
created_at,
updated_at
updated_at,
task_time_to_live
)

View File

@ -328,8 +328,12 @@ class TestTask(test_utils.BaseTestCase):
task_input = ('{"import_from": "file:///home/a.img",'
' "import_from_format": "qcow2"}')
owner = TENANT1
task_ttl = CONF.task.task_time_to_live
self.gateway = unittest_utils.FakeGateway()
self.task = self.task_factory.new_task(task_type, task_input, owner)
self.task = self.task_factory.new_task(task_type,
task_input,
owner,
task_time_to_live=task_ttl)
def test_task_invalid_status(self):
task_id = str(uuid.uuid4())
@ -411,7 +415,7 @@ class TestTask(test_utils.BaseTestCase):
self.task.succeed('{"location": "file://home"}')
self.assertEqual(self.task.status, 'success')
expected = (timeutils.utcnow() +
datetime.timedelta(hours=CONF.task_time_to_live))
datetime.timedelta(hours=CONF.task.task_time_to_live))
self.assertEqual(
self.task.expires_at,
expected
@ -424,7 +428,7 @@ class TestTask(test_utils.BaseTestCase):
self.task.fail('{"message": "connection failed"}')
self.assertEqual(self.task.status, 'failure')
expected = (timeutils.utcnow() +
datetime.timedelta(hours=CONF.task_time_to_live))
datetime.timedelta(hours=CONF.task.task_time_to_live))
self.assertEqual(
self.task.expires_at,
expected

View File

@ -227,7 +227,7 @@ class TestGlanceAPI(base.IsolatedUnitTest):
self.assertTrue('Invalid disk format' in res.body, res.body)
def test_configured_disk_format_good(self):
self.config(disk_formats=['foo'])
self.config(disk_formats=['foo'], group="image_format")
fixture_headers = {
'x-image-meta-store': 'bad',
'x-image-meta-name': 'bogus',
@ -245,7 +245,7 @@ class TestGlanceAPI(base.IsolatedUnitTest):
self.assertEqual(res.status_int, 201)
def test_configured_disk_format_bad(self):
self.config(disk_formats=['foo'])
self.config(disk_formats=['foo'], group="image_format")
fixture_headers = {
'x-image-meta-store': 'bad',
'x-image-meta-name': 'bogus',
@ -264,7 +264,7 @@ class TestGlanceAPI(base.IsolatedUnitTest):
self.assertTrue('Invalid disk format' in res.body, res.body)
def test_configured_container_format_good(self):
self.config(container_formats=['foo'])
self.config(container_formats=['foo'], group="image_format")
fixture_headers = {
'x-image-meta-store': 'bad',
'x-image-meta-name': 'bogus',
@ -282,7 +282,7 @@ class TestGlanceAPI(base.IsolatedUnitTest):
self.assertEqual(res.status_int, 201)
def test_configured_container_format_bad(self):
self.config(container_formats=['foo'])
self.config(container_formats=['foo'], group="image_format")
fixture_headers = {
'x-image-meta-store': 'bad',
'x-image-meta-name': 'bogus',

View File

@ -3104,7 +3104,7 @@ class TestImageSchemaFormatConfiguration(test_utils.BaseTestCase):
self.assertEqual(expected, actual)
def test_custom_disk_formats(self):
self.config(disk_formats=['gabe'])
self.config(disk_formats=['gabe'], group="image_format")
schema = glance.api.v2.images.get_schema()
expected = ['gabe']
actual = schema.properties['disk_format']['enum']
@ -3117,7 +3117,7 @@ class TestImageSchemaFormatConfiguration(test_utils.BaseTestCase):
self.assertEqual(expected, actual)
def test_custom_container_formats(self):
self.config(container_formats=['mark'])
self.config(container_formats=['mark'], group="image_format")
schema = glance.api.v2.images.get_schema()
expected = ['mark']
actual = schema.properties['container_format']['enum']