goharbor/harbor · error

Error: no provider configurations are provided for provider

Error message

Error: no provider configurations are provided for provider %s

What it means

Thrown by the legacy validator in make/photon/prepare/utils/misc.py when registry_storage_provider_name is not 'filesystem' but registry_storage_provider_config is empty after strip(). Cloud backends need their settings (bucket, region, credentials) rendered into the registry config, so selecting one without configuration is fatal.

Source

Thrown at make/photon/prepare/utils/misc.py:51

        cert_key_path = conf.get("configuration", "ssl_cert_key")
        if not os.path.isfile(cert_key_path):
            raise Exception(
                "Error: The path for certificate key: %s is invalid" % cert_key_path)

    # Storage validate
    valid_storage_drivers = ["filesystem",
                             "azure", "gcs", "s3", "swift", "oss"]
    storage_provider_name = conf.get(
        "configuration", "registry_storage_provider_name").strip()
    if storage_provider_name not in valid_storage_drivers:
        raise Exception("Error: storage driver %s is not supported, only the following ones are supported: %s" % (
            storage_provider_name, ",".join(valid_storage_drivers)))

    storage_provider_config = conf.get(
        "configuration", "registry_storage_provider_config").strip()
    if storage_provider_name != "filesystem":
        if storage_provider_config == "":
            raise Exception(
                "Error: no provider configurations are provided for provider %s" % storage_provider_name)

def validate_crt_subj(dirty_subj):
    subj_list = [item for item in dirty_subj.strip().split("/") \
        if len(item.split("=")) == 2 and len(item.split("=")[1]) > 0]
    return "/" + "/".join(subj_list)


def generate_random_string(length):
    return ''.join(secrets.choice(string.ascii_letters + string.digits) for _ in range(length))


def prepare_dir(root: str, *args, **kwargs) -> str:
    gid, uid = kwargs.get('gid'), kwargs.get('uid')
    absolute_path = Path(os.path.join(root, *args))
    if absolute_path.is_file():
        raise Exception('Path exists and the type is regular file')
    mode = kwargs.get('mode') or 0o755

View on GitHub (pinned to 7b2fd08cc5)

Solutions

  1. Set registry_storage_provider_config with the driver's required options, e.g. 'region: us-east-1, bucket: harbor-artifacts, accesskey: AKIA..., secretkey: <secret>'
  2. Or set registry_storage_provider_name = filesystem if object storage is not intended
  3. Re-run prepare

Example fix

# harbor.cfg (before)
registry_storage_provider_name = s3
registry_storage_provider_config =

# after
registry_storage_provider_name = s3
registry_storage_provider_config = region: us-east-1, bucket: harbor-artifacts, accesskey: AKIAIOSFODNN7EXAMPLE, secretkey: wJalrXUtnFEMI
Defensive patterns

Strategy: validation

Validate before calling

name = conf.get('configuration', 'registry_storage_provider_name').strip()
prov = conf.get('configuration', 'registry_storage_provider_config').strip()
if name != 'filesystem' and prov == '':
    raise SystemExit('storage driver %s selected but registry_storage_provider_config is empty' % name)

Prevention

When it happens

Trigger: harbor.cfg sets 'registry_storage_provider_name = s3' (or azure/gcs/swift/oss) while 'registry_storage_provider_config' is empty or only whitespace - typically the name was changed but the settings line was never filled.

Common situations: Switching Harbor from local disk to object storage in harbor.cfg and forgetting the config string; migrations that drop the registry_storage_provider_config line.

Related errors


AI-assisted analysis of goharbor/harbor@7b2fd08cc5 (2026-08-16). Data as JSON: /api/errors/4539159e3ae530de. Report an issue: GitHub.