|
| 1 | +from datetime import datetime |
1 | 2 | import logging |
2 | 3 | import time |
3 | | -from typing import Mapping |
| 4 | +import random |
| 5 | +import string |
| 6 | +from typing import ContextManager, Mapping |
4 | 7 | from uuid import UUID |
5 | 8 |
|
6 | 9 | from aws_schema_registry.schema import ( |
@@ -310,3 +313,57 @@ def create_schema( |
310 | 313 | f'Create schema {name} failed' |
311 | 314 | ) from e |
312 | 315 | return version_id |
| 316 | + |
| 317 | + |
| 318 | +class TemporaryRegistry(ContextManager): |
| 319 | + """A real schema registry for use in tests and experiments. |
| 320 | +
|
| 321 | + This class implements the ContextManager protocol, creating the registry |
| 322 | + on enter and destroying it on exit. |
| 323 | +
|
| 324 | + Usage: |
| 325 | +
|
| 326 | +```python |
| 327 | + with TemporaryRegistry(glue_client, 'MyRegistry') as r: |
| 328 | + # registry is created on enter |
| 329 | + print(r.name) # the "real" (suffixed) registry name |
| 330 | + # registry is destroyed on exit |
| 331 | +``` |
| 332 | +
|
| 333 | + Arguments: |
| 334 | + glue_client: glue client created by `botocore`/`boto3`. |
| 335 | + name: human-readable name for the created registry. The name will be |
| 336 | + suffixed by a random identifier to reduce the freqency of |
| 337 | + collisions. |
| 338 | + description: description for the created registry. |
| 339 | + autoremove: whether to destroy the created registry. Defaults to True. |
| 340 | + """ |
| 341 | + |
| 342 | + DEFAULT_DESCRIPTION = 'Temporary registry created with the aws-glue-schema-registry Python library.' # NOQA |
| 343 | + |
| 344 | + def __init__(self, glue_client, |
| 345 | + name: str = 'temporary-registry', |
| 346 | + description: str = DEFAULT_DESCRIPTION, |
| 347 | + autoremove: bool = True): |
| 348 | + self.glue_client = glue_client |
| 349 | + date = datetime.utcnow().strftime('%y-%m-%d-%H-%M') |
| 350 | + r = ''.join(random.choices(string.digits + string.ascii_letters, |
| 351 | + k=16)) |
| 352 | + self.name = f'{name}-{date}-{r}' |
| 353 | + self.description = description |
| 354 | + self.autoremove = autoremove |
| 355 | + |
| 356 | + def __enter__(self): |
| 357 | + LOG.info('creating registry %s...' % self.name) |
| 358 | + self.glue_client.create_registry( |
| 359 | + RegistryName=self.name, |
| 360 | + Description=self.description |
| 361 | + ) |
| 362 | + return self |
| 363 | + |
| 364 | + def __exit__(self, *args): |
| 365 | + if self.autoremove: |
| 366 | + LOG.info('deleting registry %s...' % self.name) |
| 367 | + self.glue_client.delete_registry( |
| 368 | + RegistryId={'RegistryName': self.name} |
| 369 | + ) |
0 commit comments