def getJobForHost(src_hostname, dt): jobs = [] conn = MongoClient(config.MONGO_SERVER)[config.MONGO_DB] ping_dt = dt - config.PING_INTERVAL iperf_dt = dt - config.IPERF_INTERVAL iperf_hard_dt = dt - config.IPERF_HARD_INTERVAL src_host = common.select_host(src_hostname) query = {'src': src_hostname, 'last_iperf_dt': {"$lt": iperf_dt}} src_group = common.select_group(src_host["gid"]) if config.ENABLE_HOSTGROUP: if src_group["status"] == 'external': members = common.group_members(src_group) logging.error("internal members :%s" % str(members)) query['dest'] = {"$in": members} running_hosts = conn.host.find({'status': 'running'}).count() if running_hosts >= config.MAX_RUNNING: query['src'] = 'this should found nothing' flows = conn.flow.find(query).sort('last_iperf_dt', 1) logging.error("flows count: %d " % flows.count()) # Do only one iperf to made the whole system work concurrently for flow in flows: dest_host = common.select_host(flow['dest']) dest_group = common.select_group(dest_host["gid"]) # Soft Deadline if dest_host['status'] == 'idle': logging.error("soft:" + src_host["hostname"] + "->" + dest_host["hostname"]) jobs.append(common.createIperfJob(src_host, dest_host)) common.update_group_status(src_group, dest_group) break # Hard Deadline if dest_host[ 'status'] == 'busy' and flow['last_iperf_dt'] < iperf_hard_dt: logging.error("hard:" + src_host["hostname"] + "->" + dest_host["hostname"]) jobs.append(common.createIperfJob(src_host, dest_host)) common.update_group_status(src_group, dest_group) break query = conn['flow'].find({ 'src': src_hostname, 'last_ping_dt': { "$lt": ping_dt } }) flows = query.sort('last_ping_dt', 1) # Ping does not toggle host status to running, but need to be done when idle # Src host running is okay since it will complete iperf first btw for flow in flows: dest_host = common.select_host(flow['dest']) if dest_host['status'] == 'idle': jobs.append({'type': 'ping', 'hostname': dest_host["hostname"]}) return jobs
def getJobForHost(src_hostname, dt): jobs = [] conn = MongoClient(config.MONGO_SERVER)[config.MONGO_DB] ping_dt = dt - config.PING_INTERVAL iperf_dt = dt - config.IPERF_INTERVAL iperf_hard_dt = dt - config.IPERF_HARD_INTERVAL src_host = common.select_host(src_hostname) query = { 'src' : src_hostname, 'last_iperf_dt': {"$lt" : iperf_dt} } src_group = common.select_group(src_host["gid"]) if config.ENABLE_HOSTGROUP: if src_group["status"] == 'external': members = common.group_members(src_group) logging.error("internal members :%s" %str(members)) query['dest'] = { "$in": members} running_hosts = conn.host.find({'status':'running'}).count() if running_hosts >= config.MAX_RUNNING: query['src'] = 'this should found nothing' flows = conn.flow.find(query).sort('last_iperf_dt',1) logging.error("flows count: %d " %flows.count()) # Do only one iperf to made the whole system work concurrently for flow in flows: dest_host = common.select_host(flow['dest']) dest_group = common.select_group(dest_host["gid"]) # Soft Deadline if dest_host['status'] == 'idle': logging.error("soft:" + src_host["hostname"] + "->" + dest_host["hostname"]) jobs.append(common.createIperfJob(src_host, dest_host)) common.update_group_status(src_group, dest_group) break; # Hard Deadline if dest_host['status'] == 'busy' and flow['last_iperf_dt'] < iperf_hard_dt: logging.error("hard:" + src_host["hostname"] + "->" + dest_host["hostname"]) jobs.append(common.createIperfJob(src_host, dest_host)) common.update_group_status(src_group, dest_group) break; query = conn['flow'].find({ 'src' : src_hostname, 'last_ping_dt': {"$lt" : ping_dt} }) flows = query.sort('last_ping_dt',1) # Ping does not toggle host status to running, but need to be done when idle # Src host running is okay since it will complete iperf first btw for flow in flows: dest_host = common.select_host(flow['dest']) if dest_host['status'] == 'idle': jobs.append({'type':'ping','hostname': dest_host["hostname"]}) return jobs
def record_values(src_hostname, status, values, dt): conn = MongoClient(config.MONGO_SERVER)[config.MONGO_DB] logging.error(src_hostname +" - values : " +str(values)) src_host = common.select_host(src_hostname) src_group = common.select_group(src_host["gid"]) for r in values: row = dict() row["src"] = src_hostname row["dt"] = dt row["type"] = r["type"] row["dest"] = r["dest"] if row["type"] == 'utilization': row["cpu"] = float(r["cpu"]) row["net"] = float(r["net"]) row["loadavg"] = float(r["loadavg"]) else: flow_query = {'src': src_hostname, 'dest': r["dest"]} flow = conn.flow.find_one(flow_query) if row["type"] == 'ping': row["min"] = float(r["min"]) row["max"] = float(r["max"]) row["avg"] = float(r["avg"]) flow["last_ping_dt"] = dt elif row["type"] == 'iperf': row["bandwidth"] = float(r["bandwidth"]) flow["last_iperf_dt"] = dt else: logging.error("invalid value type") return False conn.flow.update({'_id': flow["_id"]}, flow) conn.values.insert(row) logging.error("recording : %s" %str(row['src'])) if status == 'idle': src_host["status"] = 'idle' src_group["status"] = 'idle' conn.hostgroup.update({'_id':src_group["_id"]}, src_group) else: src_host["status"] = status conn.host.update({'_id':src_host["_id"]}, src_host)