Skip to content

Server v3.0.0 - #2635

Open
johngrimes wants to merge 239 commits into
mainfrom
release/server/3.0.0
Open

Server v3.0.0#2635
johngrimes wants to merge 239 commits into
mainfrom
release/server/3.0.0

Conversation

@johngrimes

Copy link
Copy Markdown
Member

No description provided.

Add viewReference support, Reference-typed patient/group with spec
cardinality, Bundle unwrapping in the resource parameter, and 422 for
semantically invalid ViewDefinitions on the run operation. Across the
run, export, and sqlquery-run operations, reject an explicitly
unsupported _format and the unsupported source parameter rather than
silently ignoring them. Add a creation-time start timestamp to the
async job for later export-manifest timing.
Support view.viewReference resolution to a stored ViewDefinition with
per-part exclusivity and presence checks. Rewrite the completion
manifest to the SQL on FHIR shape (exportId, status, echoed
clientTrackingId and _format, export timing fields, and one output per
view with name and location parts), dropping the Bulk Data-style
fields. Return a Parameters kick-off acknowledgement for SQL on FHIR
async operations while leaving the Bulk Data kick-off body unchanged.
…ery 422

Declare the SQL on FHIR spec canonical OperationDefinition URLs for the
viewdefinition-run, viewdefinition-export, and sqlquery-run operations in
the CapabilityStatement, and stop serving the Pathling-authored
OperationDefinitions for them. Add a regression test pinning the existing
422 response for an unmappable FHIR column type under _format=fhir on
sqlquery-run, and integration coverage for the source and _format
rejections across all levels and transports.
Update the admin UI manifest parser to read the spec-shaped output
location parts (one or more per output) instead of a single url part,
emitting one download entry per file so a view that produced several
files lists every file. Add an end-to-end check that an invalid custom
ViewDefinition surfaces the 422 OperationOutcome message.
Update the run, export, and sqlquery-run operation docs for the new
viewReference support, Reference-typed patient/group, Bundle unwrapping,
the spec-shaped export manifest and kick-off acknowledgement, the source
and unsupported-format rejections, the 400/404/422 status semantics, and
the spec conformance canonicals. Credit the additional author on the
significantly changed sqlquery providers.
Align the admin UI export end-to-end mocks with the new completion
manifest: output download files are carried in location parts, and the
non-spec transactionTime and requiresAccessToken fields are removed, so
the card-listing tests exercise the location-reading parser.
Strip media-type parameters (e.g. text/csv;charset=utf-8) before
matching an explicit _format value across the run, export, and
sqlquery-run strict parsers, so a supported media type with parameters
is treated as that format rather than rejected with 400, matching the
spec's content-negotiation edge case.
The strict SQL validator's expression allow-list omitted the named and
positional parameter placeholder expressions, so any parameterised query
(using ":name") failed static validation. This blocked runtime parameter
binding for $sqlquery-run even though the binding machinery was already
present.

Add NamedParameter and PosParameter to the allow-list. They are leaf,
unevaluable value placeholders bound at execution time, so they carry no
code-execution risk.
Implement the SQL on FHIR $sqlquery-export operation, the asynchronous
counterpart to $sqlquery-run, at the system, type, and instance levels.
Clients can run one or more SQL queries against materialised ViewDefinition
tables in the background and download each result as files, following the
FHIR Asynchronous Request Pattern.

Each query produces one output. Table sources can be supplied at request
time, inline or by reference, in addition to being read from server storage.
Supported formats are NDJSON (default), CSV, and Parquet, with patient,
group, and _since filtering. A failed query fails the whole export.

To avoid duplication, extract the shared asynchronous-export machinery into a
new operations/export package (a generic completion-manifest builder, a file
writer, and a filtered data-source builder) reused by both export operations,
and refactor $sqlquery-run onto a shared SqlQueryPipeline that the export also
uses. The Admin UI gains an export affordance on the SQL query result card,
backed by a reusable export-job card shared with the ViewDefinition export.

The operation is declared in the CapabilityStatement against the spec
canonical and gated by a new sqlQueryExportEnabled configuration flag.

Resolves #2633.
Replace the boolean redirectOnComplete marker on the server's asynchronous
machinery with an AsyncPattern enum (STANDARD_ASYNC_PATTERN, BULK_DATA), so the
@AsyncSupported annotation reads as a deliberate choice between two named
patterns rather than the presence or absence of one behaviour.

Correct the Javadoc that misattributed the redirect-based completion to a "SQL
on FHIR unify-async" specification, citing the HL7 Asynchronous Interaction
Request Pattern instead.

