IF YOU WOULD LIKE TO GET AN ACCOUNT, please write an email to s dot adaszewski at gmail dot com. User accounts are meant only to report issues and/or generate pull requests. This is a purpose-specific Git hosting for ADARED projects. Thank you for your understanding!
Parcourir la source

Working on image build

tags/0.92
Stanislaw Adaszewski il y a 4 ans
Parent
révision
655f2a4981
5 fichiers modifiés avec 71 ajouts et 55 suppressions
  1. +1
    -0
      .gitignore
  2. +21
    -48
      focker.py
  3. +15
    -2
      image.py
  4. +0
    -0
      run.py
  5. +34
    -5
      zfs.py

+ 1
- 0
.gitignore Voir le fichier

@@ -0,0 +1 @@
__pycache__

+ 21
- 48
focker.py Voir le fichier

@@ -1,58 +1,31 @@
from argparse import ArgumentParser
import yaml
import os
from weir import zfs, process
from .build import build
# from weir import zfs, process
from .image import command_image_build
import sys
from .zfs import zfs_init
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 command_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)
build(spec)
def create_parser():
parser_top = ArgumentParser()
subparsers_top = parser_top.add_subparsers()
def run(args):
pass
subparsers = subparsers_top.add_parser('image').add_subparsers()
parser = subparsers.add_parser('build')
parser.set_defaults(func=command_image_build)
parser.add_argument('focker_dir', type=str)
return parser_top
def create_parser():
parser = ArgumentParser()
subparsers = parser.add_subparsers()
parser_build = subparsers.add_parser('build')
parser_build.set_defaults(func=command_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
def main():
zfs_init()
parser = create_parser()
args = parser.parse_args()
if not hasattr(args, 'func'):
sys.exit('You must choose a mode')
args.func(args)
parser = create_parser()
args = parser.parse_args()
if not hasattr(args, 'func'):
raise ValueError('You must choose the mode')
args.func(args)
if __name__ == '__main__':
main()

build.py → image.py Voir le fichier

@@ -1,4 +1,6 @@
from .zfs import *
import os
import yaml
def process_step(step, name):
@@ -17,8 +19,19 @@ def process_steps(steps, name):
def build(spec):
if 'base' not in spec:
raise ValueError('Missing base specification')
base = spec.base
base = zfs_snapshot_by_tag_or_name(base)
base = spec['base']
base = zfs_snapshot_by_tag_or_sha256(base)
root = '/'.join(base.split('/')[:-1])
print('base:', base, 'root:', root)
def command_image_build(args):
fname = os.path.join(args.focker_dir, 'Fockerfile')
print('fname:', fname)
if not os.path.exists(fname):
raise ValueError('No Fockerfile could be found in the specified directory')
with open(fname, 'r') as f:
spec = yaml.safe_load(f)
print('spec:', spec)
build(spec)

+ 0
- 0
run.py Voir le fichier


+ 34
- 5
zfs.py Voir le fichier

@@ -1,10 +1,12 @@
import subprocess
import csv
import io
import os
def zfs_run(command):
out = subprocess.check_output(command)
# print('Running:', command)
out = subprocess.check_output(command, stderr=subprocess.STDOUT)
return out
@@ -20,15 +22,42 @@ def zfs_get_type(name):
return lst[0][1]
def zfs_snapshot_by_tag_or_name(s):
lst = zfs_parse_output(['zfs', 'list', '-o', 'name,focker:tags,type', '-H'])
lst = list(filter(lambda a: (a[0] == s or s in a[1].split(' ') and a[2] == 'snapshot')))
def zfs_snapshot_by_tag_or_sha256(s):
lst = zfs_parse_output(['zfs', 'list', '-o', 'focker:sha256,focker:tags,type,name', '-H', '-t', 'snapshot'])
lst = list(filter(lambda a: (a[0] == s or s in a[1].split(' ')) and a[2] == 'snapshot', lst))
if len(lst) == 0:
raise ValueError('Reference not found: ' + s)
if len(lst) > 1:
raise ValueError('Ambiguous reference: ' + s)
return lst[0][0]
return lst[0][3]
def zfs_clone(name, target_name):
zfs_run(['zfs', 'clone', name, target_name])
def zfs_exists(name):
try:
zfs_run(['zfs', 'list', name])
except subprocess.CalledProcessError as e:
return False
return True
def zfs_init():
poolname = zfs_parse_output(['zfs', 'list', '-H', '/'])
if len(poolname) == 0:
raise ValueError('Not a ZFS root')
poolname = poolname[0][0].split('/')[0]
print('poolname:', poolname)
for path in ['/focker', '/focker/images', '/focker/volumes', '/focker/jails']:
if not os.path.exists(path):
os.mkdir(path)
if not zfs_exists(poolname + '/focker'):
zfs_run(['zfs', 'create', '-o', 'canmount=off', '-o', 'mountpoint=/focker', poolname + '/focker'])
if not zfs_exists(poolname + '/focker/images'):
zfs_run(['zfs', 'create', '-o', 'canmount=off', poolname + '/focker/images'])
if not zfs_exists(poolname + '/focker/volumes'):
zfs_run(['zfs', 'create', '-o', 'canmount=off', poolname + '/focker/volumes'])
if not zfs_exists(poolname + '/focker/volumes'):
zfs_run(['zfs', 'create', '-o', 'canmount=off', poolname + '/focker/jails'])

Chargement…
Annuler
Enregistrer