Skip to content
GitHub
documentation

Connecting to Bloom

Send test case outcomes from Bud to Bloom PLM, and answer report requests from Bloom.

Bud and Bloom remain independently deployable. Bud does not require Bloom: connect the two when you want test case outcomes from Bud to reach Bloom.

Deploy both apps and give each one the other’s public URL: set BUD_APP_URL and BLOOM_APP_URL in both .env files, so each app shows navigation links to the other. These URLs only add links. Result synchronization requires the separate credentials described under Secrets for the sync.

# Set in both .env files
BUD_APP_URL=https://bud.example.com
BLOOM_APP_URL=https://bloom.example.com

On Cloudron, set the link with cloudron env set. See Install on Cloudron.

Before the two can exchange credentials, each side needs one secret that is only required for the sync. Bud stores the Bloom token encrypted at rest under a Fernet key, and Bloom hashes the service tokens it issues with an independent pepper of at least 32 characters. For Docker Compose, set both, then restart. Cloudron generates these secrets automatically.

# Generate the Fernet key for Bud
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
# Bud .env: encrypts the saved Bloom credentials
BUD_INTEGRATION_ENCRYPTION_KEY=<the generated key>
# Bloom .env: peppers the service tokens Bloom issues to Bud
SERVICE_TOKEN_PEPPER=<independent random value, 32+ characters>
  1. In Bloom, set SERVICE_TOKEN_PEPPER and restart Bloom.
  2. In Bloom, open Settings → PLM Integration Token Management, select Create Credential, and generate a service token with test-results:write scope.
  3. Copy the blm_sync_… credential when it is shown. Bloom displays it only once.
  4. In Bud, set BUD_INTEGRATION_ENCRYPTION_KEY and restart Bud.
  5. In Bud, open Settings → Bloom PLM Integration and paste Bloom’s reachable URL and that token.

The credential is scoped to test-results:write, revocable, and time-limited. Bud encrypts it at rest and never returns it through its settings API. Saving the Bloom URL and the credential enables result synchronization directly. Clearing the saved credential disables it.

On the test side, give a test class BloomMetaData("PRJ", "001") so every uploaded result carries a Bloom tc_id.

from budtestlibrary import BudTestCase, BloomMetaData
class TraceableTest(BudTestCase):
bloom_metadata = BloomMetaData("PRJ", "001")

Check the IDs a suite claims before uploading results with budtestlibrary check. See Check Bloom metadata.

In Bloom, test cases are linked to the requirements they verify. See Typed links and Coverage.

Bud then posts one aggregated execution outcome per tc_id to Bloom, which updates the matching test case and its campaign line items. Result sync carries execution status only: Bud never creates or synchronizes Bloom campaigns, suites, requirements, or documents.

When Bud syncs a run’s results, Bloom answers with the test suite that holds the synced test cases. Bud keeps that reference on the run and shows it on the dashboard, the run list, and the run detail page. With no Bloom configured, the reference is simply absent.

The Bloom sync event on a run says how many results had no Bloom tc_id and how many skipped results were not sent.

Users with the Publish to Bloom permission publish a run’s report to Bloom. The run must be completed and identify one project through canonical Bloom test case IDs. A user without that permission finds Request access in its place. See Roles and access.

Bloom readers can request a report beside a linked Bud run. Bud collects those requests through the configured Bloom connection once a minute.

  • Report publishers see pending requests on the dashboard and run page. Configured SMTP also emails active publishers.
  • Successful publication closes matching requests in that Bloom project.
  • Publishers can refuse with a reason, which returns to the reader. A request whose run cannot be published can be refused the same way.
  • Failed publication keeps the request open.

The configured integration credential exchanges report requests, including the reader’s name and email, as well as test outcomes and published reports. Collection resumes after a restart. Unsent email is retried and successful recipients are recorded. A connection failure leaves the request in Bloom for a later collection.

Bloom’s half of this setup, the pepper and the service token, is described in Connecting to Bud.