Behaviour is unchanged; the existing async tests pass with only their
identifiers updated.
isAnyExportEnabled now also covers the SQL on FHIR asynchronous export
operations, so the all-exports-disabled case must also disable the
viewdefinition-export and sqlquery-export flags, both of which default
to enabled.
The SQL on FHIR export integration tests added to the server module push
the full build-and-test suite past the previous 30-minute job limit,
causing the run to be cancelled before completion. Raise the timeout on
the test, pre-release, and release server workflows so the suite has room
to finish.
The disabled-operation assertion called doesNotContain on its own, which
passes vacuously if the operation list is empty. Assert the still-enabled
sqlquery-run operation is present first, so the test proves the list is
populated and only sqlquery-export was dropped.
@johngrimes johngrimes self-assigned this Jun 22, 2026
@johngrimes johngrimes added release Pull request that represents a new release server Issues relating to Pathling server. labels Jun 22, 2026
@github-project-automation github-project-automation Bot moved this to Backlog in Pathling Jun 22, 2026
@johngrimes johngrimes moved this from Backlog to In progress in Pathling Jun 22, 2026
Resolves twelve Netty advisories reported against 4.1.133.Final,
spanning HTTP/2 denial-of-service, TLS hostname verification bypass,
and DNS resolver issues. All are fixed within the 4.1.x line at
4.1.135.Final, so no move to the 4.2.x series is required. The Netty
BOM remains imported ahead of Spring Boot's so the pinned version
continues to win.
Addresses CVE-2026-55471, an XML external entity vulnerability in
XsltUtilities.saxonTransform via an unhardened Saxon TransformerFactory.
HAPI FHIR 8.10.0 still bundles 6.9.4.1, so the existing override of
org.hl7.fhir.r4 and org.hl7.fhir.utilities is raised from 6.9.7 to the
patched 6.9.10.
Resolves a batch of react-router security advisories by moving to the
latest 7.x release. None of the vulnerable code paths (RSC, SSR, data
routers, the __manifest endpoint) are reachable from the admin UI, which
uses declarative routing only, but upgrading is a low-risk minor bump
that clears the findings and lets the react-router suppressions be
removed from the Trivy ignore list.
Restore the server image's ability to run as either the FHIR server or a
Spark Kubernetes executor, selected by the container's first argument.
Spark on Kubernetes launches executor pods with the single argument
"executor" and no command override, so the role selection lives in the
image entrypoint. A Bash dry-run test covers the role-selection logic
without Docker, a network, or a cluster.
Set the dispatching entrypoint as the image's entry behaviour in both the
docker and dockerPreRelease profiles, copy it into the image via Jib
extraDirectories with executable permissions, and remove the now-dead
jvmFlags (Jib ignores them once an explicit entrypoint is set). Run the
dispatch test during the test phase of these profiles, gated by skipTests.
The citation pointed to the Spark 4.0.0 entrypoint; the runtime is Spark
4.0.2, whose executor branch is identical.
Restore the dual-role server image for Spark on Kubernetes
The Varnish frontend cache previously inherited Varnish's default 60s
first-byte timeout, which caused long-running synchronous Pathling
queries to fail with a 503 before the server could respond.

Expose the timeout as a PATHLING_FIRST_BYTE_TIMEOUT environment variable,
substituted into the backend definition, and surface it through the Helm
chart as pathlingCache.firstByteTimeout (defaulting to the previous 60s).
Make the accepted JWS signing algorithms configurable
Derivation needs to build sources over the guarded source itself, which
requires a context. Both construction sites already hold one, so the
snapshot factory no longer needs it passed in separately.
A read narrowed by patient, group or _since resolved against the resource
types the data source knew at startup, so a type whose table was created
later was invisible to it while the same read without a filter succeeded.
Deriving a source now defers resolution to the source it was derived from,
which inherits that source's discovery, empty-dataset fallback and drift
guard, and composes across chained derivations.

Resolves the reported failure for $sql-run and the bulk export operations.
The bulk export reaches the same defect through the _since map and the
patient-compartment filter. No production change was needed beyond the
derivation fix; these guard it at the export boundary.
A type whose table existed but had not been read was absent from the data
source's type set, so an unnarrowed export silently omitted it until an
unrelated request happened to read it first. Enumeration now also lists the
database directory, which covers tables written by another process sharing
the warehouse, and the snapshot reuses it.
Cancelling a job deletes its directory asynchronously, so a test
teardown sweeping the jobs directory can race the server and fail
with NoSuchFileException. Provide a cleanup helper that treats a
concurrently deleted entry as already cleaned up.
The fallback test verified the behaviour but not the warning, so the
logging half of the contract could regress silently. Capture the log
events and require a WARN naming the failed listing. Resolves #2712.
ExportOperationIT.cleanup raced the server's asynchronous deletion of
a cancelled job's directory, failing intermittently with
NoSuchFileException. Switch the job directory teardowns to the
tolerant cleanup helper. Resolves #2711.
An overwrite import left the dataset pinned and cached at startup in
service, so reads could be answered from a plan predating the import,
and a schema-changing rewrite made any recache of that plan fail.
Refresh the data source for each imported resource type on completion,
as updates already do.
Cover the system-level $export paths that narrow the output by
permission-based resource type filtering and by _since, which were
previously covered only by unit tests over the derivation mechanism.
Resolves #2713.
Hoist the duplicated output file extraction helper into
ExportOperationUtil so the export integration tests parse manifests
through a single implementation.
SonarCloud could not connect the supplied-count guard to the
nullability of the individual naming forms (java:S2637).
Add a pathling.trustedCertificates value that accepts PEM certificates.
When set, an init container merges them into a copy of the image's
default cacerts and the server JVM is pointed at the merged truststore.
This allows the server to reach OIDC issuers and other TLS endpoints
whose certificates are issued by a private CA.
The chart tests depended on the helm-unittest plugin, which is not
part of the project's standard tooling and is not run in CI.
A trustedCertificates entry containing a concatenated bundle would
previously have only its first certificate imported, because keytool
reads a single certificate per file. Entries are now split into one
ConfigMap key per certificate, and an entry with no PEM certificate
fails the template render.
# Conflicts:
#	site/docs/server/authorization.md
Refresh served datasets after an import
Use the smaller button size for the execute, add to export set and save
to server buttons, and stop their labels wrapping onto two lines when
the card is narrow.
The chart now assumes that a full trust store is available as a
Kubernetes secret.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release Pull request that represents a new release server Issues relating to Pathling server.

Projects

Status: In progress

Development

Successfully merging this pull request may close these issues.

1 participant