在nova/compute/manager.py 中的
class ComputeManager(manager.Manager):
def _build_and_run_instance(self, context, instance, image, request_spec):
image_name = image.get('name')
这里通过image.get得到这个image的name
这里的image是在nova/image 下的__init__.py中有定义
def API():
# Needed to prevent circular import...
import nova.image.api
return nova.image.api.API()
看到这里是返回nova.image.api.API()。由这个路径继续看api.py中的get函数
def get(self, context, id_or_uri, include_locations=False,
//首先通过_get_session_and_image_id得到session和image_id
session, image_id = self._get_session_and_image_id(context, id_or_uri)
//最后调用show方法,这个show方法最后是调用glance的show方法,之前已经分析过
return session.show(context, image_id,
include_locations=include_locations,
show_deleted=show_deleted)
这里我们只看_get_session_and_image_id
def _get_session_and_image_id(self, context, id_or_uri):
return glance.get_remote_image_service(context, id_or_uri)
这里的glance来自from nova.image import glance。
继续看glance.py
def get_remote_image_service(context, image_href):
# NOTE(bcwaldon): If image_href doesn't look like a URI, assume its a
# standalone image ID
if '/' not in str(image_href):
image_service = get_default_image_service()
return image_service, image_href
try:
//得到glance的endpoint。看起来endpoint是存在image_href中
(image_id, endpoint) = _endpoint_from_image_ref(image_href)
glance_client = GlanceClientWrapper(context=context,
endpoint=endpoint)
except ValueError:
raise exception.InvalidImageRef(image_href=image_href)
# TODO(sbiswas7): Remove this check once we move to glance V2
# completely.
在根据配置文件中用的是glance是v1还是v2版本,调用不同的Image Service。这个之前已经分析过
if CONF.glance.use_glance_v1:
image_service = GlanceImageService(client=glance_client)
else:
image_service = GlanceImageServiceV2(client=glance_client)
return image_service, image_id