Skip to content

Fix DOI updates, broker LDAP and live-check compatibility - #193

Merged
maxlastglance merged 4 commits into
mainfrom
fix/batch-doi-delete-amqp
Nov 7, 2026
Merged

maxlastglance merged 4 commits into
mainfrom
fix/batch-doi-delete-amqp

Conversation

@maxlastglance

@maxlastglance maxlastglance commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor

Batch lookup compatibility was undocumented, identifier metadata updates could erase the DOI before a provider request, the live runner assumed physical deletion on archival builds, and Compose passed literal LDAP bind credentials to RabbitMQ.

Four separate commits address #183 through #186:

  • Document the batch endpoint's minimum source revision and add a literal-HTTP regression for requested, duplicate and missing IDs. The endpoint was already introduced in Match current metadata and paginate complete search results #163; no new server defect is claimed for the older installation.
  • Preserve the authoritative DOI in both profiles, reject replacement through metadata edits, retain local drafts without provider calls, and verify provider resource identity and rollback with a stub. With the DOI profile enabled, a local draft receives a DOI when explicitly published.
  • Bring the existing portable live-check runner into the repository, refresh its inventory and add an explicit physical/archive contract. Archival checks include read-only behavior, repeated removal and historical subset/identifier reads. Reports record the chosen contract; comparison exposes contract differences. Add the offline checks to SDK CI.
  • Use RabbitMQ's environment interpolation syntax for LDAP bind credentials while retaining the LDAP username pattern. A disposable LDAP/broker integration test publishes a row and a dataframe with an ordinary account, reads both back and rejects an invalid password. No authentication or authorization policy is relaxed.

Closes #183. Closes #184. Closes #185. Closes #186.

Validation: 15 batch HTTP tests, 176 affected identifier tests, 342 SDK tests, 13 offline runner tests and the refreshed 98-operation/62-method inventory pass locally. The standalone LDAP/broker integration passes on s93 with disposable services. The complete isolated user-profile preview has 113 passed/6 failed and 25 cases outside its scope. The catalogue has 98 operations and 62 public SDK methods; the selected profile has no uncovered operation or method. No previously passing case failed. This run adds direct schema analysis and AMQP scope; its reports are not an identical-runner comparison with the earlier 109/6 result. The DOI-enabled gateway probe passes against a local provider stub, including rollback and retained identity. A targeted comparison-instance archive probe verifies identity, timestamp, repeated archive, denied writes and historical query rows without creating a new identifier. All executed PR checks pass on the final head; image publishing is intentionally skipped. The live runtime is Python 3.10.12; the previous preview used Python 3.11.18, so runtime differences also limit the comparison. DOI transport tests use a stub; no real provider credentials or publication are used for these fixtures.

A separate downstream failure is tracked in #194: the default Consumer's internal HTTP identity cannot write through the normal row endpoint. The successful end-to-end control used the same authorized ordinary fixture owner for the disposable Consumer's HTTP writes; broker reader credentials were unchanged. The LDAP fix does not repair the standard worker or establish production-wide ingestion readiness. The regular worker was not reconfigured. Published historical citation checks remain outside the targeted archive probe.

All eight temporary preview containers and the temporary directory were removed. Persistent service containers remain running and healthy.

Hold merge for maintainer review of the four commits. The regular s93 deployment is unchanged.

'password': credentials['password'], 'credentialId': ''},
timeout=(5, 30), allow_redirects=False)
if response.status_code in (301, 302, 303):
response = session_get(session, base, urljoin(response.url, response.headers['Location']))
try:
code = response.json().get('code') if isinstance(response.json(), dict) else None
if isinstance(code, str) and re.fullmatch(r'[a-zA-Z0-9_.-]+', code): entry['api_code'] = code
except ValueError: pass
identifier = getattr(value, 'id', None)
if identifier is None and self.last_response is not None and self.last_response.status_code == 201:
try: identifier = self.last_response.json().get('id') or self.last_response.json().get('uid')
except (ValueError, AttributeError): pass
@maxlastglance
maxlastglance force-pushed the fix/batch-doi-delete-amqp branch from 49f3579 to 3af8dd7 Compare November 7, 2026 11:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant