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
- Reconnect with the read-only flag disabled before performing deletions
- Remove read_only=Y from the repository metadata
- Check capabilities.isReadOnly() before delete calls and skip/log instead
- 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
- Gate all delete/maintenance scripts on a writable connection
- Do not point cleanup jobs at read-only repository profiles
- Surface the read-only capability in admin tooling
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
- DELETE_DATABASE : repository is read-only
- MODIFY_JOB : repository is read-only
- MODIFY_TRANSFORMATION : repository is read-only
- : repository is read-only
- DELETE_JOB : repository is read-only
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)