summaryrefslogtreecommitdiff
path: root/roles/storage/zfs/base/filter_plugins/zfs.py
diff options
context:
space:
mode:
Diffstat (limited to 'roles/storage/zfs/base/filter_plugins/zfs.py')
-rw-r--r--roles/storage/zfs/base/filter_plugins/zfs.py43
1 files changed, 43 insertions, 0 deletions
diff --git a/roles/storage/zfs/base/filter_plugins/zfs.py b/roles/storage/zfs/base/filter_plugins/zfs.py
new file mode 100644
index 00000000..a336c197
--- /dev/null
+++ b/roles/storage/zfs/base/filter_plugins/zfs.py
@@ -0,0 +1,43 @@
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+
+from functools import partial
+from copy import deepcopy
+
+from ansible import errors
+
+
+def _recurse_pool_volumes(pool, prefix, volumes):
+ result = []
+ if prefix != '':
+ prefix = prefix + '/'
+ for name, volume in volumes.items():
+ entry = deepcopy(volume)
+ entry.pop('children', None)
+ entry['pool'] = pool
+ entry['name'] = prefix+name
+ result.append(entry)
+ if 'children' in volume:
+ result = result + _recurse_pool_volumes(pool, entry['name'], volume['children'])
+
+ return result
+
+
+def zfs_volume_list(data):
+ try:
+ result = []
+ for pool, volumes in data.items():
+ result = result + _recurse_pool_volumes(pool, '', volumes)
+ return result
+ except Exception as e:
+ raise errors.AnsibleFilterError("zfs_volume_list(): %s" % str(e))
+
+
+class FilterModule(object):
+
+ filter_map = {
+ 'zfs_volume_list': zfs_volume_list,
+ }
+
+ def filters(self):
+ return self.filter_map