2017-04-18 17:09:10 +00:00
|
|
|
from __future__ import unicode_literals
|
|
|
|
import json
|
|
|
|
|
|
|
|
from moto.core.responses import BaseResponse
|
|
|
|
from .models import ssm_backends
|
|
|
|
|
|
|
|
|
|
|
|
class SimpleSystemManagerResponse(BaseResponse):
|
|
|
|
@property
|
|
|
|
def ssm_backend(self):
|
|
|
|
return ssm_backends[self.region]
|
|
|
|
|
|
|
|
@property
|
|
|
|
def request_params(self):
|
|
|
|
try:
|
|
|
|
return json.loads(self.body)
|
|
|
|
except ValueError:
|
|
|
|
return {}
|
|
|
|
|
|
|
|
def _get_param(self, param, default=None):
|
|
|
|
return self.request_params.get(param, default)
|
|
|
|
|
|
|
|
def delete_parameter(self):
|
2019-10-31 15:44:26 +00:00
|
|
|
name = self._get_param("Name")
|
2020-02-26 01:25:44 +00:00
|
|
|
result = self.ssm_backend.delete_parameter(name)
|
|
|
|
if result is None:
|
|
|
|
error = {
|
|
|
|
"__type": "ParameterNotFound",
|
|
|
|
"message": "Parameter {0} not found.".format(name),
|
|
|
|
}
|
|
|
|
return json.dumps(error), dict(status=400)
|
2017-04-18 17:09:10 +00:00
|
|
|
return json.dumps({})
|
|
|
|
|
2017-08-11 13:19:36 +00:00
|
|
|
def delete_parameters(self):
|
2019-10-31 15:44:26 +00:00
|
|
|
names = self._get_param("Names")
|
2017-08-11 13:19:36 +00:00
|
|
|
result = self.ssm_backend.delete_parameters(names)
|
|
|
|
|
2019-10-31 15:44:26 +00:00
|
|
|
response = {"DeletedParameters": [], "InvalidParameters": []}
|
2017-08-11 13:19:36 +00:00
|
|
|
|
|
|
|
for name in names:
|
|
|
|
if name in result:
|
2019-10-31 15:44:26 +00:00
|
|
|
response["DeletedParameters"].append(name)
|
2017-08-11 13:19:36 +00:00
|
|
|
else:
|
2019-10-31 15:44:26 +00:00
|
|
|
response["InvalidParameters"].append(name)
|
2017-08-11 13:19:36 +00:00
|
|
|
return json.dumps(response)
|
|
|
|
|
2017-09-18 13:13:02 +00:00
|
|
|
def get_parameter(self):
|
2019-10-31 15:44:26 +00:00
|
|
|
name = self._get_param("Name")
|
|
|
|
with_decryption = self._get_param("WithDecryption")
|
2017-09-18 13:13:02 +00:00
|
|
|
|
|
|
|
result = self.ssm_backend.get_parameter(name, with_decryption)
|
|
|
|
|
|
|
|
if result is None:
|
2017-09-18 20:27:56 +00:00
|
|
|
error = {
|
2019-10-31 15:44:26 +00:00
|
|
|
"__type": "ParameterNotFound",
|
|
|
|
"message": "Parameter {0} not found.".format(name),
|
2017-09-18 20:27:56 +00:00
|
|
|
}
|
|
|
|
return json.dumps(error), dict(status=400)
|
2017-09-18 13:13:02 +00:00
|
|
|
|
2019-12-01 01:03:51 +00:00
|
|
|
response = {"Parameter": result.response_object(with_decryption, self.region)}
|
2017-09-18 13:13:02 +00:00
|
|
|
return json.dumps(response)
|
|
|
|
|
2017-04-18 17:09:10 +00:00
|
|
|
def get_parameters(self):
|
2019-10-31 15:44:26 +00:00
|
|
|
names = self._get_param("Names")
|
|
|
|
with_decryption = self._get_param("WithDecryption")
|
2017-04-18 17:09:10 +00:00
|
|
|
|
|
|
|
result = self.ssm_backend.get_parameters(names, with_decryption)
|
|
|
|
|
2019-10-31 15:44:26 +00:00
|
|
|
response = {"Parameters": [], "InvalidParameters": []}
|
2017-04-18 17:09:10 +00:00
|
|
|
|
|
|
|
for parameter in result:
|
2019-12-01 01:03:51 +00:00
|
|
|
param_data = parameter.response_object(with_decryption, self.region)
|
2019-10-31 15:44:26 +00:00
|
|
|
response["Parameters"].append(param_data)
|
2017-04-18 17:09:10 +00:00
|
|
|
|
2017-08-16 10:49:03 +00:00
|
|
|
param_names = [param.name for param in result]
|
|
|
|
for name in names:
|
|
|
|
if name not in param_names:
|
2019-10-31 15:44:26 +00:00
|
|
|
response["InvalidParameters"].append(name)
|
2017-04-18 17:09:10 +00:00
|
|
|
return json.dumps(response)
|
|
|
|
|
2017-11-06 09:44:54 +00:00
|
|
|
def get_parameters_by_path(self):
|
2019-10-31 15:44:26 +00:00
|
|
|
path = self._get_param("Path")
|
|
|
|
with_decryption = self._get_param("WithDecryption")
|
|
|
|
recursive = self._get_param("Recursive", False)
|
|
|
|
filters = self._get_param("ParameterFilters")
|
2019-11-27 22:12:31 +00:00
|
|
|
token = self._get_param("NextToken")
|
|
|
|
max_results = self._get_param("MaxResults", 10)
|
|
|
|
|
|
|
|
result, next_token = self.ssm_backend.get_parameters_by_path(
|
|
|
|
path,
|
|
|
|
with_decryption,
|
|
|
|
recursive,
|
|
|
|
filters,
|
|
|
|
next_token=token,
|
|
|
|
max_results=max_results,
|
2017-11-06 09:44:54 +00:00
|
|
|
)
|
|
|
|
|
2019-11-27 22:12:31 +00:00
|
|
|
response = {"Parameters": [], "NextToken": next_token}
|
2017-11-06 09:44:54 +00:00
|
|
|
|
|
|
|
for parameter in result:
|
2019-12-01 01:03:51 +00:00
|
|
|
param_data = parameter.response_object(with_decryption, self.region)
|
2019-10-31 15:44:26 +00:00
|
|
|
response["Parameters"].append(param_data)
|
2017-11-06 09:44:54 +00:00
|
|
|
|
|
|
|
return json.dumps(response)
|
|
|
|
|
2017-06-20 01:22:33 +00:00
|
|
|
def describe_parameters(self):
|
2017-06-20 18:47:53 +00:00
|
|
|
page_size = 10
|
2019-10-31 15:44:26 +00:00
|
|
|
filters = self._get_param("Filters")
|
|
|
|
parameter_filters = self._get_param("ParameterFilters")
|
|
|
|
token = self._get_param("NextToken")
|
|
|
|
if hasattr(token, "strip"):
|
2017-06-20 18:47:53 +00:00
|
|
|
token = token.strip()
|
|
|
|
if not token:
|
2019-10-31 15:44:26 +00:00
|
|
|
token = "0"
|
2017-06-20 18:47:53 +00:00
|
|
|
token = int(token)
|
|
|
|
|
2019-10-31 15:44:26 +00:00
|
|
|
result = self.ssm_backend.describe_parameters(filters, parameter_filters)
|
2019-09-21 14:55:43 +00:00
|
|
|
|
2019-10-31 15:44:26 +00:00
|
|
|
response = {"Parameters": []}
|
2017-06-20 01:22:33 +00:00
|
|
|
|
2017-06-20 18:47:53 +00:00
|
|
|
end = token + page_size
|
|
|
|
for parameter in result[token:]:
|
2019-10-31 15:44:26 +00:00
|
|
|
response["Parameters"].append(parameter.describe_response_object(False))
|
2017-06-20 18:47:53 +00:00
|
|
|
|
|
|
|
token = token + 1
|
2019-10-31 15:44:26 +00:00
|
|
|
if len(response["Parameters"]) == page_size:
|
|
|
|
response["NextToken"] = str(end)
|
2017-06-20 18:47:53 +00:00
|
|
|
break
|
|
|
|
|
2017-06-20 01:22:33 +00:00
|
|
|
return json.dumps(response)
|
|
|
|
|
2017-04-18 17:09:10 +00:00
|
|
|
def put_parameter(self):
|
2019-10-31 15:44:26 +00:00
|
|
|
name = self._get_param("Name")
|
|
|
|
description = self._get_param("Description")
|
|
|
|
value = self._get_param("Value")
|
|
|
|
type_ = self._get_param("Type")
|
|
|
|
allowed_pattern = self._get_param("AllowedPattern")
|
|
|
|
keyid = self._get_param("KeyId")
|
|
|
|
overwrite = self._get_param("Overwrite", False)
|
2017-04-18 17:09:10 +00:00
|
|
|
|
2018-03-21 15:56:57 +00:00
|
|
|
result = self.ssm_backend.put_parameter(
|
2019-10-31 15:44:26 +00:00
|
|
|
name, description, value, type_, allowed_pattern, keyid, overwrite
|
|
|
|
)
|
2018-03-21 15:56:57 +00:00
|
|
|
|
|
|
|
if result is None:
|
|
|
|
error = {
|
2019-10-31 15:44:26 +00:00
|
|
|
"__type": "ParameterAlreadyExists",
|
|
|
|
"message": "Parameter {0} already exists.".format(name),
|
2018-03-21 15:56:57 +00:00
|
|
|
}
|
|
|
|
return json.dumps(error), dict(status=400)
|
|
|
|
|
2019-10-31 15:44:26 +00:00
|
|
|
response = {"Version": result}
|
2018-03-21 15:56:57 +00:00
|
|
|
return json.dumps(response)
|
2017-07-26 11:38:12 +00:00
|
|
|
|
2019-11-04 17:49:09 +00:00
|
|
|
def get_parameter_history(self):
|
2019-11-04 18:04:10 +00:00
|
|
|
name = self._get_param("Name")
|
2019-11-04 17:49:09 +00:00
|
|
|
with_decryption = self._get_param("WithDecryption")
|
|
|
|
|
|
|
|
result = self.ssm_backend.get_parameter_history(name, with_decryption)
|
|
|
|
|
2019-11-04 20:30:30 +00:00
|
|
|
if result is None:
|
|
|
|
error = {
|
|
|
|
"__type": "ParameterNotFound",
|
|
|
|
"message": "Parameter {0} not found.".format(name),
|
|
|
|
}
|
|
|
|
return json.dumps(error), dict(status=400)
|
|
|
|
|
2019-11-04 17:49:09 +00:00
|
|
|
response = {"Parameters": []}
|
|
|
|
for parameter_version in result:
|
2019-11-04 18:04:10 +00:00
|
|
|
param_data = parameter_version.describe_response_object(
|
2020-03-11 15:57:04 +00:00
|
|
|
decrypt=with_decryption, include_labels=True
|
2019-11-04 18:04:10 +00:00
|
|
|
)
|
|
|
|
response["Parameters"].append(param_data)
|
2019-11-04 17:49:09 +00:00
|
|
|
|
|
|
|
return json.dumps(response)
|
|
|
|
|
2020-03-09 00:32:01 +00:00
|
|
|
def label_parameter_version(self):
|
|
|
|
name = self._get_param("Name")
|
|
|
|
version = self._get_param("ParameterVersion")
|
|
|
|
labels = self._get_param("Labels")
|
|
|
|
|
2020-03-11 15:57:04 +00:00
|
|
|
invalid_labels, version = self.ssm_backend.label_parameter_version(
|
|
|
|
name, version, labels
|
|
|
|
)
|
2020-03-09 00:32:01 +00:00
|
|
|
|
|
|
|
response = {"InvalidLabels": invalid_labels, "ParameterVersion": version}
|
|
|
|
return json.dumps(response)
|
|
|
|
|
2017-07-26 11:38:12 +00:00
|
|
|
def add_tags_to_resource(self):
|
2019-10-31 15:44:26 +00:00
|
|
|
resource_id = self._get_param("ResourceId")
|
|
|
|
resource_type = self._get_param("ResourceType")
|
|
|
|
tags = {t["Key"]: t["Value"] for t in self._get_param("Tags")}
|
|
|
|
self.ssm_backend.add_tags_to_resource(resource_id, resource_type, tags)
|
2017-07-26 11:38:12 +00:00
|
|
|
return json.dumps({})
|
|
|
|
|
|
|
|
def remove_tags_from_resource(self):
|
2019-10-31 15:44:26 +00:00
|
|
|
resource_id = self._get_param("ResourceId")
|
|
|
|
resource_type = self._get_param("ResourceType")
|
|
|
|
keys = self._get_param("TagKeys")
|
|
|
|
self.ssm_backend.remove_tags_from_resource(resource_id, resource_type, keys)
|
2017-07-26 11:38:12 +00:00
|
|
|
return json.dumps({})
|
|
|
|
|
|
|
|
def list_tags_for_resource(self):
|
2019-10-31 15:44:26 +00:00
|
|
|
resource_id = self._get_param("ResourceId")
|
|
|
|
resource_type = self._get_param("ResourceType")
|
|
|
|
tags = self.ssm_backend.list_tags_for_resource(resource_id, resource_type)
|
|
|
|
tag_list = [{"Key": k, "Value": v} for (k, v) in tags.items()]
|
|
|
|
response = {"TagList": tag_list}
|
2017-07-26 11:38:12 +00:00
|
|
|
return json.dumps(response)
|
2018-02-19 15:39:29 +00:00
|
|
|
|
|
|
|
def send_command(self):
|
2019-10-31 15:44:26 +00:00
|
|
|
return json.dumps(self.ssm_backend.send_command(**self.request_params))
|
2018-04-25 20:25:44 +00:00
|
|
|
|
|
|
|
def list_commands(self):
|
2019-10-31 15:44:26 +00:00
|
|
|
return json.dumps(self.ssm_backend.list_commands(**self.request_params))
|
2018-07-24 20:15:53 +00:00
|
|
|
|
|
|
|
def get_command_invocation(self):
|
|
|
|
return json.dumps(
|
|
|
|
self.ssm_backend.get_command_invocation(**self.request_params)
|
|
|
|
)
|