Add the Pagination Utility to the Elasticache describe_cache_clusters model + response (#7500)
This commit is contained in:
		
							parent
							
								
									90bdd72555
								
							
						
					
					
						commit
						3edc0c751c
					
				| @ -1,9 +1,10 @@ | |||||||
| from re import compile as re_compile | from re import compile as re_compile | ||||||
| from typing import Any, Dict, List, Optional, Tuple | from typing import Any, Dict, List, Optional | ||||||
| 
 | 
 | ||||||
| from moto.core.base_backend import BackendDict, BaseBackend | from moto.core.base_backend import BackendDict, BaseBackend | ||||||
| from moto.core.common_models import BaseModel | from moto.core.common_models import BaseModel | ||||||
| from moto.core.utils import utcnow | from moto.core.utils import utcnow | ||||||
|  | from moto.utilities.paginator import paginate | ||||||
| 
 | 
 | ||||||
| from ..moto_api._internal import mock_random | from ..moto_api._internal import mock_random | ||||||
| from .exceptions import ( | from .exceptions import ( | ||||||
| @ -13,6 +14,7 @@ from .exceptions import ( | |||||||
|     UserAlreadyExists, |     UserAlreadyExists, | ||||||
|     UserNotFound, |     UserNotFound, | ||||||
| ) | ) | ||||||
|  | from .utils import PAGINATION_MODEL | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class User(BaseModel): | class User(BaseModel): | ||||||
| @ -312,25 +314,24 @@ class ElastiCacheBackend(BaseBackend): | |||||||
|         self.cache_clusters[cache_cluster_id] = cache_cluster |         self.cache_clusters[cache_cluster_id] = cache_cluster | ||||||
|         return cache_cluster |         return cache_cluster | ||||||
| 
 | 
 | ||||||
|  |     @paginate(PAGINATION_MODEL) | ||||||
|     def describe_cache_clusters( |     def describe_cache_clusters( | ||||||
|         self, |         self, | ||||||
|         cache_cluster_id: str, |         cache_cluster_id: str, | ||||||
|         max_records: int, |         max_records: int, | ||||||
|         marker: str, |         marker: str, | ||||||
|     ) -> Tuple[str, List[CacheCluster]]: |     ) -> List[CacheCluster]: | ||||||
|         if marker is None: |  | ||||||
|             marker = str(mock_random.uuid4()) |  | ||||||
|         if max_records is None: |         if max_records is None: | ||||||
|             max_records = 100 |             max_records = 100 | ||||||
|         if cache_cluster_id: |         if cache_cluster_id: | ||||||
|             if cache_cluster_id in self.cache_clusters: |             if cache_cluster_id in self.cache_clusters: | ||||||
|                 cache_cluster = self.cache_clusters[cache_cluster_id] |                 cache_cluster = self.cache_clusters[cache_cluster_id] | ||||||
|                 return marker, [cache_cluster] |                 return list([cache_cluster]) | ||||||
|             else: |             else: | ||||||
|                 raise CacheClusterNotFound(cache_cluster_id) |                 raise CacheClusterNotFound(cache_cluster_id) | ||||||
|         cache_clusters = list(self.cache_clusters.values())[:max_records] |         cache_clusters = list(self.cache_clusters.values())[:max_records] | ||||||
| 
 | 
 | ||||||
|         return marker, cache_clusters |         return cache_clusters | ||||||
| 
 | 
 | ||||||
|     def delete_cache_cluster(self, cache_cluster_id: str) -> CacheCluster: |     def delete_cache_cluster(self, cache_cluster_id: str) -> CacheCluster: | ||||||
|         if cache_cluster_id: |         if cache_cluster_id: | ||||||
|  | |||||||
| @ -128,7 +128,8 @@ class ElastiCacheResponse(BaseResponse): | |||||||
|         cache_cluster_id = self._get_param("CacheClusterId") |         cache_cluster_id = self._get_param("CacheClusterId") | ||||||
|         max_records = self._get_int_param("MaxRecords") |         max_records = self._get_int_param("MaxRecords") | ||||||
|         marker = self._get_param("Marker") |         marker = self._get_param("Marker") | ||||||
|         marker, cache_clusters = self.elasticache_backend.describe_cache_clusters( | 
 | ||||||
|  |         cache_clusters, marker = self.elasticache_backend.describe_cache_clusters( | ||||||
|             cache_cluster_id=cache_cluster_id, |             cache_cluster_id=cache_cluster_id, | ||||||
|             marker=marker, |             marker=marker, | ||||||
|             max_records=max_records, |             max_records=max_records, | ||||||
| @ -347,7 +348,7 @@ DESCRIBE_CACHE_CLUSTERS_TEMPLATE = """<DescribeCacheClustersResponse xmlns="http | |||||||
|     <RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId> |     <RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId> | ||||||
|   </ResponseMetadata> |   </ResponseMetadata> | ||||||
|   <DescribeCacheClustersResult> |   <DescribeCacheClustersResult> | ||||||
|     <Marker>{{ marker }}</Marker> |     {% if marker %}<Marker>{{ marker }}</Marker>{% endif %} | ||||||
|     <CacheClusters> |     <CacheClusters> | ||||||
| {% for cache_cluster in cache_clusters %} | {% for cache_cluster in cache_clusters %} | ||||||
|       <member> |       <member> | ||||||
|  | |||||||
							
								
								
									
										8
									
								
								moto/elasticache/utils.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								moto/elasticache/utils.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  | PAGINATION_MODEL = { | ||||||
|  |     "describe_cache_clusters": { | ||||||
|  |         "input_token": "marker", | ||||||
|  |         "limit_key": "max_records", | ||||||
|  |         "limit_default": 100, | ||||||
|  |         "unique_attribute": "cache_cluster_id", | ||||||
|  |     }, | ||||||
|  | } | ||||||
| @ -291,28 +291,31 @@ def test_create_duplicate_cache_cluster(): | |||||||
| def test_describe_all_cache_clusters(): | def test_describe_all_cache_clusters(): | ||||||
|     client = boto3.client("elasticache", region_name="us-east-2") |     client = boto3.client("elasticache", region_name="us-east-2") | ||||||
| 
 | 
 | ||||||
|     test_memcached_cache_cluster_exist = False |     num_clusters = 5 | ||||||
|  |     match_number = 0 | ||||||
| 
 | 
 | ||||||
|     cache_cluster_id = "test-cache-cluster" |     for i in range(num_clusters): | ||||||
|     cache_cluster_engine = "memcached" |         client.create_cache_cluster( | ||||||
|     cache_cluster_num_cache_nodes = 5 |             CacheClusterId=f"test-cache-cluster-{i}", | ||||||
| 
 |             Engine="memcached", | ||||||
|     client.create_cache_cluster( |             NumCacheNodes=5, | ||||||
|         CacheClusterId=cache_cluster_id, |         ) | ||||||
|         Engine=cache_cluster_engine, |  | ||||||
|         NumCacheNodes=cache_cluster_num_cache_nodes, |  | ||||||
|     ) |  | ||||||
| 
 | 
 | ||||||
|     resp = client.describe_cache_clusters() |     resp = client.describe_cache_clusters() | ||||||
|  |     assert resp["ResponseMetadata"]["HTTPStatusCode"] == 200 | ||||||
| 
 | 
 | ||||||
|     cache_clusters = resp["CacheClusters"] |     cache_clusters = resp["CacheClusters"] | ||||||
|  |     # account for the default cluster created moto/elasticache/models.py line 148 | ||||||
|  |     del cache_clusters[0] | ||||||
| 
 | 
 | ||||||
|     for cache_cluster in cache_clusters: |     for i, cache_cluster in enumerate(cache_clusters): | ||||||
|         if cache_cluster["CacheClusterId"] == cache_cluster_id: |         if cache_cluster["CacheClusterId"] == f"test-cache-cluster-{i}": | ||||||
|             test_memcached_cache_cluster_exist = True |             match_number = match_number + 1 | ||||||
| 
 | 
 | ||||||
|     assert resp["ResponseMetadata"]["HTTPStatusCode"] == 200 |     if match_number == (num_clusters): | ||||||
|     assert test_memcached_cache_cluster_exist |         assert True | ||||||
|  |     else: | ||||||
|  |         assert False | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @mock_aws | @mock_aws | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user