mirror of
https://github.com/kevingruesser/bootstrap-vz.git
synced 2025-08-22 18:00:35 +00:00
Bootstrap azure images directly to VHD
This commit is contained in:
parent
d5ef584b42
commit
f572703ecc
5 changed files with 27 additions and 31 deletions
|
@ -22,10 +22,12 @@ def load_volume(data, bootloader):
|
|||
from bootstrapvz.common.fs.loopbackvolume import LoopbackVolume
|
||||
from bootstrapvz.providers.ec2.ebsvolume import EBSVolume
|
||||
from bootstrapvz.common.fs.virtualdiskimage import VirtualDiskImage
|
||||
from bootstrapvz.common.fs.virtualharddisk import VirtualHardDisk
|
||||
from bootstrapvz.common.fs.virtualmachinedisk import VirtualMachineDisk
|
||||
volume_backing = {'raw': LoopbackVolume,
|
||||
's3': LoopbackVolume,
|
||||
'vdi': VirtualDiskImage,
|
||||
'vhd': VirtualHardDisk,
|
||||
'vmdk': VirtualMachineDisk,
|
||||
'ebs': EBSVolume
|
||||
}.get(data['backing'])
|
||||
|
|
23
bootstrapvz/common/fs/virtualharddisk.py
Normal file
23
bootstrapvz/common/fs/virtualharddisk.py
Normal file
|
@ -0,0 +1,23 @@
|
|||
from qemuvolume import QEMUVolume
|
||||
from ..tools import log_check_call
|
||||
|
||||
|
||||
class VirtualHardDisk(QEMUVolume):
|
||||
|
||||
extension = 'vhd'
|
||||
qemu_format = 'vpc'
|
||||
ovf_uri = 'http://go.microsoft.com/fwlink/?LinkId=137171'
|
||||
|
||||
# Azure requires the image size to be a multiple of 1 MiB.
|
||||
# VHDs are dynamic by default, so we add the option
|
||||
# to make the image size fixed (subformat=fixed)
|
||||
def _before_create(self, e):
|
||||
self.image_path = e.image_path
|
||||
vol_size = str(self.size.bytes.get_qty_in('MiB')) + 'M'
|
||||
log_check_call(['qemu-img', 'create', '-o', 'subformat=fixed', '-f', self.qemu_format, self.image_path, vol_size])
|
||||
|
||||
def get_uuid(self):
|
||||
if not hasattr(self, 'uuid'):
|
||||
import uuid
|
||||
self.uuid = uuid.uuid4()
|
||||
return self.uuid
|
|
@ -1,7 +1,6 @@
|
|||
from bootstrapvz.common import task_groups
|
||||
import tasks.packages
|
||||
import tasks.boot
|
||||
import tasks.image
|
||||
from bootstrapvz.common.tasks import loopback
|
||||
from bootstrapvz.common.tasks import initd
|
||||
from bootstrapvz.common.tasks import ssh
|
||||
|
@ -20,6 +19,7 @@ def resolve_tasks(taskset, manifest):
|
|||
tasks.packages.DefaultPackages,
|
||||
loopback.AddRequiredCommands,
|
||||
loopback.Create,
|
||||
loopback.MoveImage,
|
||||
initd.InstallInitScripts,
|
||||
ssh.AddOpenSSHPackage,
|
||||
ssh.ShredHostkeys,
|
||||
|
@ -27,7 +27,6 @@ def resolve_tasks(taskset, manifest):
|
|||
tasks.packages.Waagent,
|
||||
tasks.boot.ConfigureGrub,
|
||||
tasks.boot.PatchUdev,
|
||||
tasks.image.ConvertToVhd,
|
||||
])
|
||||
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ properties:
|
|||
properties:
|
||||
backing:
|
||||
type: string
|
||||
enum: [raw]
|
||||
enum: [vhd]
|
||||
partitions:
|
||||
type: object
|
||||
properties:
|
||||
|
|
|
@ -1,28 +0,0 @@
|
|||
from bootstrapvz.base import Task
|
||||
from bootstrapvz.common import phases
|
||||
|
||||
|
||||
class ConvertToVhd(Task):
|
||||
description = 'Convert raw image to vhd disk'
|
||||
phase = phases.image_registration
|
||||
|
||||
@classmethod
|
||||
def run(cls, info):
|
||||
image_name = info.manifest.image['name'].format(**info.manifest_vars)
|
||||
filename = image_name + '.vhd'
|
||||
import os.path
|
||||
destination = os.path.join(info.manifest.bootstrapper['workspace'], filename)
|
||||
|
||||
file_size = os.path.getsize(info.volume.image_path)
|
||||
rounded_vol_size = str(((file_size / (1024 * 1024) + 1) * (1024 * 1024)))
|
||||
|
||||
from bootstrapvz.common.tools import log_check_call
|
||||
log_check_call(['qemu-img', 'resize', info.volume.image_path, rounded_vol_size])
|
||||
log_check_call(['qemu-img', 'convert',
|
||||
'-o', 'subformat=fixed',
|
||||
'-O', 'vpc',
|
||||
info.volume.image_path, destination])
|
||||
os.remove(info.volume.image_path)
|
||||
import logging
|
||||
log = logging.getLogger(__name__)
|
||||
log.info('The volume image has been moved to ' + destination)
|
Loading…
Add table
Reference in a new issue