junjunclub opened a new pull request, #12431:
URL: https://github.com/apache/seatunnel/pull/12431

   ### Purpose of this pull request
   
   Adds `--dry-run connect` support to the Redis **source and sink** in one 
slice.
   
   Both factories now implement the existing opt-in SPI only:
   
   - `RedisSourceFactory implements SupportSourceDryRunValidation`
   - `RedisSinkFactory implements SupportSinkDryRunValidation`
   
   `DryRunConnectValidator` and the shared SPI are **not** touched.
   
   **What the validation does** (`RedisDryRunValidator`, shared by source and 
sink):
   
   - Single-node: opens one `Jedis` with a bounded connect/socket timeout 
(10s), sends
     `AUTH` (when `auth` is set), `SELECT db_num`, `PING`, and closes the 
client.
   - Cluster: builds a `JedisCluster` with the same bounded timeouts and a 
single
     attempt — the constructor initializes the slot cache, which already proves
     connectivity and authentication — then reads node-level `INFO` through the
     existing `JedisWrapper` and closes it.
   - Every client is closed on success **and** on failure.
   - Only `AUTH`, `SELECT`, `PING`, `CLUSTER SLOTS` and `INFO` are issued: no 
key is
     read, scanned, written or expired, and no key space is created.
   - Source schemas come from the configured `schema` / `tables_configs` 
through the
     same path the runtime uses, so downstream plugins see the real output 
tables.
     No Redis value is inspected and no reader is created.
   - Failures are reported as `RedisConnectorException(REDIS_CONNECTION_ERROR)` 
naming
     the validated target (host:port or node list) without echoing credentials.
   
   **What a successful validation does _not_ prove** (documented in the 
connector docs):
   
   - Key existence, key-pattern matches, or that stored values match 
`data_type` / `format`.
   - Read or write permission on the configured keys.
   - Sink field compatibility. The Redis sink resolves `key`, `value_field`,
     `hash_key_field` and `hash_value_field` against the upstream fields and 
falls back
     to the configured name as a literal value, so a name missing from the 
schema is not
     a runtime failure and must not be rejected here.
   - Cluster deployments with partially unreachable nodes: `JedisWrapper#info` 
succeeds
     as long as one node answers.
   
   **One deliberate divergence from the runtime client, for reviewers:**
   `RedisParameters#buildJedis()` is not reused. On the single-node path it 
calls
   `jedis.aclSetUser(user)`, which mutates server-side ACLs — not acceptable in 
a dry
   run. The validation therefore mirrors the runtime `AUTH` only and never 
applies the
   `user` option, in either mode. A deployment that relies on `user` is not 
fully proven
   by `--dry-run connect`; this is stated in the docs. The runtime path is 
unchanged.
   
   ### Does this PR introduce _any_ user-facing change?
   
   Yes, for `--dry-run connect` only:
   
   - Redis source and sink are now reported as `VALIDATED` instead of 
`SKIPPED`, and a
     configuration pointing at an unreachable or misauthenticated Redis now 
fails the
     dry run instead of passing silently.
   - `--dry-run connect` may now open a short-lived connection to Redis. No job
     submission, reader, writer or save-mode logic is involved, and normal job 
execution
     is unchanged.
   - Docs: EN/ZH Redis source and sink pages get a "Connectivity dry-run" 
section, and
     the Layer 1 support matrix in `docs/{en,zh}/engines/zeta/user-command.md` 
gains a
     Redis row. _(pending in this draft)_
   
   ### How was this patch tested?
   
   `RedisDryRunValidatorTest` (new, Mockito construction mocking — no server 
required):
   
   - single-node success: `AUTH` → `SELECT` → `PING` → `close` in order, plus
     `verifyNoMoreInteractions`, which proves no key command is issued;
   - single-node without `auth`: no authentication is attempted;
   - authentication failure (`WRONGPASS`): reported with the target in the 
message, and
     the client is still closed;
   - connection failure: same, with the `JedisConnectionException` preserved as 
cause;
   - cluster: asserts the bounded constructor arguments (10s/10s, 1 attempt, 
password)
     and that the client is closed;
   - cluster with no reachable node: reported, client closed.
   
   `RedisFactoryTest` (extended): `inferSchemaForDryRun` returns the configured 
columns
   for a single table and one table per `tables_configs` entry — passing 
without any
   Redis instance, which is what proves no value is read.
   
   ```shell
   ./mvnw -pl seatunnel-connectors-v2/connector-redis -am test
   
   TODO before this leaves draft:
   
   - [ ] EN/ZH docs for the Redis source and sink connectors
   - [ ] Redis row in the EN/ZH Layer 1 support matrix
   - [ ] RedisConnectDryRunIT against a password-protected container (success,
     wrong password, unreachable port, and DBSIZE == 0 after validation)
   
   Check list
   
   - [x] If any new Jar binary package adding in your PR, please add License 
Notice according
     New License Guide 
(https://github.com/apache/seatunnel/blob/dev/docs/en/developer/new-license.md) 
— no new dependency
   - [ ] If necessary, please update the documentation to describe the new 
feature. https://github.com/apache/seatunnel/tree/dev/docs
   - [x] If necessary, please update incompatible-changes.md to describe the 
incompatibility caused by this PR — not applicable, runtime behavior is 
unchanged
   - [ ] If you are contributing the connector code, please check that the 
following files are updated:
     1. Update plugin-mapping.properties 
(https://github.com/apache/seatunnel/blob/dev/plugin-mapping.properties) and 
add new connector information in it — not applicable, existing connector
     2. Update the pom file of seatunnel-dist 
(https://github.com/apache/seatunnel/blob/dev/seatunnel-dist/pom.xml) — not 
applicable
     3. Add ci label in label-scope-conf 
(https://github.com/apache/seatunnel/blob/dev/.github/workflows/labeler/label-scope-conf.yml)
 — not applicable
     4. Add e2e testcase in seatunnel-e2e 
(https://github.com/apache/seatunnel/tree/dev/seatunnel-e2e/seatunnel-connector-v2-e2e/)
 — pending
     5. Update connector plugin_config 
(https://github.com/apache/seatunnel/blob/dev/config/plugin_config) — not 
applicable


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to