def test_many_requests_canceled_to_completed(self, modify_mock): now = timezone.now() for req in self.requests: req.state = 'CANCELED' req.save() self.ur.state = 'CANCELED' self.ur.save() dmixer.cycle(3).blend(Window, request=(r for r in self.requests), start=now - timedelta(days=2), end=now - timedelta(days=1)) molecules3 = mixer.cycle(3).blend(PondMolecule, completed=True, failed=False, request_num=self.requests[2].id, tracking_num=self.ur.id) pond_blocks = [ mixer.blend(PondBlock, molecules=molecules3, start=now - timedelta(minutes=30), end=now - timedelta(minutes=20))._to_dict() ] update_request_states_from_pond_blocks(pond_blocks) request_states = ['CANCELED', 'CANCELED', 'COMPLETED'] for i, req in enumerate(self.requests): req.refresh_from_db() self.assertEqual(req.state, request_states[i]) self.ur.refresh_from_db() self.assertEqual(self.ur.state, 'COMPLETED')
def test_oneof_requests_fail_and_window_expired(self, modify_mock): now = timezone.now() self.ur.operator = 'ONEOF' self.ur.save() self.requests[0].state = 'WINDOW_EXPIRED' self.requests[0].save() self.requests[1].state = 'WINDOW_EXPIRED' self.requests[1].save() dmixer.cycle(3).blend(Window, request=(r for r in self.requests), start=now - timedelta(days=2), end=(e for e in [now - timedelta(days=1), now - timedelta(days=1), now + timedelta(days=1)])) molecules1 = mixer.cycle(3).blend(PondMolecule, completed=False, failed=False, request_num=self.requests[0].id, tracking_num=self.ur.id, event=[]) molecules2 = mixer.cycle(3).blend(PondMolecule, completed=False, failed=True, request_num=self.requests[1].id, tracking_num=self.ur.id, event=[]) molecules3 = mixer.cycle(3).blend(PondMolecule, completed=False, failed=True, request_num=self.requests[2].id, tracking_num=self.ur.id, event=[]) pond_blocks = mixer.cycle(3).blend(PondBlock, molecules=(m for m in [molecules1, molecules2, molecules3]), start=now - timedelta(minutes=30), end=now - timedelta(minutes=20), canceled=False) pond_blocks = [pb._to_dict() for pb in pond_blocks] update_request_states_from_pond_blocks(pond_blocks) request_states = ['WINDOW_EXPIRED', 'WINDOW_EXPIRED', 'PENDING'] for i, req in enumerate(self.requests): req.refresh_from_db() self.assertEqual(req.state, request_states[i]) self.ur.refresh_from_db() self.assertEqual(self.ur.state, 'PENDING')
def test_many_requests_expire_after_last_window(self, modify_mock): now = timezone.now() dmixer.cycle(3).blend(Window, request=(r for r in self.requests), start=now-timedelta(days=2), end=now-timedelta(days=1)) molecules1 = mixer.cycle(3).blend(PondMolecule, completed=False, failed=False, request_num=self.requests[0].id, tracking_num=self.ur.id, event=[]) molecules2 = mixer.cycle(3).blend(PondMolecule, completed=False, failed=False, request_num=self.requests[1].id, tracking_num=self.ur.id, event=[]) molecules3 = mixer.cycle(3).blend(PondMolecule, completed=False, failed=False, request_num=self.requests[2].id, tracking_num=self.ur.id, event=[]) pond_blocks = mixer.cycle(3).blend(PondBlock, molecules=(m for m in [molecules1, molecules2, molecules3]), start=now - timedelta(minutes=30), end=now - timedelta(minutes=20)) pond_blocks = [pb._to_dict() for pb in pond_blocks] update_request_states_from_pond_blocks(pond_blocks) for req in self.requests: req.refresh_from_db() self.assertEqual(req.state, 'WINDOW_EXPIRED') self.ur.refresh_from_db() self.assertEqual(self.ur.state, 'WINDOW_EXPIRED')
def test_many_requests_complete_and_failed(self, modify_mock): now = timezone.now() dmixer.cycle(3).blend(Window, request=(r for r in self.requests), start=now-timedelta(days=2), end=now+timedelta(days=1)) molecules1 = mixer.cycle(3).blend(PondMolecule, completed=True, failed=False, request_num=self.requests[0].id, tracking_num=self.ur.id, event=[]) molecules2 = mixer.cycle(3).blend(PondMolecule, completed=True, failed=False, request_num=self.requests[1].id, tracking_num=self.ur.id, event=[]) molecules3 = mixer.cycle(3).blend(PondMolecule, completed=False, failed=True, request_num=self.requests[2].id, tracking_num=self.ur.id, event=[]) pond_blocks = mixer.cycle(3).blend(PondBlock, molecules=(m for m in [molecules1, molecules2, molecules3]), start=now - timedelta(minutes=30), end=now - timedelta(minutes=20)) pond_blocks = [pb._to_dict() for pb in pond_blocks] update_request_states_from_pond_blocks(pond_blocks) request_states = ['COMPLETED', 'COMPLETED', 'PENDING'] for i, req in enumerate(self.requests): req.refresh_from_db() self.assertEqual(req.state, request_states[i]) self.ur.refresh_from_db() self.assertEqual(self.ur.state, 'PENDING')
def get(self, request): try: last_query_time = parse(request.query_params.get('last_query_time')) except (TypeError, ValueError): last_query_time = cache.get('isDirty_query_time', (timezone.now() - timedelta(days=7))) url = settings.POND_URL + '/pond/pond/blocks/new/?since={}&using=default'.format(last_query_time.strftime('%Y-%m-%dT%H:%M:%S')) now = timezone.now() try: response = requests.get(url) response.raise_for_status() except Exception as e: return HttpResponseServerError({'error': repr(e)}) pond_blocks = response.json() is_dirty = update_request_states_from_pond_blocks(pond_blocks) cache.set('isDirty_query_time', now, None) return Response({'isDirty': is_dirty})
def get(self, request): try: last_query_time = parse(request.query_params.get('last_query_time')) except (TypeError, ValueError): last_query_time = cache.get('isDirty_query_time', (timezone.now() - timedelta(days=7))) url = settings.POND_URL + '/blocks/?modified_after={0}&canceled=False&limit=1000'.format(last_query_time.strftime('%Y-%m-%dT%H:%M:%S.%f')) now = timezone.now() pond_blocks = [] try: pond_blocks = return_paginated_results(pond_blocks, url) except Exception as e: return HttpResponseServerError({'error': repr(e)}) is_dirty = update_request_states_from_pond_blocks(pond_blocks) cache.set('isDirty_query_time', now, None) # also factor in if a change in requests (added, updated, cancelled) has occurred since we last checked last_update_time = max(Request.objects.latest('modified').modified, UserRequest.objects.latest('modified').modified) is_dirty |= last_update_time >= last_query_time return Response({'isDirty': is_dirty})
def get(self, request): try: last_query_time = parse(request.query_params.get('last_query_time')) except (TypeError, ValueError): last_query_time = cache.get('isDirty_query_time', (timezone.now() - timedelta(days=7))) url = settings.POND_URL + '/pond/pond/blocks/new/?since={}&using=default'.format(last_query_time.strftime('%Y-%m-%dT%H:%M:%S')) now = timezone.now() try: response = requests.get(url) response.raise_for_status() except Exception as e: return HttpResponseServerError({'error': repr(e)}) pond_blocks = response.json() is_dirty = update_request_states_from_pond_blocks(pond_blocks) cache.set('isDirty_query_time', now, None) # also factor in if a change in requests (added, updated, cancelled) has occurred since we last checked last_update_time = max(Request.objects.latest('modified').modified, UserRequest.objects.latest('modified').modified) is_dirty |= last_update_time >= last_query_time return Response({'isDirty': is_dirty})