import os import json import argparse from appr.commands.command_base import CommandBase, LoadVariables from appr.render_jsonnet import RenderJsonnet class JsonnetCmd(CommandBase): name = 'jsonnet' help_message = "Resolve a jsonnet file" def __init__(self, options): super(JsonnetCmd, self).__init__(options) self.namespace = options.namespace self.variables = options.variables self.filepath = options.filepath[0] self.extra_libs = options.lib_dir self.raw = options.raw self.result = None @classmethod def _add_arguments(cls, parser): parser.add_argument("--namespace", help="kubernetes namespace", default='default') parser.add_argument("-x", "--variables", help="variables", default={}, action=LoadVariables) parser.add_argument('filepath', nargs=1, help="Fetch package from the registry") parser.add_argument('--raw', action="store_true", default=False, help=argparse.SUPPRESS) parser.add_argument('-J', '--lib-dir', action='append', default=[], help="Specify an additional library search dir") def _call(self): r = RenderJsonnet(manifestpath=self.filepath, lib_dirs=self.extra_libs) if os.path.basename(self.filepath) == "manifest.jsonnet" and not self.raw: namespace = self.namespace self.variables['namespace'] = namespace tla_codes = {"params": json.dumps({"variables": self.variables})} else: tla_codes = self.variables p = open(self.filepath).read() self.result = r.render_jsonnet(p, tla_codes=tla_codes) def _render_dict(self): return self.result def _render_console(self): return json.dumps(self._render_dict(), indent=2, separators=(',', ': '))