Bug 1299877 - virsh create-snapshot ignores <disks> parameter and snapshots all disks
virsh create-snapshot ignores <disks> parameter and snapshots all disks
Status: CLOSED NOTABUG
Product: Virtualization Tools
Classification: Community
Component: libvirt (Show other bugs)
unspecified
Unspecified Linux
unspecified Severity high
: ---
: ---
Assigned To: Libvirt Maintainers
:
Depends On:
Blocks:
  Show dependency treegraph
 
Reported: 2016-01-19 08:09 EST by Pieter Hollants
Modified: 2016-01-19 08:29 EST (History)
1 user (show)

See Also:
Fixed In Version:
Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of:
Environment:
Last Closed: 2016-01-19 08:29:29 EST
Type: Bug
Regression: ---
Mount Type: ---
Documentation: ---
CRM:
Verified Versions:
Category: ---
oVirt Team: ---
RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: ---


Attachments (Terms of Use)

  None (edit)
Description Pieter Hollants 2016-01-19 08:09:09 EST
Description of problem:
-----------------------
According to the manpage it should be possible to restrict the disks being snapshoted:

  "Normally, the only properties settable for a domain snapshot are the <name>
  and <description> elements, as well as <disks> if --disk-only is given; the
  rest of the fields are ignored, and automatically filled in by libvirt."

However virsh seems to ignore the <disks> element and always snapshot all disks.


Version-Release number of selected component (if applicable):
-------------------------------------------------------------
libvirt 1.3.0


How reproducible:
-----------------
See below


Steps to Reproduce:
-------------------
1. Create a temporary directory:
   mkdir /tmp/test

2. Create a storage pool:
   virsh -c qemu:///session pool-create-as testpool dir --target /tmp/test

3. Create two qcow2 disk images:
   virsh -c qemu:///session vol-create-as --format qcow2 testpool Test1 1G
   virsh -c qemu:///session vol-create-as --format qcow2 testpool Test2 1G

4. Create a domain using these images:
   virsh -c qemu:///session define /dev/stdin <<EOF
<domain type='kvm'>
  <name>Test</name>
  <uuid>f44e2d21-32be-4129-936f-440e75c691a5</uuid>
  <memory unit='KiB'>1048576</memory>
  <currentMemory unit='KiB'>1048576</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-2.4'>hvm</type>
  </os>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/tmp/test/Test1'/>
      <target dev='hda' bus='ide'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/tmp/test/Test2'/>
      <target dev='hdb' bus='ide'/>
      <address type='drive' controller='0' bus='0' target='0' unit='1'/>
    </disk>
  </devices>
</domain>
EOF

5. Inspect the contents of the storage pool BEFORE taking the snapshot:
   ls -la /tmp/test

6. Create a snapshot:
   virsh -c qemu:///session snapshot-create Test --disk-only /dev/stdin <<EOF
<domainsnapshot>
  <name>Snapshot1</name>
  <disks>
    <disk name="/tmp/test/Test1" snapshot="external">
      <source file="/tmp/test/Test1_Snapshot" />
    </disk>
  </disks>
</domainsnapshot>
EOF

7. Inspect the contents of the storage pool AFTER taking the snapshot:
   ls -la /tmp/test


Actual results:
---------------
Before taking the snapshot:

drwxr-xr-x  2 pief users   4096 19. Jan 13:49 .
drwxrwxrwt 72 root root   28672 19. Jan 13:49 ..
-rw-------  1 pief users 197120 19. Jan 13:49 Test1
-rw-------  1 pief users 197120 19. Jan 13:49 Test2

After taking the snapshot:

drwxr-xr-x  2 pief users   4096 19. Jan 13:49 .
drwxrwxrwt 72 root root   28672 19. Jan 13:49 ..
-rw-------  1 pief users 197120 19. Jan 13:49 Test1
-rw-r--r--  1 pief users 197120 19. Jan 13:49 Test1_Snapshot
-rw-------  1 pief users 197120 19. Jan 13:49 Test2
-rw-r--r--  1 pief users 197120 19. Jan 13:49 Test2.Snapshot1


Expected results:
-----------------
There shouldn't have been a file "Test2.Snapshot1" because the XML specified that only Test1 should be snapshotted.


Additional info:
----------------
Seeing that it's named "Test2.Snapshot1" and not "Test2_Snapshot", it appears libvirt is not RESTRICTING snapshoting to Test1 but merely CHANGING the snapshot parameters for Test1 while maintaining the default behavior for Test2.
(The default name for a snapshot is constructed by libvirt by appending the snapshot to the domain name, separated by a colon ".")
Comment 1 Pieter Hollants 2016-01-19 08:29:29 EST
On second thought, it appears that if such restrictions of snapshots to single disks is desired, ALL disks must be listed nevertheless and the disks that are NOT to be snapshotted must have a snapshot property of "no":

  <disk name="/tmp/test/Test2" snapshot="no">
  </disk>

This wasn't really clear to me out of the documentation.

Note You need to log in before you can comment on or make changes to this bug.