pentaho/pentaho-kettle · error · KettleException

DELETE_TRANSFORMATION : repository is read-only

Error message

DELETE_TRANSFORMATION : repository is read-only

What it means

KettleFileRepositorySecurityProvider.validateAction() throws this KettleException when a DELETE_TRANSFORMATION operation is requested on a repository whose capabilities indicate isReadOnly() is true. This is the file repository's only access control: the read-only flag.

Solutions

  1. Reconnect with the read-only flag disabled before performing deletions
  2. Remove read_only=Y from the repository metadata
  3. Check capabilities.isReadOnly() before delete calls and skip/log instead
  4. Use a separate writable connection for maintenance scripts

Example fix

// before
repo.deleteTransformation(transId); // fails when read-only
// after
if (!repo.getRepositoryCapabilities().isReadOnly()) {
  repo.deleteTransformation(transId);
}
Defensive patterns

Strategy: validation

Validate before calling

if (repo.getRepositoryCapabilities().isReadOnly()) {
  log.warn("Skipping delete; repository is read-only");
  return;
}

Try / catch

try {
  repo.deleteTransformation(id);
} catch (KettleException e) {
  if (e.getMessage().contains("read-only")) {
    log.warn("Delete blocked: repository read-only");
  }
}

Prevention

When it happens

Trigger: Calling deleteTransformation (or any API that validates DELETE_TRANSFORMATION) against a read-only KettleFileRepository.

Common situations: User opens the repository in read-only mode intentionally but then tries to delete transformations; automated cleanup scripts pointing at a read-only repository connection.

Understand the failure class

Background: Permission denied / not authorized / 403 Forbidden: access-control rejections when the caller lacks the required role, grant, or ownership — this error's family across 18 libraries.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/repository/filerep/KettleFileRepositorySecurityProvider.java:58

  public RepositoryMeta getRepositoryMeta() {
    return repositoryMeta;
  }

  public void validateAction( RepositoryOperation... operations ) throws KettleException, KettleSecurityException {

    for ( RepositoryOperation operation : operations ) {
      switch ( operation ) {
        case READ_TRANSFORMATION:
          break;
        case MODIFY_TRANSFORMATION:
          if ( capabilities.isReadOnly() ) {
            throw new KettleException( operation + " : repository is read-only" );
          }
          break;
        case DELETE_TRANSFORMATION:
          if ( capabilities.isReadOnly() ) {
            throw new KettleException( operation + " : repository is read-only" );
          }
          break;
        case EXECUTE_TRANSFORMATION:
          break;
        case LOCK_TRANSFORMATION:
          break;

        case READ_JOB:
          break;
        case MODIFY_JOB:
          if ( capabilities.isReadOnly() ) {
            throw new KettleException( operation + " : repository is read-only" );
          }
          break;
        case DELETE_JOB:
          if ( capabilities.isReadOnly() ) {
            throw new KettleException( operation + " : repository is read-only" );
          }

View on GitHub (pinned to f3058517a1)