'Responder to ``ClusterStatusDiffCommand``. Updates the configuration
and state by applying diffs to the current values, and verifies the
hash of the resulting objects.
:param eliot_context: The eliot context this is called under.
:param configuration_diff: The diff from the current configuration to
the next one.
:param start_configuration_generation: The expected generation hash of
former configuration known by this node.
:param end_configuration_generation: The expected generation hash of
the new configuration after the diff is applied.
:param state: The new state.
:param start_state_generation: The expected generation hash of former
state known by this node.
:param end_state_generation: The expected generation hash of the new
state after the diff is applied.'

@ClusterStatusDiffCommand.responder
def cluster_updated_diff(self, eliot_context, configuration_diff, start_configuration_generation, end_configuration_generation, state_diff, start_state_generation, end_state_generation):

    with eliot_context:
        if (start_configuration_generation != self._current_configuration_generation):
            return self._current_generations_response()
        if (start_state_generation != self._current_state_generation):
            return self._current_generations_response()
        new_configuration = configuration_diff.apply(self._current_configuration)
        new_state = state_diff.apply(self._current_state)
        self._update_cluster(new_configuration, end_configuration_generation, new_state, end_state_generation)
        return self._current_generations_response()
