2013-07-13 15:10:04 +02:00
|
|
|
from base import Task
|
|
|
|
from common import phases
|
2013-07-14 23:16:37 +02:00
|
|
|
from filesystem import UnmountVolume
|
2013-07-13 15:10:04 +02:00
|
|
|
from common.tools import log_check_call
|
|
|
|
|
|
|
|
|
|
|
|
class Create(Task):
|
|
|
|
description = 'Creating a loopback volume'
|
|
|
|
phase = phases.volume_creation
|
|
|
|
|
|
|
|
def run(self, info):
|
|
|
|
loopback_filename = 'loopback-{id:x}.img'.format(id=info.run_id)
|
|
|
|
import os.path
|
|
|
|
info.loopback_file = os.path.join(info.manifest.volume['loopback_dir'], loopback_filename)
|
|
|
|
log_check_call(['/bin/dd',
|
2013-08-17 17:28:46 +02:00
|
|
|
'if=/dev/zero', 'of=' + info.loopback_file,
|
|
|
|
'bs=1M', 'seek=' + str(info.manifest.volume['size']), 'count=0'])
|
2013-07-13 15:10:04 +02:00
|
|
|
|
|
|
|
|
2013-08-10 20:03:20 +02:00
|
|
|
class CreateQemuImg(Task):
|
|
|
|
description = 'Creating a loopback volume with qemu'
|
2013-08-11 18:26:01 +02:00
|
|
|
phase = phases.volume_creation
|
2013-08-10 20:03:20 +02:00
|
|
|
|
|
|
|
def run(self, info):
|
|
|
|
loopback_filename = 'loopback-{id:x}.img'.format(id=info.run_id)
|
|
|
|
import os.path
|
|
|
|
info.loopback_file = os.path.join(info.manifest.volume['loopback_dir'], loopback_filename)
|
|
|
|
log_check_call(['/usr/bin/qemu-img', 'create', '-f', 'raw',
|
2013-08-17 17:28:46 +02:00
|
|
|
info.loopback_file, str(info.manifest.volume['size']) + 'M'])
|
2013-08-10 20:03:20 +02:00
|
|
|
|
|
|
|
|
2013-07-13 15:10:04 +02:00
|
|
|
class Attach(Task):
|
|
|
|
description = 'Attaching the loopback volume'
|
|
|
|
phase = phases.volume_creation
|
2013-08-11 18:26:01 +02:00
|
|
|
after = [Create, CreateQemuImg]
|
2013-07-13 15:10:04 +02:00
|
|
|
|
|
|
|
def run(self, info):
|
|
|
|
info.bootstrap_device = {}
|
2013-08-17 16:38:43 +02:00
|
|
|
command = ['/sbin/losetup', '--show', '--find', info.loopback_file]
|
|
|
|
[info.bootstrap_device['path']] = log_check_call(command)
|
2013-07-13 15:10:04 +02:00
|
|
|
|
|
|
|
|
|
|
|
class Detach(Task):
|
|
|
|
description = 'Detaching the loopback volume'
|
|
|
|
phase = phases.volume_unmounting
|
2013-07-14 23:16:37 +02:00
|
|
|
after = [UnmountVolume]
|
2013-07-13 15:10:04 +02:00
|
|
|
|
|
|
|
def run(self, info):
|
2013-08-17 15:00:53 +00:00
|
|
|
log_check_call(['/sbin/losetup', '--detach', info.bootstrap_device['path']])
|
2013-07-13 15:10:04 +02:00
|
|
|
del info.bootstrap_device
|
|
|
|
|
|
|
|
|
|
|
|
class Delete(Task):
|
|
|
|
description = 'Deleting the loopback volume'
|
|
|
|
phase = phases.cleaning
|
|
|
|
|
|
|
|
def run(self, info):
|
|
|
|
from os import remove
|
2013-07-14 23:16:37 +02:00
|
|
|
remove(info.loopback_file)
|
2013-07-13 15:10:04 +02:00
|
|
|
del info.loopback_file
|