def Register(ON_IP, ON_PORT, capacity, resource): global loggerReg print "ON_IP",ON_IP, \ "ON_PORT", ON_PORT, \ "capacity", capacity, \ "resource", resource json_doc = { "_id" : ON_IP, "info" : { "capacity": capacity, \ "resource" : resource, \ "avail" : resource, \ "credit" : resource, \ "effort" : float(resource * k.res)/(capacity * k.cap) \ }, "providedTo" : {}, ## { 'nodeID' : 'amount' } "suppliedFrom" : {} ## {'nodeID' : [ {'amount' : amount ,'timestamp' : timestamp}, .. ] } store.call_db().store_document(json_doc) ## TODO : record sliver info ## loggerReg.info("The node:%s is registered with capacity:%s resources:%s" % (ON_IP, capacity, resource)) return "REGISTERED"
def Register(ON_IP,ON_PORT,capacity,resource): global loggerReg print "ON_IP",ON_IP, \ "ON_PORT", ON_PORT, \ "capacity", capacity, \ "resource", resource json_doc = { "_id" : ON_IP, "info" : { "capacity": capacity, \ "resource" : resource, \ "avail" : resource, \ "credit" : resource, \ "effort" : float(resource * k.res)/(capacity * k.cap) \ }, "providedTo" : {}, ## { 'nodeID' : 'amount' } "suppliedFrom" : {} ## {'nodeID' : [ {'amount' : amount ,'timestamp' : timestamp}, .. ] } store.call_db().store_document(json_doc) ## TODO : record sliver info ## loggerReg.info("The node:%s is registered with capacity:%s resources:%s" %(ON_IP,capacity,resource)) return "REGISTERED"
def decision(doc, amount, duration): global sem sem.acquire() global loggerReq isFullySupplied = 0 requestor_id = doc['_id'] provider_list = view.sorted_list() for n in provider_list: provider_id = n.keys()[0] if provider_id == requestor_id: pass else: supplierDoc = store.call_db().get_document(provider_id) res = supplierDoc['info']['avail'] if res <= 0: continue tempDoc = doc tempSupplierDoc = supplierDoc if res >= amount: res = res - amount tempSharedAmount = amount isFullySupplied = 1 else: amount = amount - res tempSharedAmount = res trans_cost = tempSharedAmount * k.res # coeff_res tempDoc = requestor(provider_id, trans_cost, tempSharedAmount, tempDoc) tempSupplierDoc = supplier(requestor_id, trans_cost, tempSharedAmount, tempSupplierDoc) store.call_db().update_document(requestor_id, tempDoc) store.call_db().update_document(provider_id, tempSupplierDoc) loggerReq.info("The node:%s supplied %s amount resource to %s" % (provider_id, amount, requestor_id)) if isFullySupplied == 1: break sem.release() return "REQUESTED"
def Request(ON_IP, ON_PORT, amount, duration): global loggerReq print "ON_IP", ON_IP, \ "ON_PORT", ON_PORT, \ "amount", amount, \ "duration", duration doc = store.call_db().get_document(ON_IP) totalAvailResInTheSystem = view.total_availablity() rmax = math.ceil(doc['info']['effort'] * totalAvailResInTheSystem ) #max number of resource that a node can request loggerReq.info("The Node:%s asks for %s amount of resource, its RMAX:%s" % (ON_IP, amount, rmax)) if (rmax >= amount): if ((totalAvailResInTheSystem - doc['info']['avail']) >= amount): return decision(doc, amount, duration) else: loggerReq.warning( "There is not enough resource:%s to meet your:%s request:%s" % (totalAvailResInTheSystem, ON_IP, amount)) return "There is not enough resource to meet your request." else: loggerReq.warning( "The Node:%s has less RMAX:%s to get %s amount resources" % (ON_IP, rmax, amount)) return "You don't have enough credit for requesting that amount of resource"
def decision(doc, amount, duration): global sem sem.acquire() global loggerReq isFullySupplied = 0 requestor_id = doc["_id"] provider_list = view.sorted_list() for n in provider_list: provider_id = n.keys()[0] if provider_id == requestor_id: pass else: supplierDoc = store.call_db().get_document(provider_id) res = supplierDoc["info"]["avail"] if res <= 0: continue tempDoc = doc tempSupplierDoc = supplierDoc if res >= amount: res = res - amount tempSharedAmount = amount isFullySupplied = 1 else: amount = amount - res tempSharedAmount = res trans_cost = tempSharedAmount * k.res # coeff_res tempDoc = requestor(provider_id, trans_cost, tempSharedAmount, tempDoc) tempSupplierDoc = supplier(requestor_id, trans_cost, tempSharedAmount, tempSupplierDoc) store.call_db().update_document(requestor_id, tempDoc) store.call_db().update_document(provider_id, tempSupplierDoc) loggerReq.info("The node:%s supplied %s amount resource to %s" % (provider_id, amount, requestor_id)) if isFullySupplied == 1: break sem.release() return "REQUESTED"
def total_availablity(): map_func_for_avail = """function(doc) { \ if(doc['info'].capacity) \ emit(doc._id, doc['info'].avail); \ }""" avail_results = store.call_db().get_db().query(map_func_for_avail) avail_total = 0 for row in avail_results: avail_total += row.value return avail_total
def sorted_list(): map_func_for_sorted = """function(doc) { \ if('credit' in doc['info']) \ emit(doc['info'].credit, doc._id); \ }""" sort_results = store.call_db().get_db().query(map_func_for_sorted) sorted_list = [] ## key-value is exchange to make the works easier. for performance should be same! for row in sort_results: sorted_list.append({row.value: row.key}) return sorted_list
def sorted_list(): map_func_for_sorted = """function(doc) { \ if('credit' in doc['info']) \ emit(doc['info'].credit, doc._id); \ }""" sort_results = store.call_db().get_db().query(map_func_for_sorted) sorted_list = [] ## key-value is exchange to make the works easier. for performance should be same! for row in sort_results: sorted_list.append({row.value:row.key}) return sorted_list
def Leave(ON_IP, ON_PORT): global loggerLev loggerLev.info("The node:%s is leaving all resources" % ON_IP) tempDoc = store.call_db().get_document(ON_IP) for id in tempDoc['suppliedFrom'].keys(): tempSupplierDoc = store.call_db().get_document(id) tempSupplierDoc = regain(ON_IP, tempSupplierDoc) tempDoc = reallocate(id, tempDoc) store.call_db().update_document(id, tempSupplierDoc) store.call_db().update_document(ON_IP, tempDoc) return "ALL occupied resources are left"
def Leave(ON_IP,ON_PORT): global loggerLev loggerLev.info("The node:%s is leaving all resources" %ON_IP) tempDoc = store.call_db().get_document(ON_IP) for id in tempDoc['suppliedFrom'].keys(): tempSupplierDoc = store.call_db().get_document(id) tempSupplierDoc = regain(ON_IP,tempSupplierDoc) tempDoc = reallocate(id,tempDoc) store.call_db().update_document(id, tempSupplierDoc) store.call_db().update_document(ON_IP, tempDoc) return "ALL occupied resources are left"
def Request(ON_IP, ON_PORT, amount, duration): global loggerReq print "ON_IP", ON_IP, "ON_PORT", ON_PORT, "amount", amount, "duration", duration doc = store.call_db().get_document(ON_IP) totalAvailResInTheSystem = view.total_availablity() rmax = math.ceil(doc["info"]["effort"] * totalAvailResInTheSystem) # max number of resource that a node can request loggerReq.info("The Node:%s asks for %s amount of resource, its RMAX:%s" % (ON_IP, amount, rmax)) if rmax >= amount: if (totalAvailResInTheSystem - doc["info"]["avail"]) >= amount: return decision(doc, amount, duration) else: loggerReq.warning( "There is not enough resource:%s to meet your:%s request:%s" % (totalAvailResInTheSystem, ON_IP, amount) ) return "There is not enough resource to meet your request." else: loggerReq.warning("The Node:%s has less RMAX:%s to get %s amount resources" % (ON_IP, rmax, amount)) return "You don't have enough credit for requesting that amount of resource"