Improve recursive converter, fix rq.yaml

This commit is contained in:
f3flight 2016-05-07 05:56:26 +00:00
parent 30084fcec9
commit 4e833e6821
2 changed files with 41 additions and 50 deletions

19
rq.yaml
View File

@ -11,26 +11,26 @@ files:
ubuntu: [etc-apt] ubuntu: [etc-apt]
cmds: cmds:
by_release: by_release:
4.1.1: '4.1.1':
by_role: by_role:
fuel: [fuel-postgres-dump] fuel: [fuel-postgres-dump]
5.0.1: '5.0.1':
by_role: by_role:
fuel: [fuel-docker-ps, fuel-dockerctl-check, fuel-docker-db-archive] fuel: [fuel-docker-ps, fuel-dockerctl-check, fuel-docker-db-archive]
6.0: '6.0':
by_role: by_role:
compute: [ipset-save, ipset-list] compute: [ipset-save, ipset-list]
controller: [ipset-save, ipset-list] controller: [ipset-save, ipset-list]
6.1: '6.1':
by_role: by_role:
fuel: [fuel-notifications] fuel: [fuel-notifications]
7.0: '7.0':
by_role: by_role:
fuel: [fuel-notifications] fuel: [fuel-notifications]
5.1.1: '5.1.1':
by_role: by_role:
fuel: [fuel-dockerctl-list, fuel-docker-ps, fuel-dockerctl-check, fuel-docker-db-archive] fuel: [fuel-dockerctl-list, fuel-docker-ps, fuel-dockerctl-check, fuel-docker-db-archive]
8.0: '8.0':
by_role: by_role:
fuel: [fuel-notifications] fuel: [fuel-notifications]
by_role: by_role:
@ -53,8 +53,5 @@ cmds:
by_os_platform: by_os_platform:
ubuntu: [dmesg-t-ubuntu, packages-ubuntu] ubuntu: [dmesg-t-ubuntu, packages-ubuntu]
centos: [dmesg-centos, packages-centos] centos: [dmesg-centos, packages-centos]
default: __default:
[ip-ne, iptables, ipnetns, ss, ipa, iptables-nat, df-m, services-status, cpuinfo, df-i, ipro] [ip-ne, iptables, ipnetns, ss, ipa, iptables-nat, df-m, services-status, cpuinfo, df-i, ipro]
# by-os:
# centos: []
# ubuntu: []

View File

@ -2,59 +2,53 @@
from timmy import tools from timmy import tools
from yaml import dump from yaml import dump
from copy import deepcopy as dc
class Conf(): class Conf():
default_key = '__default' default_key = '__default'
class Node(): class Node():
conf_section_prefix = 'by_' conf_match_prefix = 'by_'
def import_rq(): def import_rq():
def is_sub(m, d, p): def sub_is_match(el, d, p):
checks = [] checks = []
for i in m: for i in el:
checks.append(i.startswith(p) or i == d) checks.append(i.startswith(p) or i == d)
return all(checks) return all(checks)
def r_sub(a, m, mk, mmk, d, p, ds): def r_sub(attr, el, k, d, p, dst):
if not mk in ds: match_sect = False
ds[mk] = {} if type(k) is str and k.startswith(p):
if d in mmk: match_sect = True
if mk.startswith(p): if not k in dst and k != attr:
ds[mk][d] = {a: mmk[d]} dst[k] = {}
mmk[d] = {a: mmk[d]} if d in el[k]:
if k == attr:
dst[k] = el[k][d]
elif k.startswith(p):
dst[k][d] = {attr: el[k][d]}
else: else:
ds[mk][a] = mmk[d] dst[k][attr] = el[k][d]
if mk.startswith(p): if k == attr:
ks = [k for k in mmk if k != d] subks = [subk for subk in el[k] if subk != d]
for k in ks: for subk in subks:
if mmk[k] is not None: r_sub(attr, el[k], subk, d, p, dst)
if not k in ds[mk]: elif match_sect or type(el[k]) is dict and sub_is_match(el[k], d, p):
ds[mk][k] = {} subks = [subk for subk in el[k] if subk != d]
r_sub(a, mmk, k, mmk[k], d, p, ds[mk]) for subk in subks:
elif type(mmk) is dict and is_sub(mmk, d, p): if el[k][subk] is not None:
ks = [k for k in mmk if k.startswith(p)] if not subk in dst[k]:
for k in ks: dst[k][subk] = {}
if mmk[k] is not None: r_sub(attr, el[k], subk, d, p, dst[k])
if not k in ds[mk]:
ds[mk][k] = {}
r_sub(a, mmk, k, mmk[k], d, p, ds[mk])
else: else:
ds[mk][a] = m[mk] dst[k][attr] = el[k]
m[mk] = {a: m[mk]}
rq = tools.load_yaml_file('rqtest.yaml') src = tools.load_yaml_file('rq.yaml')
rq2 = {} dst = {}
p = Node.conf_section_prefix p = Node.conf_match_prefix
d = Conf.default_key d = Conf.default_key
for attr in rq: for attr in src:
m = rq[attr] r_sub(attr, src, attr, d, p, dst)
if d in m: return dst
rq2[attr] = m[d]
mks = [mk for mk in m if mk.startswith(p)]
for mk in mks:
r_sub(attr, m, mk, m[mk], d, p, rq2)
return rq2
print(dump(import_rq(), default_flow_style=False)) print(dump(import_rq(), default_flow_style=False))