Implements core MediaConnect endpoints (#3718)
* Adds initial models and implements create_flow endpoint. * Updates README with a Releases section * Removes unused import * Adds __init__.py files to MediaLive and MediaConnect test directories. * Adds list_flows endpoint and tests. * Adds describe_flow endpoint and tests. * Adds delete_flow endpoint and tests. * Adds URLs * Adds start_flow and stop_flow endpoints and tests. * Adds tag_resource and list_tags_for_resource endpoints and tests. * Uses unquote for ARNs
This commit is contained in:
parent
4b1c7225b6
commit
869b3c45c1
12 changed files with 491 additions and 9 deletions
0
tests/test_mediaconnect/__init__.py
Normal file
0
tests/test_mediaconnect/__init__.py
Normal file
152
tests/test_mediaconnect/test_mediaconnect.py
Normal file
152
tests/test_mediaconnect/test_mediaconnect.py
Normal file
|
|
@ -0,0 +1,152 @@
|
|||
from __future__ import unicode_literals
|
||||
|
||||
import boto3
|
||||
import sure # noqa
|
||||
from moto import mock_mediaconnect
|
||||
|
||||
|
||||
region = "eu-west-1"
|
||||
|
||||
|
||||
def _create_flow_config(name, **kwargs):
|
||||
availability_zone = kwargs.get("availability_zone", "AZ1")
|
||||
entitlements = kwargs.get(
|
||||
"entitlements",
|
||||
[
|
||||
{
|
||||
"DataTransferSubscriberFeePercent": 12,
|
||||
"Description": "An entitlement",
|
||||
"Encryption": {"Algorithm": "aes256", "RoleArn": "some:role"},
|
||||
"EntitlementStatus": "ENABLED",
|
||||
"Name": "Entitlement A",
|
||||
"Subscribers": [],
|
||||
}
|
||||
],
|
||||
)
|
||||
outputs = kwargs.get("outputs", [{"Name": "Output 1", "Protocol": "zixi-push"}])
|
||||
source = kwargs.get(
|
||||
"source",
|
||||
{
|
||||
"Decryption": {"Algorithm": "aes256", "RoleArn": "some:role"},
|
||||
"Description": "A source",
|
||||
"Name": "Source A",
|
||||
},
|
||||
)
|
||||
source_failover_config = kwargs.get("source_failover_config", {})
|
||||
sources = kwargs.get("sources", [])
|
||||
vpc_interfaces = kwargs.get("vpc_interfaces", [])
|
||||
flow_config = dict(
|
||||
AvailabilityZone=availability_zone,
|
||||
Entitlements=entitlements,
|
||||
Name=name,
|
||||
Outputs=outputs,
|
||||
Source=source,
|
||||
SourceFailoverConfig=source_failover_config,
|
||||
Sources=sources,
|
||||
VpcInterfaces=vpc_interfaces,
|
||||
)
|
||||
return flow_config
|
||||
|
||||
|
||||
@mock_mediaconnect
|
||||
def test_create_flow_succeeds():
|
||||
client = boto3.client("mediaconnect", region_name=region)
|
||||
channel_config = _create_flow_config("test Flow 1")
|
||||
|
||||
response = client.create_flow(**channel_config)
|
||||
|
||||
response["ResponseMetadata"]["HTTPStatusCode"].should.equal(200)
|
||||
response["Flow"]["FlowArn"][:26].should.equal("arn:aws:mediaconnect:flow:")
|
||||
response["Flow"]["Name"].should.equal("test Flow 1")
|
||||
response["Flow"]["Status"].should.equal("STANDBY")
|
||||
|
||||
|
||||
@mock_mediaconnect
|
||||
def test_list_flows_succeeds():
|
||||
client = boto3.client("mediaconnect", region_name=region)
|
||||
flow_1_config = _create_flow_config("test Flow 1")
|
||||
flow_2_config = _create_flow_config("test Flow 2")
|
||||
|
||||
client.create_flow(**flow_1_config)
|
||||
client.create_flow(**flow_2_config)
|
||||
|
||||
response = client.list_flows()
|
||||
len(response["Flows"]).should.equal(2)
|
||||
|
||||
response["Flows"][0]["Name"].should.equal("test Flow 1")
|
||||
response["Flows"][0]["AvailabilityZone"].should.equal("AZ1")
|
||||
response["Flows"][0]["SourceType"].should.equal("OWNED")
|
||||
response["Flows"][0]["Status"].should.equal("STANDBY")
|
||||
|
||||
response["Flows"][1]["Name"].should.equal("test Flow 2")
|
||||
response["Flows"][1]["AvailabilityZone"].should.equal("AZ1")
|
||||
response["Flows"][1]["SourceType"].should.equal("OWNED")
|
||||
response["Flows"][1]["Status"].should.equal("STANDBY")
|
||||
|
||||
|
||||
@mock_mediaconnect
|
||||
def test_describe_flow_succeeds():
|
||||
client = boto3.client("mediaconnect", region_name=region)
|
||||
channel_config = _create_flow_config("test Flow 1")
|
||||
|
||||
create_response = client.create_flow(**channel_config)
|
||||
create_response["ResponseMetadata"]["HTTPStatusCode"].should.equal(200)
|
||||
flow_arn = create_response["Flow"]["FlowArn"]
|
||||
describe_response = client.describe_flow(FlowArn=flow_arn)
|
||||
describe_response["ResponseMetadata"]["HTTPStatusCode"].should.equal(200)
|
||||
describe_response["Flow"]["Name"].should.equal("test Flow 1")
|
||||
|
||||
|
||||
@mock_mediaconnect
|
||||
def test_delete_flow_succeeds():
|
||||
client = boto3.client("mediaconnect", region_name=region)
|
||||
channel_config = _create_flow_config("test Flow 1")
|
||||
|
||||
create_response = client.create_flow(**channel_config)
|
||||
create_response["ResponseMetadata"]["HTTPStatusCode"].should.equal(200)
|
||||
flow_arn = create_response["Flow"]["FlowArn"]
|
||||
delete_response = client.delete_flow(FlowArn=flow_arn)
|
||||
delete_response["ResponseMetadata"]["HTTPStatusCode"].should.equal(200)
|
||||
delete_response["FlowArn"].should.equal(flow_arn)
|
||||
delete_response["Status"].should.equal("STANDBY")
|
||||
|
||||
|
||||
@mock_mediaconnect
|
||||
def test_start_stop_flow_succeeds():
|
||||
client = boto3.client("mediaconnect", region_name=region)
|
||||
channel_config = _create_flow_config("test Flow 1")
|
||||
|
||||
create_response = client.create_flow(**channel_config)
|
||||
create_response["ResponseMetadata"]["HTTPStatusCode"].should.equal(200)
|
||||
create_response["Flow"]["Status"].should.equal("STANDBY")
|
||||
flow_arn = create_response["Flow"]["FlowArn"]
|
||||
|
||||
start_response = client.start_flow(FlowArn=flow_arn)
|
||||
start_response["ResponseMetadata"]["HTTPStatusCode"].should.equal(200)
|
||||
start_response["FlowArn"].should.equal(flow_arn)
|
||||
start_response["Status"].should.equal("STARTING")
|
||||
|
||||
describe_response = client.describe_flow(FlowArn=flow_arn)
|
||||
describe_response["ResponseMetadata"]["HTTPStatusCode"].should.equal(200)
|
||||
describe_response["Flow"]["Status"].should.equal("ACTIVE")
|
||||
|
||||
stop_response = client.stop_flow(FlowArn=flow_arn)
|
||||
stop_response["ResponseMetadata"]["HTTPStatusCode"].should.equal(200)
|
||||
stop_response["FlowArn"].should.equal(flow_arn)
|
||||
stop_response["Status"].should.equal("STOPPING")
|
||||
|
||||
describe_response = client.describe_flow(FlowArn=flow_arn)
|
||||
describe_response["ResponseMetadata"]["HTTPStatusCode"].should.equal(200)
|
||||
describe_response["Flow"]["Status"].should.equal("STANDBY")
|
||||
|
||||
|
||||
@mock_mediaconnect
|
||||
def test_tag_resource_succeeds():
|
||||
client = boto3.client("mediaconnect", region_name=region)
|
||||
|
||||
tag_response = client.tag_resource(ResourceArn="some-arn", Tags={"Tag1": "Value1"})
|
||||
tag_response["ResponseMetadata"]["HTTPStatusCode"].should.equal(200)
|
||||
|
||||
list_response = client.list_tags_for_resource(ResourceArn="some-arn")
|
||||
list_response["ResponseMetadata"]["HTTPStatusCode"].should.equal(200)
|
||||
list_response["Tags"].should.equal({"Tag1": "Value1"})
|
||||
21
tests/test_mediaconnect/test_server.py
Normal file
21
tests/test_mediaconnect/test_server.py
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
from __future__ import unicode_literals
|
||||
|
||||
import sure # noqa
|
||||
|
||||
import moto.server as server
|
||||
from moto import mock_mediaconnect
|
||||
|
||||
"""
|
||||
Test the different server responses
|
||||
"""
|
||||
|
||||
|
||||
@mock_mediaconnect
|
||||
def test_mediaconnect_list_flows():
|
||||
backend = server.create_backend_app("mediaconnect")
|
||||
test_client = backend.test_client()
|
||||
|
||||
res = test_client.get("/v1/flows")
|
||||
|
||||
result = res.data.decode("utf-8")
|
||||
result.should.contain('"flows": []')
|
||||
0
tests/test_medialive/__init__.py
Normal file
0
tests/test_medialive/__init__.py
Normal file
Loading…
Add table
Add a link
Reference in a new issue