subiquity/scripts/validate-yaml.py

80 lines
2.1 KiB
Python
Raw Normal View History

#!/usr/bin/python3
import sys
import yaml
class StorageChecker:
def __init__(self):
self.actions = {}
self.unmounted_swap_ids = set()
def _check_partition(self, action):
assert 'device' in action
assert 'size' in action
assert action['device'] in self.actions
assert 'ptable' in self.actions[action['device']]
def _check_format(self, action):
assert 'volume' in action
assert action['volume'] in self.actions
if action['fstype'] == 'swap':
self.unmounted_swap_ids.add(action['id'])
def _check_mount(self, action):
assert 'device' in action
assert action['device'] in self.actions
if not action.get('path'):
assert self.actions[action['device']]['fstype'] == "swap"
self.unmounted_swap_ids.remove(action['device'])
def _check_raid(self, action):
assert 'raidlevel' in action
for d in action['devices']:
assert d in self.actions
def _check_lvm_volgroup(self, action):
assert 'name' in action
for d in action['devices']:
assert d in self.actions
def _check_lvm_partition(self, action):
assert 'name' in action
assert 'size' in action
assert isinstance(action['size'], str)
assert action['volgroup'] in self.actions
def check(self, action):
assert 'type' in action
assert 'id' in action
m = getattr(self, '_check_{type}'.format(**action), None)
if m:
m(action)
self.actions[action['id']] = action
def final_checks(self):
if len(self.unmounted_swap_ids) > 0:
raise Exception(
"some swap formats had no mounts: {}".format(
self.unmounted_swap_ids))
config = yaml.safe_load(open(sys.argv[1]))
def main():
storage_checker = StorageChecker()
for action in config['storage']['config']:
try:
storage_checker.check(action)
except Exception:
print('checking {} failed'.format(action))
raise
storage_checker.final_checks()
main()