pentaho/pentaho-kettle · error · FileException

Error getting VFS locations. Check your credentials and for…

Error message

Error getting VFS locations. Check your credentials and for connectivity.

What it means

VFSFileProvider.getBuckets() resolves the VFS connection provider and asks it for the available locations (bucket roots). Any failure from getExistingProvider or getLocations (undefined provider, credential problems, network errors per BACKLOG-36560) is wrapped in this FileException telling the user to check credentials and connectivity.

Solutions

  1. Verify the VFS connection's credentials in the connection manager and re-authenticate
  2. Test network/VPN connectivity to the storage endpoint
  3. Confirm the provider plugin for this connection type is installed and enabled
  4. Re-open/re-save the connection details so getExistingProvider resolves a defined provider
  5. Inspect the wrapped cause `e` for the true backend error

Example fix

// before
FileConnectionRoot root = provider.getRoot(); // fails when offline
// after
try {
  provider.testConnection( details ); // preflight
} catch ( FileException fe ) {
  logError( "Check credentials/connectivity: " + fe.getCause() );
  return;
}
Defensive patterns

Strategy: try-catch

Validate before calling

// preflight
try {
  List<Location> roots = vfsConnectionProvider.getLocations( details );
  if ( roots == null || roots.isEmpty() ) throw new IllegalStateException( "No locations for connection" );
} catch ( Exception e ) { /* fix credentials/network before calling getFiles */ }

Type guard

boolean providerResolvable = vfsConnectionManagerHelper.getExistingProvider( getConnectionManager( bowl ), details ) != null;

Try / catch

try { provider.getFiles( details ); } catch ( FileException fe ) {
  Throwable cause = fe.getCause();
  log.error( "VFS location lookup failed; check credentials/connectivity", cause );
}

Prevention

When it happens

Trigger: getFiles() -> getBuckets() where vfsConnectionProvider.getLocations(details) throws a RuntimeException, or getExistingProvider cannot find a provider for the given connection details.

Common situations: Expired or wrong cloud credentials on a VFS connection; no network/VPN to the storage backend; a saved connection whose provider plugin is not installed (undefined provider); transient backend outages.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/9763bb9a628f513f. Report an issue: GitHub.

Appendix: source

Thrown at plugins/file-open-save-new/core/src/main/java/org/pentaho/di/plugins/fileopensave/providers/vfs/VFSFileProvider.java:266

                                    VFSConnectionDetails details )
    throws FileException {

    if ( this.roots.containsKey( getKey( fileConnectionRoot ) ) ) {
      return this.roots.get( getKey( fileConnectionRoot ) );
    }

    List<VFSFile> files = new ArrayList<>();

    List<VFSRoot> bucketRoots;
    try {
      VFSConnectionProvider<VFSConnectionDetails> vfsConnectionProvider =
        vfsConnectionManagerHelper.getExistingProvider( getConnectionManager( bowl ), details );

      bucketRoots = vfsConnectionProvider.getLocations( details );
    } catch ( Exception e ) {
      // Catching either the very unlikely undefined provider for the given details,
      // or a RuntimeException's possibly thrown by getLocations(.) (see BACKLOG-36560)
      throw new FileException(
        "Error getting VFS locations. Check your credentials and for connectivity.", e );
    }

    if ( bucketRoots == null || bucketRoots.isEmpty() ) {
      throw new FileNotFoundException( fileConnectionRoot.getPath(), fileConnectionRoot.getProvider() );
    }

    for ( VFSRoot bucketRoot : bucketRoots ) {
      // Assuming bucket names do not have special characters, which should be the case,
      // given buckets take the domain position of provider URIs.
      ConnectionFileName bucketFileName =
        connectionRootFileName.createChildName( bucketRoot.getName(), FileType.FOLDER );

      VFSDirectory vfsDirectory = new VFSDirectory();
      vfsDirectory.setName( bucketRoot.getName() );
      vfsDirectory.setDate( bucketRoot.getModifiedDate() );
      vfsDirectory.setHasChildren( true );
      vfsDirectory.setCanAddChildren( true );

View on GitHub (pinned to f3058517a1)