def serialize_glance_image(image): # If we're being asked to index an ID, retrieve the full image information if isinstance(image, six.text_type): g_client = openstack_clients.get_glanceclient() image = g_client.images.get(image) members = _get_image_members(image) fields_to_ignore = ['schema', 'file', 'locations'] document = {k: v for k, v in image.items() if k not in fields_to_ignore} members = list(members) older_glance_version = False # Make it backward compatibe with older glance version if members and len(members) > 0 and "deleted" in members[0]: older_glance_version = True if older_glance_version: document['members'] = [ member['member'] for member in members if (member['status'] == 'accepted' and member['deleted'] == 0)] else: document['members'] = [ member['member_id'] for member in members if (member['status'] == 'accepted')] return document
def _get_image_members(image): if image['visibility'] == 'public': return [] try: g_client = openstack_clients.get_glanceclient() members = g_client.image_members.list(image['id']) return members except glanceclient.exc.HTTPForbidden: LOG.warning(_LW("Could not list image members for %s; forbidden") % image['id']) return []
def _get_image_members(image): if image['visibility'] == 'public': return [] try: g_client = openstack_clients.get_glanceclient() members = g_client.image_members.list(image['id']) return members except glanceclient.exc.Unauthorized: LOG.warning("Could not list image members for %s; forbidden" % image['id']) return []
def _get_image_members(image): if image['visibility'] in ['public', 'private']: return [] try: g_client = openstack_clients.get_glanceclient() members = g_client.image_members.list(image['id']) return members except glanceclient.exc.Unauthorized: LOG.warning("Could not list image members for %s; forbidden" % image['id']) return []
def get_glance_metadefs_with_pyclient(): glance_client = openstack_clients.get_glanceclient() namespace_list = [] metadefs_namespace_list = list(glance_client.metadefs_namespace.list()) for namespace in metadefs_namespace_list: _namespace = glance_client.metadefs_namespace.get( namespace['namespace']) namespace_list.append(_namespace) metadef_namespace_json = json.dumps(namespace_list, indent=4) with open(METADEFS_FILE, "w") as f: f.write(metadef_namespace_json)
def get_glance_images_and_members_with_pyclient(): glance_client = openstack_clients.get_glanceclient() images = glance_client.images.list() images_json = json.dumps(list(images), indent=4) with open(IMAGES_FILE, "w") as f: f.write(images_json) image_members_dict = dict() images = glance_client.images.list() for image in images: if image['visibility'] != 'public': image_members = glance_client.image_members.list(image['id']) image_members_list = [] if image_members: image_members_list = list(image_members) if len(image_members_list) > 0: image_members_dict[image['id']] = image_members_list image_members_json = json.dumps(image_members_dict, indent=4) with open(IMAGE_MEMBERS_FILE, "w") as f: f.write(image_members_json)
def serialize_glance_image(image): g_client = openstack_clients.get_glanceclient() using_v1 = False # If we're being asked to index an ID, retrieve the full image information if isinstance(image, basestring): image = g_client.images.get(image) # If a v1 image, convert to dict so we can iterate over its properties if isinstance(image, v1_image): using_v1 = True image = image.to_dict() else: image['visibility'] = 'public' if image.pop('is_public') else 'private' try: members = g_client.image_members.list(image['id']) if using_v1: members = [member.to_dict() for member in members] except glanceclient.exc.HTTPForbidden: LOG.warning(_LW("Could not list image members for %s; forbidden") % image['id']) members = [] pass fields_to_ignore = ['ramdisk_id', 'schema', 'kernel_id', 'file', 'locations'] extra_properties = image.pop('properties', []) document = dict((k, v) for k, v in six.iteritems(image) if k not in fields_to_ignore) document['members'] = [ member['member'] for member in members if (member['status'] == 'accepted' and member['deleted'] == 0)] for kv in extra_properties: document[kv['name']] = kv['value'] return document
def serialize_glance_image(image): g_client = openstack_clients.get_glanceclient() using_v1 = False # If we're being asked to index an ID, retrieve the full image information if isinstance(image, basestring): image = g_client.images.get(image) # TODO(lakshmiS): We shouldn't check for v1 since g_client is always v2. # If a v1 image, convert to dict so we can iterate over its properties if isinstance(image, v1_image): using_v1 = True image = image.to_dict() try: members = g_client.image_members.list(image['id']) # TODO(lakshmiS): Same as above. No need to check for v1. if using_v1: members = [member.to_dict() for member in members] except glanceclient.exc.HTTPForbidden: LOG.warning(_LW("Could not list image members for %s; forbidden") % image['id']) members = [] pass fields_to_ignore = ['ramdisk_id', 'schema', 'kernel_id', 'file', 'locations'] document = dict((k, v) for k, v in six.iteritems(image) if k not in fields_to_ignore) if image['visibility'] != 'public': document['members'] = [ member['member'] for member in members if (member['status'] == 'accepted' and member['deleted'] == 0)] return document
def get_objects(self): from searchlight.elasticsearch.plugins import openstack_clients # Images include their properties and tags. Members are different return openstack_clients.get_glanceclient().images.list()
def get_objects(self): from searchlight.elasticsearch.plugins import openstack_clients gc = openstack_clients.get_glanceclient() return list(gc.metadefs_namespace.list())
def serialize_glance_metadef_ns(metadef_namespace): def _serialize_tag(tag): return {'name': tag['name']} def _serialize_property(name, property): serialized_prop = copy.deepcopy(property) serialized_prop['name'] = name if 'default' in serialized_prop: serialized_prop['default'] = str(serialized_prop['default']) if 'enum' in serialized_prop: serialized_prop['enum'] = sorted(map(str, serialized_prop['enum'])) return serialized_prop def _serialize_object(obj): serialized_obj = { 'name': obj['name'], 'description': obj['description'] } serialized_obj['properties'] = sorted([ _serialize_property(name, property) for name, property in six.iteritems(obj.get('properties', {})) ], key=operator.itemgetter('name')) return serialized_obj def _serialize_res_type(rt): return { 'name': rt['name'] } # TODO(sjmc7): test this better incomplete = 'objects' not in metadef_namespace or \ 'properties' not in metadef_namespace or \ 'tags' not in metadef_namespace if incomplete: LOG.debug("Retrieving metadef namespace '%s'", metadef_namespace['namespace']) g_client = openstack_clients.get_glanceclient() metadef_namespace = g_client.metadefs_namespace.get( metadef_namespace['namespace']) # The CIS code specifically serialized some fields rather than indexing # everything; do the same. namespace_fields = ('namespace', 'display_name', 'description', 'visibility', 'owner', 'protected', 'created_at') document = {f: metadef_namespace.get(f, None) for f in namespace_fields} document['id'] = document['namespace'] if document['display_name']: document['name'] = document['display_name'] else: document['name'] = document['namespace'] document['tags'] = sorted([ _serialize_tag(tag) for tag in metadef_namespace.get('tags', []) ], key=operator.itemgetter('name')) document['properties'] = sorted([ _serialize_property(name, property) for name, property in six.iteritems( metadef_namespace.get('properties', {})) ], key=operator.itemgetter('name')) document['objects'] = sorted([ _serialize_object(obj) for obj in metadef_namespace.get('objects', []) ], key=operator.itemgetter('name')) document['resource_types'] = sorted([ _serialize_res_type(rt) for rt in metadef_namespace.get('resource_type_associations', []) ], key=operator.itemgetter('name')) utils.normalize_date_fields(document, created_at=None, updated_at='created_at') return document
def serialize_glance_metadef_ns(metadef_namespace): def _serialize_tag(tag): return tag["name"] def _serialize_property(name, property): serialized_prop = copy.deepcopy(property) serialized_prop['name'] = name if 'default' in serialized_prop: serialized_prop['default'] = str(serialized_prop['default']) if 'enum' in serialized_prop: serialized_prop['enum'] = sorted(map(str, serialized_prop['enum'])) return serialized_prop def _serialize_object(obj): serialized_obj = { 'name': obj['name'], 'description': obj['description'] } serialized_obj['properties'] = sorted([ _serialize_property(name, property) for name, property in obj.get('properties', {}).items() ], key=operator.itemgetter('name')) return serialized_obj def _serialize_res_type(rt): return { 'name': rt['name'] } # TODO(sjmc7): test this better incomplete = 'objects' not in metadef_namespace or \ 'properties' not in metadef_namespace or \ 'tags' not in metadef_namespace if incomplete: LOG.debug("Retrieving metadef namespace '%s'", metadef_namespace['namespace']) g_client = openstack_clients.get_glanceclient() metadef_namespace = g_client.metadefs_namespace.get( metadef_namespace['namespace']) # The CIS code specifically serialized some fields rather than indexing # everything; do the same. namespace_fields = ('namespace', 'display_name', 'description', 'visibility', 'owner', 'protected', 'created_at', 'updated_at') document = {f: metadef_namespace.get(f, None) for f in namespace_fields} document['id'] = document['namespace'] if document['display_name']: document['name'] = document['display_name'] else: document['name'] = document['namespace'] # Add project_id as a copy of 'owner' if 'project_id' not in document: document['project_id'] = document['owner'] document['tags'] = sorted([ _serialize_tag(tag) for tag in metadef_namespace.get('tags', [])]) document['properties'] = sorted([ _serialize_property(name, property) for name, property in metadef_namespace.get('properties', {}).items() ], key=operator.itemgetter('name')) document['objects'] = sorted([ _serialize_object(obj) for obj in metadef_namespace.get('objects', []) ], key=operator.itemgetter('name')) document['resource_types'] = sorted([ _serialize_res_type(rt) for rt in metadef_namespace.get('resource_type_associations', []) ], key=operator.itemgetter('name')) utils.normalize_date_fields(document) return document