{"record":{"id":"5b8e291cf24cce6a","repo":"goharbor/harbor","slug":"error-no-provider-configurations-are-provided-for","errorCode":null,"errorMessage":"Error: no provider configurations are provided for provider %s","messagePattern":"Error: no provider configurations are provided for provider (.+?)","errorType":"validation","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"make/photon/prepare/utils/configs.py","lineNumber":56,"sourceCode":"    if ('log_ep_host' in conf) and not conf['log_ep_host']:\n        raise Exception('Error: must set log endpoint host to enable external host')\n    if ('log_ep_port' in conf) and not conf['log_ep_port']:\n        raise Exception('Error: must set log endpoint port to enable external host')\n    if ('log_ep_protocol' in conf) and (conf['log_ep_protocol'] not in ['udp', 'tcp']):\n        raise Exception(\"Protocol in external log endpoint must be one of 'udp' or 'tcp' \")\n\n    # Storage validate\n    valid_storage_drivers = [\"filesystem\", \"azure\", \"gcs\", \"s3\", \"swift\", \"oss\"]\n    storage_provider_name = conf.get(\"storage_provider_name\")\n    if storage_provider_name not in valid_storage_drivers:\n        raise Exception(\"Error: storage driver %s is not supported, only the following ones are supported: %s\" % (\n            storage_provider_name, \",\".join(valid_storage_drivers)))\n\n    # original is registry_storage_provider_config\n    storage_provider_config = conf.get(\"storage_provider_config\")\n    if storage_provider_name != \"filesystem\":\n        if storage_provider_config == \"\":\n            raise Exception(\n                \"Error: no provider configurations are provided for provider %s\" % storage_provider_name)\n    # ca_bundle validate\n    if conf.get('registry_custom_ca_bundle_path'):\n        registry_custom_ca_bundle_path = conf.get('registry_custom_ca_bundle_path') or ''\n        if registry_custom_ca_bundle_path.startswith('/data/'):\n            ca_bundle_host_path = registry_custom_ca_bundle_path\n        else:\n            ca_bundle_host_path = os.path.join(host_root_dir, registry_custom_ca_bundle_path.lstrip('/'))\n        try:\n            uid = os.stat(ca_bundle_host_path).st_uid\n            st_mode = os.stat(ca_bundle_host_path).st_mode\n        except Exception as e:\n            logging.error(e)\n            raise Exception('Can not get file info')\n        err_msg = 'Cert File {} should be owned by user with uid 10000 or readable by others'.format(registry_custom_ca_bundle_path)\n        if uid == DEFAULT_UID and not owner_can_read(st_mode):\n            raise Exception(err_msg)\n        if uid != DEFAULT_UID and not other_can_read(st_mode):","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/goharbor/harbor/blob/7b2fd08cc568955cca339afeefab27372840d936/make/photon/prepare/utils/configs.py#L38-L74","documentation":"Thrown by validate() in make/photon/prepare/utils/configs.py when storage_provider_name is a non-filesystem driver but storage_provider_config is the empty string — i.e., a cloud storage backend was selected without any credentials/settings. Distribution cannot use s3/gcs/azure/swift/oss without their required options (bucket, region, keys), so prepare aborts. In the harbor.yml flow the parser stores provider options as a dict (and silently falls back to filesystem when the section is empty), so this exact raise mainly affects conf dicts built the legacy string way; the user-facing twin is misc.py:51 for harbor.cfg.","triggerScenarios":"storage_provider_name = 's3' (or azure/gcs/swift/oss) while storage_provider_config == '' — typically a hand-built conf dict, a legacy harbor.cfg with empty registry_storage_provider_config, or a migration of an old cfg where the config line was dropped.","commonSituations":"Switching from filesystem to S3 and filling in the name but not the settings; harbor.cfg to harbor.yml migrations that lose the registry_storage_provider_config line; automation that sets only the driver name.","solutions":["Fill the provider section under 'storage_service:' in harbor.yml with the required keys for the driver (s3 needs region, bucket, accesskey, secretkey)","In legacy harbor.cfg, set registry_storage_provider_config to the provider's comma-separated options","If you meant to keep local disk, set the provider back to filesystem and remove the cloud section","Re-run ./install.sh"],"exampleFix":"# harbor.yml (before)\nstorage_service:\n  s3:\n\n# harbor.yml (after)\nstorage_service:\n  s3:\n    region: us-east-1\n    bucket: harbor-artifacts\n    accesskey: AKIA...\n    secretkey: <secret>","handlingStrategy":"validation","validationCode":"name = conf.get('storage_provider_name', 'filesystem')\nprov = conf.get('storage_provider_config')\nif name != 'filesystem' and not prov:\n    raise SystemExit('driver %s selected but no provider config given' % name)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never rename the driver without bringing its settings along","Keep storage credentials in the storage_service section, not in env files","After editing, grep the rendered /etc/registry config for the bucket/region to confirm"],"tags":["harbor","storage","s3","configuration","validation"],"backgroundTag":null,"analyzedSha":"7b2fd08cc568955cca339afeefab27372840d936","analyzedAt":"2026-08-16T00:00:10.961Z","schemaVersion":2},"datasetVersion":"2026-08-16T03:17:38.424Z"}