MediaStore delete container and list tags endpoints implemented (#3938)
* Add delete container and list tags endpoints to MediaStore * Black reformat * Fixed Lint problems * Check if dictionary was deleted effectively * lint fix Co-authored-by: av <arcovoltaico@gmail.com>
This commit is contained in:
parent
752b508738
commit
7f49cd0ed6
@ -1,4 +1,5 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from moto.core.exceptions import JsonRESTError
|
from moto.core.exceptions import JsonRESTError
|
||||||
|
|
||||||
|
|
||||||
@ -6,6 +7,15 @@ class MediaStoreClientError(JsonRESTError):
|
|||||||
code = 400
|
code = 400
|
||||||
|
|
||||||
|
|
||||||
|
class ContainerNotFoundException(MediaStoreClientError):
|
||||||
|
def __init__(self, msg=None):
|
||||||
|
self.code = 400
|
||||||
|
super(ContainerNotFoundException, self).__init__(
|
||||||
|
"ContainerNotFoundException",
|
||||||
|
msg or "The specified container does not exist",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class ResourceNotFoundException(MediaStoreClientError):
|
class ResourceNotFoundException(MediaStoreClientError):
|
||||||
def __init__(self, msg=None):
|
def __init__(self, msg=None):
|
||||||
self.code = 400
|
self.code = 400
|
||||||
|
@ -1,9 +1,16 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
from boto3 import Session
|
|
||||||
from moto.core import BaseBackend, BaseModel
|
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from datetime import date
|
from datetime import date
|
||||||
from .exceptions import ResourceNotFoundException, PolicyNotFoundException
|
|
||||||
|
from boto3 import Session
|
||||||
|
|
||||||
|
from moto.core import BaseBackend, BaseModel
|
||||||
|
from .exceptions import (
|
||||||
|
ContainerNotFoundException,
|
||||||
|
ResourceNotFoundException,
|
||||||
|
PolicyNotFoundException,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class Container(BaseModel):
|
class Container(BaseModel):
|
||||||
@ -16,6 +23,7 @@ class Container(BaseModel):
|
|||||||
self.lifecycle_policy = None
|
self.lifecycle_policy = None
|
||||||
self.policy = None
|
self.policy = None
|
||||||
self.metric_policy = None
|
self.metric_policy = None
|
||||||
|
self.tags = kwargs.get("tags")
|
||||||
|
|
||||||
def to_dict(self, exclude=None):
|
def to_dict(self, exclude=None):
|
||||||
data = {
|
data = {
|
||||||
@ -24,6 +32,7 @@ class Container(BaseModel):
|
|||||||
"Endpoint": self.endpoint,
|
"Endpoint": self.endpoint,
|
||||||
"Status": self.status,
|
"Status": self.status,
|
||||||
"CreationTime": self.creation_time,
|
"CreationTime": self.creation_time,
|
||||||
|
"Tags": self.tags,
|
||||||
}
|
}
|
||||||
if exclude:
|
if exclude:
|
||||||
for key in exclude:
|
for key in exclude:
|
||||||
@ -50,10 +59,17 @@ class MediaStoreBackend(BaseBackend):
|
|||||||
endpoint="/{}".format(name),
|
endpoint="/{}".format(name),
|
||||||
status="CREATING",
|
status="CREATING",
|
||||||
creation_time=date.today().strftime("%m/%d/%Y, %H:%M:%S"),
|
creation_time=date.today().strftime("%m/%d/%Y, %H:%M:%S"),
|
||||||
|
tags=tags,
|
||||||
)
|
)
|
||||||
self._containers[name] = container
|
self._containers[name] = container
|
||||||
return container
|
return container
|
||||||
|
|
||||||
|
def delete_container(self, name):
|
||||||
|
if name not in self._containers:
|
||||||
|
raise ContainerNotFoundException()
|
||||||
|
del self._containers[name]
|
||||||
|
return {}
|
||||||
|
|
||||||
def describe_container(self, name):
|
def describe_container(self, name):
|
||||||
if name not in self._containers:
|
if name not in self._containers:
|
||||||
raise ResourceNotFoundException()
|
raise ResourceNotFoundException()
|
||||||
@ -66,6 +82,10 @@ class MediaStoreBackend(BaseBackend):
|
|||||||
response_containers = [c.to_dict() for c in containers]
|
response_containers = [c.to_dict() for c in containers]
|
||||||
return response_containers, None
|
return response_containers, None
|
||||||
|
|
||||||
|
def list_tags_for_resource(self, name):
|
||||||
|
tags = self._containers[name].tags
|
||||||
|
return tags
|
||||||
|
|
||||||
def put_lifecycle_policy(self, container_name, lifecycle_policy):
|
def put_lifecycle_policy(self, container_name, lifecycle_policy):
|
||||||
if container_name not in self._containers:
|
if container_name not in self._containers:
|
||||||
raise ResourceNotFoundException()
|
raise ResourceNotFoundException()
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import json
|
||||||
|
|
||||||
from moto.core.responses import BaseResponse
|
from moto.core.responses import BaseResponse
|
||||||
from .models import mediastore_backends
|
from .models import mediastore_backends
|
||||||
import json
|
|
||||||
|
|
||||||
|
|
||||||
class MediaStoreResponse(BaseResponse):
|
class MediaStoreResponse(BaseResponse):
|
||||||
@ -17,6 +19,11 @@ class MediaStoreResponse(BaseResponse):
|
|||||||
container = self.mediastore_backend.create_container(name=name, tags=tags)
|
container = self.mediastore_backend.create_container(name=name, tags=tags)
|
||||||
return json.dumps(dict(Container=container.to_dict()))
|
return json.dumps(dict(Container=container.to_dict()))
|
||||||
|
|
||||||
|
def delete_container(self):
|
||||||
|
name = self._get_param("ContainerName")
|
||||||
|
result = self.mediastore_backend.delete_container(name=name)
|
||||||
|
return json.dumps(result)
|
||||||
|
|
||||||
def describe_container(self):
|
def describe_container(self):
|
||||||
name = self._get_param("ContainerName")
|
name = self._get_param("ContainerName")
|
||||||
container = self.mediastore_backend.describe_container(name=name)
|
container = self.mediastore_backend.describe_container(name=name)
|
||||||
@ -30,6 +37,11 @@ class MediaStoreResponse(BaseResponse):
|
|||||||
)
|
)
|
||||||
return json.dumps(dict(dict(Containers=containers), NextToken=next_token))
|
return json.dumps(dict(dict(Containers=containers), NextToken=next_token))
|
||||||
|
|
||||||
|
def list_tags_for_resource(self):
|
||||||
|
name = self._get_param("Resource")
|
||||||
|
tags = self.mediastore_backend.list_tags_for_resource(name)
|
||||||
|
return json.dumps(dict(Tags=tags))
|
||||||
|
|
||||||
def put_lifecycle_policy(self):
|
def put_lifecycle_policy(self):
|
||||||
container_name = self._get_param("ContainerName")
|
container_name = self._get_param("ContainerName")
|
||||||
lifecycle_policy = self._get_param("LifecyclePolicy")
|
lifecycle_policy = self._get_param("LifecyclePolicy")
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import boto3
|
import boto3
|
||||||
import sure # noqa
|
|
||||||
import pytest
|
import pytest
|
||||||
from moto import mock_mediastore
|
import sure # noqa
|
||||||
from botocore.exceptions import ClientError
|
from botocore.exceptions import ClientError
|
||||||
|
|
||||||
|
from moto import mock_mediastore
|
||||||
|
|
||||||
region = "eu-west-1"
|
region = "eu-west-1"
|
||||||
|
|
||||||
|
|
||||||
@ -192,3 +193,51 @@ def test_get_metric_policy_raises_error_if_container_does_not_have_metric_policy
|
|||||||
with pytest.raises(ClientError) as ex:
|
with pytest.raises(ClientError) as ex:
|
||||||
client.get_metric_policy(ContainerName="container-name")
|
client.get_metric_policy(ContainerName="container-name")
|
||||||
ex.value.response["Error"]["Code"].should.equal("PolicyNotFoundException")
|
ex.value.response["Error"]["Code"].should.equal("PolicyNotFoundException")
|
||||||
|
|
||||||
|
|
||||||
|
@mock_mediastore
|
||||||
|
def test_list_tags_for_resource():
|
||||||
|
client = boto3.client("mediastore", region_name=region)
|
||||||
|
tags = [{"Key": "customer"}]
|
||||||
|
|
||||||
|
create_response = client.create_container(
|
||||||
|
ContainerName="Awesome container!", Tags=tags
|
||||||
|
)
|
||||||
|
container = create_response["Container"]
|
||||||
|
response = client.list_tags_for_resource(Resource=container["Name"])
|
||||||
|
response["ResponseMetadata"]["HTTPStatusCode"].should.equal(200)
|
||||||
|
response["Tags"].should.equal(tags)
|
||||||
|
|
||||||
|
|
||||||
|
@mock_mediastore
|
||||||
|
def test_list_tags_for_resource_return_none_if_no_tags():
|
||||||
|
client = boto3.client("mediastore", region_name=region)
|
||||||
|
|
||||||
|
create_response = client.create_container(ContainerName="Awesome container!")
|
||||||
|
container = create_response["Container"]
|
||||||
|
response = client.list_tags_for_resource(Resource=container["Name"])
|
||||||
|
response["ResponseMetadata"]["HTTPStatusCode"].should.equal(200)
|
||||||
|
response.get("Tags").should.equal(None)
|
||||||
|
|
||||||
|
|
||||||
|
@mock_mediastore
|
||||||
|
def test_delete_container():
|
||||||
|
client = boto3.client("mediastore", region_name=region)
|
||||||
|
container_name = "Awesome container!"
|
||||||
|
create_response = client.create_container(ContainerName=container_name)
|
||||||
|
container = create_response["Container"]
|
||||||
|
response = client.delete_container(ContainerName=container["Name"])
|
||||||
|
response["ResponseMetadata"]["HTTPStatusCode"].should.equal(200)
|
||||||
|
containers = client.list_containers(NextToken="next-token")["Containers"]
|
||||||
|
container_exists = any(d["Name"] == container_name for d in containers)
|
||||||
|
container_exists.should.equal(False)
|
||||||
|
|
||||||
|
|
||||||
|
@mock_mediastore
|
||||||
|
def test_delete_container_raise_error_if_container_not_found():
|
||||||
|
client = boto3.client("mediastore", region_name=region)
|
||||||
|
client.create_container(ContainerName="Awesome container!")
|
||||||
|
|
||||||
|
with pytest.raises(ClientError) as ex:
|
||||||
|
client.delete_container(ContainerName="notAvailable")
|
||||||
|
ex.value.response["Error"]["Code"].should.equal("ContainerNotFoundException")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user