def poll(self, conf_tree): """Poll for prerequisites of applications.""" # Get the poll configuration. poll_test, poll_file_test, poll_all_files, poll_any_files = ( self._get_tests(conf_tree)) poll_delays = [] if poll_test or poll_all_files or poll_any_files: poll_delays = self._get_delays(conf_tree) # Launch the polling. t_init = get_timepoint_for_now() poll_test, poll_any_files, poll_all_files = (self._run_poll( poll_test, poll_all_files, poll_any_files, poll_delays, poll_file_test=poll_file_test)) t_finish = get_timepoint_for_now() # Handle any failures. failed_items = [] if poll_test: failed_items.append("test") if poll_any_files: failed_items.append("any-files") if poll_all_files: failed_items.append("all-files:" + self.popen.list_to_shell_str(poll_all_files)) if failed_items: now = get_timepoint_for_now() raise PollTimeoutError(now, t_finish - t_init, failed_items)
def poll(self, conf_tree): """Poll for prerequisites of applications.""" # Get the poll configuration. poll_test, poll_file_test, poll_all_files, poll_any_files = ( self._get_tests(conf_tree)) poll_delays = [] if poll_test or poll_all_files or poll_any_files: poll_delays = self._get_delays(conf_tree) # Launch the polling. t_init = get_timepoint_for_now() poll_test, poll_any_files, poll_all_files = ( self._run_poll(poll_test, poll_all_files, poll_any_files, poll_delays, poll_file_test=poll_file_test) ) t_finish = get_timepoint_for_now() # Handle any failures. failed_items = [] if poll_test: failed_items.append("test") if poll_any_files: failed_items.append("any-files") if poll_all_files: failed_items.append("all-files:" + self.popen.list_to_shell_str(poll_all_files)) if failed_items: now = get_timepoint_for_now() raise PollTimeoutError(now, t_finish - t_init, failed_items)
def date_parse(self, time_point_str=None): """Parse time_point_str. Return (t, format) where t is a isodatetime.data.TimePoint object and format is the format that matches time_point_str. time_point_str -- The time point string to parse. Otherwise, use ref time. """ if time_point_str is None or time_point_str == self.STR_REF: time_point_str = self.ref_point_str if time_point_str is None or time_point_str == self.STR_NOW: time_point = get_timepoint_for_now() time_point.set_time_zone_to_local() if self.utc_mode or time_point.get_time_zone_utc(): # is in UTC parse_format = self.CURRENT_TIME_DUMP_FORMAT_Z else: parse_format = self.CURRENT_TIME_DUMP_FORMAT elif self.custom_parse_format is not None: parse_format = self.custom_parse_format time_point = self.strptime(time_point_str, parse_format) else: parse_formats = list(self.parse_formats) time_point = None while parse_formats: parse_format, should_use_datetime = parse_formats.pop(0) try: if should_use_datetime: time_point = self.get_datetime_strptime( time_point_str, parse_format) else: time_point = self.time_point_parser.strptime( time_point_str, parse_format) break except ValueError: pass if time_point is None: time_point = self.time_point_parser.parse( time_point_str, dump_as_parsed=True) parse_format = time_point.dump_format if self.utc_mode: time_point.set_time_zone_to_utc() return time_point, parse_format
def _poll(self, conf_tree): """Poll for prerequisites of applications.""" # Poll configuration poll_test = conf_tree.node.get_value(["poll", "test"]) poll_all_files_value = conf_tree.node.get_value(["poll", "all-files"]) poll_all_files = [] if poll_all_files_value: try: poll_all_files = shlex.split( env_var_process(poll_all_files_value)) except UnboundEnvironmentVariableError as exc: raise ConfigValueError(["poll", "all-files"], poll_all_files_value, exc) poll_any_files_value = conf_tree.node.get_value(["poll", "any-files"]) poll_any_files = [] if poll_any_files_value: try: poll_any_files = shlex.split( env_var_process(poll_any_files_value)) except UnboundEnvironmentVariableError as exc: raise ConfigValueError(["poll", "any-files"], poll_any_files_value, exc) poll_file_test = None if poll_all_files or poll_any_files: poll_file_test = conf_tree.node.get_value(["poll", "file-test"]) if poll_file_test and "{}" not in poll_file_test: raise ConfigValueError(["poll", "file-test"], poll_file_test, ConfigValueError.SYNTAX) poll_delays = [] if poll_test or poll_all_files or poll_any_files: # Parse something like this: delays=10,4*PT30S,PT2M30S,2*PT1H # R*DURATION: repeat the value R times conf_keys = ["poll", "delays"] poll_delays_value = conf_tree.node.get_value( conf_keys, default="").strip() if poll_delays_value: is_legacy0 = None for item in poll_delays_value.split(","): value = item.strip() repeat = 1 if "*" in value: repeat, value = value.split("*", 1) try: repeat = int(repeat) except ValueError as exc: raise ConfigValueError(conf_keys, poll_delays_value, ConfigValueError.SYNTAX) try: value = self.duration_parser.parse(value).get_seconds() is_legacy = False except ISO8601SyntaxError: # Legacy mode: nnnU # nnn is a float, U is the unit # No unit or s: seconds # m: minutes # h: hours unit = None if value[-1].lower() in self.OLD_DURATION_UNITS: unit = self.OLD_DURATION_UNITS[value[-1].lower()] value = value[:-1] try: value = float(value) except ValueError as exc: raise ConfigValueError(conf_keys, poll_delays_value, ConfigValueError.SYNTAX) if unit: value *= unit is_legacy = True if is_legacy0 is None: is_legacy0 = is_legacy elif is_legacy0 != is_legacy: raise ConfigValueError( conf_keys, poll_delays_value, ConfigValueError.DURATION_LEGACY_MIX) poll_delays += [value] * repeat else: poll_delays = [0] # poll once without a delay # Poll t_init = get_timepoint_for_now() while poll_delays and (poll_test or poll_any_files or poll_all_files): poll_delay = poll_delays.pop(0) if poll_delay: sleep(poll_delay) if poll_test: ret_code = self.popen.run( poll_test, shell=True, stdout=sys.stdout, stderr=sys.stderr)[0] self.handle_event(PollEvent(time(), poll_test, ret_code == 0)) if ret_code == 0: poll_test = None any_files = list(poll_any_files) for file_ in any_files: if self._poll_file(file_, poll_file_test): self.handle_event(PollEvent(time(), "any-files", True)) poll_any_files = [] break all_files = list(poll_all_files) for file_ in all_files: if self._poll_file(file_, poll_file_test): poll_all_files.remove(file_) if all_files and not poll_all_files: self.handle_event(PollEvent(time(), "all-files", True)) failed_items = [] if poll_test: failed_items.append("test") if poll_any_files: failed_items.append("any-files") if poll_all_files: failed_items.append("all-files:" + self.popen.list_to_shell_str(poll_all_files)) if failed_items: now = get_timepoint_for_now() raise PollTimeoutError(now, now - t_init, failed_items)
def _poll(self, conf_tree): """Poll for prerequisites of applications.""" # Poll configuration poll_test = conf_tree.node.get_value(["poll", "test"]) poll_all_files_value = conf_tree.node.get_value(["poll", "all-files"]) poll_all_files = [] if poll_all_files_value: try: poll_all_files = shlex.split( env_var_process(poll_all_files_value)) except UnboundEnvironmentVariableError as exc: raise ConfigValueError(["poll", "all-files"], poll_all_files_value, exc) poll_any_files_value = conf_tree.node.get_value(["poll", "any-files"]) poll_any_files = [] if poll_any_files_value: try: poll_any_files = shlex.split( env_var_process(poll_any_files_value)) except UnboundEnvironmentVariableError as exc: raise ConfigValueError(["poll", "any-files"], poll_any_files_value, exc) poll_file_test = None if poll_all_files or poll_any_files: poll_file_test = conf_tree.node.get_value(["poll", "file-test"]) if poll_file_test and "{}" not in poll_file_test: raise ConfigValueError(["poll", "file-test"], poll_file_test, ConfigValueError.SYNTAX) poll_delays = [] if poll_test or poll_all_files or poll_any_files: # Parse something like this: delays=10,4*PT30S,PT2M30S,2*PT1H # R*DURATION: repeat the value R times conf_keys = ["poll", "delays"] poll_delays_value = conf_tree.node.get_value(conf_keys, default="").strip() if poll_delays_value: is_legacy0 = None for item in poll_delays_value.split(","): value = item.strip() repeat = 1 if "*" in value: repeat, value = value.split("*", 1) try: repeat = int(repeat) except ValueError as exc: raise ConfigValueError(conf_keys, poll_delays_value, ConfigValueError.SYNTAX) try: value = self.duration_parser.parse(value).get_seconds() is_legacy = False except ISO8601SyntaxError: # Legacy mode: nnnU # nnn is a float, U is the unit # No unit or s: seconds # m: minutes # h: hours unit = None if value[-1].lower() in self.OLD_DURATION_UNITS: unit = self.OLD_DURATION_UNITS[value[-1].lower()] value = value[:-1] try: value = float(value) except ValueError as exc: raise ConfigValueError(conf_keys, poll_delays_value, ConfigValueError.SYNTAX) if unit: value *= unit is_legacy = True if is_legacy0 is None: is_legacy0 = is_legacy elif is_legacy0 != is_legacy: raise ConfigValueError( conf_keys, poll_delays_value, ConfigValueError.DURATION_LEGACY_MIX) poll_delays += [value] * repeat else: poll_delays = [0] # poll once without a delay # Poll t_init = get_timepoint_for_now() while poll_delays and (poll_test or poll_any_files or poll_all_files): poll_delay = poll_delays.pop(0) if poll_delay: sleep(poll_delay) if poll_test: ret_code = self.popen.run(poll_test, shell=True, stdout=sys.stdout, stderr=sys.stderr)[0] self.handle_event(PollEvent(time(), poll_test, ret_code == 0)) if ret_code == 0: poll_test = None any_files = list(poll_any_files) for file_ in any_files: if self._poll_file(file_, poll_file_test): self.handle_event(PollEvent(time(), "any-files", True)) poll_any_files = [] break all_files = list(poll_all_files) for file_ in all_files: if self._poll_file(file_, poll_file_test): poll_all_files.remove(file_) if all_files and not poll_all_files: self.handle_event(PollEvent(time(), "all-files", True)) failed_items = [] if poll_test: failed_items.append("test") if poll_any_files: failed_items.append("any-files") if poll_all_files: failed_items.append("all-files:" + self.popen.list_to_shell_str(poll_all_files)) if failed_items: now = get_timepoint_for_now() raise PollTimeoutError(now, now - t_init, failed_items)