'Run some nodes using ``libcloud``.
By default, two nodes are run.  This can be overridden by using
the ``--number-of-nodes`` command line option.
:param PackageSource package_source: The source of omnibus packages.
:param BackendDescription dataset_backend: The description of the
dataset backend the nodes are configured with.
:param provider: The name of the cloud provider of nodes for the tests.
:param provider_config: The ``managed`` section of the acceptance
:returns: ``LibcloudRunner``.'

def _libcloud_runner(self, package_source, dataset_backend, provider, provider_config):

    if (provider_config is None):
        self._provider_config_missing(provider)
    provider_factory = CLOUD_PROVIDERS[provider]
    try:
        provisioner = provider_factory(**provider_config)
    except TypeError:
        try:
            validate_signature_against_kwargs(provider_factory, set(provider_config.keys()))
        except InvalidSignature as e:
            raise SystemExit("Missing    or    incorrect    configuration    for    provider    '{}'.\nMissing    Keys:    {}\nUnexpected    Keys:    {}\nOptional    Missing    Keys:    {}".format(provider, (',    '.join(e.missing_arguments) or '<None>'), (',    '.join(e.unexpected_arguments) or '<None>'), (',    '.join(e.missing_optional_arguments) or '<None>')))
        raise
    return LibcloudRunner(config=self['config'], top_level=self.top_level, distribution=self['distribution'], package_source=package_source, provisioner=provisioner, dataset_backend=dataset_backend, dataset_backend_configuration=self.dataset_backend_configuration(), variants=self['variants'], num_nodes=self['number-of-nodes'], identity=self._make_cluster_identity(dataset_backend), cert_path=self['cert-directory'])
