[ZEPPELIN-6400] Remove ZeppelinConfiguration dependency from zeppelin-interpreter module

## Summary

- **Move `ZeppelinConfiguration` from `zeppelin-interpreter` to `zeppelin-zengine`** so it is no longer included in the shaded interpreter JAR. This prevents the Maven shade plugin from corrupting config string literals, which caused classpath-order-dependent configuration loading failures.
- **Replace `ZeppelinConfiguration` usage in `zeppelin-interpreter` with `Properties`-based configuration** across `InterpreterLauncher`, `LifecycleManager`, `RecoveryStorage`, `DependencyResolver`, and all launcher plugins (Docker, K8s, YARN, Flink).
- **Update callers** in `zeppelin-zengine`, `zeppelin-server`, `flink`, and `markdown` interpreter modules.
- **Fix `TimeoutLifecycleManager` to parse time unit suffixes** (e.g., `"10s"`, `"1000ms"`) by adding `parseTimeValue()`. Previously, `Long.parseLong("10s")` threw `NumberFormatException`, causing the `TimeoutLifecycleManagerTest.testTimeout_2` to enter an infinite loop and hang CI for 6 hours.
- **Fix flaky `PersonalizeActionsIT.testGraphAction` Selenium test** by using `clickAndWait()` instead of `clickableWait().click()`, allowing the UI to update before assertion.

## Motivation

`ZeppelinConfiguration` in `zeppelin-interpreter` gets processed by the Maven shade plugin, which corrupts string literals (e.g., `org.apache.zeppelin` → `unshaded.org.apache.zeppelin`). This causes config keys to mismatch at runtime depending on classpath ordering. Moving it to `zeppelin-zengine` (which is not shaded) permanently eliminates this class of bugs.

As discussed by the community: *"ZeppelinConfiguration belongs to the Zeppelin server, and the Zeppelin interpreter should really only work on a HashMap with ConfigKey and ConfigValue."*

## Changes

| Area | Change |
|------|--------|
| `zeppelin-interpreter` (core) | Remove `ZeppelinConfiguration` imports; use `Properties` for config |
| `InterpreterLauncher` | `ZeppelinConfiguration zConf` → `Properties zProperties` |
| `LifecycleManager` / `RecoveryStorage` | Constructor takes `Properties` instead of `ZeppelinConfiguration` |
| `TimeoutLifecycleManager` | Add `parseTimeValue()` to handle time unit suffixes (`"10s"`, `"1000ms"`) |
| `DependencyResolver` | Accept individual config values instead of `ZeppelinConfiguration` |
| Launcher plugins (7 files) | Updated to `Properties`-based API |
| `zeppelin-zengine` | `PluginManager` passes derived values (absolute paths) via Properties |
| `ZeppelinConfiguration.java` | Moved from `zeppelin-interpreter` → `zeppelin-zengine` |
| `PersonalizeActionsIT` | Fix flaky `testGraphAction` by waiting for UI update after click |

## Future Work

Some logic was duplicated during this refactoring to keep `zeppelin-interpreter` independent of `ZeppelinConfiguration`:

- `TimeoutLifecycleManager.parseTimeValue()` duplicates `ZeppelinConfiguration.timeUnitToMill()` — both parse time strings like `"10s"` or `"1000ms"` via `Duration.parse("PT" + value)`. A shared utility in `zeppelin-common` could consolidate this in the future.
- Config key strings (e.g., `"zeppelin.interpreter.lifecyclemanager.timeout.threshold"`) are now hardcoded as plain strings in `zeppelin-interpreter` rather than referencing `ConfVars` enum constants. If config key management becomes an issue, a lightweight key constants class could be introduced.

## Test Plan

- [x] CI: `core.yml` - Core module tests (including `TimeoutLifecycleManagerTest`)
- [x] CI: `core.yml` - Interpreter tests (Spark, Flink)
- [x] CI: `frontend.yml` - E2E tests (Playwright + Selenium)
- [x] CI: `quick.yml` - RAT license check
- [x] Verify shaded JAR does not contain `ZeppelinConfiguration`

Closes #5167 from jongyoul/ZEPPELIN-6400-remove-zepconf-from-interpreter.

Signed-off-by: Jongyoul Lee <jongyoul@gmail.com>
37 files changed
tree: f1031abec4675e1c6ab60828c38f8bbfa62cdeb4
  1. .github/
  2. .husky/
  3. .mvn/
  4. alluxio/
  5. angular/
  6. bigquery/
  7. bin/
  8. build-tools/
  9. cassandra/
  10. conf/
  11. dev/
  12. docs/
  13. elasticsearch/
  14. examples/
  15. file/
  16. flink/
  17. flink-cmd/
  18. groovy/
  19. hbase/
  20. helium-dev/
  21. influxdb/
  22. java/
  23. jdbc/
  24. k8s/
  25. licenses/
  26. livy/
  27. markdown/
  28. mongodb/
  29. neo4j/
  30. notebook/
  31. python/
  32. rlang/
  33. scripts/
  34. shell/
  35. spark/
  36. spark-submit/
  37. sparql/
  38. testing/
  39. zeppelin-client/
  40. zeppelin-client-examples/
  41. zeppelin-common/
  42. zeppelin-distribution/
  43. zeppelin-examples/
  44. zeppelin-integration/
  45. zeppelin-interpreter/
  46. zeppelin-interpreter-integration/
  47. zeppelin-interpreter-parent/
  48. zeppelin-interpreter-shaded/
  49. zeppelin-jupyter/
  50. zeppelin-jupyter-interpreter/
  51. zeppelin-jupyter-interpreter-shaded/
  52. zeppelin-plugins/
  53. zeppelin-server/
  54. zeppelin-test/
  55. zeppelin-web/
  56. zeppelin-web-angular/
  57. zeppelin-zengine/
  58. .asf.yaml
  59. .gitattributes
  60. .gitignore
  61. Dockerfile
  62. LICENSE
  63. mvnw
  64. mvnw.cmd
  65. NOTICE
  66. pom.xml
  67. README.md
  68. Roadmap.md
  69. SECURITY-README.md
  70. STYLE.md
README.md

Apache Zeppelin

Documentation: User Guide
Mailing Lists: User and Dev mailing list
Continuous Integration: core frontend rat
Contributing: Contribution Guide
Issue Tracker: Jira
License: Apache 2.0

Zeppelin, a web-based notebook that enables interactive data analytics. You can make beautiful data-driven, interactive and collaborative documents with SQL, Scala and more.

Core features:

  • Web based notebook style editor.
  • Built-in Apache Spark support

To know more about Zeppelin, visit our web site https://zeppelin.apache.org

Getting Started

Install binary package

Please go to install to install Apache Zeppelin from binary package.

Build from source

Please check Build from source to build Zeppelin from source.