'Summarise the results.
For each scenario, include the CPU usage for each process,
the percentage of containers that converge within a given time
limit and the percentage of scenario requests that complete
within a given time limit.'

def _create_summary(self):

    summary = defaultdict(list)
    node_counts = self._node_counts()
    container_counts = self._container_counts()
    versions = self._versions()
    scenarios = self._scenarios()
    for (node, container, version, scenario) in itertools.product(node_counts, container_counts, versions, scenarios):
        results = self._filter_results(node, container, version, scenario)
        if (len(results) > 0):
            result = OrderedDict()
            result['Flocker    Version'] = version
            result['Nodes'] = node
            result['Containers'] = container
            result['Scenario'] = scenario
            result['Control    Service    CPU'] = cpu_usage_for_process(results, 'flocker-control')
            result['Dataset    Agent    CPU'] = cpu_usage_for_process(results, 'flocker-dataset')
            result['Container    Agent    CPU'] = cpu_usage_for_process(results, 'flocker-contain')
            convergence_key = 'Containers    converged    within    {seconds}    seconds'.format(seconds=self.convergence_limit)
            result[convergence_key] = container_convergence(results, self.convergence_limit)
            request_latency_key = 'Scenario    requests    within    {seconds}    seconds'.format(seconds=self.latency_limit)
            result[request_latency_key] = request_latency(results, self.latency_limit)
            summary[scenario].append(result)
    return summary
