Improve SSM PutParameter & DescribeParameters actions (#1348)
This commit is contained in:
parent
2609f6cd3a
commit
caec929506
@ -5,13 +5,17 @@ from collections import defaultdict
|
|||||||
from moto.core import BaseBackend, BaseModel
|
from moto.core import BaseBackend, BaseModel
|
||||||
from moto.ec2 import ec2_backends
|
from moto.ec2 import ec2_backends
|
||||||
|
|
||||||
|
import time
|
||||||
|
|
||||||
|
|
||||||
class Parameter(BaseModel):
|
class Parameter(BaseModel):
|
||||||
def __init__(self, name, value, type, description, keyid):
|
def __init__(self, name, value, type, description, keyid, last_modified_date, version):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.type = type
|
self.type = type
|
||||||
self.description = description
|
self.description = description
|
||||||
self.keyid = keyid
|
self.keyid = keyid
|
||||||
|
self.last_modified_date = last_modified_date
|
||||||
|
self.version = version
|
||||||
|
|
||||||
if self.type == 'SecureString':
|
if self.type == 'SecureString':
|
||||||
self.value = self.encrypt(value)
|
self.value = self.encrypt(value)
|
||||||
@ -33,8 +37,20 @@ class Parameter(BaseModel):
|
|||||||
r = {
|
r = {
|
||||||
'Name': self.name,
|
'Name': self.name,
|
||||||
'Type': self.type,
|
'Type': self.type,
|
||||||
'Value': self.decrypt(self.value) if decrypt else self.value
|
'Value': self.decrypt(self.value) if decrypt else self.value,
|
||||||
|
'Version': self.version,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return r
|
||||||
|
|
||||||
|
def describe_response_object(self, decrypt=False):
|
||||||
|
r = self.response_object(decrypt)
|
||||||
|
r['LastModifiedDate'] = int(self.last_modified_date)
|
||||||
|
r['LastModifiedUser'] = 'N/A'
|
||||||
|
|
||||||
|
if self.description:
|
||||||
|
r['Description'] = self.description
|
||||||
|
|
||||||
if self.keyid:
|
if self.keyid:
|
||||||
r['KeyId'] = self.keyid
|
r['KeyId'] = self.keyid
|
||||||
return r
|
return r
|
||||||
@ -96,10 +112,18 @@ class SimpleSystemManagerBackend(BaseBackend):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
def put_parameter(self, name, description, value, type, keyid, overwrite):
|
def put_parameter(self, name, description, value, type, keyid, overwrite):
|
||||||
if not overwrite and name in self._parameters:
|
previous_parameter = self._parameters.get(name)
|
||||||
return
|
version = 1
|
||||||
|
|
||||||
|
if previous_parameter:
|
||||||
|
version = previous_parameter.version + 1
|
||||||
|
|
||||||
|
if not overwrite:
|
||||||
|
return
|
||||||
|
|
||||||
|
last_modified_date = time.time()
|
||||||
self._parameters[name] = Parameter(
|
self._parameters[name] = Parameter(
|
||||||
name, value, type, description, keyid)
|
name, value, type, description, keyid, last_modified_date, version)
|
||||||
|
|
||||||
def add_tags_to_resource(self, resource_type, resource_id, tags):
|
def add_tags_to_resource(self, resource_type, resource_id, tags):
|
||||||
for key, value in tags.items():
|
for key, value in tags.items():
|
||||||
|
@ -117,7 +117,7 @@ class SimpleSystemManagerResponse(BaseResponse):
|
|||||||
|
|
||||||
end = token + page_size
|
end = token + page_size
|
||||||
for parameter in result[token:]:
|
for parameter in result[token:]:
|
||||||
param_data = parameter.response_object(False)
|
param_data = parameter.describe_response_object(False)
|
||||||
add = False
|
add = False
|
||||||
|
|
||||||
if filters:
|
if filters:
|
||||||
|
@ -3,6 +3,7 @@ from __future__ import unicode_literals
|
|||||||
import boto3
|
import boto3
|
||||||
import botocore.exceptions
|
import botocore.exceptions
|
||||||
import sure # noqa
|
import sure # noqa
|
||||||
|
import datetime
|
||||||
|
|
||||||
from moto import mock_ssm
|
from moto import mock_ssm
|
||||||
|
|
||||||
@ -112,6 +113,46 @@ def test_put_parameter():
|
|||||||
response['Parameters'][0]['Name'].should.equal('test')
|
response['Parameters'][0]['Name'].should.equal('test')
|
||||||
response['Parameters'][0]['Value'].should.equal('value')
|
response['Parameters'][0]['Value'].should.equal('value')
|
||||||
response['Parameters'][0]['Type'].should.equal('String')
|
response['Parameters'][0]['Type'].should.equal('String')
|
||||||
|
response['Parameters'][0]['Version'].should.equal(1)
|
||||||
|
|
||||||
|
client.put_parameter(
|
||||||
|
Name='test',
|
||||||
|
Description='desc 2',
|
||||||
|
Value='value 2',
|
||||||
|
Type='String')
|
||||||
|
|
||||||
|
response = client.get_parameters(
|
||||||
|
Names=[
|
||||||
|
'test'
|
||||||
|
],
|
||||||
|
WithDecryption=False)
|
||||||
|
|
||||||
|
# without overwrite nothing change
|
||||||
|
len(response['Parameters']).should.equal(1)
|
||||||
|
response['Parameters'][0]['Name'].should.equal('test')
|
||||||
|
response['Parameters'][0]['Value'].should.equal('value')
|
||||||
|
response['Parameters'][0]['Type'].should.equal('String')
|
||||||
|
response['Parameters'][0]['Version'].should.equal(1)
|
||||||
|
|
||||||
|
client.put_parameter(
|
||||||
|
Name='test',
|
||||||
|
Description='desc 3',
|
||||||
|
Value='value 3',
|
||||||
|
Type='String',
|
||||||
|
Overwrite=True)
|
||||||
|
|
||||||
|
response = client.get_parameters(
|
||||||
|
Names=[
|
||||||
|
'test'
|
||||||
|
],
|
||||||
|
WithDecryption=False)
|
||||||
|
|
||||||
|
# without overwrite nothing change
|
||||||
|
len(response['Parameters']).should.equal(1)
|
||||||
|
response['Parameters'][0]['Name'].should.equal('test')
|
||||||
|
response['Parameters'][0]['Value'].should.equal('value 3')
|
||||||
|
response['Parameters'][0]['Type'].should.equal('String')
|
||||||
|
response['Parameters'][0]['Version'].should.equal(2)
|
||||||
|
|
||||||
|
|
||||||
@mock_ssm
|
@mock_ssm
|
||||||
@ -279,6 +320,33 @@ def test_describe_parameters_filter_keyid():
|
|||||||
response['Parameters'][0]['Type'].should.equal('SecureString')
|
response['Parameters'][0]['Type'].should.equal('SecureString')
|
||||||
''.should.equal(response.get('NextToken', ''))
|
''.should.equal(response.get('NextToken', ''))
|
||||||
|
|
||||||
|
@mock_ssm
|
||||||
|
def test_describe_parameters_attributes():
|
||||||
|
client = boto3.client('ssm', region_name='us-east-1')
|
||||||
|
|
||||||
|
client.put_parameter(
|
||||||
|
Name='aa',
|
||||||
|
Value='11',
|
||||||
|
Type='String',
|
||||||
|
Description='my description'
|
||||||
|
)
|
||||||
|
|
||||||
|
client.put_parameter(
|
||||||
|
Name='bb',
|
||||||
|
Value='22',
|
||||||
|
Type='String'
|
||||||
|
)
|
||||||
|
|
||||||
|
response = client.describe_parameters()
|
||||||
|
len(response['Parameters']).should.equal(2)
|
||||||
|
|
||||||
|
response['Parameters'][0]['Description'].should.equal('my description')
|
||||||
|
response['Parameters'][0]['Version'].should.equal(1)
|
||||||
|
response['Parameters'][0]['LastModifiedDate'].should.be.a(datetime.date)
|
||||||
|
response['Parameters'][0]['LastModifiedUser'].should.equal('N/A')
|
||||||
|
|
||||||
|
response['Parameters'][1].get('Description').should.be.none
|
||||||
|
response['Parameters'][1]['Version'].should.equal(1)
|
||||||
|
|
||||||
@mock_ssm
|
@mock_ssm
|
||||||
def test_get_parameter_invalid():
|
def test_get_parameter_invalid():
|
||||||
|
Loading…
x
Reference in New Issue
Block a user