ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ# coding=utf-8 # # Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2023 All Rights Reserved # # Licensed under CLOUD LINUX LICENSE AGREEMENT # http://cloudlinux.com/docs/LICENSE.TXT import typing import itertools from typing import Collection, Iterator from lvestats.orm import BurstingEventType from .base import InBurstingEventRow, Timestamp from ..common import LveId def lves_historical_events_iter( lves_ids: Collection[LveId], events_ts_and_type_iter: Iterator[tuple[Timestamp, BurstingEventType]], ): for ts, event_type in events_ts_and_type_iter: for lve_id in lves_ids: yield InBurstingEventRow( lve_id=lve_id, timestamp=ts, event_type=event_type, ) def lve_historical_events_ts_and_type_iter( start_stop_pairs_iter: Iterator[tuple[Timestamp, Timestamp]], ) -> Iterator[tuple[Timestamp, BurstingEventType]]: timestemps_iter = itertools.chain.from_iterable(start_stop_pairs_iter) event_types_iter = itertools.cycle([BurstingEventType.STARTED, BurstingEventType.STOPPED]) for timestamp, event_type in zip(timestemps_iter, event_types_iter): yield timestamp, event_type def lve_historical_intervals_iter( overusing_intervals: int, interval_duration: int, cooldown: int = 1, ) -> Iterator[tuple[Timestamp, Timestamp]]: assert overusing_intervals >= 0 assert interval_duration >= 1 assert cooldown >= 1 now = Timestamp(0) for _ in range(overusing_intervals): started_at, stopped_at = now, now + interval_duration yield typing.cast(tuple[Timestamp, Timestamp], (started_at, stopped_at)) now = typing.cast(Timestamp, stopped_at + cooldown)