'Adds an :class:`.ExecutionProfile` to the cluster. This makes it available for use by ``name`` in :meth:`.Session.execute`
and :meth:`.Session.execute_async`. This method will raise if the profile already exists.
Normally profiles will be injected at cluster initialization via ``Cluster(execution_profiles)``. This method
provides a way of adding them dynamically.
Adding a new profile updates the connection pools according to the specified ``load_balancing_policy``. By default,
this method will wait up to five seconds for the pool creation to complete, so the profile can be used immediately
upon return. This behavior can be controlled using ``pool_wait_timeout`` (see
`concurrent.futures.wait <https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.wait>`_
for timeout semantics).'

def add_execution_profile(self, name, profile, pool_wait_timeout=5):

    if (not isinstance(profile, ExecutionProfile)):
        raise TypeError('profile    must    be    an    instance    of    ExecutionProfile')
    if (self._config_mode == _ConfigMode.LEGACY):
        raise ValueError('Cannot    add    execution    profiles    when    legacy    parameters    are    set    explicitly.')
    if (name in self.profile_manager.profiles):
        raise ValueError('Profile    %s    already    exists')
    self.profile_manager.profiles[name] = profile
    profile.load_balancing_policy.populate(self, self.metadata.all_hosts())
    for host in filter((lambda h: h.is_up), self.metadata.all_hosts()):
        profile.load_balancing_policy.on_up(host)
    futures = set()
    for session in self.sessions:
        futures.update(session.update_created_pools())
    (_, not_done) = wait_futures(futures, pool_wait_timeout)
    if not_done:
        raise OperationTimedOut('Failed    to    create    all    new    connection    pools    in    the    %ss    timeout.')
