@@ -69,9 +69,11 @@ def create_parser(): | |||||
parser = subparsers.add_parser('list') | parser = subparsers.add_parser('list') | ||||
parser.set_defaults(func=command_volume_list) | parser.set_defaults(func=command_volume_list) | ||||
parser.add_argument('--full-sha256', '-f', action='store_true') | |||||
parser = subparsers.add_parser('tag') | parser = subparsers.add_parser('tag') | ||||
parser.set_defaults(func=command_volume_tag) | parser.set_defaults(func=command_volume_tag) | ||||
parser.add_argument('reference', type=str) | |||||
parser.add_argument('tags', type=str, nargs='+') | parser.add_argument('tags', type=str, nargs='+') | ||||
parser = subparsers.add_parser('untag') | parser = subparsers.add_parser('untag') | ||||
@@ -98,10 +98,11 @@ def command_image_list(args): | |||||
def command_image_prune(args): | def command_image_prune(args): | ||||
poolname = zfs_poolname() | |||||
again = True | again = True | ||||
while again: | while again: | ||||
again = False | again = False | ||||
lst = zfs_parse_output(['zfs', 'list', '-o', 'focker:sha256,focker:tags,origin,name', '-H']) | |||||
lst = zfs_parse_output(['zfs', 'list', '-o', 'focker:sha256,focker:tags,origin,name', '-H', '-r', poolname + '/focker/images']) | |||||
used = set() | used = set() | ||||
for r in lst: | for r in lst: | ||||
if r[2] == '-': | if r[2] == '-': | ||||
@@ -1,5 +1,6 @@ | |||||
from .misc import random_sha256_hexdigest | from .misc import random_sha256_hexdigest | ||||
from .zfs import * | from .zfs import * | ||||
from tabulate import tabulate | |||||
def command_volume_create(args): | def command_volume_create(args): | ||||
@@ -14,16 +15,23 @@ def command_volume_create(args): | |||||
def command_volume_prune(args): | def command_volume_prune(args): | ||||
raise NotImplementedError | |||||
zfs_prune(focker_type='volume') | |||||
def command_volume_list(args): | def command_volume_list(args): | ||||
raise NotImplementedError | |||||
poolname = zfs_poolname() | |||||
lst = zfs_parse_output(['zfs', 'list', '-o', 'name,refer,focker:sha256,focker:tags', '-H', '-r', poolname + '/focker/volumes']) | |||||
lst = list(filter(lambda a: a[2] != '-', lst)) | |||||
lst = list(map(lambda a: [ a[3], a[1], | |||||
a[2] if args.full_sha256 else a[2][:7] ], lst)) | |||||
print(tabulate(lst, headers=['Tags', 'Size', 'SHA256'])) | |||||
def command_volume_tag(args): | def command_volume_tag(args): | ||||
raise NotImplementedError | |||||
name, _ = zfs_find(args.reference, focker_type='volume') | |||||
zfs_untag(args.tags) | |||||
zfs_tag(name, args.tags) | |||||
def command_volume_untag(args): | def command_volume_untag(args): | ||||
raise NotImplementedError | |||||
zfs_untag(args.tags) |
@@ -49,6 +49,26 @@ def zfs_find(reference, focker_type='image', zfs_type='filesystem'): | |||||
return (lst[0][3], lst[0][0]) | return (lst[0][3], lst[0][0]) | ||||
def zfs_prune(focker_type='image'): | |||||
poolname = zfs_poolname() | |||||
again = True | |||||
while again: | |||||
again = False | |||||
lst = zfs_parse_output(['zfs', 'list', '-o', 'focker:sha256,focker:tags,origin,name', '-H', '-r', poolname + '/focker/' + focker_type + 's']) | |||||
used = set() | |||||
for r in lst: | |||||
if r[2] == '-': | |||||
continue | |||||
used.add(r[2].split('@')[0]) | |||||
for r in lst: | |||||
if r[0] == '-' or r[1] != '-': | |||||
continue | |||||
if r[3] not in used: | |||||
print('Removing:', r[3]) | |||||
zfs_run(['zfs', 'destroy', '-r', '-f', r[3]]) | |||||
again = True | |||||
def zfs_clone(name, target_name): | def zfs_clone(name, target_name): | ||||
zfs_run(['zfs', 'clone', name, target_name]) | zfs_run(['zfs', 'clone', name, target_name]) | ||||