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 os
Theo Chatzimichos 02fadf
import sys
Theo Chatzimichos 02fadf
ac656a
import yaml
Christian Boltz 25cb76
from get_roles import read_file_skip_jinja
04eaa2
from get_valid_custom_grains import get_countries, get_valid_global_grains
Theo Chatzimichos 7cceb8
Theo Chatzimichos 02fadf
Theo Chatzimichos 02fadf
def error_msg(sls, key, valid_values):
8c9349
    if isinstance(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)
ac656a
    print(f'pillar/id/{sls} has invalid value for the "{key}" key. Valid value{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:
ac656a
        print(f'pillar/id/{sls} is missing the "{key}" key')
Theo Chatzimichos 02fadf
        return 1
Theo Chatzimichos 02fadf
8c9349
    if isinstance(valid_values, str):
Theo Chatzimichos 02fadf
        if value != valid_values:
Theo Chatzimichos 02fadf
            status = error_msg(sls, key, valid_values)
c3f233
    elif valid_values and value not in valid_values:
c3f233
        status = error_msg(sls, key, map(str, 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 7cceb8
valid_global_grains = get_valid_global_grains()
04eaa2
all_countries = get_countries()
Theo Chatzimichos 02fadf
Theo Chatzimichos 02fadf
all_ids = sorted(os.listdir('pillar/id'))
Theo Chatzimichos 02fadf
for sls in all_ids:
Christian Boltz 2570f4
    if sls == 'README.md':
Christian Boltz 2570f4
        continue
Christian Boltz 2570f4
Christian Boltz 25cb76
    content = read_file_skip_jinja("pillar/id/%s" % sls)
Karol Babioch 3016f1
    mygrains = yaml.safe_load(content)['grains']
Theo Chatzimichos 02fadf
Christian Boltz 25cb76
    for key, valid_values in valid_global_grains.items():
Christian Boltz 25cb76
        status = test_custom_grain(mygrains, sls, key, valid_values, status)
Theo Chatzimichos 02fadf
04eaa2
    if 'country' not in mygrains or mygrains['country'] not in all_countries:
04eaa2
        status = error_msg(sls, 'country', all_countries)
Theo Chatzimichos 02fadf
Theo Chatzimichos 02fadf
sys.exit(status)