Skip to content

Commit 0308e2b

Browse files
committed
SimpleDB: implement domain_metadata
Signed-off-by: Yves Bastide <stid@acm.org>
1 parent 87369f0 commit 0308e2b

File tree

3 files changed

+117
-1
lines changed

3 files changed

+117
-1
lines changed

moto/sdb/models.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,5 +100,30 @@ def put_attributes(
100100
domain = self._get_domain(domain_name)
101101
domain.put(item_name, attributes)
102102

103+
def domain_metadata(self, domain_name: str) -> Dict[str, Any]:
104+
self._validate_domain_name(domain_name)
105+
domain = self._get_domain(domain_name)
106+
item_names_size_bytes = 0
107+
attribute_name_count = 0
108+
attribute_names_size_bytes = 0
109+
attribute_value_count = 0
110+
attribute_values_size_bytes = 0
111+
for name, item in domain.items.items():
112+
item_names_size_bytes += len(name)
113+
with item.lock:
114+
for attr in item.attributes:
115+
attribute_name_count += 1
116+
attribute_names_size_bytes += len(attr["name"])
117+
attribute_value_count += 1
118+
attribute_values_size_bytes += len(attr["value"])
119+
return {
120+
"item_count": len(domain.items),
121+
"item_names_size_bytes": item_names_size_bytes,
122+
"attribute_name_count": attribute_name_count,
123+
"attribute_names_size_bytes": attribute_names_size_bytes,
124+
"attribute_value_count": attribute_value_count,
125+
"attribute_values_size_bytes": attribute_values_size_bytes,
126+
}
127+
103128

104129
sdb_backends = BackendDict(SimpleDBBackend, "sdb")

moto/sdb/responses.py

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,71 @@ def put_attributes(self) -> ActionResult:
4646
self.sdb_backend.put_attributes(
4747
domain_name=domain_name, item_name=item_name, attributes=attributes
4848
)
49-
return EmptyResult()
49+
template = self.response_template(PUT_ATTRIBUTES_TEMPLATE)
50+
return template.render()
51+
52+
def domain_metadata(self) -> str:
53+
domain_name = self._get_param("DomainName")
54+
metadata = self.sdb_backend.domain_metadata(domain_name=domain_name)
55+
template = self.response_template(DOMAIN_METADATA_TEMPLATE)
56+
return template.render(metadata=metadata)
57+
58+
59+
CREATE_DOMAIN_TEMPLATE = """<?xml version="1.0" encoding="UTF-8"?>
60+
<CreateDomainResult xmlns="http://sdb.amazonaws.com/doc/2009-04-15/"></CreateDomainResult>
61+
"""
62+
63+
64+
LIST_DOMAINS_TEMPLATE = """<?xml version="1.0" encoding="UTF-8"?>
65+
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
66+
<ListDomainsResult>
67+
{% for name in domain_names %}
68+
<DomainName>{{ name }}</DomainName>
69+
{% endfor %}
70+
<NextToken>{{ next_token }}</NextToken>
71+
</ListDomainsResult>
72+
</ListDomainsResponse>
73+
"""
74+
75+
DELETE_DOMAIN_TEMPLATE = """<?xml version="1.0"?>
76+
<DeleteDomainResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
77+
<ResponseMetadata>
78+
<RequestId>64d9c3ac-ef19-2e3d-7a03-9ea46205eb71</RequestId>
79+
<BoxUsage>0.0055590278</BoxUsage>
80+
</ResponseMetadata>
81+
</DeleteDomainResponse>"""
82+
83+
PUT_ATTRIBUTES_TEMPLATE = """<?xml version="1.0" encoding="UTF-8"?>
84+
<PutAttributesResult xmlns="http://sdb.amazonaws.com/doc/2009-04-15/"></PutAttributesResult>
85+
"""
86+
87+
GET_ATTRIBUTES_TEMPLATE = """<GetAttributesResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
88+
<ResponseMetadata>
89+
<RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
90+
</ResponseMetadata>
91+
<GetAttributesResult>
92+
{% for attribute in attributes %}
93+
<Attribute>
94+
<Name>{{ attribute["name"] }}</Name>
95+
<Value>{{ attribute["value"] }}</Value>
96+
</Attribute>
97+
{% endfor %}
98+
</GetAttributesResult>
99+
</GetAttributesResponse>"""
100+
101+
102+
DOMAIN_METADATA_TEMPLATE = """<DomainMetadataResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
103+
<DomainMetadataResult>
104+
<ItemCount>{{ metadata.item_count }}</ItemCount>
105+
<ItemNamesSizeBytes>{{ metadata.item_names_size_bytes }}</ItemNamesSizeBytes>
106+
<AttributeNameCount >{{ metadata.attribute_name_count }}</AttributeNameCount >
107+
<AttributeNamesSizeBytes>{{ metadata.attribute_names_size_bytes }}</AttributeNamesSizeBytes>
108+
<AttributeValueCount>{{ metadata.attribute_value_count }}</AttributeValueCount>
109+
<AttributeValuesSizeBytes>{{ metadata.attribute_values_size_bytes }}</AttributeValuesSizeBytes>
110+
<Timestamp>1225486466</Timestamp>
111+
</DomainMetadataResult>
112+
<ResponseMetadata>
113+
<RequestId>b1e8f1f7-42e9-494c-ad09-2674e557526d</RequestId>
114+
<BoxUsage>0.0000219907</BoxUsage>
115+
</ResponseMetadata>
116+
</DomainMetadataResponse>"""

tests/test_sdb/test_sdb_domains.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from unittest.mock import ANY
2+
13
import boto3
24
import pytest
35
from botocore.exceptions import ClientError
@@ -65,3 +67,25 @@ def test_delete_domain_invalid():
6567
assert err["Code"] == "InvalidParameterValue"
6668
assert err["Message"] == "Value (a) for parameter DomainName is invalid. "
6769
assert "BoxUsage" in err
70+
71+
72+
@mock_aws
73+
def test_domain_metadata():
74+
name = "mydomain"
75+
sdb = boto3.client("sdb", region_name="eu-west-1")
76+
sdb.create_domain(DomainName=name)
77+
sdb.put_attributes(
78+
DomainName=name, ItemName="asdf", Attributes=[{"Name": "abc", "Value": "de"}]
79+
)
80+
metadata = sdb.domain_metadata(DomainName=name)
81+
expected = {
82+
"ItemCount": 1,
83+
"ItemNamesSizeBytes": 4,
84+
"AttributeNameCount": 1,
85+
"AttributeNamesSizeBytes": 3,
86+
"AttributeValueCount": 1,
87+
"AttributeValuesSizeBytes": 2,
88+
"Timestamp": ANY,
89+
"ResponseMetadata": ANY,
90+
}
91+
assert metadata == expected

0 commit comments

Comments
 (0)