Source code for paradrop.core.config.resource

from paradrop.core.chute.chute_storage import ChuteStorage
from paradrop.lib.misc import resopt


[docs]def computeResourceAllocation(chutes): service_names = [] service_cpu_fractions = [] allocation = {} for chute in chutes: if not chute.isRunning(): continue for service in chute.get_services(): service_names.append(service.get_container_name()) cpu_fraction = service.requests.get('cpu-fraction', None) service_cpu_fractions.append(cpu_fraction) # Use the optimizer to allocate cpu fractions and fill in unspecified # (None) values. The result is a vector that sums to one. new_cpu_fractions = resopt.allocate(service_cpu_fractions, total=1.0) n = len(service_names) for i in range(n): # Convert the fraction to an integer. We multiply by 1024*n so that # they all center around 1024, which is what Docker assigns to # containers by default. cpu_shares = int(round(new_cpu_fractions[i] * 1024 * n)) # Keep it above 2. Docker treats 0 and 1 as special values. cpu_shares = max(cpu_shares, 2) name = service_names[i] allocation[name] = { 'cpu_shares': cpu_shares } return allocation
[docs]def getResourceAllocation(update): """ Allocate compute resources for chutes. Sets cache variables "newResourceAllocation" and "oldResourceAllocation". """ chuteStore = ChuteStorage() chutes = chuteStore.getChuteList() old_allocation = computeResourceAllocation(chutes) # Insert the new chute into the list and replace the old version if it # existed. chutes.insert(0, update.new) for i in range(1, len(chutes)): if chutes[i].name == update.new.name: del chutes[i] break new_allocation = computeResourceAllocation(chutes) update.cache_set('newResourceAllocation', new_allocation) update.cache_set('oldResourceAllocation', old_allocation)