Fixes and additional tests

This commit is contained in:
James Belleau 2020-05-06 21:12:48 -05:00
commit 5ec814a604
5 changed files with 193 additions and 60 deletions

View file

@ -8,7 +8,7 @@ from moto.core import BaseBackend, BaseModel
from .exceptions import BadRequestException
from .utils import get_network_id
from .utils import get_network_id, get_member_id
FRAMEWORKS = [
"HYPERLEDGER_FABRIC",
@ -37,7 +37,7 @@ class ManagedBlockchainNetwork(BaseModel):
region,
description=None,
):
self.st = datetime.datetime.now(datetime.timezone.utc)
self.creationdate = datetime.datetime.utcnow()
self.id = id
self.name = name
self.description = description
@ -49,19 +49,34 @@ class ManagedBlockchainNetwork(BaseModel):
self.region = region
def to_dict(self):
# Format for list_networks
d = {
"Id": self.id,
"Name": self.name,
"Framework": self.framework,
"FrameworkVersion": self.frameworkversion,
"Status": "AVAILABLE",
"CreationDate": self.creationdate.strftime("%Y-%m-%dT%H:%M:%S.%f%z"),
}
if self.description is not None:
d["Description"] = self.description
return d
def get_format(self):
# Format for get_networks
frameworkattributes = {
"Fabric": {
"OrderingServiceEndpoint": "orderer.{0}.managedblockchain.{1}.amazonaws.com:30001".format(
self.id, self.region
self.id.lower(), self.region
),
"Edition": self.frameworkconfiguration["Fabric"]["Edition"],
}
}
vpcendpointname = "com.amazonaws.{0}.managedblockchain.{1}".format(
self.region, self.id
self.region, self.id.lower()
)
# Use iso_8601_datetime_with_milliseconds ?
d = {
"Id": self.id,
"Name": self.name,
@ -71,7 +86,7 @@ class ManagedBlockchainNetwork(BaseModel):
"VpcEndpointServiceName": vpcendpointname,
"VotingPolicy": self.voting_policy,
"Status": "AVAILABLE",
"CreationDate": self.st.strftime("%Y-%m-%dT%H:%M:%S.%f%z"),
"CreationDate": self.creationdate.strftime("%Y-%m-%dT%H:%M:%S.%f%z"),
}
if self.description is not None:
d["Description"] = self.description
@ -90,14 +105,21 @@ class ManagedBlockchainBackend(BaseBackend):
def create_network(
self,
json_body,
name,
framework,
frameworkversion,
frameworkconfiguration,
voting_policy,
member_configuration,
description=None,
):
name = json_body["Name"]
framework = json_body["Framework"]
frameworkversion = json_body["FrameworkVersion"]
frameworkconfiguration = json_body["FrameworkConfiguration"]
voting_policy = json_body["VotingPolicy"]
member_configuration = json_body["MemberConfiguration"]
self.name = name
self.framework = framework
self.frameworkversion = frameworkversion
self.frameworkconfiguration = frameworkconfiguration
self.voting_policy = voting_policy
self.member_configuration = member_configuration
self.description = description
# Check framework
if framework not in FRAMEWORKS:
@ -119,33 +141,32 @@ class ManagedBlockchainBackend(BaseBackend):
## Generate network ID
network_id = get_network_id()
## Generate memberid ID - will need to actually create member
member_id = get_member_id()
self.networks[network_id] = ManagedBlockchainNetwork(
id=network_id,
name=name,
framework=framework,
frameworkversion=frameworkversion,
frameworkconfiguration=frameworkconfiguration,
voting_policy=voting_policy,
member_configuration=member_configuration,
framework=self.framework,
frameworkversion=self.frameworkversion,
frameworkconfiguration=self.frameworkconfiguration,
voting_policy=self.voting_policy,
member_configuration=self.member_configuration,
region=self.region_name,
description=self.description,
)
# Return the network and member ID
d = {"NetworkId": network_id, "MemberId": member_id}
return d
def list_networks(self):
return self.networks.values()
def get_network(self, network_id):
return self.networks[network_id]
return self.networks.get(network_id)
managedblockchain_backends = {}
for region in Session().get_available_regions("managedblockchain"):
managedblockchain_backends[region] = ManagedBlockchainBackend(region)
for region in Session().get_available_regions(
"managedblockchain", partition_name="aws-us-gov"
):
managedblockchain_backends[region] = ManagedBlockchainBackend(region)
for region in Session().get_available_regions(
"managedblockchain", partition_name="aws-cn"
):
managedblockchain_backends[region] = ManagedBlockchainBackend(region)

View file

@ -5,7 +5,10 @@ from six.moves.urllib.parse import urlparse, parse_qs
from moto.core.responses import BaseResponse
from .models import managedblockchain_backends
from .utils import region_from_managedblckchain_url, networkid_from_managedblockchain_url
from .utils import (
region_from_managedblckchain_url,
networkid_from_managedblockchain_url,
)
class ManagedBlockchainResponse(BaseResponse):
@ -16,7 +19,9 @@ class ManagedBlockchainResponse(BaseResponse):
@classmethod
def network_response(clazz, request, full_url, headers):
region_name = region_from_managedblckchain_url(full_url)
response_instance = ManagedBlockchainResponse(managedblockchain_backends[region_name])
response_instance = ManagedBlockchainResponse(
managedblockchain_backends[region_name]
)
return response_instance._network_response(request, full_url, headers)
def _network_response(self, request, full_url, headers):
@ -42,13 +47,35 @@ class ManagedBlockchainResponse(BaseResponse):
return 200, headers, response
def _network_response_post(self, json_body, querystring, headers):
self.backend.create_network(json_body)
return 201, headers, ""
name = json_body["Name"]
framework = json_body["Framework"]
frameworkversion = json_body["FrameworkVersion"]
frameworkconfiguration = json_body["FrameworkConfiguration"]
voting_policy = json_body["VotingPolicy"]
member_configuration = json_body["MemberConfiguration"]
# Optional
description = None
if "Description" in json_body:
description = json_body["Description"]
response = self.backend.create_network(
name,
framework,
frameworkversion,
frameworkconfiguration,
voting_policy,
member_configuration,
description,
)
return 201, headers, json.dumps(response)
@classmethod
def networkid_response(clazz, request, full_url, headers):
region_name = region_from_managedblckchain_url(full_url)
response_instance = ManagedBlockchainResponse(managedblockchain_backends[region_name])
response_instance = ManagedBlockchainResponse(
managedblockchain_backends[region_name]
)
return response_instance._networkid_response(request, full_url, headers)
def _networkid_response(self, request, full_url, headers):
@ -60,8 +87,6 @@ class ManagedBlockchainResponse(BaseResponse):
def _networkid_response_get(self, network_id, headers):
mbcnetwork = self.backend.get_network(network_id)
response = json.dumps(
{"Network": mbcnetwork.to_dict()}
)
response = json.dumps({"Network": mbcnetwork.get_format()})
headers["content-type"] = "application/json"
return 200, headers, response

View file

@ -21,3 +21,9 @@ def get_network_id():
return "n-" + "".join(
random.choice(string.ascii_uppercase + string.digits) for _ in range(26)
)
def get_member_id():
return "m-" + "".join(
random.choice(string.ascii_uppercase + string.digits) for _ in range(26)
)