pentaho/pentaho-kettle · error · KettleException

No repository

Error message

No repository

What it means

ClientRepositoryLoader.getRepository connects to the named repository using the repo name, user, and password from PurFileSystemConfig; connectToRepository returned null (no repository could be connected), so this KettleException is thrown. The VFS layer has no repository to operate on.

Solutions

  1. Verify PurFileSystemConfig values (repo name, user, password) in your VFS FileSystemOptions
  2. Confirm the repository plugin for that metadata type is installed and loadable
  3. Check logs around connectToRepository for the underlying connection failure
  4. Re-register the repository in Kettle's repository metadata (repositories.xml)

Example fix

// before
FileSystemOptions opts = new FileSystemOptions();
// after — set all required config before resolving pur:// URIs
FileSystemOptions opts = new FileSystemOptions();
PurFileSystemConfig cfg = PurFileSystemConfig.getInstance(opts);
cfg.setRepositoryName("myPurRepo");
cfg.setUser("admin");
cfg.setPass("password");
Defensive patterns

Strategy: validation

Validate before calling

// Java — before resolving pur:// URIs
PurFileSystemConfig cfg = PurFileSystemConfig.getInstance( opts );
if ( cfg.getRepoName().isEmpty() || cfg.getUser().isEmpty() || cfg.getPass().isEmpty() ) {
  throw new IllegalStateException( "PurFileSystemConfig requires repo name, user and password" );
}

Try / catch

try {
  Repository repo = loader.getRepository( opts );
} catch ( KettleException e ) {
  logError( "VFS repository load failed: " + e.getMessage(), e );
  throw e;
}

Prevention

When it happens

Trigger: getRepository(opts) runs after 'No repository name/user/password' checks pass, but connectToRepository yields null — e.g. the named repository exists in metadata yet fails to load/produce an instance.

Common situations: PurFileSystemConfig missing or having invalid values in FileSystemOptions; repository metadata present but plugin for that repository type not installed; connection silently failing and returning null upstream.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


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

Appendix: source

Thrown at plugins/repo-vfs/repo-vfs-pdi/src/main/java/org/pentaho/di/repovfs/plugin/client/ClientRepositoryLoader.java:76

    var bowl = cfg.getBowl();
    if ( bowl.isPresent() && bowl.get() instanceof RepositoryBowl repoBowl ) {
      log.debug( "Using repository from bowl" );
      return repoBowl.getRepository();
    }

    Spoon spoon = Spoon.getInstance();
    if ( spoon != null ) {
      log.debug( "Using spoon repository" );
      return spoon.getRepository();
    }
    // there is no spoon
    log.debug( "Connecting to repository" );
    var repository = connectToRepository(
      cfg.getRepoName().orElseThrow( () -> new KettleException( "No repository name" ) ),
      cfg.getUser().orElseThrow( () -> new KettleException( "No user name" ) ),
      cfg.getPass().orElseThrow( () -> new KettleException( "No password" ) ) );
    if ( repository == null ) {
      throw new KettleException( "No repository" );
    }
    return repository;
  }

  private Repository connectToRepository( String repositoryName, String user, String password )
    throws KettleException {
    var repositories = repositoriesLoader.get();
    var repoMeta = repositories.findRepository( repositoryName );
    if ( repoMeta == null ) {
      throw new KettleException( "Repository not found: " + repositoryName );
    }
    var repo = PluginRegistry.getInstance().loadClass( RepositoryPluginType.class, repoMeta, Repository.class );
    repo.init( repoMeta );
    repo.connect( user, password );
    return repo;
  }

View on GitHub (pinned to f3058517a1)