Prerequisites
OpenStack release, Keystone, message queue, database, required services
This page describes the environment Abacá requires before you run the install scripts. Abacá drives Manila, Nova, Neutron, Barbican, and an S3-compatible object store on your behalf — and most of these dependencies fail quietly when unmet, producing a share that never snapshots, a worker VM that never registers, or a dashboard panel that renders an empty table rather than a clear error. Reading this page before you deploy saves significant debugging time. The requirements are grouped by service area so you can verify them independently and understand the symptom each unmet requirement produces.
The following services and versions must be present and functional before you install Abacá. "Functional" means the service can actually perform its core operation — a pod reporting Ready proves very little, since Keystone's readiness probe passes without a working database.
Platform
- Red Hat OpenStack Services on OpenShift (RHOSO) 18 or later
- OpenShift 4.14 or later (hosts the Abacá control plane)
- Python 3.11 or later (3.12 recommended)
Required OpenStack services
- Keystone — with trusts enabled and domain-scoped tokens supported (2023.1 or later)
- Barbican — OpenStack Key Manager; a hard dependency, not optional
- Manila — Shared File System service, with snapshot support and IP-based access rules on the backend
- Nova — Compute, for booting worker VMs
- Neutron — Networking, for binding worker VM ports
- Glance — Image Service, for storing the worker VM image
Infrastructure
- MySQL or MariaDB (Galera) — a dedicated instance for Abacá; never share the control plane's database
- RabbitMQ — a dedicated instance for Abacá; never share the platform's shared broker
- S3-compatible object storage (AWS S3, Wasabi, MinIO, or compatible) with bucket versioning enabled and Object Lock enabled at bucket creation time
- RHEL 9 or later base cloud image (for worker VM builds), with
libguestfsavailable on the build host - Kopia binary (FIPS-built, version-pinned) 0.17.0 or later — baked into the worker image, not fetched at boot
Operator tooling
ocauthenticated to the target OpenShift clusteropenstackCLI (python-abacaclientinstalled) with admin credentialskustomize(for manifests)bash(fordeploy/rhoso/install scripts)
Optional
- Horizon — for the
abaca-dashboardplugin tox4.0 or later — for local development and testing- Docker or Podman with Compose — for the local developer stack only
Keystone role
- The
abaca_domain_ownerrole must exist in Keystone before any target template can be created.deploy/rhoso/01-identity.shcreates it. Without it, no principal can register a backup target and the install is functionally incomplete even if all services are up.
Run the preflight script first. It is read-only and exits non-zero on any condition that would cause the later install steps to fail.
bash deploy/rhoso/00-preflight.sh
The script checks cluster access, required CRDs, the platform CA bundle, and Keystone reachability. Review every FAIL and WARN line before continuing. Manila absence is reported as a warning, not a failure — the control plane installs without it, but end-to-end share protection requires it.
Step 1 — Verify cluster access and required CRDs
The preflight script confirms that the following CRDs are present. If any are missing, you are not running a RHOSO 18 control plane:
mariadbdatabases.mariadb.openstack.org
mariadbaccounts.mariadb.openstack.org
transporturls.rabbitmq.openstack.org
keystoneservices.keystone.openstack.org
keystoneendpoints.keystone.openstack.org
galeras.mariadb.openstack.org
rabbitmqs.rabbitmq.openstack.org
It also checks that cert-manager CRDs are present (required for the API service's internal TLS certificate) and that build.openshift.io BuildConfig is available.
Step 2 — Verify Keystone is functional
Check that tokens can actually be issued — both project-scoped and domain-scoped — and that the abaca_domain_owner role exists:
# Project-scoped token
openstack token issue
# Domain-scoped token — required for target template management
openstack --os-domain-name <your-domain> token issue
# The role must exist before any domain owner can be assigned
openstack role show abaca_domain_owner
If the domain-scoped token command fails, Keystone is not configured to issue domain-scoped tokens. This is the requirement that most often surprises operators: a project-scoped admin token is refused by Abacá's domain-owner endpoints because holding admin on a project says nothing about authority over a domain.
Step 3 — Verify Barbican is reachable
openstack secret list
Barbican is a hard dependency. Abacá stores no secrets in its own database — only Barbican hrefs and trust IDs. A Barbican outage makes enrollment, backup, and restore impossible.
Step 4 — Verify Manila backend health
openstack share service list
Every backend you intend to protect must show State: up. Backends in down state cause backup jobs to fail at provisioning_source with snapshots stuck in creating.
Additionally confirm the backend supports snapshots and IP-based access rules — backends without snapshot support cannot be protected by Abacá.
Step 5 — Verify Nova and Neutron port binding
Port binding failure is the dependency most likely to take the product down without implicating it: if Neutron cannot bind a port, no worker VM boots and every backup fails. Verify by booting a minimal test VM on the worker network:
openstack server create \
--image cirros \
--flavor m1.tiny \
--network <worker-network> \
--wait preflight-test-vm
openstack server delete preflight-test-vm
If this fails, the fault is in the cloud infrastructure, not in Abacá.
Step 6 — Verify worker VM network reachability
From a VM on the worker network (or using the test VM above), confirm all three paths are reachable. Workers must reach all three from a single network attachment:
# Abacá worker listener (control plane)
curl -sk https://<abaca-worker-listener>/
# S3 endpoint (object storage)
curl -sI https://<s3-endpoint>/
# Manila share export (NFS)
nc -z <manila-export-ip> 2049
A worker subnet with no egress (no router or floating IP) cannot host workers. If egress is unavailable via a Neutron router, attach workers to a provider network that reaches all three destinations directly.
Step 7 — Verify the Abacá schema is at head after db-sync
After running the install scripts, confirm the schema was built by alembic and not by some other mechanism:
# The alembic_version table must contain the current head revision.
# Tables present with an empty stamp means something other than alembic built them.
oc -n abaca exec deploy/abaca-api -- abaca-manage db_sync --check
Never delete a running db-sync Job. MySQL DDL does not roll back; killing alembic mid-upgrade leaves a half-built schema that poisons every subsequent migration.
Abacá uses oslo.config with an INI-style .conf file. Every option belongs to a named section. The table below covers the options most relevant to environment prerequisites and initial deployment. For the full surface, see the annotated sample configuration.
[DEFAULT] — Service catalog and endpoint resolution
| Option | Type | Default | Purpose |
|---|---|---|---|
catalog_type | string | share-protection | The service type Abacá registers in the Keystone catalog. Horizon and the OSC plugin resolve the service endpoint by this type — an incorrect value causes panels to render empty and CLI commands to fail with endpoint-not-found. |
endpoint_type | string | publicURL | Which endpoint variant (publicURL, internalURL, adminURL) Abacá uses when resolving other services. Horizon resolves Abacá at its publicURL; that endpoint must serve a certificate trusted by Horizon's pod or panels degrade to "No items to display". |
[api] — API service binding
| Option | Type | Default | Purpose |
|---|---|---|---|
bind_host | string | 0.0.0.0 | Interface the API process listens on. |
bind_port | integer | 9797 | Port the API process listens on. |
noauth | boolean | false | Disables Keystone token validation. Never set true in production. Used only by the local Docker Compose dev stack. |
max_limit | integer | 1000 | Maximum number of items returned per list response. |
default_limit | integer | 100 | Default page size for list responses when the caller omits limit. |
[conductor] — Orchestration and worker fleet
| Option | Type | Default | Purpose |
|---|---|---|---|
scheduler_interval | integer | 60 | Seconds between policy-driven backup scheduling sweeps. |
reconciliation_interval | integer | 300 | Seconds between reconciliation sweeps that recover orphaned or stuck jobs. |
worker_heartbeat_deadline_seconds | integer | 60 | A worker that has not sent a heartbeat within this window is considered dead. |
worker_heartbeat_interval_seconds | integer | 10 | How often each worker VM sends a heartbeat to the conductor. |
min_workers | integer | 1 | The conductor boots additional workers if the fleet falls below this count. |
worker_boot_cooldown_seconds | integer | 180 | Minimum time between successive worker boot attempts, preventing rapid re-try storms. |
worker_boot_max_failures | integer | 3 | Maximum consecutive boot failures before the conductor stops attempting to boot workers. |
worker_boot_failure_window_seconds | integer | 7200 | Window over which worker_boot_max_failures is counted. |
worker_boot_grace_seconds | integer | 1200 | Time allowed for a newly booted worker to register before it is considered failed. |
worker_boot_os_cloud | string | abaca-service | The clouds.yaml entry the conductor uses when calling Nova to boot workers. Must have rights to boot VMs in the Domain's service project. |
worker_boot_image | string | abaca-worker-0.23.1 | Glance image name for worker VMs. Must carry the abaca_worker_image=1 property. Rebuild and update this after any Abacá code change. |
worker_boot_flavor | string | m1.small | Nova flavor for worker VMs. The flavor's disk must exceed the worker image size (reference image is ~6 GiB raw). |
worker_boot_network | string | (required) | Neutron network to attach worker VMs to. Must have egress to the S3 endpoint, the Abacá worker listener, and Manila share exports. |
worker_api_url | string | (required) | The HTTPS URL at which worker VMs reach the Abacá worker listener. Name resolution from the worker subnet must resolve this hostname. |
worker_api_ca_file | string | (required if self-signed) | Path to the CA bundle the conductor presents to worker VMs for TLS verification. |
worker_api_host_aliases | list | "" | IP=HOSTNAME pairs injected into the worker VM's /etc/hosts. Use this when DNS on the worker subnet cannot resolve the listener's hostname — do not substitute a bare IP in worker_api_url, as that fails TLS hostname verification. |
worker_boot_key_name | string | (optional) | Nova keypair name to inject into worker VMs for emergency access. The keypair must exist in the project that owns the workers. |
queued_job_deadline_seconds | integer | 300 | Maximum time a job may sit in queued state before the reconciliation loop marks it error. |
maintenance_interval_seconds | integer | 604800 | Seconds between Kopia repository maintenance runs (default: 7 days). |
catalogue_sync_interval_seconds | integer | 3600 | Seconds between catalog synchronization sweeps. |
usage_sample_interval_seconds | integer | 21600 | Seconds between usage metering samples. |
sweep_command_wait_seconds | integer | 120 | Time the reconciliation loop waits for a dispatched command to be acknowledged before considering it lost. |
worker_token_ttl_seconds | integer | 1800 | Lifetime of the short-lived token issued to each worker VM for authenticating to the worker listener. |
[database] — Relational store
| Option | Type | Default | Purpose |
|---|---|---|---|
connection | string | (required) | SQLAlchemy connection URL for Abacá's dedicated MariaDB/MySQL (Galera) instance. Must point at a dedicated database, never the platform's shared instance. |
[enrollment] — Target registration dispatch
| Option | Type | Valid values | Purpose |
|---|---|---|---|
dispatch | string | rpc, inline | How enrollment jobs are dispatched. rpc (default) casts to the conductor via oslo.messaging. inline runs on the API thread and is refused at startup unless api.noauth=True — it exists only for the unit-test harness. Always use rpc in any real environment. |
[kopia] — Backup engine
| Option | Type | Default | Purpose |
|---|---|---|---|
binary | string | kopia | Path to the Kopia binary inside worker VMs. |
require_fips_profile | boolean | true | Reject repository creation unless the Kopia binary supports --key-derivation-algorithm (FIPS-140 PBKDF2). Set false only in development environments where a non-FIPS Kopia build is in use. |
subprocess_timeout | integer | 3600 | Seconds before the conductor kills a Kopia subprocess and raises KopiaTimeout, which maps to operator_action_required. |
executor | string | http | http (production) dispatches Kopia commands to worker VMs over the worker listener. ephemeral_container runs Kopia locally in a container and is development-only; every process using it logs a startup WARNING. |
image | string | (required for ephemeral_container) | Container image for the ephemeral_container executor. Not used by the production http executor. |
container_engine | string | docker or podman | Container runtime for the ephemeral_container executor. |
container_network | string | (optional) | Docker/Podman network for the ephemeral_container executor. |
[worker] — Worker VM agent
| Option | Type | Default | Purpose |
|---|---|---|---|
capacity_slots | integer | (required) | Number of concurrent jobs this worker VM can run. The fleet picker only assigns a new job to a worker whose running job count is strictly below this limit. |
mount_base | string | /var/lib/abaca/mnt | Base directory inside the worker VM where Manila share exports are mounted for backup. |
command_timeout_seconds | integer | 300 | Maximum time the worker waits for a command to complete before aborting. |
command_lease_seconds | integer | 120 | How long the worker holds a claimed command lease before it must be renewed. |
max_command_duration_seconds | integer | 21600 | Absolute maximum wall-clock duration for a single backup or restore command. |
listener_port | integer | 9798 | Port on which the worker listener (inside the control plane) accepts worker registrations and command polls. |
long_poll_seconds | integer | 20 | Duration of each long-poll request from the worker to the listener when waiting for a new command. |
progress_interval_seconds | integer | 30 | How often the worker reports transfer progress back to the conductor during an active job. |
claim_poll_interval_seconds | float | 2 | Seconds between command-claim poll attempts. |
command_poll_interval_seconds | float | 2 | Seconds between command-status poll attempts. |
api_url | string | (required) | URL at which the worker contacts the Abacá worker listener. Set by the conductor at boot time via user-data. |
token | string | (required) | Short-lived token the worker uses to authenticate to the listener. Set by the conductor at boot time. |
api_ca_file | string | (optional) | CA bundle for verifying the worker listener's TLS certificate. |
id | string | (required) | Unique identifier for this worker VM instance. Set by the conductor at boot time. |
[abaca] — Service identity
| Option | Type | Default | Purpose |
|---|---|---|---|
service_user_id | string | (required) | Keystone user ID of the Abacá service account. |
service_user_name | string | (required) | Keystone user name of the Abacá service account. |
worker_project_id | string | (required) | Keystone project ID of the Domain's service project where worker VMs are booted. |
worker_project_name | string | (required) | Keystone project name of the Domain's service project. |
The sections below describe the verification steps you will perform most often during bring-up and ongoing operations. All openstack commands use the python-abacaclient OSC plugin, which adds openstack share protection … subcommands.
Check that the service is registered and reachable
After running the install scripts, confirm the Abacá service endpoint appears in the catalog under the share-protection type:
openstack endpoint list --service share-protection
If this returns no rows, Horizon and the OSC plugin cannot locate the service. The endpoint must appear with the publicURL, internalURL, and adminURL variants.
Verify identity prerequisites before creating your first target
Target templates are a domain-level operation. Confirm your user holds the abaca_domain_owner role on the domain before attempting to create one:
# Confirm the role exists
openstack role show abaca_domain_owner
# Confirm your user has it on the target domain
openstack role assignment list \
--role abaca_domain_owner \
--domain <your-domain> \
--user <your-user>
# Confirm you can obtain a domain-scoped token (required for template operations)
openstack --os-domain-name <your-domain> token issue
Verify the worker fleet is healthy
After the control plane is up, confirm the conductor has booted at least one worker VM and that it is registered:
openstack share protection worker list
A healthy fleet shows at least one worker with a recent heartbeat timestamp. If the list is empty or all workers show an expired heartbeat, check Nova port binding (see Troubleshooting) and verify conductor.worker_boot_network points at a network with egress to the worker listener.
Check the Abacá schema version
After the db-sync Job completes, the alembic_version table must contain the current head revision. Use the management CLI to verify:
oc -n abaca exec deploy/abaca-api -- abaca-manage db_sync --check
Verify Barbican custody separation
Abacá uses two separate Barbican custody paths that must never be merged. S3 credentials (s3_access_key_ref / s3_secret_key_ref) live in the Domain's service project; Kopia repository passwords (kopia_key_ref) live in each project's own Barbican namespace. Merging these grants whoever controls storage the ability to read every project's backups. Verify your Barbican policy enforces this separation after enrollment.
Enable Horizon multi-domain login
If you are deploying the abaca-dashboard plugin, Horizon must have multi-domain login enabled. Without it, any user outside the Default domain cannot authenticate at all — the login form re-renders with no error. Set this on the OpenStackControlPlane CR (this is a cluster-wide change, not part of any Abacá install script):
# OpenStackControlPlane .spec.horizon.template.customServiceConfig
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = 'Default'
Existing Default-domain users continue to work by entering Default in the new Domain field.
Example 1 — Run the preflight check before deploying
Always run this first. It is read-only and exits non-zero on any blocking condition.
bash deploy/rhoso/00-preflight.sh
Expected output (all lines should read ok):
--- cluster access ---
ok oc authenticated as system:admin on https://api.cluster.example.com:6443
ok namespace abaca present
--- required CRDs (operator-backed resources we rely on) ---
ok mariadbdatabases.mariadb.openstack.org
ok mariadbaccounts.mariadb.openstack.org
ok transporturls.rabbitmq.openstack.org
ok keystoneservices.keystone.openstack.org
ok keystoneendpoints.keystone.openstack.org
ok build.openshift.io (in-cluster image builds)
ok cert-manager (internal TLS for the API service)
--- control-plane infrastructure ---
ok database + message bus: Abaca's own (abaca-galera / abaca-rabbitmq)
ok galeras.mariadb.openstack.org (Abaca creates its own instance)
ok rabbitmqs.rabbitmq.openstack.org (Abaca creates its own instance)
ok secret/combined-ca-bundle in openstack (platform CA trust)
preflight OK.
If any line reads FAIL, resolve that condition before running install.sh.
Example 2 — Verify Keystone identity prerequisites
Confirm project-scoped and domain-scoped token issuance, and that the abaca_domain_owner role exists:
# Project-scoped token
openstack token issue -c id -f value
# Domain-scoped token (required for target template operations)
openstack --os-domain-name acme token issue -c id -f value
# The role must exist
openstack role show abaca_domain_owner -c name -f value
Expected output for each:
gAAAAAB... # a Keystone token
gAAAAAB... # a second, domain-scoped token
abaca_domain_owner
If the domain-scoped command fails with You are not authorized to perform the requested action, Keystone cannot issue domain-scoped tokens for this user. Check that the user holds the abaca_domain_owner role on the domain (not merely on a project within it).
Example 3 — Verify the service catalog entry
After running deploy/rhoso/01-identity.sh, confirm the service and its three endpoints are registered:
openstack endpoint list --service share-protection -c "Service Name" -c Interface -c URL
Expected output:
+-----------------+-----------+------------------------------------------+
| Service Name | Interface | URL |
+-----------------+-----------+------------------------------------------+
| share-protection| public | https://abaca.apps.cluster.example.com/v1|
| share-protection| internal | http://abaca-api.abaca.svc:9797/v1 |
| share-protection| admin | http://abaca-api.abaca.svc:9797/v1 |
+-----------------+-----------+------------------------------------------+
If this returns no rows, Horizon and the OSC plugin cannot discover Abacá and all subsequent operations will fail.
Example 4 — Verify worker network reachability from a test VM
Boot a minimal VM on the worker network and confirm all three required paths are reachable from it:
# Boot a test VM on the worker network
openstack server create \
--image cirros \
--flavor m1.tiny \
--network <worker-network> \
--wait \
reachability-probe
# Obtain its floating IP or use console access, then from inside the VM:
curl -sk https://<abaca-worker-listener>/ # must return HTTP response
curl -sI https://<s3-endpoint>/ # must return HTTP 200 or 403
nc -z <manila-export-ip> 2049 && echo "NFS reachable"
# Clean up
openstack server delete reachability-probe
All three must succeed from the same network attachment. If any fail, the worker fleet will be unable to complete backup jobs even if Nova successfully boots the worker VM.
Example 5 — Confirm the database schema is at head
After the db-sync Kubernetes Job completes, verify alembic stamped the schema correctly:
# Check the Job completed successfully
oc -n abaca get job abaca-db-sync
# Verify schema version via the management CLI
oc -n abaca exec deploy/abaca-api -- abaca-manage db_sync --check
The db_sync --check command exits zero only when alembic_version contains the current head revision. A non-zero exit or an empty alembic_version table means the schema was not built by alembic — do not start the API or conductor until this is resolved.
Most of these present as "Abacá is broken" while the actual fault is in the underlying infrastructure. Use the symptom as a starting point, then follow the diagnostic steps.
Every backup fails; Nova reports "Exhausted all hosts available for retrying build failures"
- Cause: Neutron cannot bind a port on the worker network. This is the dependency most likely to take the product down without implicating Abacá directly.
- Fix: Boot a plain Cirros VM on the same network. If that also fails, the fault is in the cloud infrastructure, not in Abacá. Check the Nova scheduler logs and Neutron ML2 agent logs on the hypervisor. On VMware ESXi with a Standard vSwitch, the default port-group security (Promiscuous = Reject, MAC address changes = Reject) causes unicast replies to never reach the Neutron router, which looks like intermittent port binding failure from Nova's perspective.
Worker VM is ACTIVE in Nova but never registers with the conductor
- Cause 1: DNS on the worker subnet cannot resolve the hostname in
conductor.worker_api_url. The agent starts, tries to connect to the listener, and silently fails — indistinguishable from a stale image without checking worker console output. - Fix 1: Set
conductor.worker_api_host_aliasestoIP=HOSTNAMEpairs for the listener. Do not substitute a bare IP inworker_api_url— that breaks TLS hostname verification even with the correct CA. - Cause 2: The worker image was built before the current version of
abaca-worker-agent. A stale image runs old code; the symptom is silence rather than an error. - Fix 2: Rebuild the worker image (
deploy/rhoso/worker/20-worker-image.sh) and updateconductor.worker_boot_imageto the new Glance image name. Worker VMs must not fetch packages from the internet at boot — all components must be baked in.
Backup jobs fail at provisioning_source; Manila snapshots stay in creating
- Cause: The Manila share backend is down or the driver does not support snapshots.
- Fix: Run
openstack share service listand confirm every backend you intend to protect showsState: up. If a backend is down, resolve the Manila-side issue. If the backend does not support snapshots, it cannot be protected — Abacá never backs up a live share as the primary strategy.
Dashboard panels render "No items to display" for a tenant that has backups
- Cause: The Abacá
publicURLendpoint's TLS certificate is not trusted by the Horizon pod. A failed fetch degrades silently to an empty list. - Fix: Confirm the public endpoint serves a certificate signed by the CA bundle that OpenStack pods mount (
secret/combined-ca-bundlein the control plane namespace). Check Horizon pod logs for TLS verification errors against theshare-protectionendpoint.
Horizon panels vanish, or another product's Horizon panels vanish after deploying the dashboard plugin
- Cause: The Horizon image was replaced rather than layered. The
abaca-dashboardplugin must be layered onto the existing Horizon image — replacing it removes any panels from other products already present in the base. - Fix: Re-apply the layering process per
deploy/rhoso/08-dashboard.sh. If you manage your own Horizon build pipeline, consumeabaca-dashboardandpython-abacaclientas packages with--no-depsand--ignore-requires-python(the RHOSO Horizon image ships Python 3.9). The layer must also be rebuilt and re-applied whenever the base Horizon image is updated, or the vendor's update silently reverts the panels.
A redeployed dashboard image is "deployed" but the panels are unchanged; two browser sessions behave differently
- Cause: The Horizon image is referenced by
:latesttag. WithimagePullPolicy: IfNotPresent, pods keep cached layers and the operator sees no diff in the spec — so no rollout occurs. - Fix: Pin the image reference to a digest (
@sha256:…) so every change produces a spec diff that triggers a rollout.
A tenant outside the Default domain cannot log in to Horizon; the login form re-renders with no error
- Cause: Horizon multi-domain login is disabled. There is no Domain field on the login form, so users in any domain other than
Defaultcannot authenticate. - Fix: Set the following in the
OpenStackControlPlaneCR (this is a cluster-wide change — it adds a Domain field for all users):
# .spec.horizon.template.customServiceConfig
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = 'Default'
Existing Default-domain users keep working by entering Default in the new field.
Target stuck in registering state indefinitely
- Cause 1: No worker VM is available to run the enrollment job. Check
openstack share protection worker listfor a healthy, registered worker. - Cause 2: The enrollment job was never dispatched — confirm
enrollment.dispatch = rpcin the conductor's configuration and that the conductor is running. - Fix: Resolve the worker fleet issue (see the first entry above) or correct the dispatch configuration. The reconciliation loop (
conductor.reconciliation_interval, default 300 seconds) will eventually walk the orphaned job to anerrorstate withoperator_action_required, at which point you can re-enroll.
Enrollment fails with an error about a missing repository password
- Cause: You are attempting to adopt an existing Kopia repository (the bucket already contains a repository from a previous enrollment) without supplying its password. Kopia repositories are client-side encrypted and Abacá has no way to recover the password — it is a tenant-held secret.
- Fix: Supply the
repository_password_ref(a Barbican href pointing to the original repository password) when re-enrolling. This is classified astenant_action_required.
The db-sync Job completes but alembic_version is empty; API startup fails
- Cause: Something other than alembic created the database tables — for example, a
create_all()call from an older version of the code that does not stamp the alembic revision. A half-built schema poisons every subsequent migration. - Fix: Drop and recreate the Abacá database, then re-run the db-sync Job. Do not attempt to manually stamp the revision — the migration history will be inconsistent. Never delete a running db-sync Job; MySQL DDL does not roll back.
Workers on the tenant network cannot reach the S3 endpoint or the Abacá worker listener
- Cause: The Neutron router is not forwarding traffic. On certain hypervisors (VMware ESXi Standard vSwitch, VMware Distributed vSwitch, or nested-virt IaaS environments), unicast replies destined for the router's
fa:16:3e:*MAC are dropped by the underlay because the port-group security policy rejects non-native MACs. - Diagnosis: Run
tcpdumpon the hypervisor's external NIC while pinging the router's external IP from another host on the LAN. If you see outbound ARP but no reply, you are in the filtered-underlay case. - Fix: For development environments, use
deploy/kolla/setup-host-nat-egress.shto plumb a host-side NAT gateway. For production, resolve the vSwitch security policy (set Promiscuous mode or MAC learning at the port group), or attach workers directly to a provider network that has unfiltered layer-3 reachability to all three required destinations.