Skip to content

Commit 5edb473

Browse files
committed
SimpleDB: implement domain_metadata
Signed-off-by: Yves Bastide <stid@acm.org>
1 parent c06ac47 commit 5edb473

File tree

3 files changed

+72
-0
lines changed

3 files changed

+72
-0
lines changed

moto/sdb/models.py

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

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

103128
sdb_backends = BackendDict(SimpleDBBackend, "sdb")

moto/sdb/responses.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ def put_attributes(self) -> str:
5050
template = self.response_template(PUT_ATTRIBUTES_TEMPLATE)
5151
return template.render()
5252

53+
def domain_metadata(self) -> str:
54+
domain_name = self._get_param("DomainName")
55+
metadata = self.sdb_backend.domain_metadata(domain_name=domain_name)
56+
template = self.response_template(DOMAIN_METADATA_TEMPLATE)
57+
return template.render(metadata=metadata)
58+
5359

5460
CREATE_DOMAIN_TEMPLATE = """<?xml version="1.0" encoding="UTF-8"?>
5561
<CreateDomainResult xmlns="http://sdb.amazonaws.com/doc/2009-04-15/"></CreateDomainResult>
@@ -92,3 +98,20 @@ def put_attributes(self) -> str:
9298
{% endfor %}
9399
</GetAttributesResult>
94100
</GetAttributesResponse>"""
101+
102+
103+
DOMAIN_METADATA_TEMPLATE = """<DomainMetadataResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
104+
<DomainMetadataResult>
105+
<ItemCount>{{ metadata.item_count }}</ItemCount>
106+
<ItemNamesSizeBytes>{{ metadata.item_names_size_bytes }}</ItemNamesSizeBytes>
107+
<AttributeNameCount >{{ metadata.attribute_name_count }}</AttributeNameCount >
108+
<AttributeNamesSizeBytes>{{ metadata.attribute_names_size_bytes }}</AttributeNamesSizeBytes>
109+
<AttributeValueCount>{{ metadata.attribute_value_count }}</AttributeValueCount>
110+
<AttributeValuesSizeBytes>{{ metadata.attribute_values_size_bytes }}</AttributeValuesSizeBytes>
111+
<Timestamp>1225486466</Timestamp>
112+
</DomainMetadataResult>
113+
<ResponseMetadata>
114+
<RequestId>b1e8f1f7-42e9-494c-ad09-2674e557526d</RequestId>
115+
<BoxUsage>0.0000219907</BoxUsage>
116+
</ResponseMetadata>
117+
</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)