I just discovered that novaclient's "volumes.create_server_volume" command and cinderclient's "volumes.attach" command are not equal. They both result in the specified volume being attached to the specified instance, but only novaclient's command makes Nova aware of the attachment such that novaclient's "volumes.get_server_volumes" command returns the attachment data.
Unfortunately, without novaclient's volumes.get_server_volumes command returning the correct data there is no good way to go from an instance ID to a list of attached volumes. That data is not returned with the detailed instance info (as it should be), and it can't be filtered out of a volume listing without retrieving every volume and manually filtering them based on their attachments dict.
My recommendation is twofold:
1. Cinder needs an easy way to retrieve a list of volumes attached to a given instance, and
2. Nova needs to include the list of attached volumes with the instance details the same way it returns lists of IP addresses, security groups, etc.
I can see how this is confusing:
The cinderclient attach command is solely to mark the volume attached in cinder. It is modifying metadata. When nova attaches a volume, it uses the cinderclient command to let cinder know that it has attached a volume.