Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
6c785de
test(replication): add Solr version to lifecycle matrix
vsimko Nov 4, 2026
0c360b8
test(replication): update docs/api-coverage.md
vsimko Nov 4, 2026
da50267
test(replication): update docs/api-inventory.json
vsimko Nov 4, 2026
770a1ec
test(replication): update docs/compatibility.md
vsimko Nov 4, 2026
fba0329
docs(replication): record lifecycle verification boundary
vsimko Nov 4, 2026
e3934e6
test(replication): register lifecycle integration test
vsimko Nov 4, 2026
154ba70
test(replication): verify leader follower fetch lifecycle
vsimko Nov 4, 2026
0350e6c
test(replication): allow loopback leader URLs in isolated CI Solr
vsimko Nov 4, 2026
2e763c2
test(replication): configure BasicAuth for secure leader fetches
vsimko Nov 4, 2026
1570218
test(replication): pass Solr version to secure integration matrix
vsimko Nov 4, 2026
e062fea
test(replication): allow loopback leader URLs on Solr 10 CI
vsimko Nov 4, 2026
edddceb
test(solrcloud): add opt-in SPLITSHARD and MIGRATE verification
vsimko Nov 4, 2026
f791448
docs(solrcloud): clarify opt-in runtime certification boundary
vsimko Nov 4, 2026
483c41c
test(replication): allow local leader URLs across Solr versions
vsimko Nov 4, 2026
3e99948
test(replication): enable qt dispatch for internal leader fetch
vsimko Nov 4, 2026
769b515
test(replication): use version-specific leader URL form
vsimko Nov 4, 2026
b83f953
docs(replication): clarify version-specific leader URL form (docs/rep…
vsimko Nov 4, 2026
9f9333d
docs(replication): clarify version-specific leader URL form (test/rep…
vsimko Nov 4, 2026
8cb3bb6
docs(replication): clarify version-specific leader URL form (test/rep…
vsimko Nov 4, 2026
3338c6b
types(config): expose request-handler handleSelect (src/types.ts)
vsimko Nov 4, 2026
09cf69b
types(config): expose request-handler handleSelect (test/admin-api-ty…
vsimko Nov 4, 2026
cf7d70e
types(config): expose request-handler handleSelect (docs/config.md)
vsimko Nov 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,15 @@ on:
branches: [master]
pull_request:
branches: [master]
workflow_dispatch:
inputs:
enable_destructive_solrcloud_tests:
description: "Run opt-in SPLITSHARD and MIGRATE checks on the disposable two-node cluster"
required: false
default: false
type: boolean
jobs:
test:
jobs:
test:
strategy:
Expand Down Expand Up @@ -45,7 +54,7 @@ jobs:
--volume "$RUNNER_TEMP/solr-backups:/var/solr/backups" \
--publish 8983:8983 \
--env SOLR_JAVA_MEM="-Xms512m -Xmx512m" \
--env SOLR_OPTS="-Dsolr.allowPaths=/var/solr/backups" \
--env SOLR_OPTS="-Dsolr.allowPaths=/var/solr/backups -Dsolr.disable.shardsWhitelist=true -Dsolr.disable.allowUrls=true -Dsolr.security.allow.urls.enabled=false" \
"solr:${{ matrix.solr-version }}" \
solr-precreate integration
- name: Wait for Solr and integration core
Expand All @@ -67,6 +76,7 @@ jobs:
env:
SOLR_BASE_URL: http://localhost:8983/solr
SOLR_CORE: integration
SOLR_VERSION: "${{ matrix.solr-version }}"
SOLR_BACKUP_LOCATION: /var/solr/backups
- name: Print Solr logs
if: always()
Expand Down Expand Up @@ -124,7 +134,7 @@ jobs:
--volume "$RUNNER_TEMP/solr-backups:/var/solr/backups" \
--publish 8983:8983 \
--env SOLR_JAVA_MEM="-Xms512m -Xmx512m" \
--env SOLR_OPTS="-Dsolr.allowPaths=/var/solr/backups" \
--env SOLR_OPTS="-Dsolr.allowPaths=/var/solr/backups -Dsolr.disable.shardsWhitelist=true -Dsolr.disable.allowUrls=true -Dsolr.security.allow.urls.enabled=false" \
--entrypoint /bin/bash \
"solr:${{ matrix.solr-version }}" \
-lc 'mkdir -p /var/solr/data && cp /tmp/security.json /var/solr/data/security.json && chmod 666 /var/solr/data/security.json && exec docker-entrypoint.sh solr-precreate integration'
Expand All @@ -149,6 +159,7 @@ jobs:
env:
SOLR_BASE_URL: http://localhost:8983/solr
SOLR_CORE: integration
SOLR_VERSION: "${{ matrix.solr-version }}"
SOLR_SECURITY: "true"
SOLR_USERNAME: integration-admin
SOLR_PASSWORD: integration-password
Expand All @@ -158,6 +169,8 @@ jobs:
run: docker logs solr-secure || true

cloud-integration:
env:
SOLR_DESTRUCTIVE_OPT_IN: "${{ github.event_name == 'workflow_dispatch' && inputs.enable_destructive_solrcloud_tests == true && 'true' || 'false' }}"
strategy:
fail-fast: false
matrix:
Expand Down
15 changes: 15 additions & 0 deletions docs/administration.md
Original file line number Diff line number Diff line change
Expand Up @@ -161,3 +161,18 @@ The alias and cluster-status integration checks exercise alias read-back, collec
The V1 parameter spellings are intentional: this client calls `/solr/admin/collections`, not the Solr 10 V2 `/api/collections` resources. The V2 API maps `split.key` to `splitKey` and `target.collection` to `target`; those V2 names must not be sent through this V1 client.

Reference guides: [Solr 8.1 Collections API](https://archive.apache.org/dist/lucene/solr/ref-guide/apache-solr-ref-guide-8.1.pdf), [Solr 9.2 Collection Management](https://solr.apache.org/guide/solr/9_2/deployment-guide/collection-management.html), [Solr 9.10 Shard Management](https://solr.apache.org/guide/solr/9_10/deployment-guide/shard-management.html), and [Solr 10.0 Collections API](https://solr.apache.org/guide/solr/10_0/configuration-guide/collections-api.html).

## Opt-in SPLITSHARD and MIGRATE verification

These operations are intentionally excluded from normal push/pull-request CI. The opt-in suite uses only collections created by the fixture with unique `integration_*` names. It refuses to run unless all of the following are true:

- `SOLR_CLOUD=true` and `SOLR_MULTINODE=true`.
- `SOLR_DESTRUCTIVE_OPT_IN=true` is explicitly set.
- `SOLR_BASE_URL` resolves to localhost / loopback; remote Solr endpoints are skipped.
- The disposable cluster reports at least two live nodes; the split test additionally confirms its new collection starts with one shard and the migration test confirms the target collection is empty.

Run it from the GitHub Actions **CI** workflow using **Run workflow** and enable `enable_destructive_solrcloud_tests`. This provisions the workflow's ephemeral two-node SolrCloud cluster and runs the opt-in tests for the pinned Solr version matrix. Leaving the input disabled keeps both tests skipped, including on ordinary pull requests.

The tests use asynchronous request IDs and poll `REQUESTSTATUS` for up to 180 seconds, then remove completed status records. They verify active child-shard state and post-split document visibility, and verify that every routed document is searchable in the migration target. They do not claim to test concurrent writes, rollback of a partially completed operation, or recovery after a cluster/node failure.

If a request times out or fails, do not rerun against a reused cluster. Preserve the CI job logs, inspect `CLUSTERSTATUS` and `REQUESTSTATUS`, and discard the ephemeral cluster. Fixture cleanup deletes only the collections it created; if Solr still has an operation in flight and refuses deletion, destroy the ephemeral cluster rather than attempting cleanup against a shared server. The suite is an opt-in verification harness, not permission to point these destructive actions at a user-owned cluster. A workflow that is skipped or has not been manually dispatched is not runtime evidence; record successful Solr versions individually before updating compatibility status.
2 changes: 1 addition & 1 deletion docs/api-coverage.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ A generic request method does not mean that every endpoint has a typed wrapper,
| Security | `security(area, command)` | Security-enabled standalone matrix covers anonymous 401 responses for both authentication and authorization, authenticated reads, authentication property mutation/read-back, and malformed JSON rejection on Solr 8.11.4/9.11.0/10.1.0. Unit tests verify Basic/Bearer credentials and Authorization headers are not exposed through client HTTP errors. See Issues #86–#88. |
| System | `systemInfo()`, `systemProperties()`, `systemThreads()`, `systemLogging()` | System info, non-empty JVM/process properties, a non-empty thread dump, and logger metadata are exercised on pinned Solr 8.11.4/9.11.0/10.1.0. Optional fields remain version-dependent; response models preserve unknown fields. See Issues #89 and #91. |\n| Metrics | `metrics()` with typed group/registry/prefix/regex filters; exported `SolrMetricsJsonResponse`, `SolrMetricsRegistry`, and open `SolrMetricValue`; JSON/Prometheus response union | JVM response-format coverage remains distinct (observed JSON on Solr 8/9 and Prometheus exposition on 10.1). A `node` group integration check runs on all pinned versions, asserting a non-empty JSON registry on Solr 8/9 and Prometheus samples on 10.1; registry, prefix, and regex filters are asserted against JSON responses on Solr 8/9 (Solr 10.1 supports Prometheus/OpenMetrics, not the JSON writer). Consumer fixtures verify the extensible registry/value envelope; plugin-specific metrics remain open and unenumerated. See Issues #90, #91, and #236. |
| Backup and restore | `replication("backup" | "restore" | "restorestatus" | "deletebackup")`, `collections("BACKUP" | "RESTORE" | "LISTBACKUP" | "DELETEBACKUP" | "REQUESTSTATUS" | "DELETESTATUS")` | Typed core and SolrCloud backup/restore parameters and response models, including async status polling. Full core restore and SolrCloud collection backup/restore cycles are integration-tested on Solr 8.11.4/9.11.0/10.1.0 using local filesystem repositories and shared SolrCloud storage. See [backup and restore docs](backup-restore.md). |
| Replication | `replication(command, params)`, `replicationFile(params)`; exported command-specific parameter and response models | V1 ReplicationHandler commands for index version, details, file list, leader/follower control (Solr 10 fetchindex/abortfetch; Solr 8/9 snappull/abort), core backup/restore/status/delete, and raw file-content streaming. Integration coverage includes core backup/restore cycles on Solr 8.11.4/9.11.0/10.1.0. An end-to-end leader/follower fetch cycle is not yet certified. See Issue #95 and [replication docs](replication.md). |
| Replication | `replication(command, params)`, `replicationFile(params)`; exported command-specific parameter and response models | V1 ReplicationHandler commands for index version, details, file list, leader/follower control (Solr 10 fetchindex/abortfetch; Solr 8/9 snappull/abort), core backup/restore/status/delete, and raw file-content streaming. Integration coverage includes core backup/restore cycles and a disposable two-core leader/follower fetch/read-back cycle on Solr 8.11.4/9.11.0/10.1.0. The test uses `snappull` on Solr 8/9 and `fetchindex` on Solr 10; abort and polling lifecycle behavior remains unit-only. See Issue #95 and [replication docs](replication.md). |
| Streaming Expressions | `stream()` | Sends `expr` with `wt=json` and parses the complete JSON response through the shared transport. It is not an incremental tuple-stream parser: no chunk-boundary protocol or memory-bound/backpressure guarantee is claimed. SolrCloud search is integration-tested on pinned Solr 8.11.4/9.11.0/10.1.0; unit tests cover JSON parsing, caller cancellation during body consumption, and cleanup after body-stream errors. See [Streaming Expressions](streaming.md) and Issue #93. |
| Export | `export()`, `exportStream()`; exported `SolrExportParams`, `SolrExportSort`, and `SolrExportFieldType` | Export requests require typed `fl` and `sort` parameters, support repeated filter queries, structured or raw sort expressions, batch sizing, JSON/JavaBin writers, and an explicit custom-parameter escape hatch. The raw Response preserves backpressure-aware streaming; `exportStream()` exposes its byte body directly. Sort fields must be single-valued docValues fields (int, long, float, double, or string); field lists additionally support date and boolean and may be multi-valued. Solr 10.1 `includeStoredFields` support is exposed but requires version-specific verification. Existing raw Export response tests pass on pinned Solr 8.11.4/9.11.0/10.1.0; typed parameter serialization and streamed chunk consumption have unit coverage. See [Export docs](export.md) and Issues #92–#94. |
| Advanced / Raw | `requestRaw(path, options)` with typed method/query/header/body/control options and a raw Fetch `Response` | Relative paths and same-origin absolute URLs use the shared transport. Cross-origin URLs, embedded credentials, and URL fragments are rejected before Fetch, preventing configured credentials from being sent to unrelated hosts. Generic request()/requestRaw() transport behavior has unit coverage only; arbitrary custom endpoint behavior remains unverified until endpoint-specific integration tests exist. See [raw requests](raw-requests.md) and Issue #98. |
Expand Down
Loading