Add libvirt support for vagrant plugin

This commit is contained in:
Ilarion Ishkulov 2018-04-28 21:55:09 +03:00
parent fee756185d
commit 19c241be2c
4 changed files with 37 additions and 10 deletions

View file

@ -9,4 +9,10 @@ of the virtual machine.
This plugin creates a vagrant box that is ready to be shared or This plugin creates a vagrant box that is ready to be shared or
deployed. At the moment it is only compatible with the VirtualBox deployed. At the moment it is only compatible with the VirtualBox
provider and doesn't requires any additional settings. and Libvirt providers.
Settings
~~~~~~~~
- ``provider``: Specifies the provider of a resulting vagrant box.
``optional`` Valid values: ``virtualbox, libvirt`` Default: ``libvirt``

View file

@ -6,6 +6,11 @@ from bootstrapvz.common.tools import rel_path
def validate_manifest(data, validator, error): def validate_manifest(data, validator, error):
validator(data, rel_path(__file__, 'manifest-schema.yml')) validator(data, rel_path(__file__, 'manifest-schema.yml'))
vagrant_provider = data['plugins']['vagrant'].get('provider', 'virtualbox')
if vagrant_provider == 'virtualbox' and data['volume']['backing'] != 'vmdk':
error('Virtualbox vagrant boxes support vmdk images only', ['plugins', 'vagrant', 'provider'])
if vagrant_provider == 'libvirt' and data['volume']['backing'] != 'qcow2':
error('Libvirt vagrant boxes support qcow2 images only', ['plugins', 'vagrant', 'provider'])
def resolve_tasks(taskset, manifest): def resolve_tasks(taskset, manifest):

View file

@ -8,7 +8,7 @@ properties:
properties: properties:
name: name:
type: string type: string
enum: [virtualbox] enum: [virtualbox, kvm]
system: system:
required: [hostname] required: [hostname]
volume: volume:
@ -16,11 +16,15 @@ properties:
properties: properties:
backing: backing:
type: string type: string
enum: [vmdk] enum: [vmdk, qcow2]
required: [backing] required: [backing]
plugins: plugins:
type: object type: object
properties: properties:
vagrant: vagrant:
type: object type: object
properties:
provider:
type: string
enum: [virtualbox, libvirt]
additionalProperties: false additionalProperties: false

View file

@ -4,6 +4,7 @@ from bootstrapvz.common.tasks import workspace
from bootstrapvz.common.tools import rel_path from bootstrapvz.common.tools import rel_path
import os import os
import shutil import shutil
import json
assets = rel_path(__file__, 'assets') assets = rel_path(__file__, 'assets')
@ -128,18 +129,29 @@ class PackageBox(Task):
from bootstrapvz.common.tools import sed_i from bootstrapvz.common.tools import sed_i
sed_i(vagrantfile, '\\[MAC_ADDRESS\\]', mac_address) sed_i(vagrantfile, '\\[MAC_ADDRESS\\]', mac_address)
metadata_source = os.path.join(assets, 'metadata.json') vagrant_provider = info.manifest.plugins['vagrant'].get('provider', 'virtualbox')
metadata = os.path.join(info._vagrant['folder'], 'metadata.json') metadata = {'provider': vagrant_provider}
shutil.copy(metadata_source, metadata)
if vagrant_provider == 'libvirt':
metadata['format'] = info.manifest.volume['backing']
virtual_size = info.volume.size.bytes.get_qty_in('G')
metadata['virtual_size'] = virtual_size
metadata_file = os.path.join(info._vagrant['folder'], 'metadata.json')
with open(metadata_file, 'w') as f:
json.dump(metadata, f)
from bootstrapvz.common.tools import log_check_call from bootstrapvz.common.tools import log_check_call
disk_name = 'box-disk1.' + info.volume.extension if vagrant_provider == 'libvirt':
disk_name = 'box.img'
else:
disk_name = 'box-disk1.' + info.volume.extension
ovf_path = os.path.join(info._vagrant['folder'], 'box.ovf')
cls.write_ovf(info, ovf_path, mac_address, disk_name)
disk_link = os.path.join(info._vagrant['folder'], disk_name) disk_link = os.path.join(info._vagrant['folder'], disk_name)
log_check_call(['ln', '-s', info.volume.image_path, disk_link]) log_check_call(['ln', '-s', info.volume.image_path, disk_link])
ovf_path = os.path.join(info._vagrant['folder'], 'box.ovf')
cls.write_ovf(info, ovf_path, mac_address, disk_name)
box_files = os.listdir(info._vagrant['folder']) box_files = os.listdir(info._vagrant['folder'])
log_check_call(['tar', '--create', '--gzip', '--dereference', log_check_call(['tar', '--create', '--gzip', '--dereference',
'--file', info._vagrant['box_path'], '--file', info._vagrant['box_path'],