diff --git a/glance/api/v1/images.py b/glance/api/v1/images.py index a162e8f61b..94f2d31a8d 100644 --- a/glance/api/v1/images.py +++ b/glance/api/v1/images.py @@ -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) diff --git a/glance/api/v2/images.py b/glance/api/v2/images.py index 46e1066aee..7916e6121a 100644 --- a/glance/api/v2/images.py +++ b/glance/api/v2/images.py @@ -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', diff --git a/glance/api/v2/tasks.py b/glance/api/v2/tasks.py index e1fa0d66f1..a626a0a3bc 100644 --- a/glance/api/v2/tasks.py +++ b/glance/api/v2/tasks.py @@ -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)) diff --git a/glance/common/config.py b/glance/common/config.py index c43ed4b41a..d383cf40e2 100644 --- a/glance/common/config.py +++ b/glance/common/config.py @@ -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) diff --git a/glance/domain/__init__.py b/glance/domain/__init__.py index 4198c7c0c2..5144b481d0 100644 --- a/glance/domain/__init__.py +++ b/glance/domain/__init__.py @@ -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 ) diff --git a/glance/tests/unit/test_domain.py b/glance/tests/unit/test_domain.py index f57ed498d0..63bea6de85 100644 --- a/glance/tests/unit/test_domain.py +++ b/glance/tests/unit/test_domain.py @@ -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 diff --git a/glance/tests/unit/v1/test_api.py b/glance/tests/unit/v1/test_api.py index b46bd39f5f..55e96c0ba3 100644 --- a/glance/tests/unit/v1/test_api.py +++ b/glance/tests/unit/v1/test_api.py @@ -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', diff --git a/glance/tests/unit/v2/test_images_resource.py b/glance/tests/unit/v2/test_images_resource.py index a43302cdce..6ecad9b8ae 100644 --- a/glance/tests/unit/v2/test_images_resource.py +++ b/glance/tests/unit/v2/test_images_resource.py @@ -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']