def update_proccer_job(session, result): 'Create or update proccer_job row returning the updated row.' stamp = datetime.utcfromtimestamp(timegm(strptime(result['stamp'], '%Y-%m-%dT%H:%M:%SZ'))) new_state = 'ok' if result['result']['ok'] else 'error' # Find existing proccer_job job = Job.get_or_create(session, host=result['host'], login=result['login'], name=result['name']) if job.deleted: log.info('Reviving zombie-job %r', job.id) job.deleted = None job.last_seen = stamp old_state, job.state = job.state, new_state config = result.get('config', {}) job.warn_after = parse_interval(config.get('warn-after')) job.notify = config.get('notify') log.debug('old/new state for job %r: %s/%s', job.id, old_state, new_state) if old_state != new_state: job.last_stamp = datetime.utcnow() update_job_history(job) job_state_changed(job, result) return job
def read_configuration(fp): parsed = yaml.load(fp) overrides = parsed.pop('overrides', []) for override in overrides: m = re.compile(override.pop('match')) for name, desc in parsed['commands'].items(): job_id = '%s@%s/%s' % (os.environ.get('USER', ''), gethostname(), name) if m.match(job_id): desc.update(override) default_timeout = parsed.pop('default-timeout', None) for desc in parsed['commands'].values(): if not default_timeout and 'timeout' not in desc: continue td = parse_interval(desc.get('timeout', default_timeout)) desc['timeout'] = int(td.total_seconds()) # alarm only uses ints return parsed
def test_int_interval(): got = parse_interval(1) eq_(got.total_seconds(), 1)
def test_bad_interval(): parse_interval('1s')
def test_str_interval(): got = parse_interval('1 hours') eq_(got.total_seconds(), 3600)