OpenKeel: the sovereign French Cloud solution of the inherent group, with a European reach Discover inherent

Reverse-spec · Services

manila — Interactions

Interactions — manila — branch stable/2026.2

Branch stable/2026.2 @ 4fbc4b4f3688 — repository https://opendev.org/openstack/manila — analysed on 2026-10-29

Manila talks to five kinds of systems: its SQL database (every process), RabbitMQ (RPC between the four processes, and notifications), Keystone (tokens, through keystonemiddleware), other OpenStack services (Nova, Neutron, Cinder, Glance, Barbican — only for some drivers and features), and the storage back ends (driver-specific protocols: SSH, REST, librados…). The RPC frames below were recorded by the client scenarios ([_rewrite/rpc-frames_stable-2026.2.json](_rewrite/rpc-frames_stable-2026.2.json), 247 frames).

RabbitMQ

Topology

oslo.messaging, driver selected by [DEFAULT]/transport_url. Manila never calls rpc.set_defaults (manila/rpc.py:82-83 is unused), so the **control exchange is the oslo.messaging default openstack**.

ExchangeTypeRouting key / queueProducerConsumer
openstacktopicmanila-scheduler ([DEFAULT]/scheduler_topic, manila/common/config.py:59-61)manila-api, manila-shareevery manila-scheduler
openstacktopicmanila-share.<host>@<backend> ([DEFAULT]/share_topic + server, manila/common/config.py:62-64)manila-api, manila-scheduler, other manila-sharethe manila-share service of that back end
openstacktopicmanila-data ([DEFAULT]/data_topic, manila/common/config.py:65-67)manila-api, manila-sharemanila-data
manila-scheduler_fanoutfanoutall schedulersmanila-share (update_service_capabilities)every manila-scheduler
manila-share_fanoutfanoutall share servicesmanila-scheduler (publish_service_capabilities)every manila-share
notifications exchange (openstack, topic notifications.<priority>)topic[oslo_messaging_notifications]/topicsmanila-api, manila-scheduler, manila-shareCeilometer and other listeners

