コード例 #1
0
ファイル: register.py プロジェクト: zeeest/IncentiveMechanism
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"
コード例 #2
0
ファイル: register.py プロジェクト: ucb88/IncentiveMechanism
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"
コード例 #3
0
ファイル: request.py プロジェクト: zeeest/IncentiveMechanism
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"
コード例 #4
0
ファイル: request.py プロジェクト: zeeest/IncentiveMechanism
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"
コード例 #5
0
ファイル: request.py プロジェクト: ucb88/IncentiveMechanism
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"
コード例 #6
0
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
コード例 #7
0
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
コード例 #8
0
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
コード例 #9
0
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
コード例 #10
0
ファイル: leave.py プロジェクト: zeeest/IncentiveMechanism
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"
コード例 #11
0
ファイル: leave.py プロジェクト: ucb88/IncentiveMechanism
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"
コード例 #12
0
ファイル: request.py プロジェクト: ucb88/IncentiveMechanism
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"