Source code for glideinwms.frontend.manageFrontendDowntimes

#!/usr/bin/env python3

# SPDX-FileCopyrightText: 2009 Fermi Research Alliance, LLC
# SPDX-License-Identifier: Apache-2.0

import os
import os.path
import sys
import time

from glideinwms.frontend import glideinFrontendConfig, glideinFrontendDowntimeLib


[docs] def usage(): print("Usage:") print(" manageFrontendDowntimes.py -dir frontend_dir -cmd [command] [options]") print("where command is one of:") print(" add - Add a scheduled downtime period") print(" down - Put the factory down now(+delay)") print(" up - Get the factory back up now(+delay)") print(" check - Report if the factory is in downtime now(+delay)") print("Other options:") print(" -start [[[YYYY-]MM-]DD-]HH:MM[:SS] (start time for adding a downtime)") print(" -end [[[YYYY-]MM-]DD-]HH:MM[:SS] (end time for adding a downtime)") print(" -delay [HHh][MMm][SS[s]] (delay a downtime for down, up, and check cmds)")
# [[[YYYY-]MM-]DD-]HH:MM[:SS]
[docs] def strtxt2time(timeStr): deftime = time.localtime(time.time()) year = deftime[0] month = deftime[1] day = deftime[2] seconds = 0 darr = timeStr.split("-") # [[[YYYY-]MM-]DD-]HH:MM[:SS] if len(darr) > 1: # we have at least part of the date timeStr = darr[-1] day = int(darr[-2]) if len(darr) > 2: month = int(darr[-3]) if len(darr) > 3: year = int(darr[-4]) tarr = timeStr.split(":") hours = int(tarr[0]) minutes = int(tarr[1]) if len(tarr) > 2: seconds = int(tarr[2]) outtime = time.mktime((year, month, day, hours, minutes, seconds, 0, 0, -1)) return outtime # this is epoch format
# [[[YYYY-]MM-]DD-]HH:MM[:SS] # or # unix_time
[docs] def str2time(timeStr): if len(timeStr.split(":", 1)) > 1: return strtxt2time(timeStr) # has a :, so it must be a text representation else: print(timeStr) return int(timeStr) # should be a simple number
# [HHh][MMm][SS[s]]
[docs] def delay2time(delayStr): hours = 0 minutes = 0 seconds = 0 # getting hours harr = delayStr.split("h", 1) if len(harr) == 2: hours = int(harr[0]) delayStr = harr[1] # getting minutes marr = delayStr.split("m", 1) if len(marr) == 2: minutes = int(marr[0]) delayStr = marr[1] # getting seconds if delayStr[-1:] == "s": delayStr = delayStr[:-1] # remove final s if present if len(delayStr) > 0: seconds = int(delayStr) return seconds + 60 * (minutes + 60 * hours)
[docs] def get_downtime_fd(work_dir): frontendDescript = glideinFrontendConfig.FrontendDescript(work_dir) fd = glideinFrontendDowntimeLib.DowntimeFile(os.path.join(work_dir, frontendDescript.data["DowntimesFile"])) return fd
# major commands
[docs] def add(opt_dict): # glideinFrontendDowntimeLib.DowntimeFile( self.elementDescript.frontend_data['DowntimesFile'] ) down_fd = get_downtime_fd(opt_dict["dir"]) start_time = str2time(opt_dict["start"]) end_time = str2time(opt_dict["end"]) down_fd.addPeriod(start_time=start_time, end_time=end_time) return 0
# this calls checkDowntime(with delayed_start_time ) first and then startDowntime(with delayed_start_time and end_time)
[docs] def down(opt_dict): down_fd = get_downtime_fd(opt_dict["dir"]) when = delay2time(opt_dict["delay"]) if opt_dict["start"] == "None": when += int(time.time()) else: # delay applies only to the start time when += str2time(opt_dict["start"]) if opt_dict["end"] == "None": end_time = None else: end_time = str2time(opt_dict["end"]) if not down_fd.checkDowntime(check_time=when): # only add a new line if not in downtime at that time return down_fd.startDowntime(start_time=when, end_time=end_time) else: print("Frontend is already down. ") return 0
# calls endDowntime( with end_time only )
[docs] def up(opt_dict): down_fd = get_downtime_fd(opt_dict["dir"]) when = delay2time(opt_dict["delay"]) if opt_dict["end"] == "None": when += int(time.time()) else: # delay applies only to the end time when += str2time(opt_dict["end"]) rtn = down_fd.endDowntime(end_time=when) if rtn > 0: return 0 else: print("Frontend is not in downtime.") return 1
[docs] def printtimes(opt_dict): down_fd = get_downtime_fd(opt_dict["dir"]) when = delay2time(opt_dict["delay"]) + int(time.time()) down_fd.printDowntime(check_time=when)
[docs] def get_args(argv): opt_dict = {"comment": "", "sec": "All", "delay": "0", "end": "None", "start": "None", "frontend": "All"} index = 0 for arg in argv: if len(argv) <= index + 1: continue if arg == "-cmd": opt_dict["cmd"] = argv[index + 1] if arg == "-dir": opt_dict["dir"] = argv[index + 1] if arg == "-start": opt_dict["start"] = argv[index + 1] if arg == "-end": opt_dict["end"] = argv[index + 1] if arg == "-delay": opt_dict["delay"] = argv[index + 1] index = index + 1 return opt_dict
[docs] def main(argv): if len(argv) < 3: usage() return 1 # Get the command line arguments opt_dict = get_args(argv) try: frontend_dir = opt_dict["dir"] cmd = opt_dict["cmd"] except KeyError: usage() print("-cmd -dir argument is required.") return 1 try: os.chdir(frontend_dir) except OSError as e: usage() print("Failed to locate factory %s" % frontend_dir) print("%s" % e) return 1 if cmd == "add": return add(opt_dict) elif cmd == "down": return down(opt_dict) elif cmd == "up": return up(opt_dict) elif cmd == "check": return printtimes(opt_dict) else: usage() print("Invalid command %s" % cmd) return 1
if __name__ == "__main__": sys.exit(main(sys.argv))