import os import yaml from .zfs import AmbiguousValueError, \ zfs_find, \ zfs_tag from .misc import random_sha256_hexdigest, \ find_prefix import subprocess def build_volumes(spec): for tag in spec.keys(): try: name, _ = zfs_find(tag, focker_type='volume') continue except AmbiguousValueError: raise except ValueError: pass sha256 = random_sha256_hexdigest() name = find_prefix(poolname + '/focker/volumes/', sha256) subprocess.check_output(['zfs', 'create', name]) zfs_untag([ tag ], focker_type='volume') zfs_tag(name, [ tag ]) def build_images(spec, path): # print('build_images(): NotImplementedError') for (tag, focker_dir) in spec.items(): res = subprocess.run(['focker', 'image', 'build', os.path.join(path, focker_dir), '-t', tag]) if res.returncode != 0: raise RuntimeError('Image build failed: ' + str(res.returncode)) def build_jails(spec): print('build_jails(): NotImplementedError') def command_compose_build(args): if not os.path.exists(args.filename): raise ValueError('File not found: ' + args.filename) path, _ = os.path.split(args.filename) with open(args.filename, 'r') as f: spec = yaml.safe_load(f) if 'volumes' in spec: build_volumes(spec['volumes']) if 'images' in spec: build_images(spec['images'], path) if 'jails' in spec: build_jails(spec['jails']) def command_compose_run(args): raise NotImplementedError