Each manila-share process runs one service per back end of [DEFAULT]/enabled_share_backends, with host <[DEFAULT]/host>@<backend> (manila/cmd/share.py:44-51); the RPC server listens on manila-share.<host>@<backend> (manila/service.py:160-163). The share-side RPC client strips the pool part of a host (host@backend#pool → host@backend) before sending (manila/share/rpcapi.py:308).

Serialisation: RequestContextSerializer wraps the request context (keys auth_token, user_id, project_id, roles, is_admin, request_id, read_deleted, service_catalog, quota_class, remote_address, timestamp… — 25 keys recorded) and passes arguments through the oslo JSON codec; database models are converted to dictionaries by jsonutils.to_primitive (manila/rpc.py:104-140). There are no versioned objects: the receiving manager gets plain dicts and usually re-reads the rows from the database.

RPC methods

RPC_API_VERSION: share 1.30 (manila/share/manager.py:290, client cap manila/share/rpcapi.py:102), scheduler 1.11 (manila/scheduler/manager.py:71, manila/scheduler/rpcapi.py:49), data 1.1 (manila/data/manager.py:118, manila/data/rpcapi.py:48). "(observed)" marks the methods seen in the recorded frames.

MethodModeVersionTopicArgumentsClient (*/rpcapi.py)Server method
migration_startcast1.0manila-datashare_id, ignore_list, share_instance_id, dest_share_instance_id, connection_info_src, connection_info_destmanila/data/rpcapi.py:54manila/data/manager.py:136
data_copy_cancelcall1.0manila-datashare_idmanila/data/rpcapi.py:66manila/data/manager.py:207
data_copy_get_progresscall1.0manila-datashare_idmanila/data/rpcapi.py:70manila/data/manager.py:219
create_backup (observed)cast1.1manila-databackupmanila/data/rpcapi.py:75manila/data/manager.py:393
delete_backupcast1.1manila-databackupmanila/data/rpcapi.py:79manila/data/manager.py:558
restore_backupcast1.1manila-databackup, share_idmanila/data/rpcapi.py:83manila/data/manager.py:629
create_share_instance (observed)cast1.2manila-schedulerrequest_spec, filter_propertiesmanila/scheduler/rpcapi.py:61manila/scheduler/manager.py:120
update_service_capabilities (observed)fanout cast1.10manila-schedulerservice_name, host, capabilities, timestampmanila/scheduler/rpcapi.py:71manila/scheduler/manager.py:106
get_pools (observed)call1.9manila-schedulerfilters, cachedmanila/scheduler/rpcapi.py:80manila/scheduler/manager.py:136
create_share_group (observed)cast1.8manila-schedulershare_group_id, request_spec, filter_propertiesmanila/scheduler/rpcapi.py:102manila/scheduler/manager.py:263
migrate_share_to_hostcast1.7manila-schedulershare_id, host, force_host_assisted_migration, preserve_metadata, writable, nondisruptive, preserve_snapshots, new_share_network_id, new_share_type_id, request_spec, filter_propertiesmanila/scheduler/rpcapi.py:116manila/scheduler/manager.py:166
create_share_replica (observed)cast1.5manila-schedulerrequest_spec, filter_propertiesmanila/scheduler/rpcapi.py:134manila/scheduler/manager.py:305
manage_share (observed)cast1.6manila-schedulershare_id, driver_options, request_spec, filter_propertiesmanila/scheduler/rpcapi.py:143manila/scheduler/manager.py:140
extend_share (observed)cast1.11manila-schedulermanila/scheduler/rpcapi.py:161manila/scheduler/manager.py:336
create_share_instance (observed)cast1.4manila-share, server host@backendshare_instance_id, request_spec, filter_properties, snapshot_idmanila/share/rpcapi.py:110manila/share/manager.py:2184
manage_share (observed)cast1.1manila-share, server host@backendshare_id, driver_optionsmanila/share/rpcapi.py:120manila/share/manager.py:3080
unmanage_share (observed)cast1.1manila-share, server host@backendshare_idmanila/share/rpcapi.py:128manila/share/manager.py:3293
manage_snapshotcast1.9manila-share, server host@backendsnapshot_id, driver_optionsmanila/share/rpcapi.py:134manila/share/manager.py:3196
unmanage_snapshotcast1.9manila-share, server host@backendsnapshot_idmanila/share/rpcapi.py:142manila/share/manager.py:3390
manage_share_servercast1.19manila-share, server host@backendshare_server_id, identifier, driver_optsmanila/share/rpcapi.py:150manila/share/manager.py:3456
unmanage_share_servercast1.19manila-share, server host@backendshare_server_id, forcemanila/share/rpcapi.py:158manila/share/manager.py:3577
revert_to_snapshot (observed)cast1.18manila-share, server host@backendsnapshot_id, reservationsmanila/share/rpcapi.py:165manila/share/manager.py:3627
delete_share_instance (observed)cast1.27manila-share, server host@backendshare_instance_id, force, deferred_deletemanila/share/rpcapi.py:174manila/share/manager.py:3777
migration_startcast1.15manila-share, server host@backendshare_id, dest_host, force_host_assisted_migration, preserve_metadata, writable, nondisruptive, preserve_snapshots, new_share_network_id, new_share_type_idmanila/share/rpcapi.py:186manila/share/manager.py:1664
share_server_migration_startcast1.21manila-share, server host@backendshare_server_id, dest_host, writable, nondisruptive, preserve_snapshots, new_share_network_idmanila/share/rpcapi.py:204manila/share/manager.py:6374
share_server_migration_checkcall1.21manila-share, server host@backendshare_server_id, dest_host, writable, nondisruptive, preserve_snapshots, new_share_network_idmanila/share/rpcapi.py:219manila/share/manager.py:6282
share_server_migration_cancelcast1.21manila-share, server host@backendsrc_share_server_id, dest_share_server_idmanila/share/rpcapi.py:233manila/share/manager.py:6768
share_server_migration_get_progresscall1.21manila-share, server host@backendsrc_share_server_id, dest_share_server_idmanila/share/rpcapi.py:243manila/share/manager.py:6839
share_server_migration_completecast1.21manila-share, server host@backendsrc_share_server_id, dest_share_server_idmanila/share/rpcapi.py:252manila/share/manager.py:6524
connection_get_infocall1.12manila-share, server host@backendshare_instance_idmanila/share/rpcapi.py:260manila/share/manager.py:1250
delete_share_servercast1.0manila-share, server host@backendshare_servermanila/share/rpcapi.py:267manila/share/manager.py:4892
create_snapshot (observed)cast1.0manila-share, server host@backendshare_id, snapshot_idmanila/share/rpcapi.py:274manila/share/manager.py:4116
delete_snapshot (observed)cast1.27manila-share, server host@backendsnapshot_id, force, deferred_deletemanila/share/rpcapi.py:283manila/share/manager.py:4192
create_replicated_snapshotcast1.11manila-share, server host@backendsnapshot_id, share_idmanila/share/rpcapi.py:292manila/share/manager.py:4311
delete_replicated_snapshotcast1.11manila-share, server host@backendsnapshot_id, share_id, forcemanila/share/rpcapi.py:301manila/share/manager.py:4445
update_access (observed)cast1.14manila-share, server host@backendshare_instance_idmanila/share/rpcapi.py:310manila/share/manager.py:4648
update_access_for_instancescast1.21manila-share, server host@backendshare_instance_ids, share_server_idmanila/share/rpcapi.py:317manila/share/manager.py:4656
publish_service_capabilities (observed)fanout cast1.0manila-share, server host@backendmanila/share/rpcapi.py:323manila/share/manager.py:4711
transfer_accept (observed)call1.25manila-share, server host@backendmanila/share/rpcapi.py:335manila/share/manager.py:4053
extend_share (observed)cast1.2manila-share, server host@backendshare_id, new_size, reservationsmanila/share/rpcapi.py:340manila/share/manager.py:5002
shrink_share (observed)cast1.3manila-share, server host@backendshare_id, new_sizemanila/share/rpcapi.py:349manila/share/manager.py:5062
create_share_group (observed)cast1.16manila-share, server host@backendshare_group_idmanila/share/rpcapi.py:357manila/share/manager.py:5166
delete_share_groupcast1.16manila-share, server host@backendshare_group_idmanila/share/rpcapi.py:363manila/share/manager.py:5324
create_share_group_snapshotcast1.16manila-share, server host@backendshare_group_snapshot_idmanila/share/rpcapi.py:369manila/share/manager.py:5362
delete_share_group_snapshotcast1.16manila-share, server host@backendshare_group_snapshot_idmanila/share/rpcapi.py:376manila/share/manager.py:5460
create_share_replica (observed)cast1.8manila-share, server host@backendshare_replica_id, request_spec, filter_properties, share_idmanila/share/rpcapi.py:385manila/share/manager.py:2486
delete_share_replica (observed)cast1.8manila-share, server host@backendshare_replica_id, share_id, forcemanila/share/rpcapi.py:395manila/share/manager.py:2671
promote_share_replica (observed)cast1.24manila-share, server host@backendshare_replica_id, share_id, quiesce_wait_timemanila/share/rpcapi.py:405manila/share/manager.py:2768
update_share_replicacast1.8manila-share, server host@backendshare_replica_id, share_idmanila/share/rpcapi.py:414manila/share/manager.py:2953
migration_completecast1.12manila-share, server host@backendsrc_instance_id, dest_instance_idmanila/share/rpcapi.py:423manila/share/manager.py:1907
migration_cancelcast1.12manila-share, server host@backendsrc_instance_id, dest_instance_idmanila/share/rpcapi.py:431manila/share/manager.py:2071
migration_get_progresscall1.12manila-share, server host@backendsrc_instance_id, dest_instance_idmanila/share/rpcapi.py:440manila/share/manager.py:2139
provide_share_servercall1.12manila-share, server host@backendshare_instance_id, share_network_id, snapshot_idmanila/share/rpcapi.py:449manila/share/manager.py:1083
create_share_servercast1.20manila-share, server host@backendshare_server_id, share_instance_idmanila/share/rpcapi.py:458manila/share/manager.py:1064
snapshot_update_accesscast1.17manila-share, server host@backendsnapshot_instance_idmanila/share/rpcapi.py:466manila/share/manager.py:5628
update_share_network_security_servicecast1.22manila-share, server host@backendshare_network_id, new_security_service_id, current_security_service_idmanila/share/rpcapi.py:475manila/share/manager.py:7029
check_update_share_network_security_servicecast1.22manila-share, server host@backendshare_network_id, new_security_service_id, current_security_service_idmanila/share/rpcapi.py:487manila/share/manager.py:7037
check_update_share_server_network_allocationscast1.23manila-share, server host@backendshare_network_id, new_share_network_subnetmanila/share/rpcapi.py:499manila/share/manager.py:7121
update_share_server_network_allocationscast1.23manila-share, server host@backendshare_network_id, new_share_network_subnet_idmanila/share/rpcapi.py:510manila/share/manager.py:7229
create_backup (observed)cast1.26manila-share, server host@backendbackupmanila/share/rpcapi.py:519manila/share/manager.py:5645
delete_backupcast1.26manila-share, server host@backendbackupmanila/share/rpcapi.py:526manila/share/manager.py:5710
restore_backupcast1.26manila-share, server host@backendbackup, share_idmanila/share/rpcapi.py:533manila/share/manager.py:5747
update_share_from_metadatacast1.28manila-share, server host@backendshare_id, metadatamanila/share/rpcapi.py:541manila/share/manager.py:7301
update_share_network_subnet_from_metadatacast1.30manila-share, server host@backendshare_network_id, share_network_subnet_id, share_server_id, metadatamanila/share/rpcapi.py:553manila/share/manager.py:7324
ensure_driver_resourcescast1.29manila-share, server host@backendskip_backend_info_checkmanila/share/rpcapi.py:564manila/share/manager.py:427

The share-side methods not listed with "(observed)" (snapshot access, replicas' snapshots, share server migration, network updates, backups to the driver…) follow the same pattern: a cast to manila-share.<host>@<backend> with ids, the manager re-reading the rows. The only synchronous calls are get_pools (scheduler), connection_get_info, migration_get_progress, share_server_migration_check|get_progress, get_share_server_network_info, check_update_share_server_network_allocations, transfer_accept (manila/share/rpcapi.py:335) and the data service's data_copy_*: they block the API worker up to [DEFAULT]/rpc_response_timeout.

Notifications

Sent only when [oslo_messaging_notifications]/driver is set (manila/utils.py:597-604), at INFO priority unless stated, with publisher_id = "<service>.<host>" (manila/rpc.py:165-169).

event_typePriorityEmitted whenPayloadEmitted at
share.create.start / .endINFOshare manager starts / finishes create_share_instanceshare_id, user_id, project_id, snapshot_id, share_group_id, size, name, description, proto, is_public, availability_zone, host, status, share_type_id, share_type (manila/share/utils.py:130-150)manila/share/manager.py:2195, manila/share/manager.py:2441
share.delete.start / .endINFOdelete_share_instance (also .end from deferred deletion)samemanila/share/manager.py:3783, manila/share/manager.py:3912, manila/share/manager.py:3997
share.extend.start / .end, share.shrink.start / .endINFOresize in the share managersamemanila/share/manager.py:5010, manila/share/manager.py:5057, manila/share/manager.py:5074, manila/share/manager.py:5162
share.consumed.sizeINFOupdate_share_usage_size (when enable_gathering_share_usage_size)same + used_size, gathered_atmanila/share/manager.py:5868
share.transfer.create.start / .end, .delete.*, .accept.*INFOshare transfers (API process)samemanila/transfer/api.py:93-101, manila/transfer/api.py:203-226
scheduler.<method>ERRORscheduling failure (create_share_instance, create_share_replica, migrate_share_to_host…)share_id, state, method, reasonmanila/scheduler/manager.py:209-236
share_type.create|delete, share_type_extra_specs.create|update|deleteINFO / ERRORshare type APIshare_types, type_id, specsmanila/api/v2/share_types.py:50-57, manila/api/v2/share_types_extra_specs.py:104-106

Sample frames

update_access, cast from manila-api to the share service of the share's host, as recorded (the oslo.messaging envelope {"oslo.version": "2.0", "oslo.message": "<JSON below as a string>"} is added by the driver):

{
  "method": "update_access",
  "args": {"share_instance_id": "fa903622-de80-4782-b693-7e7505bd6d46"},
  "version": "1.14",
  "_unique_id": "…", "_context_user_id": "de5e0000000000000000000000005e00",
  "_context_project_id": "de0000000000000000000000000000de", "_context_roles": ["member", "reader"],
  "_context_request_id": "req-…", "_context_auth_token": "…", "_context_is_admin": false,
  "_context_read_deleted": "no", "_context_service_catalog": null
}

routing key manila-share.node-1@alpha, exchange openstack.

update_service_capabilities, fanout cast from each manila-share every periodic_interval (60 s) to manila-scheduler_fanout (manila/scheduler/rpcapi.py:67-76): service_name: "share", host: "node-1@alpha", timestamp, and capabilities = the driver's _stats (manila/share/driver.py:1344-1406): share_backend_name, driver_handles_share_servers, vendor_name, driver_version, storage_protocol, total_capacity_gb, free_capacity_gb, reserved_percentage, reserved_snapshot_percentage, reserved_share_extend_percentage, qos, pools: [{pool_name, total_capacity_gb, free_capacity_gb, …}], snapshot_support, create_share_from_snapshot_support, revert_to_snapshot_support, mount_snapshot_support, replication_domain, replication_type, filter_function, goodness_function, ipv4_support, ipv6_support, share_group_stats… The full recorded payload is in rpc-frames_stable-2026.2.json.

Database

Tables

SQLAlchemy models in manila/db/sqlalchemy/models.py, schema by alembic migrations (manila/db/migrations/alembic/versions/, head afc3b5e1f406, 76 revisions). Accessed by every process through manila/db/sqlalchemy/api.py (oslo.db enginefacade). 53 tables ([_rewrite/schema-sqlite-migrated_stable-2026.2.sql](_rewrite/schema-sqlite-migrated_stable-2026.2.sql)); almost all are soft-deleted (deleted, deleted_at).

TableRoleWritten byRead by
shares, share_metadatathe user-visible share and its metadataAPI (create/update/delete), share manager (size, task_state)all
share_instances, share_instance_metadataphysical copy of a share on a back end: host, status, share_server_id, replica_state, access_rules_statusAPI (create), scheduler (host), share manager (status)all
share_instance_export_locations, share_instance_export_locations_metadataexport paths (path, is_admin_only, preferred…)share manager (export_locations_update, manila/db/sqlalchemy/api.py:4833-4900)API
share_access_map, share_instance_access_map, share_access_rules_metadataaccess rules and their per-instance stateAPI (allow/deny), share manager (states)share manager, API
share_snapshots, share_snapshot_instances, share_snapshot_instance_export_locations, share_snapshot_access_map, share_snapshot_instance_access_map, share_snapshot_metadatasnapshots, their instances, exports and accessAPI, share managerall
share_types, share_type_extra_specs, share_type_projectsshare typesAPI (admin)API, scheduler
share_group_types, share_group_type_specs, share_group_type_projects, share_group_type_share_type_mappings, share_groups, share_group_share_type_mappings, share_group_snapshotsshare groupsAPI, scheduler, share managerall
share_networks, share_network_subnets, share_network_subnet_metadata, security_services, share_network_security_service_associationtenant networking (DHSS=True)APIshare manager
share_servers, share_server_backend_details, share_server_share_network_subnet_mappings, network_allocationsshare servers and their portsshare managerAPI (admin), share manager
services, availability_zonesservice registry and heartbeats (report_count, updated_at), AZ namesevery service (report_state, manila/service.py:282-325)scheduler (service_is_up), API
quotas, quota_classes, quota_usages, reservations, project_user_quotas, project_share_type_quotasquotas: limits, usage, two-phase reservationsAPI (reserve/commit/rollback), share manager (commit on extend), scheduler (_expire_reservations)API
messagesuser messages (§ 02.3)scheduler, share managerAPI; purged by scheduler
transfersshare transfersAPIAPI; expired by share manager
resource_locksresource locks (2.81)APIAPI, share API layer
share_backupsbackupsAPI, share manager, data managerAPI
drivers_private_data, backend_info, async_operation_datadriver key/value store, back-end info hash (ensure_shares skip), async operation stateshare manager / driversshare manager
encryption_refs, qos_types, qos_type_specsencryption key references (2.90), QoS types (2.94)APIAPI, scheduler
alembic_versionmigration headmanila-manage db sync—

Notable transactions

  • Quota reservation (manila/db/sqlalchemy/api.py:1205-1475): quota_reserve locks the user's and project's usage rows with SELECT … FOR UPDATE (manila/db/sqlalchemy/api.py:1158-1184), refreshes them if until_refresh / max_age say so, checks the deltas against the limits and inserts reservations rows (expire after reservation_expire, 86400 s, manila/quota.py:84); reservation_commit / reservation_rollback (manila/db/sqlalchemy/api.py:1478-1530) move the reserved amounts to in_use or back, also under FOR UPDATE (manila/db/sqlalchemy/api.py:1472). These functions retry deadlocks 5 times (@oslo_db_api.wrap_db_retry, manila/db/sqlalchemy/api.py:1233).
  • Share create: share_create + share_instance_create are two transactions; the quota commit is between them (manila/share/api.py:516-528), with a compensating share_delete + rollback on failure.
  • Access rules: the state changes of share_instance_access_map are serialised per share instance by a process-local lock utils.synchronized("locked_access_rules_operation_by_share_instance_<id>", external=True) (manila/share/access.py:28-55) — an oslo.concurrency file lock in [oslo_concurrency]/lock_path, so only processes on the same host are serialised.
  • Distributed locks: replica and some share operations use tooz (manila/coordination.py:42-160, [coordination]/backend_url, default file://$state_path) through @coordination.synchronized (manila/share/manager.py:226, manila/share/manager.py:246). With the default file backend these locks are host-local: running two manila-share services for the same back end on two hosts needs a real tooz backend (etcd, Redis…).

Outbound REST calls

All use keystoneauth sessions built from a configuration group (manila/common/client_auth.py:34-99); only admin clients exist: a non-admin context raises "Client (<group>) is not flagged as admin" (manila/common/client_auth.py:87-96). None is used on the path of a DHSS=False back end except Barbican for encryption.

Target serviceCallsWhenAuthenticationDefined at
Keystonetoken validationevery API request (keystonemiddleware authtoken, [keystone_authtoken])service useretc/manila/api-paste.ini:55-56
Nova (compute, microversion [nova]/api_microversion = 2.10)servers create/delete/get/reboot, volume attach/detach, keypairs, security groupsGeneric driver and service-instance module (share servers as VMs)[nova] keystoneauth options, adminmanila/compute/nova.py:62-215
Neutronports, networks, subnets, routers, port bindings, security groups (recorded for the DHSS=True back end: [_rewrite/neutron-calls_stable-2026.2.json](_rewrite/neutron-calls_stable-2026.2.json), 07 § 3.5.4)network plugins of DHSS=True drivers (manila/network/neutron/neutron_network_plugin.py), share network subnet validation[neutron], adminmanila/network/neutron/api.py:88-425
Cindervolumes and snapshots CRUD, attachGeneric driver (a share = a Cinder volume in a service VM)[cinder], adminmanila/volume/cinder.py:72-345
Glance ([glance]/api_microversion = 2)image listservice instance image lookup[glance], adminmanila/image/glance.py:55-70
Barbican (castellan)secret ACLs, key referencesshare encryption (2.90)user tokenmanila/keymgr/barbican.py:80-100

Other (binaries, files)

  • rootwrap / privsep: drivers run storage commands through sudo manila-rootwrap (manila/utils.py:88, filters etc/manila/rootwrap.d/share.filters) or SSH to the back end (manila/utils.py SSHPool).
  • manila-data mounts the source and destination exports locally (mount through rootwrap) and copies files for host-assisted migration and data-manager backups (manila/data/helper.py, manila/data/utils.py).
  • Driver protocols: one per back end (NetApp ONTAP REST/ZAPI, CephFS via librados/ceph mgr, LVM/ZFS via shell, Generic via SSH into a VM…). Not specified here: OpenKeel replaces them by a CSI-backed driver (07 § 3).

Source: reverse-spec-manila/03-interactions_stable-2026.2.md. The _rewrite/ and _inventory/ files are not published on the site.