added update rest api (#4303)

Co-authored-by: rajinder saini <rajinder.saini@c02vt5k2htd6.corp.climate.com>
This commit is contained in:
rajinder 2021-09-18 13:17:42 -07:00 committed by GitHub
parent 65c29e1f5e
commit 3d7d5eb7ed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 94 additions and 35 deletions

View File

@ -659,23 +659,45 @@ class UsagePlanKey(BaseModel, dict):
class RestAPI(CloudFormationModel):
PROP_ID = "id"
PROP_NAME = "name"
PROP_DESCRIPTON = "description"
PROP_VERSION = "version"
PROP_BINARY_MEDIA_TYPES = "binaryMediaTypes"
PROP_CREATED_DATE = "createdDate"
PROP_API_KEY_SOURCE = "apiKeySource"
PROP_ENDPOINT_CONFIGURATION = "endpointConfiguration"
PROP_TAGS = "tags"
PROP_POLICY = "policy"
PROP_DISABLE_EXECUTE_API_ENDPOINT = "disableExecuteApiEndpoint"
PROP_MINIMUM_COMPRESSION_SIZE = "minimumCompressionSize"
# operations
OPERATION_ADD = "add"
OPERATION_REPLACE = "replace"
OPERATION_REMOVE = "remove"
OPERATION_PATH = "path"
OPERATION_VALUE = "value"
OPERATION_OP = "op"
def __init__(self, id, region_name, name, description, **kwargs):
super(RestAPI, self).__init__()
self.id = id
self.region_name = region_name
self.name = name
self.description = description
self.version = kwargs.get("version") or "V1"
self.binaryMediaTypes = kwargs.get("binaryMediaTypes") or []
self.version = kwargs.get(RestAPI.PROP_VERSION) or "V1"
self.binaryMediaTypes = kwargs.get(RestAPI.PROP_BINARY_MEDIA_TYPES) or []
self.create_date = int(time.time())
self.api_key_source = kwargs.get("api_key_source") or "HEADER"
self.policy = kwargs.get("policy") or None
self.policy = kwargs.get(RestAPI.PROP_POLICY) or None
self.endpoint_configuration = kwargs.get("endpoint_configuration") or {
"types": ["EDGE"]
}
self.tags = kwargs.get("tags") or {}
self.tags = kwargs.get(RestAPI.PROP_TAGS) or {}
self.disableExecuteApiEndpoint = (
kwargs.get("disableExecuteApiEndpoint") or False
kwargs.get(RestAPI.PROP_DISABLE_EXECUTE_API_ENDPOINT) or False
)
self.minimum_compression_size = kwargs.get("minimum_compression_size")
self.deployments = {}
@ -690,35 +712,49 @@ class RestAPI(CloudFormationModel):
def to_dict(self):
return {
"id": self.id,
"name": self.name,
"description": self.description,
"version": self.version,
"binaryMediaTypes": self.binaryMediaTypes,
"createdDate": self.create_date,
"apiKeySource": self.api_key_source,
"endpointConfiguration": self.endpoint_configuration,
"tags": self.tags,
"policy": self.policy,
"disableExecuteApiEndpoint": self.disableExecuteApiEndpoint,
"minimumCompressionSize": self.minimum_compression_size,
self.PROP_ID: self.id,
self.PROP_NAME: self.name,
self.PROP_DESCRIPTON: self.description,
self.PROP_VERSION: self.version,
self.PROP_BINARY_MEDIA_TYPES: self.binaryMediaTypes,
self.PROP_CREATED_DATE: self.create_date,
self.PROP_API_KEY_SOURCE: self.api_key_source,
self.PROP_ENDPOINT_CONFIGURATION: self.endpoint_configuration,
self.PROP_TAGS: self.tags,
self.PROP_POLICY: self.policy,
self.PROP_DISABLE_EXECUTE_API_ENDPOINT: self.disableExecuteApiEndpoint,
self.PROP_MINIMUM_COMPRESSION_SIZE: self.minimum_compression_size,
}
def apply_patch_operations(self, patch_operations):
def to_path(prop):
return "/" + prop
for op in patch_operations:
path = op["path"]
value = op["value"]
if op["op"] == "replace":
if "/name" in path:
path = op[self.OPERATION_PATH]
value = ""
if self.OPERATION_VALUE in op:
value = op[self.OPERATION_VALUE]
operaton = op[self.OPERATION_OP]
if operaton == self.OPERATION_REPLACE:
if to_path(self.PROP_NAME) in path:
self.name = value
if "/description" in path:
if to_path(self.PROP_DESCRIPTON) in path:
self.description = value
if "/apiKeySource" in path:
if to_path(self.PROP_API_KEY_SOURCE) in path:
self.api_key_source = value
if "/binaryMediaTypes" in path:
self.binaryMediaTypes = value
if "/disableExecuteApiEndpoint" in path:
if to_path(self.PROP_BINARY_MEDIA_TYPES) in path:
self.binaryMediaTypes = [value]
if to_path(self.PROP_DISABLE_EXECUTE_API_ENDPOINT) in path:
self.disableExecuteApiEndpoint = bool(value)
elif operaton == self.OPERATION_ADD:
if to_path(self.PROP_BINARY_MEDIA_TYPES) in path:
self.binaryMediaTypes.append(value)
elif operaton == self.OPERATION_REMOVE:
if to_path(self.PROP_BINARY_MEDIA_TYPES) in path:
self.binaryMediaTypes.remove(value)
if to_path(self.PROP_DESCRIPTON) in path:
self.description = ""
def get_cfn_attribute(self, attribute_name):
from moto.cloudformation.exceptions import UnformattedGetAttTemplateException

View File

@ -111,8 +111,8 @@ class APIGatewayResponse(BaseResponse):
def __validte_rest_patch_operations(self, patch_operations):
for op in patch_operations:
path = op["path"]
value = op["value"]
if "apiKeySource" in path:
value = op["value"]
return self.__validate_api_key_source(value)
def restapis_individual(self, request, full_url, headers):

View File

@ -110,15 +110,15 @@ class LogsResponse(BaseResponse):
if metric_name and not metric_namespace:
raise InvalidParameterException(
constraint=f"If you include the metricName parameter in your request, "
f"you must also include the metricNamespace parameter.",
constraint=f'{"If you include the metricName parameter in your request, "}'
f'{"you must also include the metricNamespace parameter."}',
parameter="metricNamespace",
value=metric_namespace,
)
if metric_namespace and not metric_name:
raise InvalidParameterException(
constraint=f"If you include the metricNamespace parameter in your request, "
f"you must also include the metricName parameter.",
constraint=f'{"If you include the metricNamespace parameter in your request, "}'
f'{"you must also include the metricName parameter."}',
parameter="metricName",
value=metric_name,
)

View File

@ -302,7 +302,7 @@ class SageMakerResponse(BaseResponse):
errors = []
if max_results and max_results not in max_results_range:
errors.append(
"Value '%s' at 'maxResults' failed to satisfy constraint: Member must have value less than or equal to %s".format(
"Value '{0}' at 'maxResults' failed to satisfy constraint: Member must have value less than or equal to {1}".format(
max_results, max_results_range[-1]
)
)

View File

@ -181,7 +181,9 @@ class FakeTranscriptionJob(BaseObject):
)
if self.output_key is not None
else transcript_file_uri
+ "{1}.json".format(self.output_key, self.transcription_job_name)
+ "{transcription_job_name}.json".format(
transcription_job_name=self.transcription_job_name
)
)
self.output_location_type = "CUSTOMER_BUCKET"
else:

