def test_keys_deleted(): obj = Memo() obj['xyz'] = 100 del obj['xyz'] assert obj == {}
def test_fields_deleted(): obj = Memo() obj.xyz = 100 del obj.xyz assert obj == {}
def test_keys_are_fields(): obj = Memo() obj['xyz'] = 100 assert obj.xyz == 100
def test_creation_with_memo(): obj = Memo(Memo({'xyz': 100})) assert isinstance(obj, collections.abc.MutableMapping) assert set(obj) == {'xyz'}
def test_creation_with_list(): obj = Memo([('xyz', 100)]) assert isinstance(obj, collections.abc.MutableMapping) assert set(obj) == {'xyz'}
async def test_delayed_handlers_sleep(registry, settings, handlers, resource, cause_mock, cause_reason, caplog, assert_logs, k8s_mocked, now, delayed_iso, delay): caplog.set_level(logging.DEBUG) # Simulate the original persisted state of the resource. # Make sure the finalizer is added since there are mandatory deletion handlers. started_dt = datetime.datetime.fromisoformat( '2000-01-01T00:00:00') # long time ago is fine. delayed_dt = datetime.datetime.fromisoformat(delayed_iso) event_type = None if cause_reason == Reason.RESUME else 'irrelevant' event_body = { 'metadata': { 'finalizers': [settings.persistence.finalizer] }, 'status': { 'kopf': { 'progress': { 'create_fn': HandlerState(started=started_dt, delayed=delayed_dt).as_in_storage(), 'update_fn': HandlerState(started=started_dt, delayed=delayed_dt).as_in_storage(), 'delete_fn': HandlerState(started=started_dt, delayed=delayed_dt).as_in_storage(), 'resume_fn': HandlerState(started=started_dt, delayed=delayed_dt).as_in_storage(), } } } } cause_mock.reason = cause_reason with freezegun.freeze_time(now): await process_resource_event( lifecycle=kopf.lifecycles.all_at_once, registry=registry, settings=settings, resource=resource, indexers=OperatorIndexers(), memories=ResourceMemories(), memobase=Memo(), raw_event={ 'type': event_type, 'object': event_body }, event_queue=asyncio.Queue(), ) assert not handlers.create_mock.called assert not handlers.update_mock.called assert not handlers.delete_mock.called assert not handlers.resume_mock.called # The dummy patch is needed to trigger the further changes. The value is irrelevant. assert k8s_mocked.patch_obj.called assert 'dummy' in k8s_mocked.patch_obj.call_args_list[-1][1]['patch'][ 'status']['kopf'] # The duration of sleep should be as expected. assert k8s_mocked.sleep_or_wait.called assert k8s_mocked.sleep_or_wait.call_args_list[0][0][0] == delay assert_logs([ r"Sleeping for ([\d\.]+|[\d\.]+ \(capped [\d\.]+\)) seconds", ])
def make_cause( cls=ResourceChangingCause, *, resource=resource, type=None, raw=None, body=None, diff=(), old=None, new=None, reason='some-reason', initial=False, activity=None, settings=None, ): if cls is ActivityCause or cls is ActivityRegistry: return ActivityCause( memo=Memo(), logger=logging.getLogger('kopf.test.fake.logger'), indices=OperatorIndexers().indices, activity=activity, settings=settings, ) if cls is ResourceCause or cls is ResourceRegistry: return ResourceCause( logger=logging.getLogger('kopf.test.fake.logger'), indices=OperatorIndexers().indices, resource=resource, patch=Patch(), memo=Memo(), body=Body(body if body is not None else {}), ) if cls is ResourceWatchingCause or cls is ResourceWatchingRegistry: return ResourceWatchingCause( logger=logging.getLogger('kopf.test.fake.logger'), indices=OperatorIndexers().indices, resource=resource, patch=Patch(), memo=Memo(), body=Body(body if body is not None else {}), type=type, raw=raw, ) if cls is ResourceChangingCause or cls is ResourceChangingRegistry: return ResourceChangingCause( logger=logging.getLogger('kopf.test.fake.logger'), indices=OperatorIndexers().indices, resource=resource, patch=Patch(), memo=Memo(), body=Body(body if body is not None else {}), diff=Diff(DiffItem(*d) for d in diff), old=old, new=new, initial=initial, reason=reason, ) if cls is ResourceSpawningCause or cls is ResourceSpawningRegistry: return ResourceSpawningCause( logger=logging.getLogger('kopf.test.fake.logger'), indices=OperatorIndexers().indices, resource=resource, patch=Patch(), memo=Memo(), body=Body(body if body is not None else {}), reset=False, ) if cls is ResourceWebhookCause or cls is ResourceWebhooksRegistry: return ResourceWebhookCause( logger=logging.getLogger('kopf.test.fake.logger'), indices=OperatorIndexers().indices, resource=resource, patch=Patch(), memo=Memo(), body=Body(body if body is not None else {}), dryrun=False, sslpeer={}, headers={}, userinfo={}, warnings=[], reason=None, webhook=None, operation=None, ) raise TypeError( f"Cause/registry type {cls} is not supported by this fixture.")