fix: handle all exceptions to support Kotlin - #2965

Merged
csviri merged 1 commit into
operator-framework:mainfrom
dvob:handle-all-exceptions
Sep 25, 2025
Merged

fix: handle all exceptions to support Kotlin#2965
csviri merged 1 commit into
operator-framework:mainfrom
dvob:handle-all-exceptions

Conversation

@dvob

@dvobdvob commented Sep 25, 2025

Copy link
Copy Markdown
Contributor

When using JOSDK with Kotlin I ran into the problem that the retry did not work when the create method of a DependentResource throws an Exception not inherited from RuntimeException.

The change switches the handling from RuntimeException to Exception so that it works with Kotlin where you can throw Exceptions from methods which don't declare that they throw.

I changed this in the NodeExecutor to address the problem I specifically ran into. Then I also grepped for other places where RuntimeException is catched and then changed it in PollingEventSource as well.

Maybe there are other places (e.g. OperatorException) which should be changed.

@csviri

Copy link
Copy Markdown
Collaborator

Hi @dvob I'm not against this, we probably don't want to change OperatorException. So you were able to test this PR, with properly with kotlin?

@csviricsviri left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that we should at least comment on those places that Exception is required because of kotlin

@csviricsviri mentioned this pull request Sep 25, 2025
@csviri

Copy link
Copy Markdown
Collaborator

also created a followup issue: #2967

@dvob

dvob commented Sep 25, 2025

Copy link
Copy Markdown
ContributorAuthor

Theoretically this is for all JVM-languages which do not have the concept of checked vs. unchecked exceptions and not just for Kotlin. But not sure if in practice any other language is used.

Yes, I tested this with Kotlin and it fixed the problem (reconcile of DependentResource which throws Exception now causes a retry)

I will go ahead and add the comments at the places where we catch Exception, ok?
Do you want me to put this into the same commit or add a second commit and then you can squash it on merging?

@csviri

Copy link
Copy Markdown
Collaborator

I will go ahead and add the comments at the places where we catch Exception, ok?

Yes, pls.

Do you want me to put this into the same commit or add a second commit and then you can squash it on merging?

Does not matter; we squash commits.

Thank you!

@metacosmmetacosm changed the title fix: handle all excptions to support Kotlinfix: handle all exceptions to support KotlinSep 25, 2025
@dvob
dvobforce-pushed the handle-all-exceptions branch 2 times, most recently from 565ea5a to 9b0bb8bCompareSeptember 25, 2025 07:34
@dvob

dvob commented Sep 25, 2025

Copy link
Copy Markdown
ContributorAuthor

I added the comments and also fixed the typos in the commit message

Handle Exception and not just RuntimeException to support Kotlin and
probably other JVM languages which do not have the concept of checked
exceptions.
@dvob
dvobforce-pushed the handle-all-exceptions branch from 9b0bb8b to 49a913eCompareSeptember 25, 2025 07:44

@xstefankxstefank left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm OK with this but shouldn't this be considered a breaking change? If someone indeed is now throwing RuntimeException it will stop working?

@csviri

csviri commented Sep 25, 2025

Copy link
Copy Markdown
Collaborator

I'm OK with this but shouldn't this be considered a breaking change? If someone indeed is now throwing RuntimeException it will stop working?

I don't see how it would stop working, could you pls elaborate?

@xstefank

Copy link
Copy Markdown
Collaborator

scratch that, forgot which exception extends which exception

