def test_clone_error(self): """QEMU RuntimeError is raised if the base image is not contained within a libvirt Pool.""" pool = mock.Mock() hypervisor = mock.Mock() hypervisor.storageVolLookupByPath.side_effect = libvirt.libvirtError('BOOM') with self.assertRaises(RuntimeError) as error: qemu.disk_clone(hypervisor, 'foo', pool, {'image': '/foo/bar/baz.qcow2', 'clone': {}}) self.assertEqual(str(error), "/foo/bar/baz.qcow2 disk must be contained in a libvirt storage pool.")
def test_clone(self): """Clone no COW.""" pool = mock.Mock() volume = mock.Mock() hypervisor = mock.Mock() hypervisor.storageVolLookupByPath.return_value = volume pool.XMLDesc.return_value = """<pool><target><path>/pool/path</path></target></pool>""" volume.XMLDesc.return_value = """<volume><target><path>/path/volume.qcow2</path></target>""" +\ """<capacity>10</capacity></volume>""" expected = """<volume type="file"><name>foo</name><uuid>foo</uuid><target>""" +\ """<path>/pool/path/foo.qcow2</path><format type="qcow2" /></target>""" +\ """<capacity>10</capacity></volume>""" qemu.disk_clone(hypervisor, 'foo', pool, {'image': '/foo/bar/baz.qcow2', 'clone': {}}) results = pool.createXMLFrom.call_args_list[0][0][0] results = results.replace('\n', '').replace('\t', '').replace(' ', '') self.assertEqual(results, expected, compare(results, expected))
def test_clone_cow(self): """QEMU Clone with COW.""" pool = mock.Mock() volume = mock.Mock() hypervisor = mock.Mock() hypervisor.storageVolLookupByPath.return_value = volume pool.XMLDesc.return_value = """<pool><target><path>/pool/path</path></target></pool>""" volume.XMLDesc.return_value = """<volume><target><path>/path/volume.qcow2</path></target>""" +\ """<capacity>10</capacity></volume>""" expected = """<volume type="file"><name>foo</name><uuid>foo</uuid><target>""" +\ """<path>/pool/path/foo.qcow2</path><permissions><mode>0644</mode></permissions>""" +\ """<format type="qcow2" /></target><capacity>10</capacity>""" +\ """<backingStore><path>/path/volume.qcow2</path><format type="qcow2" />""" +\ """</backingStore></volume>""" qemu.disk_clone(hypervisor, 'foo', pool, {'image': '/foo/bar/baz.qcow2', 'clone': {'copy_on_write': True}}) results = pool.createXML.call_args_list[0][0][0] results = results.replace('\n', '').replace('\t', '').replace(' ', '') self.assertEqual(results, expected, compare(results, expected))
def test_clone(self): """Clone no COW.""" pool = mock.Mock() volume = mock.Mock() hypervisor = mock.Mock() hypervisor.storageVolLookupByPath.return_value = volume pool.XMLDesc.return_value = """<pool><target><path>/pool/path</path></target></pool>""" volume.XMLDesc.return_value = """<volume><target><path>/path/volume.qcow2</path></target>""" +\ """<capacity>10</capacity></volume>""" expected = """<volume type="file"><name>foo</name><uuid>foo</uuid><target>""" +\ """<path>/pool/path/foo.qcow2</path><format type="qcow2" /></target>""" +\ """<capacity>10</capacity></volume>""" qemu.disk_clone(hypervisor, 'foo', pool, { 'image': '/foo/bar/baz.qcow2', 'clone': {} }) results = pool.createXMLFrom.call_args_list[0][0][0] results = results.replace('\n', '').replace('\t', '').replace(' ', '') self.assertEqual(results, expected, compare(results, expected))
def test_clone_fwdslash(self, os_mock): """QEMU Clone no COW.""" os_mock.return_value = True logger = mock.Mock() pool = mock.Mock() volume = mock.Mock() hypervisor = mock.Mock() hypervisor.storageVolLookupByPath.side_effect = libvirt.libvirtError( 'BAM!') pool.XMLDesc.return_value = """<pool><target><path>/pool/path</path></target></pool>""" volume.XMLDesc.return_value = """<volume><target><path>/path/volume.qcow2</path>""" +\ """</target><capacity>10</capacity></volume>""" expected = """<volume type="file"><name>foo</name><uuid>foo</uuid><target>""" +\ """<path>/pool/path/foo.qcow2</path><permissions>""" +\ """<mode>0644</mode></permissions>""" +\ """<format type="qcow2" /></target>""" +\ """<capacity>10</capacity></volume>""" with self.assertRaises(libvirt.libvirtError) as error: qemu.disk_clone(hypervisor, 'foo', pool, {}, '/foo/bar/baz.qcow2', logger) self.assertFalse( '/' in etree.fromstring(hypervisor.storagePoolDefineXML. call_args[0][0]).find('.//name').text)