def __add_workload(self, workload):
        log.info("Assigning '{}' thread(s) to workload: '{}'".format(workload.get_thread_count(), workload.get_id()))

        workload_map = self.get_workload_map_copy()
        workload_map[workload.get_id()] = workload

        request = self.__get_threads_request(workload.get_id(), workload_map, "assign")
        response = self.__cpu_allocator.assign_threads(request)

        self.__update_state(response.get_cpu(), workload_map)
        report_cpu_event(request, response)
    def __remove_workload(self, workload_id):
        log.info("Removing workload: {}".format(workload_id))
        if workload_id not in self.__workloads:
            log.error("Attempted to remove unknown workload: '{}'".format(workload_id))
            return

        workload_map = self.get_workload_map_copy()

        request = self.__get_threads_request(workload_id, workload_map, "free")
        response = self.__cpu_allocator.free_threads(request)

        workload_map.pop(workload_id)
        self.__update_state(response.get_cpu(), workload_map)
        report_cpu_event(request, response)
    def __rebalance(self, dummy):
        request = self.__get_rebalance_request()
        response = self.__cpu_allocator.rebalance(request)

        self.__update_state(response.get_cpu(), request.get_workloads())
        report_cpu_event(request, response)