@csviri
csviri merged commit e368709 into operator-framework:mainSep 25, 2025
1 check failed
csviri pushed a commit that referenced this pull request Jul 29, 2026
…ator E2E test (#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before #2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closes#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
csviri pushed a commit that referenced this pull request Aug 1, 2026
…ator E2E test (#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before #2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closes#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
csviri pushed a commit to csviri/java-operator-sdk that referenced this pull request Aug 3, 2026
…ator E2E test (operator-framework#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before operator-framework#2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closesoperator-framework#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@dvob@csviri@xstefank@metacosm
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix: handle all exceptions to support Kotlin - #2965

Merged
csviri merged 1 commit into
operator-framework:mainfrom
dvob:handle-all-exceptions
Sep 25, 2025
Merged

fix: handle all exceptions to support Kotlin#2965
csviri merged 1 commit into
operator-framework:mainfrom
dvob:handle-all-exceptions

Conversation

@dvob

@dvobdvob commented Sep 25, 2025

Copy link
Copy Markdown
Contributor

When using JOSDK with Kotlin I ran into the problem that the retry did not work when the create method of a DependentResource throws an Exception not inherited from RuntimeException.

The change switches the handling from RuntimeException to Exception so that it works with Kotlin where you can throw Exceptions from methods which don't declare that they throw.

I changed this in the NodeExecutor to address the problem I specifically ran into. Then I also grepped for other places where RuntimeException is catched and then changed it in PollingEventSource as well.

Maybe there are other places (e.g. OperatorException) which should be changed.

@csviri

Copy link
Copy Markdown
Collaborator

Hi @dvob I'm not against this, we probably don't want to change OperatorException. So you were able to test this PR, with properly with kotlin?

@csviricsviri left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that we should at least comment on those places that Exception is required because of kotlin

@csviricsviri mentioned this pull request Sep 25, 2025
@csviri

Copy link
Copy Markdown
Collaborator

also created a followup issue: #2967

@dvob

dvob commented Sep 25, 2025

Copy link
Copy Markdown
ContributorAuthor

Theoretically this is for all JVM-languages which do not have the concept of checked vs. unchecked exceptions and not just for Kotlin. But not sure if in practice any other language is used.

Yes, I tested this with Kotlin and it fixed the problem (reconcile of DependentResource which throws Exception now causes a retry)

I will go ahead and add the comments at the places where we catch Exception, ok?
Do you want me to put this into the same commit or add a second commit and then you can squash it on merging?

@csviri

Copy link
Copy Markdown
Collaborator

I will go ahead and add the comments at the places where we catch Exception, ok?

Yes, pls.

Do you want me to put this into the same commit or add a second commit and then you can squash it on merging?

Does not matter; we squash commits.

Thank you!

@metacosmmetacosm changed the title fix: handle all excptions to support Kotlinfix: handle all exceptions to support KotlinSep 25, 2025
@dvob
dvobforce-pushed the handle-all-exceptions branch 2 times, most recently from 565ea5a to 9b0bb8bCompareSeptember 25, 2025 07:34
@dvob

dvob commented Sep 25, 2025

Copy link
Copy Markdown
ContributorAuthor

I added the comments and also fixed the typos in the commit message

Handle Exception and not just RuntimeException to support Kotlin and
probably other JVM languages which do not have the concept of checked
exceptions.
@dvob
dvobforce-pushed the handle-all-exceptions branch from 9b0bb8b to 49a913eCompareSeptember 25, 2025 07:44

@xstefankxstefank left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm OK with this but shouldn't this be considered a breaking change? If someone indeed is now throwing RuntimeException it will stop working?

@csviri

csviri commented Sep 25, 2025

Copy link
Copy Markdown
Collaborator

I'm OK with this but shouldn't this be considered a breaking change? If someone indeed is now throwing RuntimeException it will stop working?

I don't see how it would stop working, could you pls elaborate?

@xstefank

Copy link
Copy Markdown
Collaborator

scratch that, forgot which exception extends which exception

@csviri
csviri merged commit e368709 into operator-framework:mainSep 25, 2025
1 check failed
csviri pushed a commit that referenced this pull request Jul 29, 2026
…ator E2E test (#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before #2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closes#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
csviri pushed a commit that referenced this pull request Aug 1, 2026
…ator E2E test (#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before #2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closes#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
csviri pushed a commit to csviri/java-operator-sdk that referenced this pull request Aug 3, 2026
…ator E2E test (operator-framework#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before operator-framework#2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closesoperator-framework#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@dvob@csviri@xstefank@metacosm
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: handle all exceptions to support Kotlin - #2965

Merged
csviri merged 1 commit into
operator-framework:mainfrom
dvob:handle-all-exceptions
Sep 25, 2025
Merged

fix: handle all exceptions to support Kotlin#2965
csviri merged 1 commit into
operator-framework:mainfrom
dvob:handle-all-exceptions

Conversation

@dvob

@dvobdvob commented Sep 25, 2025

Copy link
Copy Markdown
Contributor

When using JOSDK with Kotlin I ran into the problem that the retry did not work when the create method of a DependentResource throws an Exception not inherited from RuntimeException.

The change switches the handling from RuntimeException to Exception so that it works with Kotlin where you can throw Exceptions from methods which don't declare that they throw.

I changed this in the NodeExecutor to address the problem I specifically ran into. Then I also grepped for other places where RuntimeException is catched and then changed it in PollingEventSource as well.

Maybe there are other places (e.g. OperatorException) which should be changed.

@csviri

Copy link
Copy Markdown
Collaborator

Hi @dvob I'm not against this, we probably don't want to change OperatorException. So you were able to test this PR, with properly with kotlin?

@csviricsviri left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that we should at least comment on those places that Exception is required because of kotlin

@csviricsviri mentioned this pull request Sep 25, 2025
@csviri

Copy link
Copy Markdown
Collaborator

also created a followup issue: #2967

@dvob

dvob commented Sep 25, 2025

Copy link
Copy Markdown
ContributorAuthor

Theoretically this is for all JVM-languages which do not have the concept of checked vs. unchecked exceptions and not just for Kotlin. But not sure if in practice any other language is used.

Yes, I tested this with Kotlin and it fixed the problem (reconcile of DependentResource which throws Exception now causes a retry)

I will go ahead and add the comments at the places where we catch Exception, ok?
Do you want me to put this into the same commit or add a second commit and then you can squash it on merging?

@csviri

Copy link
Copy Markdown
Collaborator

I will go ahead and add the comments at the places where we catch Exception, ok?

Yes, pls.

Do you want me to put this into the same commit or add a second commit and then you can squash it on merging?

Does not matter; we squash commits.

Thank you!

@metacosmmetacosm changed the title fix: handle all excptions to support Kotlinfix: handle all exceptions to support KotlinSep 25, 2025
@dvob
dvobforce-pushed the handle-all-exceptions branch 2 times, most recently from 565ea5a to 9b0bb8bCompareSeptember 25, 2025 07:34
@dvob

dvob commented Sep 25, 2025

Copy link
Copy Markdown
ContributorAuthor

I added the comments and also fixed the typos in the commit message

Handle Exception and not just RuntimeException to support Kotlin and
probably other JVM languages which do not have the concept of checked
exceptions.
@dvob
dvobforce-pushed the handle-all-exceptions branch from 9b0bb8b to 49a913eCompareSeptember 25, 2025 07:44

@xstefankxstefank left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm OK with this but shouldn't this be considered a breaking change? If someone indeed is now throwing RuntimeException it will stop working?

@csviri

csviri commented Sep 25, 2025

Copy link
Copy Markdown
Collaborator

I'm OK with this but shouldn't this be considered a breaking change? If someone indeed is now throwing RuntimeException it will stop working?

I don't see how it would stop working, could you pls elaborate?

@xstefank

Copy link
Copy Markdown
Collaborator

scratch that, forgot which exception extends which exception

@csviri
csviri merged commit e368709 into operator-framework:mainSep 25, 2025
1 check failed
csviri pushed a commit that referenced this pull request Jul 29, 2026
…ator E2E test (#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before #2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closes#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
csviri pushed a commit that referenced this pull request Aug 1, 2026
…ator E2E test (#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before #2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closes#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
csviri pushed a commit to csviri/java-operator-sdk that referenced this pull request Aug 3, 2026
…ator E2E test (operator-framework#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before operator-framework#2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closesoperator-framework#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@dvob@csviri@xstefank@metacosm
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: handle all exceptions to support Kotlin - #2965

Merged
csviri merged 1 commit into
operator-framework:mainfrom
dvob:handle-all-exceptions
Sep 25, 2025
Merged

fix: handle all exceptions to support Kotlin#2965
csviri merged 1 commit into
operator-framework:mainfrom
dvob:handle-all-exceptions

Conversation

@dvob

@dvobdvob commented Sep 25, 2025

Copy link
Copy Markdown
Contributor

When using JOSDK with Kotlin I ran into the problem that the retry did not work when the create method of a DependentResource throws an Exception not inherited from RuntimeException.

The change switches the handling from RuntimeException to Exception so that it works with Kotlin where you can throw Exceptions from methods which don't declare that they throw.

I changed this in the NodeExecutor to address the problem I specifically ran into. Then I also grepped for other places where RuntimeException is catched and then changed it in PollingEventSource as well.

Maybe there are other places (e.g. OperatorException) which should be changed.

@csviri

Copy link
Copy Markdown
Collaborator

Hi @dvob I'm not against this, we probably don't want to change OperatorException. So you were able to test this PR, with properly with kotlin?

@csviricsviri left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that we should at least comment on those places that Exception is required because of kotlin

@csviricsviri mentioned this pull request Sep 25, 2025
@csviri

Copy link
Copy Markdown
Collaborator

also created a followup issue: #2967

@dvob

dvob commented Sep 25, 2025

Copy link
Copy Markdown
ContributorAuthor

Theoretically this is for all JVM-languages which do not have the concept of checked vs. unchecked exceptions and not just for Kotlin. But not sure if in practice any other language is used.

Yes, I tested this with Kotlin and it fixed the problem (reconcile of DependentResource which throws Exception now causes a retry)

I will go ahead and add the comments at the places where we catch Exception, ok?
Do you want me to put this into the same commit or add a second commit and then you can squash it on merging?

@csviri

Copy link
Copy Markdown
Collaborator

I will go ahead and add the comments at the places where we catch Exception, ok?

Yes, pls.

Do you want me to put this into the same commit or add a second commit and then you can squash it on merging?

Does not matter; we squash commits.

Thank you!

@metacosmmetacosm changed the title fix: handle all excptions to support Kotlinfix: handle all exceptions to support KotlinSep 25, 2025
@dvob
dvobforce-pushed the handle-all-exceptions branch 2 times, most recently from 565ea5a to 9b0bb8bCompareSeptember 25, 2025 07:34
@dvob

dvob commented Sep 25, 2025

Copy link
Copy Markdown
ContributorAuthor

I added the comments and also fixed the typos in the commit message

Handle Exception and not just RuntimeException to support Kotlin and
probably other JVM languages which do not have the concept of checked
exceptions.
@dvob
dvobforce-pushed the handle-all-exceptions branch from 9b0bb8b to 49a913eCompareSeptember 25, 2025 07:44

@xstefankxstefank left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm OK with this but shouldn't this be considered a breaking change? If someone indeed is now throwing RuntimeException it will stop working?

@csviri

csviri commented Sep 25, 2025

Copy link
Copy Markdown
Collaborator

I'm OK with this but shouldn't this be considered a breaking change? If someone indeed is now throwing RuntimeException it will stop working?

I don't see how it would stop working, could you pls elaborate?

@xstefank

Copy link
Copy Markdown
Collaborator

scratch that, forgot which exception extends which exception

@csviri
csviri merged commit e368709 into operator-framework:mainSep 25, 2025
1 check failed
csviri pushed a commit that referenced this pull request Jul 29, 2026
…ator E2E test (#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before #2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closes#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
csviri pushed a commit that referenced this pull request Aug 1, 2026
…ator E2E test (#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before #2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closes#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
csviri pushed a commit to csviri/java-operator-sdk that referenced this pull request Aug 3, 2026
…ator E2E test (operator-framework#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before operator-framework#2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closesoperator-framework#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@dvob@csviri@xstefank@metacosm
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix: handle all exceptions to support Kotlin - #2965

Merged
csviri merged 1 commit into
operator-framework:mainfrom
dvob:handle-all-exceptions
Sep 25, 2025
Merged

fix: handle all exceptions to support Kotlin#2965
csviri merged 1 commit into
operator-framework:mainfrom
dvob:handle-all-exceptions

Conversation

@dvob

@dvobdvob commented Sep 25, 2025

Copy link
Copy Markdown
Contributor

When using JOSDK with Kotlin I ran into the problem that the retry did not work when the create method of a DependentResource throws an Exception not inherited from RuntimeException.

The change switches the handling from RuntimeException to Exception so that it works with Kotlin where you can throw Exceptions from methods which don't declare that they throw.

I changed this in the NodeExecutor to address the problem I specifically ran into. Then I also grepped for other places where RuntimeException is catched and then changed it in PollingEventSource as well.

Maybe there are other places (e.g. OperatorException) which should be changed.

@csviri

Copy link
Copy Markdown
Collaborator

Hi @dvob I'm not against this, we probably don't want to change OperatorException. So you were able to test this PR, with properly with kotlin?

@csviricsviri left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that we should at least comment on those places that Exception is required because of kotlin

@csviricsviri mentioned this pull request Sep 25, 2025
@csviri

Copy link
Copy Markdown
Collaborator

also created a followup issue: #2967

@dvob

dvob commented Sep 25, 2025

Copy link
Copy Markdown
ContributorAuthor

Theoretically this is for all JVM-languages which do not have the concept of checked vs. unchecked exceptions and not just for Kotlin. But not sure if in practice any other language is used.

Yes, I tested this with Kotlin and it fixed the problem (reconcile of DependentResource which throws Exception now causes a retry)

I will go ahead and add the comments at the places where we catch Exception, ok?
Do you want me to put this into the same commit or add a second commit and then you can squash it on merging?

@csviri

Copy link
Copy Markdown
Collaborator

I will go ahead and add the comments at the places where we catch Exception, ok?

Yes, pls.

Do you want me to put this into the same commit or add a second commit and then you can squash it on merging?

Does not matter; we squash commits.

Thank you!

@metacosmmetacosm changed the title fix: handle all excptions to support Kotlinfix: handle all exceptions to support KotlinSep 25, 2025
@dvob
dvobforce-pushed the handle-all-exceptions branch 2 times, most recently from 565ea5a to 9b0bb8bCompareSeptember 25, 2025 07:34
@dvob

dvob commented Sep 25, 2025

Copy link
Copy Markdown
ContributorAuthor

I added the comments and also fixed the typos in the commit message

Handle Exception and not just RuntimeException to support Kotlin and
probably other JVM languages which do not have the concept of checked
exceptions.
@dvob
dvobforce-pushed the handle-all-exceptions branch from 9b0bb8b to 49a913eCompareSeptember 25, 2025 07:44

@xstefankxstefank left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm OK with this but shouldn't this be considered a breaking change? If someone indeed is now throwing RuntimeException it will stop working?

@csviri

csviri commented Sep 25, 2025

Copy link
Copy Markdown
Collaborator

I'm OK with this but shouldn't this be considered a breaking change? If someone indeed is now throwing RuntimeException it will stop working?

I don't see how it would stop working, could you pls elaborate?

@xstefank

Copy link
Copy Markdown
Collaborator

scratch that, forgot which exception extends which exception

@csviri
csviri merged commit e368709 into operator-framework:mainSep 25, 2025
1 check failed
csviri pushed a commit that referenced this pull request Jul 29, 2026
…ator E2E test (#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before #2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closes#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
csviri pushed a commit that referenced this pull request Aug 1, 2026
…ator E2E test (#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before #2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closes#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
csviri pushed a commit to csviri/java-operator-sdk that referenced this pull request Aug 3, 2026
…ator E2E test (operator-framework#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before operator-framework#2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closesoperator-framework#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@dvob@csviri@xstefank@metacosm
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: handle all exceptions to support Kotlin - #2965

Merged
csviri merged 1 commit into
operator-framework:mainfrom
dvob:handle-all-exceptions
Sep 25, 2025
Merged

fix: handle all exceptions to support Kotlin#2965
csviri merged 1 commit into
operator-framework:mainfrom
dvob:handle-all-exceptions

Conversation

@dvob

@dvobdvob commented Sep 25, 2025

Copy link
Copy Markdown
Contributor

When using JOSDK with Kotlin I ran into the problem that the retry did not work when the create method of a DependentResource throws an Exception not inherited from RuntimeException.

The change switches the handling from RuntimeException to Exception so that it works with Kotlin where you can throw Exceptions from methods which don't declare that they throw.

I changed this in the NodeExecutor to address the problem I specifically ran into. Then I also grepped for other places where RuntimeException is catched and then changed it in PollingEventSource as well.

Maybe there are other places (e.g. OperatorException) which should be changed.

@csviri

Copy link
Copy Markdown
Collaborator

Hi @dvob I'm not against this, we probably don't want to change OperatorException. So you were able to test this PR, with properly with kotlin?

@csviricsviri left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that we should at least comment on those places that Exception is required because of kotlin

@csviricsviri mentioned this pull request Sep 25, 2025
@csviri

Copy link
Copy Markdown
Collaborator

also created a followup issue: #2967

@dvob

dvob commented Sep 25, 2025

Copy link
Copy Markdown
ContributorAuthor

Theoretically this is for all JVM-languages which do not have the concept of checked vs. unchecked exceptions and not just for Kotlin. But not sure if in practice any other language is used.

Yes, I tested this with Kotlin and it fixed the problem (reconcile of DependentResource which throws Exception now causes a retry)

I will go ahead and add the comments at the places where we catch Exception, ok?
Do you want me to put this into the same commit or add a second commit and then you can squash it on merging?

@csviri

Copy link
Copy Markdown
Collaborator

I will go ahead and add the comments at the places where we catch Exception, ok?

Yes, pls.

Do you want me to put this into the same commit or add a second commit and then you can squash it on merging?

Does not matter; we squash commits.

Thank you!

@metacosmmetacosm changed the title fix: handle all excptions to support Kotlinfix: handle all exceptions to support KotlinSep 25, 2025
@dvob
dvobforce-pushed the handle-all-exceptions branch 2 times, most recently from 565ea5a to 9b0bb8bCompareSeptember 25, 2025 07:34
@dvob

dvob commented Sep 25, 2025

Copy link
Copy Markdown
ContributorAuthor

I added the comments and also fixed the typos in the commit message

Handle Exception and not just RuntimeException to support Kotlin and
probably other JVM languages which do not have the concept of checked
exceptions.
@dvob
dvobforce-pushed the handle-all-exceptions branch from 9b0bb8b to 49a913eCompareSeptember 25, 2025 07:44

@xstefankxstefank left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm OK with this but shouldn't this be considered a breaking change? If someone indeed is now throwing RuntimeException it will stop working?

@csviri

csviri commented Sep 25, 2025

Copy link
Copy Markdown
Collaborator

I'm OK with this but shouldn't this be considered a breaking change? If someone indeed is now throwing RuntimeException it will stop working?

I don't see how it would stop working, could you pls elaborate?

@xstefank

Copy link
Copy Markdown
Collaborator

scratch that, forgot which exception extends which exception

@csviri
csviri merged commit e368709 into operator-framework:mainSep 25, 2025
1 check failed
csviri pushed a commit that referenced this pull request Jul 29, 2026
…ator E2E test (#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before #2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closes#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
csviri pushed a commit that referenced this pull request Aug 1, 2026
…ator E2E test (#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before #2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closes#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
csviri pushed a commit to csviri/java-operator-sdk that referenced this pull request Aug 3, 2026
…ator E2E test (operator-framework#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before operator-framework#2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closesoperator-framework#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@dvob@csviri@xstefank@metacosm
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: handle all exceptions to support Kotlin - #2965

Merged
csviri merged 1 commit into
operator-framework:mainfrom
dvob:handle-all-exceptions
Sep 25, 2025
Merged

fix: handle all exceptions to support Kotlin#2965
csviri merged 1 commit into
operator-framework:mainfrom
dvob:handle-all-exceptions

Conversation

@dvob

@dvobdvob commented Sep 25, 2025

Copy link
Copy Markdown
Contributor

When using JOSDK with Kotlin I ran into the problem that the retry did not work when the create method of a DependentResource throws an Exception not inherited from RuntimeException.

The change switches the handling from RuntimeException to Exception so that it works with Kotlin where you can throw Exceptions from methods which don't declare that they throw.

I changed this in the NodeExecutor to address the problem I specifically ran into. Then I also grepped for other places where RuntimeException is catched and then changed it in PollingEventSource as well.

Maybe there are other places (e.g. OperatorException) which should be changed.

@csviri

Copy link
Copy Markdown
Collaborator

Hi @dvob I'm not against this, we probably don't want to change OperatorException. So you were able to test this PR, with properly with kotlin?

@csviricsviri left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that we should at least comment on those places that Exception is required because of kotlin

@csviricsviri mentioned this pull request Sep 25, 2025
@csviri

Copy link
Copy Markdown
Collaborator

also created a followup issue: #2967

@dvob

dvob commented Sep 25, 2025

Copy link
Copy Markdown
ContributorAuthor

Theoretically this is for all JVM-languages which do not have the concept of checked vs. unchecked exceptions and not just for Kotlin. But not sure if in practice any other language is used.

Yes, I tested this with Kotlin and it fixed the problem (reconcile of DependentResource which throws Exception now causes a retry)

I will go ahead and add the comments at the places where we catch Exception, ok?
Do you want me to put this into the same commit or add a second commit and then you can squash it on merging?

@csviri

Copy link
Copy Markdown
Collaborator

I will go ahead and add the comments at the places where we catch Exception, ok?

Yes, pls.

Do you want me to put this into the same commit or add a second commit and then you can squash it on merging?

Does not matter; we squash commits.

Thank you!

@metacosmmetacosm changed the title fix: handle all excptions to support Kotlinfix: handle all exceptions to support KotlinSep 25, 2025
@dvob
dvobforce-pushed the handle-all-exceptions branch 2 times, most recently from 565ea5a to 9b0bb8bCompareSeptember 25, 2025 07:34
@dvob

dvob commented Sep 25, 2025

Copy link
Copy Markdown
ContributorAuthor

I added the comments and also fixed the typos in the commit message

Handle Exception and not just RuntimeException to support Kotlin and
probably other JVM languages which do not have the concept of checked
exceptions.
@dvob
dvobforce-pushed the handle-all-exceptions branch from 9b0bb8b to 49a913eCompareSeptember 25, 2025 07:44

@xstefankxstefank left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm OK with this but shouldn't this be considered a breaking change? If someone indeed is now throwing RuntimeException it will stop working?

@csviri

csviri commented Sep 25, 2025

Copy link
Copy Markdown
Collaborator

I'm OK with this but shouldn't this be considered a breaking change? If someone indeed is now throwing RuntimeException it will stop working?

I don't see how it would stop working, could you pls elaborate?

@xstefank

Copy link
Copy Markdown
Collaborator

scratch that, forgot which exception extends which exception

@csviri
csviri merged commit e368709 into operator-framework:mainSep 25, 2025
1 check failed
csviri pushed a commit that referenced this pull request Jul 29, 2026
…ator E2E test (#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before #2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closes#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
csviri pushed a commit that referenced this pull request Aug 1, 2026
…ator E2E test (#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before #2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closes#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
csviri pushed a commit to csviri/java-operator-sdk that referenced this pull request Aug 3, 2026
…ator E2E test (operator-framework#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before operator-framework#2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closesoperator-framework#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@dvob@csviri@xstefank@metacosm
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix: handle all exceptions to support Kotlin - #2965

Merged
csviri merged 1 commit into
operator-framework:mainfrom
dvob:handle-all-exceptions
Sep 25, 2025
Merged

fix: handle all exceptions to support Kotlin#2965
csviri merged 1 commit into
operator-framework:mainfrom
dvob:handle-all-exceptions

Conversation

@dvob

@dvobdvob commented Sep 25, 2025

Copy link
Copy Markdown
Contributor

When using JOSDK with Kotlin I ran into the problem that the retry did not work when the create method of a DependentResource throws an Exception not inherited from RuntimeException.

The change switches the handling from RuntimeException to Exception so that it works with Kotlin where you can throw Exceptions from methods which don't declare that they throw.

I changed this in the NodeExecutor to address the problem I specifically ran into. Then I also grepped for other places where RuntimeException is catched and then changed it in PollingEventSource as well.

Maybe there are other places (e.g. OperatorException) which should be changed.

@csviri

Copy link
Copy Markdown
Collaborator

Hi @dvob I'm not against this, we probably don't want to change OperatorException. So you were able to test this PR, with properly with kotlin?

@csviricsviri left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that we should at least comment on those places that Exception is required because of kotlin

@csviricsviri mentioned this pull request Sep 25, 2025
@csviri

Copy link
Copy Markdown
Collaborator

also created a followup issue: #2967

@dvob

dvob commented Sep 25, 2025

Copy link
Copy Markdown
ContributorAuthor

Theoretically this is for all JVM-languages which do not have the concept of checked vs. unchecked exceptions and not just for Kotlin. But not sure if in practice any other language is used.

Yes, I tested this with Kotlin and it fixed the problem (reconcile of DependentResource which throws Exception now causes a retry)

I will go ahead and add the comments at the places where we catch Exception, ok?
Do you want me to put this into the same commit or add a second commit and then you can squash it on merging?

@csviri

Copy link
Copy Markdown
Collaborator

I will go ahead and add the comments at the places where we catch Exception, ok?

Yes, pls.

Do you want me to put this into the same commit or add a second commit and then you can squash it on merging?

Does not matter; we squash commits.

Thank you!

@metacosmmetacosm changed the title fix: handle all excptions to support Kotlinfix: handle all exceptions to support KotlinSep 25, 2025
@dvob
dvobforce-pushed the handle-all-exceptions branch 2 times, most recently from 565ea5a to 9b0bb8bCompareSeptember 25, 2025 07:34
@dvob

dvob commented Sep 25, 2025

Copy link
Copy Markdown
ContributorAuthor

I added the comments and also fixed the typos in the commit message

Handle Exception and not just RuntimeException to support Kotlin and
probably other JVM languages which do not have the concept of checked
exceptions.
@dvob
dvobforce-pushed the handle-all-exceptions branch from 9b0bb8b to 49a913eCompareSeptember 25, 2025 07:44

@xstefankxstefank left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm OK with this but shouldn't this be considered a breaking change? If someone indeed is now throwing RuntimeException it will stop working?

@csviri

csviri commented Sep 25, 2025

Copy link
Copy Markdown
Collaborator

I'm OK with this but shouldn't this be considered a breaking change? If someone indeed is now throwing RuntimeException it will stop working?

I don't see how it would stop working, could you pls elaborate?

@xstefank

Copy link
Copy Markdown
Collaborator

scratch that, forgot which exception extends which exception

@csviri
csviri merged commit e368709 into operator-framework:mainSep 25, 2025
1 check failed
csviri pushed a commit that referenced this pull request Jul 29, 2026
…ator E2E test (#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before #2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closes#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
csviri pushed a commit that referenced this pull request Aug 1, 2026
…ator E2E test (#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before #2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closes#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
csviri pushed a commit to csviri/java-operator-sdk that referenced this pull request Aug 3, 2026
…ator E2E test (operator-framework#3513)
Adds a Maven-compiled Kotlin test source set to operator-framework-core
and a smoke test verifying that a checked (non-RuntimeException) Exception
thrown from a Kotlin DependentResource is properly caught and reported by
the workflow executor, so that retries are triggered as expected.
Kotlin does not have checked exceptions, so Kotlin code can throw a
checked Exception from an overridden method without declaring it, even
though the Java DependentResource#reconcile signature does not declare
`throws Exception`. Before operator-framework#2965 this exception would not have been
caught by NodeExecutor, since it only handled RuntimeException, silently
swallowing the error and preventing retries.
Closesoperator-framework#2967
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: close class brace in Kotlin test; add Kotlin sample operator E2E
Fixes a missing closing brace left in KotlinCheckedExceptionDependentResourceTest.kt.
Adds a new sample-operators/kotlin-operator module: a minimalist Kotlin
operator (ConfigMapCopyReconciler) that copies a value from a custom
resource's spec into a ConfigMap, with a dual-mode (local/remote) E2E
test mirroring the other samples. This verifies deserialization via the
fabric8 client and the full reconciliation runtime when both the CR and
reconciler are implemented in Kotlin, addressing the maintainer's request
for broader coverage than the existing unit-level smoke test.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@dvob@csviri@xstefank@metacosm