Theo Chatzimichos 02fadf
#!/usr/bin/python3
Theo Chatzimichos 02fadf
Theo Chatzimichos 02fadf
# Validates if the pillar/id/$FQDN.sls has correct custom grains
Theo Chatzimichos 02fadf
Theo Chatzimichos 02fadf
import yaml
Theo Chatzimichos 02fadf
import os
Theo Chatzimichos 02fadf
import sys
Theo Chatzimichos 02fadf
Theo Chatzimichos 02fadf
Theo Chatzimichos 02fadf
def error_msg(sls, key, valid_values):
Theo Chatzimichos 02fadf
    if type(valid_values) == str:
Theo Chatzimichos 02fadf
        msg = ' is'
Theo Chatzimichos 02fadf
        result = valid_values
Theo Chatzimichos 02fadf
    else:
Theo Chatzimichos 02fadf
        msg = 's are'
Theo Chatzimichos 02fadf
        result = ', '.join(valid_values)
Theo Chatzimichos 02fadf
    print('pillar/id/%s has invalid value for the "%s" key. Valid value%s: %s' % (sls, key, msg, result))
Theo Chatzimichos 02fadf
    return 1
Theo Chatzimichos 02fadf
Theo Chatzimichos 02fadf
Theo Chatzimichos 02fadf
def test_custom_grain(mygrains, sls, key, valid_values, status):
Theo Chatzimichos 02fadf
    try:
Theo Chatzimichos 02fadf
        value = mygrains[key]
Theo Chatzimichos 02fadf
    except KeyError:
Theo Chatzimichos 02fadf
        print('pillar/id/%s is missing the "%s" key' % (sls, key))
Theo Chatzimichos 02fadf
        return 1
Theo Chatzimichos 02fadf
Theo Chatzimichos 02fadf
    if type(valid_values) == str:
Theo Chatzimichos 02fadf
        if value != valid_values:
Theo Chatzimichos 02fadf
            status = error_msg(sls, key, valid_values)
Theo Chatzimichos 02fadf
    else:
Theo Chatzimichos 02fadf
        if value not in valid_values:
Theo Chatzimichos 02fadf
            status = error_msg(sls, key, valid_values)
Theo Chatzimichos 02fadf
Theo Chatzimichos 02fadf
    return status
Theo Chatzimichos 02fadf
Theo Chatzimichos 02fadf
Theo Chatzimichos 02fadf
status = 0
Theo Chatzimichos 02fadf
Theo Chatzimichos 02fadf
with open('pillar/valid_custom_grains.yaml', 'r') as f:
Theo Chatzimichos 02fadf
    VALID_CUSTOM_GRAINS = yaml.load(f)
Theo Chatzimichos 02fadf
Theo Chatzimichos 02fadf
valid_global_grains = VALID_CUSTOM_GRAINS['global']
Theo Chatzimichos 02fadf
all_localized_grains = VALID_CUSTOM_GRAINS['localized']
Theo Chatzimichos 02fadf
Theo Chatzimichos 02fadf
all_ids = sorted(os.listdir('pillar/id'))
Theo Chatzimichos 02fadf
for sls in all_ids:
Theo Chatzimichos 02fadf
    with open("pillar/id/%s" % sls) as f:
Theo Chatzimichos 02fadf
        mygrains = yaml.load(f)['grains']
Theo Chatzimichos 02fadf
Theo Chatzimichos 02fadf
        for key, valid_values in valid_global_grains.items():
Theo Chatzimichos 02fadf
            status = test_custom_grain(mygrains, sls, key, valid_values, status)
Theo Chatzimichos 02fadf
Theo Chatzimichos 02fadf
        try:
Theo Chatzimichos 02fadf
            valid_localized_grains = all_localized_grains[mygrains['country']]
Theo Chatzimichos 02fadf
            for key, valid_values in valid_localized_grains.items():
Theo Chatzimichos 02fadf
                status = test_custom_grain(mygrains, sls, key, valid_values, status)
Theo Chatzimichos 02fadf
        except KeyError:
Theo Chatzimichos 02fadf
            status = error_msg(sls, 'country', all_localized_grains.keys())
Theo Chatzimichos 02fadf
Theo Chatzimichos 02fadf
sys.exit(status)