added update rest api (#4303)
Co-authored-by: rajinder saini <rajinder.saini@c02vt5k2htd6.corp.climate.com>
This commit is contained in:
parent
65c29e1f5e
commit
3d7d5eb7ed
@ -659,23 +659,45 @@ class UsagePlanKey(BaseModel, dict):
|
|||||||
|
|
||||||
|
|
||||||
class RestAPI(CloudFormationModel):
|
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):
|
def __init__(self, id, region_name, name, description, **kwargs):
|
||||||
super(RestAPI, self).__init__()
|
super(RestAPI, self).__init__()
|
||||||
self.id = id
|
self.id = id
|
||||||
self.region_name = region_name
|
self.region_name = region_name
|
||||||
self.name = name
|
self.name = name
|
||||||
self.description = description
|
self.description = description
|
||||||
self.version = kwargs.get("version") or "V1"
|
self.version = kwargs.get(RestAPI.PROP_VERSION) or "V1"
|
||||||
self.binaryMediaTypes = kwargs.get("binaryMediaTypes") or []
|
self.binaryMediaTypes = kwargs.get(RestAPI.PROP_BINARY_MEDIA_TYPES) or []
|
||||||
self.create_date = int(time.time())
|
self.create_date = int(time.time())
|
||||||
self.api_key_source = kwargs.get("api_key_source") or "HEADER"
|
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 {
|
self.endpoint_configuration = kwargs.get("endpoint_configuration") or {
|
||||||
"types": ["EDGE"]
|
"types": ["EDGE"]
|
||||||
}
|
}
|
||||||
self.tags = kwargs.get("tags") or {}
|
self.tags = kwargs.get(RestAPI.PROP_TAGS) or {}
|
||||||
self.disableExecuteApiEndpoint = (
|
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.minimum_compression_size = kwargs.get("minimum_compression_size")
|
||||||
self.deployments = {}
|
self.deployments = {}
|
||||||
@ -690,35 +712,49 @@ class RestAPI(CloudFormationModel):
|
|||||||
|
|
||||||
def to_dict(self):
|
def to_dict(self):
|
||||||
return {
|
return {
|
||||||
"id": self.id,
|
self.PROP_ID: self.id,
|
||||||
"name": self.name,
|
self.PROP_NAME: self.name,
|
||||||
"description": self.description,
|
self.PROP_DESCRIPTON: self.description,
|
||||||
"version": self.version,
|
self.PROP_VERSION: self.version,
|
||||||
"binaryMediaTypes": self.binaryMediaTypes,
|
self.PROP_BINARY_MEDIA_TYPES: self.binaryMediaTypes,
|
||||||
"createdDate": self.create_date,
|
self.PROP_CREATED_DATE: self.create_date,
|
||||||
"apiKeySource": self.api_key_source,
|
self.PROP_API_KEY_SOURCE: self.api_key_source,
|
||||||
"endpointConfiguration": self.endpoint_configuration,
|
self.PROP_ENDPOINT_CONFIGURATION: self.endpoint_configuration,
|
||||||
"tags": self.tags,
|
self.PROP_TAGS: self.tags,
|
||||||
"policy": self.policy,
|
self.PROP_POLICY: self.policy,
|
||||||
"disableExecuteApiEndpoint": self.disableExecuteApiEndpoint,
|
self.PROP_DISABLE_EXECUTE_API_ENDPOINT: self.disableExecuteApiEndpoint,
|
||||||
"minimumCompressionSize": self.minimum_compression_size,
|
self.PROP_MINIMUM_COMPRESSION_SIZE: self.minimum_compression_size,
|
||||||
}
|
}
|
||||||
|
|
||||||
def apply_patch_operations(self, patch_operations):
|
def apply_patch_operations(self, patch_operations):
|
||||||
|
def to_path(prop):
|
||||||
|
return "/" + prop
|
||||||
|
|
||||||
for op in patch_operations:
|
for op in patch_operations:
|
||||||
path = op["path"]
|
path = op[self.OPERATION_PATH]
|
||||||
value = op["value"]
|
value = ""
|
||||||
if op["op"] == "replace":
|
if self.OPERATION_VALUE in op:
|
||||||
if "/name" in path:
|
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
|
self.name = value
|
||||||
if "/description" in path:
|
if to_path(self.PROP_DESCRIPTON) in path:
|
||||||
self.description = value
|
self.description = value
|
||||||
if "/apiKeySource" in path:
|
if to_path(self.PROP_API_KEY_SOURCE) in path:
|
||||||
self.api_key_source = value
|
self.api_key_source = value
|
||||||
if "/binaryMediaTypes" in path:
|
if to_path(self.PROP_BINARY_MEDIA_TYPES) in path:
|
||||||
self.binaryMediaTypes = value
|
self.binaryMediaTypes = [value]
|
||||||
if "/disableExecuteApiEndpoint" in path:
|
if to_path(self.PROP_DISABLE_EXECUTE_API_ENDPOINT) in path:
|
||||||
self.disableExecuteApiEndpoint = bool(value)
|
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):
|
def get_cfn_attribute(self, attribute_name):
|
||||||
from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
|
from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
|
||||||
|
@ -111,8 +111,8 @@ class APIGatewayResponse(BaseResponse):
|
|||||||
def __validte_rest_patch_operations(self, patch_operations):
|
def __validte_rest_patch_operations(self, patch_operations):
|
||||||
for op in patch_operations:
|
for op in patch_operations:
|
||||||
path = op["path"]
|
path = op["path"]
|
||||||
value = op["value"]
|
|
||||||
if "apiKeySource" in path:
|
if "apiKeySource" in path:
|
||||||
|
value = op["value"]
|
||||||
return self.__validate_api_key_source(value)
|
return self.__validate_api_key_source(value)
|
||||||
|
|
||||||
def restapis_individual(self, request, full_url, headers):
|
def restapis_individual(self, request, full_url, headers):
|
||||||
|
@ -110,15 +110,15 @@ class LogsResponse(BaseResponse):
|
|||||||
|
|
||||||
if metric_name and not metric_namespace:
|
if metric_name and not metric_namespace:
|
||||||
raise InvalidParameterException(
|
raise InvalidParameterException(
|
||||||
constraint=f"If you include the metricName parameter in your request, "
|
constraint=f'{"If you include the metricName parameter in your request, "}'
|
||||||
f"you must also include the metricNamespace parameter.",
|
f'{"you must also include the metricNamespace parameter."}',
|
||||||
parameter="metricNamespace",
|
parameter="metricNamespace",
|
||||||
value=metric_namespace,
|
value=metric_namespace,
|
||||||
)
|
)
|
||||||
if metric_namespace and not metric_name:
|
if metric_namespace and not metric_name:
|
||||||
raise InvalidParameterException(
|
raise InvalidParameterException(
|
||||||
constraint=f"If you include the metricNamespace parameter in your request, "
|
constraint=f'{"If you include the metricNamespace parameter in your request, "}'
|
||||||
f"you must also include the metricName parameter.",
|
f'{"you must also include the metricName parameter."}',
|
||||||
parameter="metricName",
|
parameter="metricName",
|
||||||
value=metric_name,
|
value=metric_name,
|
||||||
)
|
)
|
||||||
|
@ -302,7 +302,7 @@ class SageMakerResponse(BaseResponse):
|
|||||||
errors = []
|
errors = []
|
||||||
if max_results and max_results not in max_results_range:
|
if max_results and max_results not in max_results_range:
|
||||||
errors.append(
|
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]
|
max_results, max_results_range[-1]
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -181,7 +181,9 @@ class FakeTranscriptionJob(BaseObject):
|
|||||||
)
|
)
|
||||||
if self.output_key is not None
|
if self.output_key is not None
|
||||||
else transcript_file_uri
|
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"
|
self.output_location_type = "CUSTOMER_BUCKET"
|
||||||
else:
|
else:
|
||||||
|
@ -43,7 +43,7 @@ def test_create_and_get_rest_api():
|
|||||||
|
|
||||||
|
|
||||||
@mock_apigateway
|
@mock_apigateway
|
||||||
def test_upate_rest_api():
|
def test_update_rest_api():
|
||||||
client = boto3.client("apigateway", region_name="us-west-2")
|
client = boto3.client("apigateway", region_name="us-west-2")
|
||||||
response = client.create_rest_api(name="my_api", description="this is my api")
|
response = client.create_rest_api(name="my_api", description="this is my api")
|
||||||
api_id = response["id"]
|
api_id = response["id"]
|
||||||
@ -87,7 +87,7 @@ def test_upate_rest_api():
|
|||||||
|
|
||||||
|
|
||||||
@mock_apigateway
|
@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")
|
client = boto3.client("apigateway", region_name="us-west-2")
|
||||||
patchOperations = [
|
patchOperations = [
|
||||||
{"op": "replace", "path": "/apiKeySource", "value": "AUTHORIZER"}
|
{"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")
|
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
|
@mock_apigateway
|
||||||
def test_list_and_delete_apis():
|
def test_list_and_delete_apis():
|
||||||
client = boto3.client("apigateway", region_name="us-west-2")
|
client = boto3.client("apigateway", region_name="us-west-2")
|
||||||
|
Loading…
Reference in New Issue
Block a user