summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNaveed Massjouni <naveedm9@gmail.com>2011-05-18 03:51:25 -0400
committerNaveed Massjouni <naveedm9@gmail.com>2011-05-18 03:51:25 -0400
commit6c151bfbfeb728d6e38f777640d483c1e344113d (patch)
tree4cc80cb1a76abf2c26f729c57e60c82029540c96
parentd24f59a251173826817e5f5c53a4f54dfe927f2d (diff)
Removed all utils.import_object(FLAGS.image_service) and replaced with
utils.get_default_image_service().
-rwxr-xr-xbin/nova-manage2
-rw-r--r--nova/api/openstack/image_metadata.py2
-rw-r--r--nova/api/openstack/images.py5
-rw-r--r--nova/api/openstack/servers.py22
-rw-r--r--nova/api/openstack/views/servers.py10
-rw-r--r--nova/compute/api.py4
-rw-r--r--nova/image/s3.py4
-rw-r--r--nova/tests/api/openstack/test_servers.py11
-rw-r--r--nova/utils.py60
-rw-r--r--nova/virt/images.py2
-rw-r--r--nova/virt/libvirt_conn.py2
11 files changed, 58 insertions, 66 deletions
diff --git a/bin/nova-manage b/bin/nova-manage
index db964064d..3f3fd72a6 100755
--- a/bin/nova-manage
+++ b/bin/nova-manage
@@ -905,7 +905,7 @@ class ImageCommands(object):
"""Methods for dealing with a cloud in an odd state"""
def __init__(self, *args, **kwargs):
- self.image_service = utils.import_object(FLAGS.image_service)
+ self.image_service = utils.get_default_image_service()
def _register(self, container_format, disk_format,
path, owner, name=None, is_public='T',
diff --git a/nova/api/openstack/image_metadata.py b/nova/api/openstack/image_metadata.py
index 1eccc0174..f6913ffc6 100644
--- a/nova/api/openstack/image_metadata.py
+++ b/nova/api/openstack/image_metadata.py
@@ -32,7 +32,7 @@ class Controller(common.OpenstackController):
"""The image metadata API controller for the Openstack API"""
def __init__(self):
- self.image_service = utils.import_object(FLAGS.image_service)
+ self.image_service = utils.get_default_image_service()
super(Controller, self).__init__()
def _get_metadata(self, context, image_id, image=None):
diff --git a/nova/api/openstack/images.py b/nova/api/openstack/images.py
index 8d796c284..8a90b4c4d 100644
--- a/nova/api/openstack/images.py
+++ b/nova/api/openstack/images.py
@@ -47,11 +47,10 @@ class Controller(common.OpenstackController):
:param compute_service: `nova.compute.api:API`
:param image_service: `nova.image.service:BaseImageService`
- """
- _default_service = utils.import_object(flags.FLAGS.image_service)
+ """
self._compute_service = compute_service or compute.API()
- self._image_service = image_service or _default_service
+ self._image_service = image_service or utils.get_default_image_service()
def index(self, req):
"""Return an index listing of images available to the request.
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py
index bf0f56373..4e8574994 100644
--- a/nova/api/openstack/servers.py
+++ b/nova/api/openstack/servers.py
@@ -64,7 +64,6 @@ class Controller(common.OpenstackController):
def __init__(self):
self.compute_api = compute.API()
- self._image_service = utils.import_object(FLAGS.image_service)
super(Controller, self).__init__()
def index(self, req):
@@ -75,7 +74,7 @@ class Controller(common.OpenstackController):
""" Returns a list of server details for a given user """
return self._items(req, is_detail=True)
- def _image_id_from_req_data(self, data):
+ def _image_ref_from_req_data(self, data):
raise NotImplementedError()
def _flavor_id_from_req_data(self, data):
@@ -140,13 +139,13 @@ class Controller(common.OpenstackController):
key_name = key_pair['name']
key_data = key_pair['public_key']
- requested_image_id = self._image_id_from_req_data(env)
+ image_ref = self._image_ref_from_req_data(env)
try:
- (image_service, service_image_id) = utils.get_image_service(
- requested_image_id)
+ (image_service, image_id) = utils.get_image_service( image_ref)
- image_id = common.get_image_id_from_image_hash(image_service,
- context, requested_image_id)
+ #TODO: need to assert image exists a better way
+ #image_id = common.get_image_id_from_image_hash(image_service,
+ #context, image_ref)
except:
msg = _("Can not find requested image")
return faults.Fault(exc.HTTPBadRequest(msg))
@@ -188,7 +187,7 @@ class Controller(common.OpenstackController):
self._handle_quota_error(error)
inst['instance_type'] = inst_type
- inst['image_id'] = requested_image_id
+ inst['image_id'] = image_ref
builder = self._get_view_builder(req)
server = builder.build(inst, is_detail=True)
@@ -596,7 +595,7 @@ class Controller(common.OpenstackController):
class ControllerV10(Controller):
- def _image_id_from_req_data(self, data):
+ def _image_ref_from_req_data(self, data):
return data['server']['imageId']
def _flavor_id_from_req_data(self, data):
@@ -639,9 +638,8 @@ class ControllerV10(Controller):
class ControllerV11(Controller):
- def _image_id_from_req_data(self, data):
- href = data['server']['imageRef']
- return common.get_id_from_href(href)
+ def _image_ref_from_req_data(self, data):
+ return data['server']['imageRef']
def _flavor_id_from_req_data(self, data):
href = data['server']['flavorRef']
diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py
index 0be468edc..70a942594 100644
--- a/nova/api/openstack/views/servers.py
+++ b/nova/api/openstack/views/servers.py
@@ -113,7 +113,7 @@ class ViewBuilderV10(ViewBuilder):
def _build_image(self, response, inst):
if 'image_id' in dict(inst):
- response['imageId'] = inst['image_id']
+ response['imageId'] = int(inst['image_id'])
def _build_flavor(self, response, inst):
if 'instance_type' in dict(inst):
@@ -130,9 +130,11 @@ class ViewBuilderV11(ViewBuilder):
self.base_url = base_url
def _build_image(self, response, inst):
- if "image_id" in dict(inst):
- image_id = inst.get("image_id")
- response["imageRef"] = self.image_builder.generate_href(image_id)
+ if 'image_id' in dict(inst):
+ image_id = inst['image_id']
+ if utils.is_int(image_id):
+ image_id = int(image_id)
+ response['imageRef'] = image_id
def _build_flavor(self, response, inst):
if "instance_type" in dict(inst):
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 930e4efaa..4e7af7421 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -58,9 +58,7 @@ class API(base.Base):
def __init__(self, image_service=None, network_api=None,
volume_api=None, hostname_factory=generate_default_hostname,
**kwargs):
- if not image_service:
- image_service = utils.import_object(FLAGS.image_service)
- self.image_service = image_service
+ self.image_service = image_service or utils.get_default_image_service()
if not network_api:
network_api = network.API()
self.network_api = network_api
diff --git a/nova/image/s3.py b/nova/image/s3.py
index c38c58d95..ed685ea51 100644
--- a/nova/image/s3.py
+++ b/nova/image/s3.py
@@ -46,9 +46,7 @@ class S3ImageService(service.BaseImageService):
"""Wraps an existing image service to support s3 based register."""
def __init__(self, service=None, *args, **kwargs):
- if service is None:
- service = utils.import_object(FLAGS.image_service)
- self.service = service
+ self.service = service or utils.get_default_image_service()
self.service.__init__(*args, **kwargs)
def create(self, context, metadata, data=None):
diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py
index e8182b6a9..cfa8d2556 100644
--- a/nova/tests/api/openstack/test_servers.py
+++ b/nova/tests/api/openstack/test_servers.py
@@ -628,13 +628,12 @@ class ServersTest(test.TestCase):
def test_create_instance_v1_1_local_href(self):
self._setup_for_create_instance()
- image_ref = 'http://localhost/v1.1/images/2'
- image_ref_local = '2'
+ image_ref = 2
flavor_ref = 'http://localhost/v1.1/flavors/3'
body = {
'server': {
'name': 'server_test',
- 'imageRef': image_ref_local,
+ 'imageRef': image_ref,
'flavorRef': flavor_ref,
},
}
@@ -852,7 +851,7 @@ class ServersTest(test.TestCase):
self.assertEqual(s['id'], i)
self.assertEqual(s['hostId'], '')
self.assertEqual(s['name'], 'server%d' % i)
- self.assertEqual(s['imageId'], '10')
+ self.assertEqual(s['imageId'], 10)
self.assertEqual(s['flavorId'], 1)
self.assertEqual(s['status'], 'BUILD')
self.assertEqual(s['metadata']['seq'], str(i))
@@ -866,7 +865,7 @@ class ServersTest(test.TestCase):
self.assertEqual(s['id'], i)
self.assertEqual(s['hostId'], '')
self.assertEqual(s['name'], 'server%d' % i)
- self.assertEqual(s['imageRef'], 'http://localhost/v1.1/images/10')
+ self.assertEqual(s['imageRef'], 10)
self.assertEqual(s['flavorRef'], 'http://localhost/v1.1/flavors/1')
self.assertEqual(s['status'], 'BUILD')
self.assertEqual(s['metadata']['seq'], str(i))
@@ -898,7 +897,7 @@ class ServersTest(test.TestCase):
self.assertEqual(s['id'], i)
self.assertEqual(s['hostId'], host_ids[i % 2])
self.assertEqual(s['name'], 'server%d' % i)
- self.assertEqual(s['imageId'], '10')
+ self.assertEqual(s['imageId'], 10)
self.assertEqual(s['flavorId'], 1)
def test_server_pause(self):
diff --git a/nova/utils.py b/nova/utils.py
index fff916527..3c8c82281 100644
--- a/nova/utils.py
+++ b/nova/utils.py
@@ -35,6 +35,7 @@ import struct
import sys
import time
import types
+from urlparse import urlparse
from xml.sax import saxutils
from eventlet import event
@@ -42,6 +43,7 @@ from eventlet import greenthread
from eventlet import semaphore
from eventlet.green import subprocess
+import nova
from nova import exception
from nova import flags
from nova import log as logging
@@ -727,57 +729,53 @@ def parse_server_string(server_str):
def is_int(x):
- """ Return if passed in variable is integer or not """
return re.match(r'\d+$', str(x))
def parse_image_ref(image_ref):
- """
- Parse an imageRef and return (id, host, port)
+ """Parse an image href into composite parts.
If the image_ref passed in is an integer, it will
return (image_ref, None, None), otherwise it will
- return (id, host, port)
+ return (image_id, host, port)
- image_ref - imageRef for an image
+ :param image_ref: href or id of an image
"""
-
if is_int(image_ref):
- return (image_ref, None, None)
+ return (int(image_ref), None, None)
o = urlparse(image_ref)
- # Default to port 80 if not passed, should this be 9292?
- port = o.port or 80
+ port = o.port
host = o.netloc.split(':', 1)[0]
- id = o.path.split('/')[-1]
-
- return (id, host, port)
+ image_id = o.path.split('/')[-1]
+ if is_int(image_id):
+ image_id = int(image_id)
+ else:
+ raise Exception(_('image_ref [%s] is missing a proper id') % image_ref)
+ return (image_id, host, port)
-def get_image_service(image_ref=None):
- """
- Get the proper image_service for an image_id
- Returns (image_service, image_id)
- image_ref - image ref/id for an image
- """
+def get_default_image_service():
ImageService = import_class(FLAGS.image_service)
+ return ImageService()
- if not image_ref:
- return (ImageService(), None)
-
- (image_id, host, port) = parse_image_ref(image_ref)
+def get_image_service(image_ref):
+ """Get the proper image_service and id for the given image_ref.
- image_service = None
+ The image_ref param can be an href of the form
+ http://myglanceserver:9292/images/42, or just an int such as 42. If the
+ image_ref is an int, then the default image service is returned.
- if host:
- GlanceImageService = import_class(FLAGS.glance_image_service)
- GlanceClient = import_class('glance.client.Client')
+ :param image_ref: image ref/id for an image
+ :returns: a tuple of the form (image_service, image_id)
- glance_client = GlanceClient(host, port)
- image_service = GlanceImageService(glance_client)
- else:
- image_service = ImageService()
+ """
+ if is_int(image_ref):
+ return (get_default_image_service(), int(image_ref))
- return (image_service, id)
+ (image_id, host, port) = parse_image_ref(image_ref)
+ glance_client = nova.image.glance.GlanceClient(host, port)
+ image_service = nova.image.glance.GlanceImageService(glance_client)
+ return (image_service, image_id)
diff --git a/nova/virt/images.py b/nova/virt/images.py
index 2e3f2ee4d..0828a1fd0 100644
--- a/nova/virt/images.py
+++ b/nova/virt/images.py
@@ -45,7 +45,7 @@ def fetch(image_id, path, _user, _project):
# when it is added to glance. Right now there is no
# auth checking in glance, so we assume that access was
# checked before we got here.
- image_service = utils.import_object(FLAGS.image_service)
+ image_service = utils.get_default_image_service()
with open(path, "wb") as image_file:
elevated = context.get_admin_context()
metadata = image_service.get(elevated, image_id, image_file)
diff --git a/nova/virt/libvirt_conn.py b/nova/virt/libvirt_conn.py
index fa918b0a3..23fa5bdfc 100644
--- a/nova/virt/libvirt_conn.py
+++ b/nova/virt/libvirt_conn.py
@@ -448,7 +448,7 @@ class LibvirtConnection(driver.ComputeDriver):
to support this command.
"""
- image_service = utils.import_object(FLAGS.image_service)
+ image_service = utils.get_default_image_service()
virt_dom = self._lookup_by_name(instance['name'])
elevated = context.get_admin_context()