Add Pagination for Organizations:ListAccounts
This commit is contained in:
parent
662b96693d
commit
a90d8c801b
@ -20,6 +20,8 @@ from moto.organizations.exceptions import (
|
|||||||
PolicyTypeNotEnabledException,
|
PolicyTypeNotEnabledException,
|
||||||
TargetNotFoundException,
|
TargetNotFoundException,
|
||||||
)
|
)
|
||||||
|
from moto.utilities.paginator import paginate
|
||||||
|
from .utils import PAGINATION_MODEL
|
||||||
|
|
||||||
|
|
||||||
class FakeOrganization(BaseModel):
|
class FakeOrganization(BaseModel):
|
||||||
@ -495,8 +497,11 @@ class OrganizationsBackend(BaseBackend):
|
|||||||
next_token = str(len(accounts_resp))
|
next_token = str(len(accounts_resp))
|
||||||
return dict(CreateAccountStatuses=accounts_resp, NextToken=next_token)
|
return dict(CreateAccountStatuses=accounts_resp, NextToken=next_token)
|
||||||
|
|
||||||
|
@paginate(pagination_model=PAGINATION_MODEL)
|
||||||
def list_accounts(self):
|
def list_accounts(self):
|
||||||
return dict(Accounts=[account.describe() for account in self.accounts])
|
accounts = [account.describe() for account in self.accounts]
|
||||||
|
accounts = sorted(accounts, key=lambda x: x["JoinedTimestamp"])
|
||||||
|
return accounts
|
||||||
|
|
||||||
def list_accounts_for_parent(self, **kwargs):
|
def list_accounts_for_parent(self, **kwargs):
|
||||||
parent_id = self.validate_parent_id(kwargs["ParentId"])
|
parent_id = self.validate_parent_id(kwargs["ParentId"])
|
||||||
|
@ -85,7 +85,15 @@ class OrganizationsResponse(BaseResponse):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def list_accounts(self):
|
def list_accounts(self):
|
||||||
return json.dumps(self.organizations_backend.list_accounts())
|
max_results = self._get_int_param("MaxResults")
|
||||||
|
next_token = self._get_param("NextToken")
|
||||||
|
accounts, next_token = self.organizations_backend.list_accounts(
|
||||||
|
max_results=max_results, next_token=next_token
|
||||||
|
)
|
||||||
|
response = {"Accounts": accounts}
|
||||||
|
if next_token:
|
||||||
|
response["NextToken"] = next_token
|
||||||
|
return json.dumps(response)
|
||||||
|
|
||||||
def list_accounts_for_parent(self):
|
def list_accounts_for_parent(self):
|
||||||
return json.dumps(
|
return json.dumps(
|
||||||
|
@ -33,6 +33,16 @@ ACCOUNT_ID_REGEX = r"[0-9]{%s}" % ACCOUNT_ID_SIZE
|
|||||||
CREATE_ACCOUNT_STATUS_ID_REGEX = r"car-[a-z0-9]{%s}" % CREATE_ACCOUNT_STATUS_ID_SIZE
|
CREATE_ACCOUNT_STATUS_ID_REGEX = r"car-[a-z0-9]{%s}" % CREATE_ACCOUNT_STATUS_ID_SIZE
|
||||||
POLICY_ID_REGEX = r"%s|p-[a-z0-9]{%s}" % (DEFAULT_POLICY_ID, POLICY_ID_SIZE)
|
POLICY_ID_REGEX = r"%s|p-[a-z0-9]{%s}" % (DEFAULT_POLICY_ID, POLICY_ID_SIZE)
|
||||||
|
|
||||||
|
PAGINATION_MODEL = {
|
||||||
|
"list_accounts": {
|
||||||
|
"input_token": "next_token",
|
||||||
|
"limit_key": "max_results",
|
||||||
|
"limit_default": 100,
|
||||||
|
"result_key": "Accounts",
|
||||||
|
"unique_attribute": "JoinedTimestamp",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def make_random_org_id():
|
def make_random_org_id():
|
||||||
# The regex pattern for an organization ID string requires "o-"
|
# The regex pattern for an organization ID string requires "o-"
|
||||||
|
@ -137,7 +137,7 @@ class Paginator(object):
|
|||||||
predicate_values = unique_attributes.split("|")
|
predicate_values = unique_attributes.split("|")
|
||||||
for (index, attr) in enumerate(self._unique_attributes):
|
for (index, attr) in enumerate(self._unique_attributes):
|
||||||
curr_val = item[attr] if type(item) == dict else getattr(item, attr, None)
|
curr_val = item[attr] if type(item) == dict else getattr(item, attr, None)
|
||||||
if not curr_val == predicate_values[index]:
|
if not str(curr_val) == predicate_values[index]:
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@ -148,9 +148,9 @@ class Paginator(object):
|
|||||||
range_keys = []
|
range_keys = []
|
||||||
for attr in self._unique_attributes:
|
for attr in self._unique_attributes:
|
||||||
if type(next_item) == dict:
|
if type(next_item) == dict:
|
||||||
range_keys.append(next_item[attr])
|
range_keys.append(str(next_item[attr]))
|
||||||
else:
|
else:
|
||||||
range_keys.append(getattr(next_item, attr))
|
range_keys.append(str(getattr(next_item, attr)))
|
||||||
token_dict["uniqueAttributes"] = "|".join(range_keys)
|
token_dict["uniqueAttributes"] = "|".join(range_keys)
|
||||||
return self._token_encoder.encode(token_dict)
|
return self._token_encoder.encode(token_dict)
|
||||||
|
|
||||||
|
@ -229,6 +229,25 @@ def test_list_accounts():
|
|||||||
accounts[3]["Email"].should.equal(mockname + "2" + "@" + mockdomain)
|
accounts[3]["Email"].should.equal(mockname + "2" + "@" + mockdomain)
|
||||||
|
|
||||||
|
|
||||||
|
@mock_organizations
|
||||||
|
def test_list_accounts_pagination():
|
||||||
|
client = boto3.client("organizations", region_name="us-east-1")
|
||||||
|
client.create_organization(FeatureSet="ALL")
|
||||||
|
for i in range(25):
|
||||||
|
name = mockname + str(i)
|
||||||
|
email = name + "@" + mockdomain
|
||||||
|
client.create_account(AccountName=name, Email=email)
|
||||||
|
response = client.list_accounts()
|
||||||
|
response.should_not.have.key("NextToken")
|
||||||
|
len(response["Accounts"]).should.be.greater_than_or_equal_to(i)
|
||||||
|
|
||||||
|
paginator = client.get_paginator("list_accounts")
|
||||||
|
page_iterator = paginator.paginate(MaxResults=5)
|
||||||
|
for page in page_iterator:
|
||||||
|
len(page["Accounts"]).should.be.lower_than_or_equal_to(5)
|
||||||
|
page["Accounts"][-1]["Name"].should.contain("24")
|
||||||
|
|
||||||
|
|
||||||
@mock_organizations
|
@mock_organizations
|
||||||
def test_list_accounts_for_parent():
|
def test_list_accounts_for_parent():
|
||||||
client = boto3.client("organizations", region_name="us-east-1")
|
client = boto3.client("organizations", region_name="us-east-1")
|
||||||
|
Loading…
Reference in New Issue
Block a user