def durationformat(value): duration = durations.Duration(value) seconds = int(duration.to_seconds()) hours = seconds // (60*60) seconds -= 60*60*hours minutes = seconds // 60 seconds -= 60*minutes return '{hours:d}h{minutes:02d}m{seconds:02d}s'.format( hours=hours, minutes=minutes, seconds=seconds)
def convert(self, value, param, ctx) -> durations.Duration: if value is None: return value if isinstance(value, durations.Duration): return value try: return durations.Duration(value) except ValueError as e: self.fail(f'Could not parse "{value}" into duration ({e})', param, ctx)
def handler(request, _): log.setLevel(os.getenv("LOG_LEVEL", "INFO")) dry_run = request.get("dry_run", False) older_than = durations.Duration(request.get("older_than", "2h")) mode = request.get("mode", "stop") operation[mode]( ec2=boto3.client("ec2"), dry_run=dry_run, older_than=timedelta(seconds=older_than.seconds), )
def handler(request, _): log.setLevel(os.getenv("LOG_LEVEL", "INFO")) if validate(request): dry_run = request.get("dry_run", False) older_than = durations.Duration(request.get("older_than")) mode = request.get("mode", "stop") tags = request.get("tags", []) tags = tuple(Tag.from_string(s) for s in request.get("tags", [])) operation[mode]( ec2=boto3.client("ec2"), dry_run=dry_run, older_than=timedelta(seconds=older_than.seconds), tags=tags, )
def __configureSettings(self, settings): newSettings = { "controlDelay": 5, "averagintTime": 5, "pollingTime": 1 } for key, value in settings.items(): asTime = False for substring in ["delay", "time"]: if substring in key.lower(): asTime = True # parse as duration, then transform to durations newSettings[key] = durations.Duration( str(value)).to_seconds() break if not asTime: newSettings[key] = value return newSettings
def convert(self, value, param, ctx) -> Optional[datetime]: if value is None: return value if isinstance(value, datetime): return self.to_utc(value) try: if isinstance(value, str) and value[0] in ["+", "-"]: duration = durations.Duration(value) now = datetime.now() st = now.replace(second=0, microsecond=0) st = self.to_utc(st + timedelta(seconds=duration.seconds)) else: st = self.to_utc(parse(value)) return st except ValueError as e: self.fail(f'Could not parse "{value}" into datetime ({e})', param, ctx)
def create_account(cli, account, use_ledger=False): if use_ledger: acct = cli.create_account_ledger(account["name"]) else: acct = cli.create_account(account["name"]) vesting = account.get("vesting") if not vesting: cli.add_genesis_account(acct["address"], account["coins"]) else: genesis_time = isoparse(genesis["genesis_time"]) end_time = genesis_time + datetime.timedelta( seconds=durations.Duration(vesting).to_seconds()) vend = int(end_time.timestamp()) cli.add_genesis_account( acct["address"], account["coins"], vesting_amount=account["coins"], vesting_end_time=vend, ) return acct
def create_account(cli, account, use_ledger=False): if use_ledger: acct = cli.create_account_ledger(account["name"]) else: acct = cli.create_account(account["name"]) print(acct) vesting = account.get("vesting") if not vesting: cli.add_genesis_account(acct["address"], account["coins"]) else: genesis_time = isoparse(genesis["genesis_time"]) end_time = genesis_time + datetime.timedelta( seconds=durations.Duration(vesting).to_seconds()) vend = end_time.replace(tzinfo=None).isoformat("T") + "Z" cli.add_genesis_account( acct["address"], account["coins"], vesting_amount=account["coins"], vesting_end_time=vend, ) return acct
def duration_checker(value) -> bool: """ checks whether the `value` is a valid duration. >>> duration_checker({}) False >>> duration_checker(1.0) False >>> duration_checker("2h") True >>> duration_checker("hundred days") False """ try: if isinstance(value, str): durations.Duration(value) return True except durations.exceptions.InvalidTokenError as e: pass return False
def age_to_months(t): t = t.replace('m', 'M') d = durations.Duration(t); return d.to_months()
raise ValueError else: if (datetime.time( hour=int(_end_mins_and_secs[0]), minute=int(_end_mins_and_secs[1]))) < (datetime.time( hour=current_time.hour, minute=current_time.minute)) > (datetime.time( hour=int(_start_mins_and_secs[0]), minute=int(_start_mins_and_secs[1]))): for i in os.getenv("LIGHT_ID").split(","): HueOperations().turn_off_light(int(i)) print( "End time has passed, Turning lights off. Lights wont be turned off if they are already off" ) time.sleep( durations.Duration( os.getenv("REFRESH_RATE")).to_seconds()) else: now_time = parser.parse( str(TimeManagement().timezone_converter()[0])) nightscout_time = parser.parse( str(TimeManagement().timezone_converter()[1])) difference = now_time - nightscout_time if ((datetime.datetime.min + difference).time()) > datetime.time(minute=int( os.getenv("NIGHTSCOUT_REALTIME_DIFFERENCE"))): print("Nightscout DELAY: Changing to {}".format( str(os.getenv("NIGHSCOUT_DELAY_COLOR").title()))) for i in os.getenv("LIGHT_ID").split(","): HueOperations().change_1_light( HueOperations().get_color("DELAY"), int(i)) time.sleep(
def init_cluster( data_dir, config, base_port, image=IMAGE, cmd=None, gen_compose_file=False, ): """ init data directory """ process_config(config, base_port) json.dump(config, (data_dir / "config.json").open("w")) cmd = cmd or CHAIN # init home directories for i, val in enumerate(config["validators"]): ChainCommand(cmd)( "init", val["moniker"], chain_id=config["chain_id"], home=home_dir(data_dir, i), ) os.rename(data_dir / "node0/config/genesis.json", data_dir / "genesis.json") os.mkdir(data_dir / "gentx") for i in range(len(config["validators"])): try: (data_dir / f"node{i}/config/genesis.json").unlink() except OSError: pass (data_dir / f"node{i}/config/genesis.json").symlink_to("../../genesis.json") (data_dir / f"node{i}/config/gentx").symlink_to("../../gentx") # now we can create ClusterCLI cli = ClusterCLI(data_dir, cmd) # patch the genesis file genesis = jsonmerge.merge( json.load(open(data_dir / "genesis.json")), config.get("genesis", {}), ) json.dump(genesis, open(data_dir / "genesis.json", "w")) cli.validate_genesis() # create accounts accounts = [] for i, node in enumerate(config["validators"]): account = cli.create_account("validator", i) print(account) accounts.append(account) cli.add_genesis_account(account["address"], node["coins"], i) cli.gentx("validator", node["staked"], i) for account in config["accounts"]: acct = cli.create_account(account["name"]) print(acct) accounts.append(acct) vesting = account.get("vesting") if not vesting: cli.add_genesis_account(acct["address"], account["coins"]) else: genesis_time = isoparse(genesis["genesis_time"]) end_time = genesis_time + datetime.timedelta( seconds=durations.Duration(vesting).to_seconds()) vend = end_time.replace(tzinfo=None).isoformat("T") + "Z" cli.add_genesis_account( acct["address"], account["coins"], vesting_amount=account["coins"], vesting_end_time=vend, ) # output accounts (data_dir / "accounts.txt").write_text("\n".join( str(account) for account in accounts)) # collect-gentxs cli.collect_gentxs(data_dir / "gentx", i) # realise the symbolic links, so the node directories can be used independently genesis_bytes = (data_dir / "genesis.json").read_bytes() for i in range(len(config["validators"])): (data_dir / f"node{i}/config/gentx").unlink() tmp = data_dir / f"node{i}/config/genesis.json" tmp.unlink() tmp.write_bytes(genesis_bytes) # write tendermint config peers = ",".join([ "tcp://%s@%s:%d" % (cli.node_id(i), val["hostname"], ports.p2p_port(val["base_port"])) for i, val in enumerate(config["validators"]) ]) for i, val in enumerate(config["validators"]): edit_tm_cfg(data_dir / f"node{i}/config/config.toml", val["base_port"], peers) edit_app_cfg(data_dir / f"node{i}/config/app.toml", val["base_port"]) # write supervisord config file write_ini( (data_dir / SUPERVISOR_CONFIG_FILE).open("w"), supervisord_ini(cmd, config["validators"]), ) if gen_compose_file: yaml.dump( docker_compose_yml(cmd, config["validators"], data_dir, image), (data_dir / "docker-compose.yml").open("w"), )
_start_mins_and_secs = [int(x) for x in os.getenv("START_TIME").split(":")] except ValueError: raise ValueError else: try: _end_mins_and_secs = [int(x) for x in os.getenv("END_TIME").split(":")] except ValueError: raise ValueError else: if (datetime.time(hour=int(_end_mins_and_secs[0]), minute=int(_end_mins_and_secs[1]))) < ( datetime.time(hour=current_time.hour, minute=current_time.minute)) > ( datetime.time(hour=int(_start_mins_and_secs[0]), minute=int(_start_mins_and_secs[1]))): for i in os.getenv("LIGHT_ID").split(","): HueOperations().turn_off_light(int(i)) print("End time has passed, Turning lights off. Lights wont be turned off if they are already off") time.sleep(durations.Duration(refresh).to_seconds()) else: now_time = parser.parse(str(TimeManagement().timezone_converter()[0])) nightscout_time = parser.parse(str(TimeManagement().timezone_converter()[1])) difference_t = now_time - nightscout_time if ((datetime.datetime.min + difference_t).time()) > datetime.time( minute=int(os.getenv("NIGHTSCOUT_REALTIME_DIFFERENCE"))): print( "Nightscout DELAY: Changing to {}".format(str(os.getenv("NIGHSCOUT_DELAY_COLOR").title()))) for i in os.getenv("LIGHT_ID").split(","): HueOperations().change_1_light(HueOperations().get_color("DELAY"), int(i)) time.sleep(durations.Duration(refresh).to_seconds()) else: if TimeManagement().nightscout_json[0]["sgv"] in range(int(os.getenv("LOW_GLUCOSE_VALUE")), int( os.getenv("HIGH_GLUCOSE_VALUE")) + 1): for i in (os.getenv("LIGHT_ID").split(",")):