def _get_available_images(self, request, context): project_id = context.get("project_id", None) if not hasattr(self, "_public_images"): public = {"is_public": True, "status": "active"} try: public_images, _more = glance.image_list_detailed(request, filters=public) except: public_images = [] exceptions.handle(request, _("Unable to retrieve public images.")) self._public_images = public_images # Preempt if we don't have a project_id yet. if project_id is None: setattr(self, "_images_for_%s" % project_id, []) if not hasattr(self, "_images_for_%s" % project_id): owner = {"property-owner_id": project_id, "status": "active"} try: owned_images, _more = glance.image_list_detailed(request, filters=owner) except: owned_images = [] exceptions.handle(request, _("Unable to retrieve images for " "the current project.")) setattr(self, "_images_for_%s" % project_id, owned_images) owned_images = getattr(self, "_images_for_%s" % project_id) images = owned_images + self._public_images # Remove duplicate images image_ids = [] final_images = [] for image in images: if image.id not in image_ids: image_ids.append(image.id) final_images.append(image) return [image for image in final_images if image.container_format not in ("aki", "ari")]
def __init__(self, *args, **kwrds): super(CreateFlavorAction, self).__init__(*args, **kwrds) try: kernel_images = glance.image_list_detailed( self.request, filters={'disk_format': 'aki'} )[0] ramdisk_images = glance.image_list_detailed( self.request, filters={'disk_format': 'ari'} )[0] except Exception: exceptions.handle(self.request, _('Unable to retrieve images list.')) kernel_images = [] ramdisk_images = [] self.fields['kernel_image_id'].choices = [(img.id, img.name) for img in kernel_images] self.fields['ramdisk_image_id'].choices = [(img.id, img.name) for img in ramdisk_images] # Delete what is not applicable to hardware del self.fields['eph_gb'] del self.fields['swap_mb'] # Alter user-visible strings self.fields['vcpus'].label = _("CPUs") self.fields['disk_gb'].label = _("Disk GB") # No idea why Horizon exposes this database detail del self.fields['flavor_id']
def __init__(self, *args, **kwrds): super(CreateFlavorAction, self).__init__(*args, **kwrds) try: kernel_images = glance.image_list_detailed(self.request, )[0] kernel_images = [ image for image in kernel_images if utils.check_image_type(image, 'discovery kernel') ] ramdisk_images = glance.image_list_detailed(self.request, )[0] ramdisk_images = [ image for image in ramdisk_images if utils.check_image_type(image, 'discovery ramdisk') ] except Exception: exceptions.handle(self.request, _('Unable to retrieve images list.')) kernel_images = [] ramdisk_images = [] self.fields['kernel_image_id'].choices = [(img.id, img.name) for img in kernel_images] self.fields['ramdisk_image_id'].choices = [(img.id, img.name) for img in ramdisk_images] # Delete what is not applicable to hardware del self.fields['eph_gb'] del self.fields['swap_mb'] # Alter user-visible strings self.fields['vcpus'].label = _("CPUs") self.fields['disk_gb'].label = _("Disk GB") # No idea why Horizon exposes this database detail del self.fields['flavor_id']
def get_available_images(request, project_id=None, images_cache=None): """ Returns a list of images that are public or owned by the given project_id. If project_id is not specified, only public images are returned. :param images_cache: An optional dict-like object in which to cache public and per-project id image metadata. """ if images_cache is None: images_cache = {} public_images = images_cache.get('public_images', []) images_by_project = images_cache.get('images_by_project', {}) if 'public_images' not in images_cache: public = {"is_public": True, "status": "active"} try: images, _more = glance.image_list_detailed( request, filters=public) [public_images.append(image) for image in images] images_cache['public_images'] = public_images except Exception: exceptions.handle(request, _("Unable to retrieve public images.")) # Preempt if we don't have a project_id yet. if project_id is None: images_by_project[project_id] = [] if project_id not in images_by_project: owner = {"property-owner_id": project_id, "status": "active"} try: owned_images, _more = glance.image_list_detailed( request, filters=owner) images_by_project[project_id] = owned_images except Exception: owned_images = [] exceptions.handle(request, _("Unable to retrieve images for " "the current project.")) else: owned_images = images_by_project[project_id] if 'images_by_project' not in images_cache: images_cache['images_by_project'] = images_by_project images = owned_images + public_images # Remove duplicate images image_ids = [] final_images = [] for image in images: if image.id not in image_ids: image_ids.append(image.id) final_images.append(image) return [image for image in final_images if image.container_format not in ('aki', 'ari')]
def get_available_images(request, project_id=None, images_cache=None): """Returns a list of images that are public or owned by the given project_id. If project_id is not specified, only public images are returned. :param images_cache: An optional dict-like object in which to cache public and per-project id image metadata. """ if images_cache is None: images_cache = {} public_images = images_cache.get('public_images', []) images_by_project = images_cache.get('images_by_project', {}) if 'public_images' not in images_cache: public = {"is_public": True, "status": "active"} try: images, _more, _prev = glance.image_list_detailed(request, filters=public) [public_images.append(image) for image in images] images_cache['public_images'] = public_images except Exception: exceptions.handle(request, _("Unable to retrieve public images.")) # Preempt if we don't have a project_id yet. if project_id is None: images_by_project[project_id] = [] if project_id not in images_by_project: owner = {"property-owner_id": project_id, "status": "active"} try: owned_images, _more, _prev = glance.image_list_detailed( request, filters=owner) images_by_project[project_id] = owned_images except Exception: owned_images = [] exceptions.handle( request, _("Unable to retrieve images for " "the current project.")) else: owned_images = images_by_project[project_id] if 'images_by_project' not in images_cache: images_cache['images_by_project'] = images_by_project images = owned_images + public_images # Remove duplicate images image_ids = [] final_images = [] for image in images: if image.id not in image_ids: image_ids.append(image.id) final_images.append(image) return [ image for image in final_images if image.container_format not in ('aki', 'ari') ]
def get_available_images(request, project_id=None, images_cache=None): """Returns a list of images that are available in a certain context. Project_id is here only for backwards compatibility. The function shall return public, private and shared images. :param images_cache: An optional dict-like object in which to cache image metadata. """ if images_cache is None: images_cache = {} all_images = images_cache.get('all_images', []) if 'all_images' not in images_cache: try: images, _more, _prev = glance.image_list_detailed(request) [all_images.append(image) for image in images] images_cache['all_images'] = images except Exception: exceptions.handle(request, _("Unable to retrieve images.")) return [ image for image in all_images if image.container_format not in ('aki', 'ari') ]
def get_murano_images(request, region=None): images = [] try: # https://bugs.launchpad.net/murano/+bug/1339261 - glance # client version change alters the API. Other tuple values # are _more and _prev (in recent glance client) with helpers.current_region(request, region): images = glance.image_list_detailed(request)[0] except Exception: LOG.error("Error to request image list from glance ") exceptions.handle(request, _("Unable to retrieve public images.")) murano_images = [] # filter out the snapshot image type images = filter( lambda x: x.properties.get("image_type", '') != 'snapshot', images) for image in images: # Additional properties, whose value is always a string data type, are # only included in the response if they have a value. murano_property = getattr(image, 'murano_image_info', None) if murano_property: try: murano_metadata = json.loads(murano_property) except ValueError: LOG.warning("JSON in image metadata is not valid. " "Check it in glance.") messages.error(request, _("Invalid murano image metadata")) else: image.murano_property = murano_metadata murano_images.append(image) return murano_images
def update(self, request, initial): try: # public filter removed images, _more = glance.image_list_detailed(request) except: images = [] exceptions.handle(request, _("Unable to retrieve public images.")) image_mapping, image_choices = {}, [] for image in images: murano_property = image.properties.get('murano_image_info') if murano_property: # convert to dict because # only string can be stored in image metadata property try: murano_json = ast.literal_eval(murano_property) except ValueError: messages.error(request, _("Invalid value in image metadata")) else: title = murano_json.get('title') image_id = murano_json.get('id') if title and image_id: image_mapping[smart_text(title)] = smart_text(image_id) for name in sorted(image_mapping.keys()): image_choices.append((image_mapping[name], name)) if image_choices: image_choices.insert(0, ("", _("Select Image"))) else: image_choices.insert(0, ("", _("No images available"))) self.choices = image_choices
def get_filter_properties(request): try: #images, _more, _prev = glance.image_list_detailed(request) images, _more, _prev = glance.image_list_detailed(request) return images except Exception: exceptions.handle(request, _("Unable to retrieve public images."))
def get_murano_images(request): images = [] try: # https://bugs.launchpad.net/murano/+bug/1339261 - glance # client version change alters the API. Other tuple values # are _more and _prev (in recent glance client) images = glance.image_list_detailed(request)[0] except Exception: LOG.error("Error to request image list from glance ") exceptions.handle(request, _("Unable to retrieve public images.")) murano_images = [] # filter out the snapshot image type images = filter(lambda x: x.properties.get("image_type", '') != 'snapshot', images) for image in images: # Additional properties, whose value is always a string data type, are # only included in the response if they have a value. murano_property = getattr(image, 'murano_image_info', None) if murano_property: try: murano_metadata = json.loads(murano_property) except ValueError: LOG.warning("JSON in image metadata is not valid. " "Check it in glance.") messages.error(request, _("Invalid murano image metadata")) else: image.murano_property = murano_metadata murano_images.append(image) return murano_images
def populate_image_choices(self, request, context): images = glance.image_list_detailed(self.request)[0] images = [image for image in images if tuskar_utils.check_image_type(image, 'overcloud provisioning')] choices = [(i.id, i.name) for i in images] return [('', _('Unknown'))] + choices
def populate_image_choices(self, request, context): images = glance.image_list_detailed(self.request)[0] images = [ image for image in images if tuskar_utils.check_image_type(image, 'overcloud provisioning') ] choices = [(i.id, i.name) for i in images] return [('', _('Unknown'))] + choices
def _get_images(self, request, filter): try: images, _more = glance.image_list_detailed(request, filters=filter) except Exception: images = [] exceptions.handle(request, _("Unable to retrieve images with filter %s.") % filter) return images
def _get_available_images(self, request, context): project_id = context.get('project_id', None) if not hasattr(self, "_public_images"): public = {"is_public": True, "status": "active"} try: public_images, _more = glance.image_list_detailed( request, filters=public) except: public_images = [] exceptions.handle(request, _("Unable to retrieve public images.")) self._public_images = public_images # Preempt if we don't have a project_id yet. if project_id is None: setattr(self, "_images_for_%s" % project_id, []) if not hasattr(self, "_images_for_%s" % project_id): owner = {"property-owner_id": project_id, "status": "active"} try: owned_images, _more = glance.image_list_detailed(request, filters=owner) except: owned_images = [] exceptions.handle( request, _("Unable to retrieve images for " "the current project.")) setattr(self, "_images_for_%s" % project_id, owned_images) owned_images = getattr(self, "_images_for_%s" % project_id) images = owned_images + self._public_images # Remove duplicate images image_ids = [] final_images = [] for image in images: if image.id not in image_ids: image_ids.append(image.id) final_images.append(image) return [ image for image in final_images if image.container_format not in ('aki', 'ari') ]
def get_data(self): images = [] try: images, _more = glance.image_list_detailed(self.request) except Exception: msg = _('Unable to retrieve list of images') uri = reverse('horizon:murano:images:index') exceptions.handle(self.request, msg, redirect=uri) return filter_murano_images(images, request=self.request)
def _get_images(self, request, filter): try: images, _more, _prev = (glance.image_list_detailed(request, filters=filter)) except Exception: images = [] exceptions.handle( request, _("Unable to retrieve images with filter %s.") % filter) return images
def get_kernel_images(request): try: kernel_images = glance.image_list_detailed( request, )[0] kernel_images = [image for image in kernel_images if utils.check_image_type(image, 'deploy kernel')] except Exception: exceptions.handle(request, _('Unable to retrieve kernel image list.')) kernel_images = [] return kernel_images
def __init__(self, request, *args, **kwargs): super(MarkImageForm, self).__init__(request, *args, **kwargs) images = [] try: images, _more = glance.image_list_detailed(request) except Exception: LOG.error('Failed to request image list from Glance') exceptions.handle(request, _('Unable to retrieve list of images')) self.fields['image'].choices = [(i.id, i.name) for i in images] self.fields['existing_titles'].initial = \ [image.title for image in filter_murano_images(images)]
def get_data(self): images = [] try: # https://bugs.launchpad.net/murano/+bug/1339261 - glance # client version change alters the API. Other tuple values # are _more and _prev (in recent glance client) images = glance.image_list_detailed(self.request)[0] except Exception: msg = _('Unable to retrieve list of images') uri = reverse('horizon:murano:images:index') exceptions.handle(self.request, msg, redirect=uri) return forms.filter_murano_images(images, request=self.request)
def get_ramdisk_images(request): try: ramdisk_images = glance.image_list_detailed( request, )[0] ramdisk_images = [image for image in ramdisk_images if utils.check_image_type( image, 'deploy ramdisk')] except Exception: exceptions.handle(request, _('Unable to retrieve ramdisk image list.')) ramdisk_images = [] return ramdisk_images
def find_basevm_by_sha256(request, sha256_value): from openstack_dashboard.api import glance public = {"is_public": True, "status": "active"} public_images, _more = glance.image_list_detailed(request, filters=public) for image in public_images: properties = getattr(image, "properties") if properties == None or len(properties) == 0: continue if properties.get(CLOUDLET_TYPE.PROPERTY_KEY_CLOUDLET_TYPE) != \ CLOUDLET_TYPE.IMAGE_TYPE_BASE_DISK: continue base_sha256_uuid = properties.get(CLOUDLET_TYPE.PROPERTY_KEY_BASE_UUID) if base_sha256_uuid == sha256_value: return image return None
def __init__(self, request, *args, **kwargs): super(MarkImageForm, self).__init__(request, *args, **kwargs) images = [] try: # https://bugs.launchpad.net/murano/+bug/1339261 - glance # client version change alters the API. Other tuple values # are _more and _prev (in recent glance client) images = glance.image_list_detailed(request)[0] except Exception: LOG.error('Failed to request image list from Glance') exceptions.handle(request, _('Unable to retrieve list of images')) self.fields['image'].choices = [(i.id, i.name) for i in images] self.fields['existing_titles'].initial = \ [image.title for image in filter_murano_images(images)]
def get_murano_images(request): images = [] try: # public filter removed images, _more = glance.image_list_detailed(request) except: LOG.error("Error to request image list from glance ") exceptions.handle(request, _("Unable to retrieve public images.")) murano_images = [] for image in images: murano_property = image.properties.get('murano_image_info') if murano_property: try: murano_metadata = json.loads(murano_property) except ValueError: LOG.warning("JSON in image metadata is not valid. " "Check it in glance.") messages.error(request, _("Invalid murano image metadata")) else: image.murano_property = murano_metadata murano_images.append(image) return murano_images
def get_murano_images(request): images = [] try: # https://bugs.launchpad.net/murano/+bug/1339261 - glance # client version change alters the API. Other tuple values # are _more and _prev (in recent glance client) images = glance.image_list_detailed(request)[0] except Exception: LOG.error("Error to request image list from glance ") exceptions.handle(request, _("Unable to retrieve public images.")) murano_images = [] for image in images: murano_property = image.properties.get("murano_image_info") if murano_property: try: murano_metadata = json.loads(murano_property) except ValueError: LOG.warning("JSON in image metadata is not valid. " "Check it in glance.") messages.error(request, _("Invalid murano image metadata")) else: image.murano_property = murano_metadata murano_images.append(image) return murano_images
def _guess_default_image_ids(request): try: images = glance.image_list_detailed(request)[0] except Exception: horizon.exceptions.handle(request, _('Unable to retrieve images list.')) kernel_images = [] ramdisk_images = [] else: has_type = tuskar_ui.utils.utils.check_image_type kernel_images = [ image for image in images if has_type(image, 'discovery kernel') and image.name == DEFAULT_KERNEL_IMAGE_NAME ] ramdisk_images = [ image for image in images if has_type(image, 'discovery ramdisk') and image.name == DEFAULT_RAMDISK_IMAGE_NAME ] if not kernel_images or not ramdisk_images: raise ValueError("No default images") return kernel_images[0].id, ramdisk_images[0].id
def get_murano_images(request): images = [] try: # https://bugs.launchpad.net/murano/+bug/1339261 - glance # client version change alters the API. Other tuple values # are _more and _prev (in recent glance client) images = glance.image_list_detailed(request)[0] except Exception: LOG.error("Error to request image list from glance ") exceptions.handle(request, _("Unable to retrieve public images.")) murano_images = [] for image in images: murano_property = image.properties.get('murano_image_info') if murano_property: try: murano_metadata = json.loads(murano_property) except ValueError: LOG.warning("JSON in image metadata is not valid. " "Check it in glance.") messages.error(request, _("Invalid murano image metadata")) else: image.murano_property = murano_metadata murano_images.append(image) return murano_images
def __init__(self, request, *args, **kwargs): super(MarkImageForm, self).__init__(request, *args, **kwargs) images = [] try: # https://bugs.launchpad.net/murano/+bug/1339261 - glance # client version change alters the API. Other tuple values # are _more and _prev (in recent glance client) images = glance.image_list_detailed(request)[0] except Exception: LOG.error('Failed to request image list from Glance') exceptions.handle(request, _('Unable to retrieve list of images')) # filter out the image format aki and ari images = filter( lambda x: x.container_format not in ('aki', 'ari'), images) # filter out the snapshot image type images = filter( lambda x: x.properties.get("image_type", '') != 'snapshot', images) self.fields['image'].choices = [(i.id, i.name) for i in images] self.fields['existing_titles'].initial = \ [image.title for image in filter_murano_images(images)]
def populate_base_image_choices(self, request, context): public_images, _more = glance.image_list_detailed(request) return [(image.id, image.name) for image in public_images if ("image.final" in image.name or "hadoop" in image.name or "hdp" in image.name)]
def get_data(self): return glance.image_list_detailed(self.request)[0]
def get_available_images(request, project_id=None, images_cache=None): """Returns a list of available images Returns a list of images that are public, shared, community or owned by the given project_id. If project_id is not specified, only public and community images are returned. :param images_cache: An optional dict-like object in which to cache public and per-project id image metadata. """ if images_cache is None: images_cache = {} public_images = images_cache.get('public_images', []) community_images = images_cache.get('community_images', []) images_by_project = images_cache.get('images_by_project', {}) shared_images = images_cache.get('shared_images', []) if 'public_images' not in images_cache: public = {"is_public": True, "status": "active"} try: images, _more, _prev = glance.image_list_detailed( request, filters=public) public_images += images images_cache['public_images'] = public_images except Exception: exceptions.handle(request, _("Unable to retrieve public images.")) # Preempt if we don't have a project_id yet. if project_id is None: images_by_project[project_id] = [] if project_id not in images_by_project: owner = {"property-owner_id": project_id, "status": "active"} try: owned_images, _more, _prev = glance.image_list_detailed( request, filters=owner) images_by_project[project_id] = owned_images except Exception: owned_images = [] exceptions.handle(request, _("Unable to retrieve images for " "the current project.")) else: owned_images = images_by_project[project_id] if 'community_images' not in images_cache: community = {"visibility": "community", "status": "active"} try: images, _more, _prev = glance.image_list_detailed( request, filters=community) community_images += images images_cache['community_images'] = community_images except Exception: exceptions.handle(request, _("Unable to retrieve community images.")) if 'shared_images' not in images_cache: shared = {"visibility": "shared", "status": "active"} try: shared_images, _more, _prev = \ glance.image_list_detailed(request, filters=shared) images_cache['shared_images'] = shared_images except Exception: exceptions.handle(request, _("Unable to retrieve shared images.")) if 'images_by_project' not in images_cache: images_cache['images_by_project'] = images_by_project images = owned_images + public_images + community_images + shared_images image_ids = [] final_images = [] for image in images: if image.id not in image_ids and \ image.container_format not in ('aki', 'ari'): image_ids.append(image.id) final_images.append(image) return final_images
def get_internalinstances_data(self): request = self.tab_group.request instances = [] marker = self.request.GET.get( project_tables.InstancesTable._meta.pagination_param, None) # # Gather our instances try: instances, self._more = nova.server_list( self.request, search_opts={'marker': marker, 'paginate': True}) except Exception: self._more = False instances = [] exceptions.handle(self.request, _('Unable to retrieve instances.')) # Gather our flavors and images and correlate our instances to them if instances: try: flavors = nova.flavor_list(self.request) except Exception: flavors = [] exceptions.handle(self.request, ignore=True) try: # TODO(gabriel): Handle pagination. images, more = glance.image_list_detailed(self.request) except Exception: images = [] exceptions.handle(self.request, ignore=True) full_flavors = SortedDict([(str(flavor.id), flavor) for flavor in flavors]) image_map = SortedDict([(str(image.id), image) for image in images]) # Loop through instances to get flavor info. for instance in instances: if hasattr(instance, 'image'): # Instance from image returns dict if isinstance(instance.image, dict): if instance.image.get('id') in image_map: instance.image = image_map[instance.image['id']] else: # Instance from volume returns a string instance.image = {'name': instance.image if instance.image else _("-")} try: flavor_id = instance.flavor["id"] if flavor_id in full_flavors: instance.full_flavor = full_flavors[flavor_id] else: # If the flavor_id is not in full_flavors list, # get it via nova api. instance.full_flavor = nova.flavor_get( self.request, flavor_id) except Exception: msg = _('Unable to retrieve instance size information.') exceptions.handle(self.request, msg) return instances
def _get_available_images(self, request, context): if not hasattr(self, '_images_cache'): images_cache = {} if images_cache is None: images_cache = {} public_images = images_cache.get('public_images', []) images_by_project = images_cache.get('images_by_project', {}) if 'public_images' not in images_cache: public = {"is_public": True, "status": "active"} try: images, _more, _prev = glance.image_list_detailed( request, filters=public) [public_images.append(image) for image in images] images_cache['public_images'] = public_images except Exception: exceptions.handle(request, _("Unable to retrieve public images.")) # Preempt if we don't have a project_id yet. project_id = context.get('project_id', None) if project_id is None: images_by_project[project_id] = [] if project_id not in images_by_project: owner = {"property-owner_id": project_id, "status": "active"} try: owned_images, _more, _prev = glance.image_list_detailed( request, filters=owner) images_by_project[project_id] = owned_images except Exception: owned_images = [] exceptions.handle( request, _("Unable to retrieve images for " "the current project.")) else: owned_images = images_by_project[project_id] if 'images_by_project' not in images_cache: images_cache['images_by_project'] = images_by_project images = owned_images + public_images base_vms = list() for image in images: if hasattr(image, 'properties') == True: properties = getattr(image, 'properties') cloudlet_type = properties.get('cloudlet_type', None) if cloudlet_type == 'cloudlet_base_disk': base_vms.append(image) image_ids = [] final_images = [] for image in base_vms: if image.id not in image_ids: image_ids.append(image.id) final_images.append(image) return [ image for image in final_images if image.container_format not in ('aki', 'ari') ]
def get_available_images(request, project_id=None, images_cache=None): """Returns a list of images that are public, shared or owned by the given project_id. If project_id is not specified, only public images are returned. :param images_cache: An optional dict-like object in which to cache public and per-project id image metadata. """ if images_cache is None: images_cache = {} public_images = images_cache.get('public_images', []) images_by_project = images_cache.get('images_by_project', {}) #mj - https://bugs.launchpad.net/horizon/+bug/1655259 - fixed in pike shared_images = images_cache.get('shared_images', []) if 'public_images' not in images_cache: public = {"is_public": True, "status": "active"} try: images, _more, _prev = glance.image_list_detailed(request, filters=public) [public_images.append(image) for image in images] images_cache['public_images'] = public_images except Exception: exceptions.handle(request, _("Unable to retrieve public images.")) # Preempt if we don't have a project_id yet. if project_id is None: images_by_project[project_id] = [] if project_id not in images_by_project: owner = {"property-owner_id": project_id, "status": "active"} try: owned_images, _more, _prev = glance.image_list_detailed( request, filters=owner) images_by_project[project_id] = owned_images except Exception: owned_images = [] exceptions.handle( request, _("Unable to retrieve images for " "the current project.")) else: owned_images = images_by_project[project_id] #mj - https://bugs.launchpad.net/horizon/+bug/1655259 - fixed in pike if 'shared_images' not in images_cache: shared = {"visibility": "shared", "status": "active"} try: shared_images, _more, _prev = \ glance.image_list_detailed(request, filters=shared) images_cache['shared_images'] = shared_images except Exception: exceptions.handle(request, _("Unable to retrieve shared images.")) if 'images_by_project' not in images_cache: images_cache['images_by_project'] = images_by_project images = owned_images + public_images + shared_images #end bug fix block image_ids = [] final_images = [] for image in images: if image.id not in image_ids and \ image.container_format not in ('aki', 'ari'): image_ids.append(image.id) final_images.append(image) return final_images
def get_available_images(request, project_id=None, images_cache=None): """Returns a list of available images Returns a list of images that are public, shared, community or owned by the given project_id. If project_id is not specified, only public and community images are returned. :param images_cache: An optional dict-like object in which to cache public and per-project id image metadata. """ if images_cache is None: images_cache = {} public_images = images_cache.get('public_images', []) community_images = images_cache.get('community_images', []) images_by_project = images_cache.get('images_by_project', {}) shared_images = images_cache.get('shared_images', []) if 'public_images' not in images_cache: public = {"is_public": True, "status": "active"} try: images, _more, _prev = glance.image_list_detailed(request, filters=public) public_images += images images_cache['public_images'] = public_images except Exception: exceptions.handle(request, _("Unable to retrieve public images.")) # Preempt if we don't have a project_id yet. if project_id is None: images_by_project[project_id] = [] if project_id not in images_by_project: owner = {"property-owner_id": project_id, "status": "active"} try: owned_images, _more, _prev = glance.image_list_detailed( request, filters=owner) images_by_project[project_id] = owned_images except Exception: owned_images = [] exceptions.handle( request, _("Unable to retrieve images for " "the current project.")) else: owned_images = images_by_project[project_id] if 'community_images' not in images_cache: community = {"visibility": "community", "status": "active"} try: images, _more, _prev = glance.image_list_detailed( request, filters=community) community_images += images images_cache['community_images'] = community_images except Exception: exceptions.handle(request, _("Unable to retrieve community images.")) if 'shared_images' not in images_cache: shared = {"visibility": "shared", "status": "active"} try: shared_images, _more, _prev = \ glance.image_list_detailed(request, filters=shared) images_cache['shared_images'] = shared_images except Exception: exceptions.handle(request, _("Unable to retrieve shared images.")) if 'images_by_project' not in images_cache: images_cache['images_by_project'] = images_by_project images = owned_images + public_images + community_images + shared_images image_ids = [] final_images = [] for image in images: print(image.name) if image.id not in image_ids and \ image.container_format not in ('aki', 'ari') and not ("Plesk" in image.name): image_ids.append(image.id) final_images.append(image) return final_images