feat: snapshotting (#40)

This commit is contained in:
badrAZ
2017-03-10 16:09:31 +01:00
committed by Julien Fontanet
parent 3609559ced
commit d0fa5ff385
2 changed files with 129 additions and 57 deletions

View File

@@ -593,63 +593,6 @@ describe('vm', () => {
// ---------------------------------------------------------------------
describe('.snapshot()', () => {
jasmine.DEFAULT_TIMEOUT_INTERVAL = 5e3
let snapshotId
afterEach(async () => {
await xo.call('vm.delete', {id: snapshotId, delete_disks: true})
})
it('snapshots a basic VM', async () => {
vmId = await createVmTest()
snapshotId = await xo.call('vm.snapshot', {
id: vmId,
name: 'snapshot'
})
const [vm, snapshot] = await Promise.all([
xo.getOrWaitObject(vmId),
xo.getOrWaitObject(snapshotId)
])
expect(snapshot.type).to.be.equal('VM-snapshot')
almostEqual(snapshot, vm, [
'id',
'type',
'ref',
'snapshot_time',
'snapshots',
'$snapshot_of'
])
})
it('snapshots more complex VM', async () => {
vmId = await getVmXoTestPvId(xo)
snapshotId = await xo.call('vm.snapshot', {
id: vmId,
name: 'snapshot'
})
const [vm, snapshot] = await Promise.all([
xo.getOrWaitObject(vmId),
xo.getOrWaitObject(snapshotId)
])
expect(snapshot.type).to.be.equal('VM-snapshot')
almostEqual(snapshot, vm, [
'id',
'type',
'ref',
'snapshot_time',
'snapshots',
'VIFs',
'$VBDs',
'$snapshot_of'
])
})
})
// ---------------------------------------------------------------------
describe('.revert()', () => {
jasmine.DEFAULT_TIMEOUT_INTERVAL = 5e3
let snapshotId

129
src/vm/snapshotting.spec.js Normal file
View File

@@ -0,0 +1,129 @@
/* eslint-env jest */
import {
map,
size
} from 'lodash'
import {
almostEqual,
config,
waitObjectState,
xo
} from './../util'
// ===================================================================
beforeAll(async () => {
jasmine.DEFAULT_TIMEOUT_INTERVAL = 100e3
})
describe('snapshotting', () => {
let snapshotId
let vmId
// ----------------------------------------------------------------------
beforeAll(async () => {
vmId = await xo.call('vm.create', {
name_label: 'vmTest',
name_description: 'creating a vm',
template: config.templatesId.centOS,
VIFs: [
{network: config.labPoolNetworkId},
{network: config.labPoolNetworkId}
],
VDIs: [
{
device: '0',
size: 1,
SR: config.labPoolSrId,
type: 'user'
},
{
device: '1',
size: 1,
SR: config.labPoolSrId,
type: 'user'
},
{
device: '2',
size: 1,
SR: config.labPoolSrId,
type: 'user'
}
]
})
await waitObjectState(xo, vmId, vm => {
if (vm.type !== 'VM') throw new Error('retry')
})
})
afterAll(() => xo.call('vm.delete', {id: vmId, delete_disks: true}))
// =================================================================
describe('.snapshot()', () => {
let $vm
it('snapshots a VM', async () => {
snapshotId = await xo.call('vm.snapshot', {
id: vmId,
name: 'snapshot'
})
const [, snapshot] = await Promise.all([
waitObjectState(xo, vmId, vm => {
$vm = vm
expect(vm.snapshots[0]).toBe(snapshotId)
}),
xo.getOrWaitObject(snapshotId)
])
expect(snapshot.type).toBe('VM-snapshot')
expect(snapshot.name_label).toBe('snapshot')
expect(snapshot.$snapshot_of).toBe(vmId)
almostEqual(snapshot, $vm, [
'$snapshot_of',
'$VBDs',
'id',
'installTime',
'name_label',
'snapshot_time',
'snapshots',
'type',
'uuid',
'VIFs'
])
})
})
describe('.revert()', () => {
let createdSnapshotId
it('reverts a snapshot to its parent VM', async () => {
await xo.call('vm.set', {
id: vmId,
name_label: 'vmRenamed'
})
await waitObjectState(xo, vmId, vm => {
if (vm.name_label !== 'vmRenamed') throw new Error('retry')
})
await xo.call('vm.revert', {id: snapshotId})
await waitObjectState(xo, vmId, vm => {
expect(size(vm.current_operations)).toBe(0)
expect(vm.name_label).toBe('vmTest')
expect(size(vm.snapshots)).toBe(2)
map(vm.snapshots, snapshot => {
if (snapshot !== snapshotId) createdSnapshotId = snapshot
})
})
const createdSnapshot = await xo.getOrWaitObject(createdSnapshotId)
expect(createdSnapshot.name_label).toBe('vmRenamed')
})
})
})