示例#1
0
def test_keys_deleted():
    obj = Memo()
    obj['xyz'] = 100
    del obj['xyz']
    assert obj == {}
示例#2
0
def test_fields_deleted():
    obj = Memo()
    obj.xyz = 100
    del obj.xyz
    assert obj == {}
示例#3
0
def test_keys_are_fields():
    obj = Memo()
    obj['xyz'] = 100
    assert obj.xyz == 100
示例#4
0
def test_creation_with_memo():
    obj = Memo(Memo({'xyz': 100}))
    assert isinstance(obj, collections.abc.MutableMapping)
    assert set(obj) == {'xyz'}
示例#5
0
def test_creation_with_list():
    obj = Memo([('xyz', 100)])
    assert isinstance(obj, collections.abc.MutableMapping)
    assert set(obj) == {'xyz'}
示例#6
0
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",
    ])
示例#7
0
 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.")