seqdiag {
        user; nova-api; nova-conductor; nova-compute; libvirt-driver; os-brick; cinder-api;
        edge_length = 300;
        span_height = 16;
        activation = none;
        default_note_color = white;
        user ->  nova-api [label = "POST /servers/{server_id}/os-volume_attachments"];
                 nova-api -> nova-compute [label = "RPC call reserve_block_device_name"];
                             nova-compute -> nova-compute [label = "instance.uuid lock"];
                             nova-compute ->> nova-conductor [label = "bdm.create"];
                             nova-compute <<- nova-conductor [label = "return BlockDeviceMapping"];
                             nova-compute -> libvirt-driver [label = "get_device_name_for_instance"];
                             nova-compute <- libvirt-driver [label = "Return get_device_name_for_instance"];
                 nova-api <- nova-compute [label = "Return reserve_block_device_name"];
                 nova-api -> cinder-api [label = "POST /v3/{project_id}/attachments"];
                 nova-api <- cinder-api [label = "Return HTTP 200 (without connection_info)"];
                 nova-api ->> nova-compute [label = "RPC cast attach_volume"];
        user <-  nova-api [label = "Return HTTP 200 (includes device_name)"];
                             nova-compute -> nova-compute [label = "instance.uuid lock"];
                             nova-compute -> os-brick [label = "cinder_backend.uuid lock"];
                             nova-compute -> cinder-api [label = "PUT /v3/{project_id}/attachments/{attachment_id}"];
                             nova-compute <- cinder-api [label = "Return HTTP 200 (includes connection_info)"];
                             nova-compute -> libvirt-driver [label = "attach_volume"];
                                             libvirt-driver -> os-brick [label = "connect_volume"];
                                                               os-brick -> os-brick [label = "connect_volume lock"];
                                             libvirt-driver <- os-brick;
                                             libvirt-driver -> libvirt-driver [label = "guest.attach_device"];
                                             libvirt-driver -> libvirt-driver [label = "_build_device_metadata"];
                                             libvirt-driver ->> nova-conductor [label = "instance.save"];
                             nova-compute <- libvirt-driver [label = "Return attach_volume"];
                             nova-compute ->> nova-conductor [label = "bdm.save"];
                             nova-compute -> cinder-api [label = "POST /v3/{project_id}/attachments/{attachment_id}/action (os-complete)"];
                             nova-compute <- cinder-api [label = "Return HTTP 200"];
}