View File

@ -43,7 +43,7 @@ def test_create_and_get_rest_api():
@mock_apigateway
def test_upate_rest_api():
def test_update_rest_api():
client = boto3.client("apigateway", region_name="us-west-2")
response = client.create_rest_api(name="my_api", description="this is my api")
api_id = response["id"]
@ -87,7 +87,7 @@ def test_upate_rest_api():
@mock_apigateway
def test_upate_rest_api_invalid_api_id():
def test_update_rest_api_invalid_api_id():
client = boto3.client("apigateway", region_name="us-west-2")
patchOperations = [
{"op": "replace", "path": "/apiKeySource", "value": "AUTHORIZER"}
@ -97,6 +97,27 @@ def test_upate_rest_api_invalid_api_id():
ex.value.response["Error"]["Code"].should.equal("NotFoundException")
@mock_apigateway
def test_update_rest_api_operation_add_remove():
client = boto3.client("apigateway", region_name="us-west-2")
response = client.create_rest_api(name="my_api", description="this is my api")
api_id = response["id"]
patchOperations = [
{"op": "add", "path": "/binaryMediaTypes", "value": "image/png"},
{"op": "add", "path": "/binaryMediaTypes", "value": "image/jpeg"},
]
response = client.update_rest_api(restApiId=api_id, patchOperations=patchOperations)
response["binaryMediaTypes"].should.equal(["image/png", "image/jpeg"])
response["description"].should.equal("this is my api")
patchOperations = [
{"op": "remove", "path": "/binaryMediaTypes", "value": "image/png"},
{"op": "remove", "path": "/description"},
]
response = client.update_rest_api(restApiId=api_id, patchOperations=patchOperations)
response["binaryMediaTypes"].should.equal(["image/jpeg"])
response["description"].should.equal("")
@mock_apigateway
def test_list_and_delete_apis():
client = boto3.client("apigateway", region_name="us-west-2")