""" List and lookup repository images. """ import json from data.registry_model import registry_model from endpoints.api import (resource, nickname, require_repo_read, RepositoryParamResource, path_param, disallow_for_app_repositories, format_date) from endpoints.exception import NotFound def image_dict(image, with_history=False, with_tags=False): parsed_command = None if image.command: try: parsed_command = json.loads(image.command) except (ValueError, TypeError): parsed_command = {'error': 'Could not parse command'} image_data = { 'id': image.docker_image_id, 'created': format_date(image.created), 'comment': image.comment, 'command': parsed_command, 'size': image.image_size, 'uploading': image.uploading, 'sort_index': len(image.parents), } if with_tags: image_data['tags'] = [tag.name for tag in image.tags] if with_history: image_data['history'] = [image_dict(parent) for parent in image.parents] # Calculate the ancestors string, with the DBID's replaced with the docker IDs. parent_docker_ids = [parent_image.docker_image_id for parent_image in image.parents] image_data['ancestors'] = '/{0}/'.format('/'.join(parent_docker_ids)) return image_data @resource('/v1/repository//image/') @path_param('repository', 'The full path of the repository. e.g. namespace/name') class RepositoryImageList(RepositoryParamResource): """ Resource for listing repository images. """ @require_repo_read @nickname('listRepositoryImages') @disallow_for_app_repositories def get(self, namespace, repository): """ List the images for the specified repository. """ repo_ref = registry_model.lookup_repository(namespace, repository) if repo_ref is None: raise NotFound() images = registry_model.get_legacy_images(repo_ref) return {'images': [image_dict(image, with_tags=True) for image in images]} @resource('/v1/repository//image/') @path_param('repository', 'The full path of the repository. e.g. namespace/name') @path_param('image_id', 'The Docker image ID') class RepositoryImage(RepositoryParamResource): """ Resource for handling repository images. """ @require_repo_read @nickname('getImage') @disallow_for_app_repositories def get(self, namespace, repository, image_id): """ Get the information available for the specified image. """ repo_ref = registry_model.lookup_repository(namespace, repository) if repo_ref is None: raise NotFound() image = registry_model.get_legacy_image(repo_ref, image_id, include_parents=True) if image is None: raise NotFound() return image_dict(image, with_history=True)