Run black on moto & test directories.
This commit is contained in:
parent
c820395dbf
commit
96e5b1993d
507 changed files with 52541 additions and 47814 deletions
|
|
@ -2,6 +2,6 @@ from __future__ import unicode_literals
|
|||
from .models import ecr_backends
|
||||
from ..core.models import base_decorator, deprecated_base_decorator
|
||||
|
||||
ecr_backend = ecr_backends['us-east-1']
|
||||
ecr_backend = ecr_backends["us-east-1"]
|
||||
mock_ecr = base_decorator(ecr_backends)
|
||||
mock_ecr_deprecated = deprecated_base_decorator(ecr_backends)
|
||||
|
|
|
|||
|
|
@ -9,7 +9,8 @@ class RepositoryNotFoundException(RESTError):
|
|||
super(RepositoryNotFoundException, self).__init__(
|
||||
error_type="RepositoryNotFoundException",
|
||||
message="The repository with name '{0}' does not exist in the registry "
|
||||
"with id '{1}'".format(repository_name, registry_id))
|
||||
"with id '{1}'".format(repository_name, registry_id),
|
||||
)
|
||||
|
||||
|
||||
class ImageNotFoundException(RESTError):
|
||||
|
|
@ -19,4 +20,7 @@ class ImageNotFoundException(RESTError):
|
|||
super(ImageNotFoundException, self).__init__(
|
||||
error_type="ImageNotFoundException",
|
||||
message="The image with imageId {0} does not exist within the repository with name '{1}' "
|
||||
"in the registry with id '{2}'".format(image_id, repository_name, registry_id))
|
||||
"in the registry with id '{2}'".format(
|
||||
image_id, repository_name, registry_id
|
||||
),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -11,24 +11,23 @@ from moto.core import BaseBackend, BaseModel
|
|||
from moto.ec2 import ec2_backends
|
||||
from moto.ecr.exceptions import ImageNotFoundException, RepositoryNotFoundException
|
||||
|
||||
DEFAULT_REGISTRY_ID = '012345678910'
|
||||
DEFAULT_REGISTRY_ID = "012345678910"
|
||||
|
||||
|
||||
class BaseObject(BaseModel):
|
||||
|
||||
def camelCase(self, key):
|
||||
words = []
|
||||
for i, word in enumerate(key.split('_')):
|
||||
for i, word in enumerate(key.split("_")):
|
||||
if i > 0:
|
||||
words.append(word.title())
|
||||
else:
|
||||
words.append(word)
|
||||
return ''.join(words)
|
||||
return "".join(words)
|
||||
|
||||
def gen_response_object(self):
|
||||
response_object = dict()
|
||||
for key, value in self.__dict__.items():
|
||||
if '_' in key:
|
||||
if "_" in key:
|
||||
response_object[self.camelCase(key)] = value
|
||||
else:
|
||||
response_object[key] = value
|
||||
|
|
@ -40,15 +39,16 @@ class BaseObject(BaseModel):
|
|||
|
||||
|
||||
class Repository(BaseObject):
|
||||
|
||||
def __init__(self, repository_name):
|
||||
self.registry_id = DEFAULT_REGISTRY_ID
|
||||
self.arn = 'arn:aws:ecr:us-east-1:{0}:repository/{1}'.format(
|
||||
self.registry_id, repository_name)
|
||||
self.arn = "arn:aws:ecr:us-east-1:{0}:repository/{1}".format(
|
||||
self.registry_id, repository_name
|
||||
)
|
||||
self.name = repository_name
|
||||
# self.created = datetime.utcnow()
|
||||
self.uri = '{0}.dkr.ecr.us-east-1.amazonaws.com/{1}'.format(
|
||||
self.registry_id, repository_name)
|
||||
self.uri = "{0}.dkr.ecr.us-east-1.amazonaws.com/{1}".format(
|
||||
self.registry_id, repository_name
|
||||
)
|
||||
self.images = []
|
||||
|
||||
@property
|
||||
|
|
@ -59,38 +59,45 @@ class Repository(BaseObject):
|
|||
def response_object(self):
|
||||
response_object = self.gen_response_object()
|
||||
|
||||
response_object['registryId'] = self.registry_id
|
||||
response_object['repositoryArn'] = self.arn
|
||||
response_object['repositoryName'] = self.name
|
||||
response_object['repositoryUri'] = self.uri
|
||||
response_object["registryId"] = self.registry_id
|
||||
response_object["repositoryArn"] = self.arn
|
||||
response_object["repositoryName"] = self.name
|
||||
response_object["repositoryUri"] = self.uri
|
||||
# response_object['createdAt'] = self.created
|
||||
del response_object['arn'], response_object['name'], response_object['images']
|
||||
del response_object["arn"], response_object["name"], response_object["images"]
|
||||
return response_object
|
||||
|
||||
@classmethod
|
||||
def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
|
||||
properties = cloudformation_json['Properties']
|
||||
def create_from_cloudformation_json(
|
||||
cls, resource_name, cloudformation_json, region_name
|
||||
):
|
||||
properties = cloudformation_json["Properties"]
|
||||
|
||||
ecr_backend = ecr_backends[region_name]
|
||||
return ecr_backend.create_repository(
|
||||
# RepositoryName is optional in CloudFormation, thus create a random
|
||||
# name if necessary
|
||||
repository_name=properties.get(
|
||||
'RepositoryName', 'ecrrepository{0}'.format(int(random() * 10 ** 6))),
|
||||
"RepositoryName", "ecrrepository{0}".format(int(random() * 10 ** 6))
|
||||
)
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def update_from_cloudformation_json(cls, original_resource, new_resource_name, cloudformation_json, region_name):
|
||||
properties = cloudformation_json['Properties']
|
||||
def update_from_cloudformation_json(
|
||||
cls, original_resource, new_resource_name, cloudformation_json, region_name
|
||||
):
|
||||
properties = cloudformation_json["Properties"]
|
||||
|
||||
if original_resource.name != properties['RepositoryName']:
|
||||
if original_resource.name != properties["RepositoryName"]:
|
||||
ecr_backend = ecr_backends[region_name]
|
||||
ecr_backend.delete_cluster(original_resource.arn)
|
||||
return ecr_backend.create_repository(
|
||||
# RepositoryName is optional in CloudFormation, thus create a
|
||||
# random name if necessary
|
||||
repository_name=properties.get(
|
||||
'RepositoryName', 'RepositoryName{0}'.format(int(random() * 10 ** 6))),
|
||||
"RepositoryName",
|
||||
"RepositoryName{0}".format(int(random() * 10 ** 6)),
|
||||
)
|
||||
)
|
||||
else:
|
||||
# no-op when nothing changed between old and new resources
|
||||
|
|
@ -98,8 +105,9 @@ class Repository(BaseObject):
|
|||
|
||||
|
||||
class Image(BaseObject):
|
||||
|
||||
def __init__(self, tag, manifest, repository, digest=None, registry_id=DEFAULT_REGISTRY_ID):
|
||||
def __init__(
|
||||
self, tag, manifest, repository, digest=None, registry_id=DEFAULT_REGISTRY_ID
|
||||
):
|
||||
self.image_tag = tag
|
||||
self.image_tags = [tag] if tag is not None else []
|
||||
self.image_manifest = manifest
|
||||
|
|
@ -110,8 +118,10 @@ class Image(BaseObject):
|
|||
self.image_pushed_at = str(datetime.utcnow().isoformat())
|
||||
|
||||
def _create_digest(self):
|
||||
image_contents = 'docker_image{0}'.format(int(random() * 10 ** 6))
|
||||
self.image_digest = "sha256:%s" % hashlib.sha256(image_contents.encode('utf-8')).hexdigest()
|
||||
image_contents = "docker_image{0}".format(int(random() * 10 ** 6))
|
||||
self.image_digest = (
|
||||
"sha256:%s" % hashlib.sha256(image_contents.encode("utf-8")).hexdigest()
|
||||
)
|
||||
|
||||
def get_image_digest(self):
|
||||
if not self.image_digest:
|
||||
|
|
@ -135,54 +145,61 @@ class Image(BaseObject):
|
|||
@property
|
||||
def response_object(self):
|
||||
response_object = self.gen_response_object()
|
||||
response_object['imageId'] = {}
|
||||
response_object['imageId']['imageTag'] = self.image_tag
|
||||
response_object['imageId']['imageDigest'] = self.get_image_digest()
|
||||
response_object['imageManifest'] = self.image_manifest
|
||||
response_object['repositoryName'] = self.repository
|
||||
response_object['registryId'] = self.registry_id
|
||||
return {k: v for k, v in response_object.items() if v is not None and v != [None]}
|
||||
response_object["imageId"] = {}
|
||||
response_object["imageId"]["imageTag"] = self.image_tag
|
||||
response_object["imageId"]["imageDigest"] = self.get_image_digest()
|
||||
response_object["imageManifest"] = self.image_manifest
|
||||
response_object["repositoryName"] = self.repository
|
||||
response_object["registryId"] = self.registry_id
|
||||
return {
|
||||
k: v for k, v in response_object.items() if v is not None and v != [None]
|
||||
}
|
||||
|
||||
@property
|
||||
def response_list_object(self):
|
||||
response_object = self.gen_response_object()
|
||||
response_object['imageTag'] = self.image_tag
|
||||
response_object['imageDigest'] = "i don't know"
|
||||
return {k: v for k, v in response_object.items() if v is not None and v != [None]}
|
||||
response_object["imageTag"] = self.image_tag
|
||||
response_object["imageDigest"] = "i don't know"
|
||||
return {
|
||||
k: v for k, v in response_object.items() if v is not None and v != [None]
|
||||
}
|
||||
|
||||
@property
|
||||
def response_describe_object(self):
|
||||
response_object = self.gen_response_object()
|
||||
response_object['imageTags'] = self.image_tags
|
||||
response_object['imageDigest'] = self.get_image_digest()
|
||||
response_object['imageManifest'] = self.image_manifest
|
||||
response_object['repositoryName'] = self.repository
|
||||
response_object['registryId'] = self.registry_id
|
||||
response_object['imageSizeInBytes'] = self.image_size_in_bytes
|
||||
response_object['imagePushedAt'] = self.image_pushed_at
|
||||
response_object["imageTags"] = self.image_tags
|
||||
response_object["imageDigest"] = self.get_image_digest()
|
||||
response_object["imageManifest"] = self.image_manifest
|
||||
response_object["repositoryName"] = self.repository
|
||||
response_object["registryId"] = self.registry_id
|
||||
response_object["imageSizeInBytes"] = self.image_size_in_bytes
|
||||
response_object["imagePushedAt"] = self.image_pushed_at
|
||||
return {k: v for k, v in response_object.items() if v is not None and v != []}
|
||||
|
||||
@property
|
||||
def response_batch_get_image(self):
|
||||
response_object = {}
|
||||
response_object['imageId'] = {}
|
||||
response_object['imageId']['imageTag'] = self.image_tag
|
||||
response_object['imageId']['imageDigest'] = self.get_image_digest()
|
||||
response_object['imageManifest'] = self.image_manifest
|
||||
response_object['repositoryName'] = self.repository
|
||||
response_object['registryId'] = self.registry_id
|
||||
return {k: v for k, v in response_object.items() if v is not None and v != [None]}
|
||||
response_object["imageId"] = {}
|
||||
response_object["imageId"]["imageTag"] = self.image_tag
|
||||
response_object["imageId"]["imageDigest"] = self.get_image_digest()
|
||||
response_object["imageManifest"] = self.image_manifest
|
||||
response_object["repositoryName"] = self.repository
|
||||
response_object["registryId"] = self.registry_id
|
||||
return {
|
||||
k: v for k, v in response_object.items() if v is not None and v != [None]
|
||||
}
|
||||
|
||||
@property
|
||||
def response_batch_delete_image(self):
|
||||
response_object = {}
|
||||
response_object['imageDigest'] = self.get_image_digest()
|
||||
response_object['imageTag'] = self.image_tag
|
||||
return {k: v for k, v in response_object.items() if v is not None and v != [None]}
|
||||
response_object["imageDigest"] = self.get_image_digest()
|
||||
response_object["imageTag"] = self.image_tag
|
||||
return {
|
||||
k: v for k, v in response_object.items() if v is not None and v != [None]
|
||||
}
|
||||
|
||||
|
||||
class ECRBackend(BaseBackend):
|
||||
|
||||
def __init__(self):
|
||||
self.repositories = {}
|
||||
|
||||
|
|
@ -193,7 +210,9 @@ class ECRBackend(BaseBackend):
|
|||
if repository_names:
|
||||
for repository_name in repository_names:
|
||||
if repository_name not in self.repositories:
|
||||
raise RepositoryNotFoundException(repository_name, registry_id or DEFAULT_REGISTRY_ID)
|
||||
raise RepositoryNotFoundException(
|
||||
repository_name, registry_id or DEFAULT_REGISTRY_ID
|
||||
)
|
||||
|
||||
repositories = []
|
||||
for repository in self.repositories.values():
|
||||
|
|
@ -218,7 +237,9 @@ class ECRBackend(BaseBackend):
|
|||
if repository_name in self.repositories:
|
||||
return self.repositories.pop(repository_name)
|
||||
else:
|
||||
raise RepositoryNotFoundException(repository_name, registry_id or DEFAULT_REGISTRY_ID)
|
||||
raise RepositoryNotFoundException(
|
||||
repository_name, registry_id or DEFAULT_REGISTRY_ID
|
||||
)
|
||||
|
||||
def list_images(self, repository_name, registry_id=None):
|
||||
"""
|
||||
|
|
@ -235,7 +256,9 @@ class ECRBackend(BaseBackend):
|
|||
found = True
|
||||
|
||||
if not found:
|
||||
raise RepositoryNotFoundException(repository_name, registry_id or DEFAULT_REGISTRY_ID)
|
||||
raise RepositoryNotFoundException(
|
||||
repository_name, registry_id or DEFAULT_REGISTRY_ID
|
||||
)
|
||||
|
||||
images = []
|
||||
for image in repository.images:
|
||||
|
|
@ -247,26 +270,34 @@ class ECRBackend(BaseBackend):
|
|||
if repository_name in self.repositories:
|
||||
repository = self.repositories[repository_name]
|
||||
else:
|
||||
raise RepositoryNotFoundException(repository_name, registry_id or DEFAULT_REGISTRY_ID)
|
||||
raise RepositoryNotFoundException(
|
||||
repository_name, registry_id or DEFAULT_REGISTRY_ID
|
||||
)
|
||||
|
||||
if image_ids:
|
||||
response = set()
|
||||
for image_id in image_ids:
|
||||
found = False
|
||||
for image in repository.images:
|
||||
if (('imageDigest' in image_id and image.get_image_digest() == image_id['imageDigest']) or
|
||||
('imageTag' in image_id and image_id['imageTag'] in image.image_tags)):
|
||||
if (
|
||||
"imageDigest" in image_id
|
||||
and image.get_image_digest() == image_id["imageDigest"]
|
||||
) or (
|
||||
"imageTag" in image_id
|
||||
and image_id["imageTag"] in image.image_tags
|
||||
):
|
||||
found = True
|
||||
response.add(image)
|
||||
if not found:
|
||||
image_id_representation = "{imageDigest:'%s', imageTag:'%s'}" % (
|
||||
image_id.get('imageDigest', 'null'),
|
||||
image_id.get('imageTag', 'null'),
|
||||
image_id.get("imageDigest", "null"),
|
||||
image_id.get("imageTag", "null"),
|
||||
)
|
||||
raise ImageNotFoundException(
|
||||
image_id=image_id_representation,
|
||||
repository_name=repository_name,
|
||||
registry_id=registry_id or DEFAULT_REGISTRY_ID)
|
||||
registry_id=registry_id or DEFAULT_REGISTRY_ID,
|
||||
)
|
||||
|
||||
else:
|
||||
response = []
|
||||
|
|
@ -281,7 +312,12 @@ class ECRBackend(BaseBackend):
|
|||
else:
|
||||
raise Exception("{0} is not a repository".format(repository_name))
|
||||
|
||||
existing_images = list(filter(lambda x: x.response_object['imageManifest'] == image_manifest, repository.images))
|
||||
existing_images = list(
|
||||
filter(
|
||||
lambda x: x.response_object["imageManifest"] == image_manifest,
|
||||
repository.images,
|
||||
)
|
||||
)
|
||||
if not existing_images:
|
||||
# this image is not in ECR yet
|
||||
image = Image(image_tag, image_manifest, repository_name)
|
||||
|
|
@ -292,36 +328,47 @@ class ECRBackend(BaseBackend):
|
|||
existing_images[0].update_tag(image_tag)
|
||||
return existing_images[0]
|
||||
|
||||
def batch_get_image(self, repository_name, registry_id=None, image_ids=None, accepted_media_types=None):
|
||||
def batch_get_image(
|
||||
self,
|
||||
repository_name,
|
||||
registry_id=None,
|
||||
image_ids=None,
|
||||
accepted_media_types=None,
|
||||
):
|
||||
if repository_name in self.repositories:
|
||||
repository = self.repositories[repository_name]
|
||||
else:
|
||||
raise RepositoryNotFoundException(repository_name, registry_id or DEFAULT_REGISTRY_ID)
|
||||
raise RepositoryNotFoundException(
|
||||
repository_name, registry_id or DEFAULT_REGISTRY_ID
|
||||
)
|
||||
|
||||
if not image_ids:
|
||||
raise ParamValidationError(msg='Missing required parameter in input: "imageIds"')
|
||||
raise ParamValidationError(
|
||||
msg='Missing required parameter in input: "imageIds"'
|
||||
)
|
||||
|
||||
response = {
|
||||
'images': [],
|
||||
'failures': [],
|
||||
}
|
||||
response = {"images": [], "failures": []}
|
||||
|
||||
for image_id in image_ids:
|
||||
found = False
|
||||
for image in repository.images:
|
||||
if (('imageDigest' in image_id and image.get_image_digest() == image_id['imageDigest']) or
|
||||
('imageTag' in image_id and image.image_tag == image_id['imageTag'])):
|
||||
if (
|
||||
"imageDigest" in image_id
|
||||
and image.get_image_digest() == image_id["imageDigest"]
|
||||
) or (
|
||||
"imageTag" in image_id and image.image_tag == image_id["imageTag"]
|
||||
):
|
||||
found = True
|
||||
response['images'].append(image.response_batch_get_image)
|
||||
response["images"].append(image.response_batch_get_image)
|
||||
|
||||
if not found:
|
||||
response['failures'].append({
|
||||
'imageId': {
|
||||
'imageTag': image_id.get('imageTag', 'null')
|
||||
},
|
||||
'failureCode': 'ImageNotFound',
|
||||
'failureReason': 'Requested image not found'
|
||||
})
|
||||
response["failures"].append(
|
||||
{
|
||||
"imageId": {"imageTag": image_id.get("imageTag", "null")},
|
||||
"failureCode": "ImageNotFound",
|
||||
"failureReason": "Requested image not found",
|
||||
}
|
||||
)
|
||||
|
||||
return response
|
||||
|
||||
|
|
@ -338,10 +385,7 @@ class ECRBackend(BaseBackend):
|
|||
msg='Missing required parameter in input: "imageIds"'
|
||||
)
|
||||
|
||||
response = {
|
||||
"imageIds": [],
|
||||
"failures": []
|
||||
}
|
||||
response = {"imageIds": [], "failures": []}
|
||||
|
||||
for image_id in image_ids:
|
||||
image_found = False
|
||||
|
|
@ -377,8 +421,8 @@ class ECRBackend(BaseBackend):
|
|||
# Search by matching both digest and tag
|
||||
if "imageDigest" in image_id and "imageTag" in image_id:
|
||||
if (
|
||||
image_id["imageDigest"] == image.get_image_digest() and
|
||||
image_id["imageTag"] in image.image_tags
|
||||
image_id["imageDigest"] == image.get_image_digest()
|
||||
and image_id["imageTag"] in image.image_tags
|
||||
):
|
||||
image_found = True
|
||||
for image_tag in reversed(image.image_tags):
|
||||
|
|
@ -390,7 +434,10 @@ class ECRBackend(BaseBackend):
|
|||
del repository.images[num]
|
||||
|
||||
# Search by matching digest
|
||||
elif "imageDigest" in image_id and image.get_image_digest() == image_id["imageDigest"]:
|
||||
elif (
|
||||
"imageDigest" in image_id
|
||||
and image.get_image_digest() == image_id["imageDigest"]
|
||||
):
|
||||
image_found = True
|
||||
for image_tag in reversed(image.image_tags):
|
||||
repository.images[num].image_tag = image_tag
|
||||
|
|
@ -399,7 +446,9 @@ class ECRBackend(BaseBackend):
|
|||
del repository.images[num]
|
||||
|
||||
# Search by matching tag
|
||||
elif "imageTag" in image_id and image_id["imageTag"] in image.image_tags:
|
||||
elif (
|
||||
"imageTag" in image_id and image_id["imageTag"] in image.image_tags
|
||||
):
|
||||
image_found = True
|
||||
repository.images[num].image_tag = image_id["imageTag"]
|
||||
response["imageIds"].append(image.response_batch_delete_image)
|
||||
|
|
@ -416,10 +465,14 @@ class ECRBackend(BaseBackend):
|
|||
}
|
||||
|
||||
if "imageDigest" in image_id:
|
||||
failure_response["imageId"]["imageDigest"] = image_id.get("imageDigest", "null")
|
||||
failure_response["imageId"]["imageDigest"] = image_id.get(
|
||||
"imageDigest", "null"
|
||||
)
|
||||
|
||||
if "imageTag" in image_id:
|
||||
failure_response["imageId"]["imageTag"] = image_id.get("imageTag", "null")
|
||||
failure_response["imageId"]["imageTag"] = image_id.get(
|
||||
"imageTag", "null"
|
||||
)
|
||||
|
||||
response["failures"].append(failure_response)
|
||||
|
||||
|
|
|
|||
|
|
@ -24,148 +24,154 @@ class ECRResponse(BaseResponse):
|
|||
return self.request_params.get(param, None)
|
||||
|
||||
def create_repository(self):
|
||||
repository_name = self._get_param('repositoryName')
|
||||
repository_name = self._get_param("repositoryName")
|
||||
if repository_name is None:
|
||||
repository_name = 'default'
|
||||
repository_name = "default"
|
||||
repository = self.ecr_backend.create_repository(repository_name)
|
||||
return json.dumps({
|
||||
'repository': repository.response_object
|
||||
})
|
||||
return json.dumps({"repository": repository.response_object})
|
||||
|
||||
def describe_repositories(self):
|
||||
describe_repositories_name = self._get_param('repositoryNames')
|
||||
registry_id = self._get_param('registryId')
|
||||
describe_repositories_name = self._get_param("repositoryNames")
|
||||
registry_id = self._get_param("registryId")
|
||||
|
||||
repositories = self.ecr_backend.describe_repositories(
|
||||
repository_names=describe_repositories_name, registry_id=registry_id)
|
||||
return json.dumps({
|
||||
'repositories': repositories,
|
||||
'failures': []
|
||||
})
|
||||
repository_names=describe_repositories_name, registry_id=registry_id
|
||||
)
|
||||
return json.dumps({"repositories": repositories, "failures": []})
|
||||
|
||||
def delete_repository(self):
|
||||
repository_str = self._get_param('repositoryName')
|
||||
registry_id = self._get_param('registryId')
|
||||
repository_str = self._get_param("repositoryName")
|
||||
registry_id = self._get_param("registryId")
|
||||
repository = self.ecr_backend.delete_repository(repository_str, registry_id)
|
||||
return json.dumps({
|
||||
'repository': repository.response_object
|
||||
})
|
||||
return json.dumps({"repository": repository.response_object})
|
||||
|
||||
def put_image(self):
|
||||
repository_str = self._get_param('repositoryName')
|
||||
image_manifest = self._get_param('imageManifest')
|
||||
image_tag = self._get_param('imageTag')
|
||||
repository_str = self._get_param("repositoryName")
|
||||
image_manifest = self._get_param("imageManifest")
|
||||
image_tag = self._get_param("imageTag")
|
||||
image = self.ecr_backend.put_image(repository_str, image_manifest, image_tag)
|
||||
|
||||
return json.dumps({
|
||||
'image': image.response_object
|
||||
})
|
||||
return json.dumps({"image": image.response_object})
|
||||
|
||||
def list_images(self):
|
||||
repository_str = self._get_param('repositoryName')
|
||||
registry_id = self._get_param('registryId')
|
||||
repository_str = self._get_param("repositoryName")
|
||||
registry_id = self._get_param("registryId")
|
||||
images = self.ecr_backend.list_images(repository_str, registry_id)
|
||||
return json.dumps({
|
||||
'imageIds': [image.response_list_object for image in images],
|
||||
})
|
||||
return json.dumps(
|
||||
{"imageIds": [image.response_list_object for image in images]}
|
||||
)
|
||||
|
||||
def describe_images(self):
|
||||
repository_str = self._get_param('repositoryName')
|
||||
registry_id = self._get_param('registryId')
|
||||
image_ids = self._get_param('imageIds')
|
||||
images = self.ecr_backend.describe_images(repository_str, registry_id, image_ids)
|
||||
return json.dumps({
|
||||
'imageDetails': [image.response_describe_object for image in images],
|
||||
})
|
||||
repository_str = self._get_param("repositoryName")
|
||||
registry_id = self._get_param("registryId")
|
||||
image_ids = self._get_param("imageIds")
|
||||
images = self.ecr_backend.describe_images(
|
||||
repository_str, registry_id, image_ids
|
||||
)
|
||||
return json.dumps(
|
||||
{"imageDetails": [image.response_describe_object for image in images]}
|
||||
)
|
||||
|
||||
def batch_check_layer_availability(self):
|
||||
if self.is_not_dryrun('BatchCheckLayerAvailability'):
|
||||
if self.is_not_dryrun("BatchCheckLayerAvailability"):
|
||||
raise NotImplementedError(
|
||||
'ECR.batch_check_layer_availability is not yet implemented')
|
||||
"ECR.batch_check_layer_availability is not yet implemented"
|
||||
)
|
||||
|
||||
def batch_delete_image(self):
|
||||
repository_str = self._get_param('repositoryName')
|
||||
registry_id = self._get_param('registryId')
|
||||
image_ids = self._get_param('imageIds')
|
||||
repository_str = self._get_param("repositoryName")
|
||||
registry_id = self._get_param("registryId")
|
||||
image_ids = self._get_param("imageIds")
|
||||
|
||||
response = self.ecr_backend.batch_delete_image(repository_str, registry_id, image_ids)
|
||||
response = self.ecr_backend.batch_delete_image(
|
||||
repository_str, registry_id, image_ids
|
||||
)
|
||||
return json.dumps(response)
|
||||
|
||||
def batch_get_image(self):
|
||||
repository_str = self._get_param('repositoryName')
|
||||
registry_id = self._get_param('registryId')
|
||||
image_ids = self._get_param('imageIds')
|
||||
accepted_media_types = self._get_param('acceptedMediaTypes')
|
||||
repository_str = self._get_param("repositoryName")
|
||||
registry_id = self._get_param("registryId")
|
||||
image_ids = self._get_param("imageIds")
|
||||
accepted_media_types = self._get_param("acceptedMediaTypes")
|
||||
|
||||
response = self.ecr_backend.batch_get_image(repository_str, registry_id, image_ids, accepted_media_types)
|
||||
response = self.ecr_backend.batch_get_image(
|
||||
repository_str, registry_id, image_ids, accepted_media_types
|
||||
)
|
||||
return json.dumps(response)
|
||||
|
||||
def can_paginate(self):
|
||||
if self.is_not_dryrun('CanPaginate'):
|
||||
raise NotImplementedError(
|
||||
'ECR.can_paginate is not yet implemented')
|
||||
if self.is_not_dryrun("CanPaginate"):
|
||||
raise NotImplementedError("ECR.can_paginate is not yet implemented")
|
||||
|
||||
def complete_layer_upload(self):
|
||||
if self.is_not_dryrun('CompleteLayerUpload'):
|
||||
if self.is_not_dryrun("CompleteLayerUpload"):
|
||||
raise NotImplementedError(
|
||||
'ECR.complete_layer_upload is not yet implemented')
|
||||
"ECR.complete_layer_upload is not yet implemented"
|
||||
)
|
||||
|
||||
def delete_repository_policy(self):
|
||||
if self.is_not_dryrun('DeleteRepositoryPolicy'):
|
||||
if self.is_not_dryrun("DeleteRepositoryPolicy"):
|
||||
raise NotImplementedError(
|
||||
'ECR.delete_repository_policy is not yet implemented')
|
||||
"ECR.delete_repository_policy is not yet implemented"
|
||||
)
|
||||
|
||||
def generate_presigned_url(self):
|
||||
if self.is_not_dryrun('GeneratePresignedUrl'):
|
||||
if self.is_not_dryrun("GeneratePresignedUrl"):
|
||||
raise NotImplementedError(
|
||||
'ECR.generate_presigned_url is not yet implemented')
|
||||
"ECR.generate_presigned_url is not yet implemented"
|
||||
)
|
||||
|
||||
def get_authorization_token(self):
|
||||
registry_ids = self._get_param('registryIds')
|
||||
registry_ids = self._get_param("registryIds")
|
||||
if not registry_ids:
|
||||
registry_ids = [DEFAULT_REGISTRY_ID]
|
||||
auth_data = []
|
||||
for registry_id in registry_ids:
|
||||
password = '{}-auth-token'.format(registry_id)
|
||||
auth_token = b64encode("AWS:{}".format(password).encode('ascii')).decode()
|
||||
auth_data.append({
|
||||
'authorizationToken': auth_token,
|
||||
'expiresAt': time.mktime(datetime(2015, 1, 1).timetuple()),
|
||||
'proxyEndpoint': 'https://{}.dkr.ecr.{}.amazonaws.com'.format(registry_id, self.region)
|
||||
})
|
||||
return json.dumps({'authorizationData': auth_data})
|
||||
password = "{}-auth-token".format(registry_id)
|
||||
auth_token = b64encode("AWS:{}".format(password).encode("ascii")).decode()
|
||||
auth_data.append(
|
||||
{
|
||||
"authorizationToken": auth_token,
|
||||
"expiresAt": time.mktime(datetime(2015, 1, 1).timetuple()),
|
||||
"proxyEndpoint": "https://{}.dkr.ecr.{}.amazonaws.com".format(
|
||||
registry_id, self.region
|
||||
),
|
||||
}
|
||||
)
|
||||
return json.dumps({"authorizationData": auth_data})
|
||||
|
||||
def get_download_url_for_layer(self):
|
||||
if self.is_not_dryrun('GetDownloadUrlForLayer'):
|
||||
if self.is_not_dryrun("GetDownloadUrlForLayer"):
|
||||
raise NotImplementedError(
|
||||
'ECR.get_download_url_for_layer is not yet implemented')
|
||||
"ECR.get_download_url_for_layer is not yet implemented"
|
||||
)
|
||||
|
||||
def get_paginator(self):
|
||||
if self.is_not_dryrun('GetPaginator'):
|
||||
raise NotImplementedError(
|
||||
'ECR.get_paginator is not yet implemented')
|
||||
if self.is_not_dryrun("GetPaginator"):
|
||||
raise NotImplementedError("ECR.get_paginator is not yet implemented")
|
||||
|
||||
def get_repository_policy(self):
|
||||
if self.is_not_dryrun('GetRepositoryPolicy'):
|
||||
if self.is_not_dryrun("GetRepositoryPolicy"):
|
||||
raise NotImplementedError(
|
||||
'ECR.get_repository_policy is not yet implemented')
|
||||
"ECR.get_repository_policy is not yet implemented"
|
||||
)
|
||||
|
||||
def get_waiter(self):
|
||||
if self.is_not_dryrun('GetWaiter'):
|
||||
raise NotImplementedError(
|
||||
'ECR.get_waiter is not yet implemented')
|
||||
if self.is_not_dryrun("GetWaiter"):
|
||||
raise NotImplementedError("ECR.get_waiter is not yet implemented")
|
||||
|
||||
def initiate_layer_upload(self):
|
||||
if self.is_not_dryrun('InitiateLayerUpload'):
|
||||
if self.is_not_dryrun("InitiateLayerUpload"):
|
||||
raise NotImplementedError(
|
||||
'ECR.initiate_layer_upload is not yet implemented')
|
||||
"ECR.initiate_layer_upload is not yet implemented"
|
||||
)
|
||||
|
||||
def set_repository_policy(self):
|
||||
if self.is_not_dryrun('SetRepositoryPolicy'):
|
||||
if self.is_not_dryrun("SetRepositoryPolicy"):
|
||||
raise NotImplementedError(
|
||||
'ECR.set_repository_policy is not yet implemented')
|
||||
"ECR.set_repository_policy is not yet implemented"
|
||||
)
|
||||
|
||||
def upload_layer_part(self):
|
||||
if self.is_not_dryrun('UploadLayerPart'):
|
||||
raise NotImplementedError(
|
||||
'ECR.upload_layer_part is not yet implemented')
|
||||
if self.is_not_dryrun("UploadLayerPart"):
|
||||
raise NotImplementedError("ECR.upload_layer_part is not yet implemented")
|
||||
|
|
|
|||
|
|
@ -1,11 +1,6 @@
|
|||
from __future__ import unicode_literals
|
||||
from .responses import ECRResponse
|
||||
|
||||
url_bases = [
|
||||
"https?://ecr.(.+).amazonaws.com",
|
||||
"https?://api.ecr.(.+).amazonaws.com",
|
||||
]
|
||||
url_bases = ["https?://ecr.(.+).amazonaws.com", "https?://api.ecr.(.+).amazonaws.com"]
|
||||
|
||||
url_paths = {
|
||||
'{0}/$': ECRResponse.dispatch,
|
||||
}
|
||||
url_paths = {"{0}/$": ECRResponse.dispatch}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue