tools/config/config_gen.py

112 lines
3.4 KiB
Python
Executable File

#!/usr/bin/env python3
try:
import simplejson as json
except ImportError:
import json
import argparse
import ipaddress
import os
import pathlib
import pickle
import random
import shutil
import subprocess
import sys
import time
from copy import deepcopy
from template import BASE_TEMAPLTE, NODE_ID, UPDATES
class ConfigGen:
def __init__(
self,
):
parser = argparse.ArgumentParser(
description="Generates EdgeVPN config files for a range of nodes",
fromfile_prefix_chars="@",
)
parser.add_argument(
"-t",
"--template",
action="store",
dest="template",
type=str,
help="Fully qualified filename for configuration template used to generate the others",
)
parser.add_argument(
"-u",
"--updates",
action="store",
dest="updates",
help="Fully qualified filename for configuration parameters to merge/overwrite on the template ",
)
parser.add_argument(
"-o",
"--output_dir",
action="store",
dest="output_dir",
type=pathlib.Path,
help="Directory for generated configuration files",
)
parser.add_argument(
"-r",
"--range",
action="store",
dest="range",
nargs=2,
required=True,
help="Specifies the range of files to genereate",
)
self.args = parser.parse_args()
self.range_end = int(self.args.range[1])
self.range_start = int(self.args.range[0])
if not self.args.output_dir:
self.output_dir = os.path.abspath(".")
else:
self.args.output_dir.mkdir(exist_ok=True)
self.output_dir = str(self.args.output_dir)
self.config_file_base = "{0}/config-".format(self.output_dir)
def gen(self):
config = deepcopy(UPDATES)
node_id = NODE_ID
for val in range(self.range_start, self.range_end):
rng_str = "{0:03}".format(val)
cfg_file = f"{self.config_file_base}{rng_str}.json"
node_id = "{0}{1}{2}{1}{3}".format(
node_id[:4], rng_str, node_id[7:29], node_id[32:]
)
overlays = config["Broker"].get("Overlays", [])
config["Broker"]["NodeId"] = node_id
for olid in overlays:
netwk = config["BridgeController"]["Overlays"][olid]["NetDevice"][
"AppBridge"
].pop("NetworkAddress")
netwk = ipaddress.IPv4Network(netwk)
node_ip = str(netwk[val])
config["BridgeController"]["Overlays"][olid]["NetDevice"]["AppBridge"][
"IP4"
] = node_ip
config["BridgeController"]["Overlays"][olid]["NetDevice"]["AppBridge"][
"PrefixLen"
] = netwk.prefixlen
config["Topology"]["Overlays"][olid]["LocationId"] = val
with open(cfg_file, "w") as cfg_fle:
json.dump(config, cfg_fle, indent=2)
cfg_fle.flush()
config = deepcopy(UPDATES)
print("{0} config file(s) generated".format(self.range_end - self.range_start))
def main(): # pylint: disable=too-many-return-statements
cfg = ConfigGen()
cfg.gen()
if __name__ == "__main__":
main()