|
- from argparse import ArgumentParser
- import yaml
- import os
- from weir import zfs, process
-
-
- def clone(self, name, props={}, force=False):
- url = zfs._urlsplit(self.name)
- url_1 = zfs._urlsplit(name)
- if url.netloc != url_1.netloc:
- raise ValueError('Clone has to happen on the same host')
- cmd = ['zfs', 'clone']
- for prop, value in props.items():
- cmd.append('-o')
- cmd.append(prop + '=' + str(value))
- cmd.append(url.path)
- cmd.append(url_1.path)
- process.check_call(cmd, netloc=url.netloc)
-
- zfs.ZFSSnapshot.clone = clone
-
-
- def process_step(step, name):
- cmd=['jail', '-c']
- cmd.append('path=' + '/focker/' + name)
-
-
- def process_steps(steps, name):
- if isinstance(steps, list):
- for step in steps:
- process_step(step, name)
- else:
- process_step(steps, name)
-
-
- def build(args):
- fname = os.path.join(args.focker_dir, 'Fockerfile.yml')
- print('fname:', fname)
- if not os.path.exists(fname):
- raise ValueError('No Fockerfile.yml could be found in the specified directory')
- with open(fname, 'r') as f:
- spec = yaml.safe_load(f)
- print('spec:', spec)
- if 'from' not in spec:
- raise ValueError('Missing base specification')
- from_ = zfs.findprops('/', props=['focker:tags'])
- from_ = filter(lambda a: a['value'] == spec['from'] \
- and '@' in a['name'], from_)
- from_ = list(from_)
- if len(from_) == 0:
- raise ValueError('Requested base not found')
- if len(from_) > 1:
- raise ValueError('Ambiguous base specification')
- base = from_[0]['name']
- root = '/'.join(base.split('/')[:-1])
- print('base:', base)
- print('root:', root)
- base = zfs.open(base)
- name = '/'.join([root, 'x y z'])
- base.clone(name)
- process_steps(args['steps'], name)
-
-
- def run(args):
- pass
-
-
- def create_parser():
- parser = ArgumentParser()
- subparsers = parser.add_subparsers()
- parser_build = subparsers.add_parser('build')
- parser_build.set_defaults(func=build)
- parser_build.add_argument('focker_dir', type=str)
- parser_run = subparsers.add_parser('run')
- parser_run.set_defaults(func=run)
- parser_rm = subparsers.add_parser('rm')
- parser_rmi = subparsers.add_parser('rmi')
- parser_ps = subparsers.add_parser('ps')
- parser_images = subparsers.add_parser('images')
- return parser
-
-
- parser = create_parser()
- args = parser.parse_args()
- args.func(args)
|