updated config service grpc to return default templates and config, added logic to check for local custom templates

This commit is contained in:
Blake Harnden 2020-01-20 15:54:47 -08:00
parent 7b5df11dc7
commit a4f3abf27c
7 changed files with 51 additions and 54 deletions

View file

@ -13,10 +13,10 @@ import netaddr
from core import utils from core import utils
from core.api.grpc import core_pb2, core_pb2_grpc from core.api.grpc import core_pb2, core_pb2_grpc
from core.api.grpc.configservices_pb2 import ( from core.api.grpc.configservices_pb2 import (
GetConfigServiceDefaultsRequest,
GetConfigServiceDefaultsResponse,
GetConfigServicesRequest, GetConfigServicesRequest,
GetConfigServicesResponse, GetConfigServicesResponse,
GetConfigServiceTemplatesRequest,
GetConfigServiceTemplatesResponse,
GetNodeConfigServiceRequest, GetNodeConfigServiceRequest,
GetNodeConfigServiceResponse, GetNodeConfigServiceResponse,
GetNodeConfigServicesRequest, GetNodeConfigServicesRequest,
@ -1094,11 +1094,11 @@ class CoreGrpcClient:
request = GetConfigServicesRequest() request = GetConfigServicesRequest()
return self.stub.GetConfigServices(request) return self.stub.GetConfigServices(request)
def get_config_service_templates( def get_config_service_defaults(
self, name: str self, name: str
) -> GetConfigServiceTemplatesResponse: ) -> GetConfigServiceDefaultsResponse:
request = GetConfigServiceTemplatesRequest(name=name) request = GetConfigServiceDefaultsRequest(name=name)
return self.stub.GetConfigServiceTemplates(request) return self.stub.GetConfigServiceDefaults(request)
def get_node_config_service( def get_node_config_service(
self, session_id: int, node_id: int, name: str self, session_id: int, node_id: int, name: str

View file

@ -13,10 +13,10 @@ from grpc import ServicerContext
from core.api.grpc import core_pb2, core_pb2_grpc, grpcutils from core.api.grpc import core_pb2, core_pb2_grpc, grpcutils
from core.api.grpc.configservices_pb2 import ( from core.api.grpc.configservices_pb2 import (
ConfigService, ConfigService,
GetConfigServiceDefaultsRequest,
GetConfigServiceDefaultsResponse,
GetConfigServicesRequest, GetConfigServicesRequest,
GetConfigServicesResponse, GetConfigServicesResponse,
GetConfigServiceTemplatesRequest,
GetConfigServiceTemplatesResponse,
GetNodeConfigServiceRequest, GetNodeConfigServiceRequest,
GetNodeConfigServiceResponse, GetNodeConfigServiceResponse,
GetNodeConfigServicesRequest, GetNodeConfigServicesRequest,
@ -1482,20 +1482,20 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
self.validate_service(request.name, context) self.validate_service(request.name, context)
service = node.config_services.get(request.name) service = node.config_services.get(request.name)
if service: if service:
config = service.get_config() config = service.render_config()
else: else:
service = self.coreemu.service_manager.get_service(request.name) service = self.coreemu.service_manager.get_service(request.name)
config = {x.id: x.default for x in service.default_configs} config = {x.id: x.default for x in service.default_configs}
return GetNodeConfigServiceResponse(config=config) return GetNodeConfigServiceResponse(config=config)
def GetConfigServiceTemplates( def GetConfigServiceDefaults(
self, request: GetConfigServiceTemplatesRequest, context: ServicerContext self, request: GetConfigServiceDefaultsRequest, context: ServicerContext
) -> GetConfigServiceTemplatesResponse: ) -> GetConfigServiceDefaultsResponse:
service_class = self.validate_service(request.name, context) service_class = self.validate_service(request.name, context)
service = service_class(None) service = service_class(None)
templates = service.get_templates() templates = service.get_templates()
return GetConfigServiceTemplatesResponse(templates=templates) config = service.render_config()
return GetConfigServiceDefaultsResponse(templates=templates, config=config)
def GetNodeConfigServices( def GetNodeConfigServices(
self, request: GetNodeConfigServicesRequest, context: ServicerContext self, request: GetNodeConfigServicesRequest, context: ServicerContext

View file

@ -37,6 +37,7 @@ class ConfigService(abc.ABC):
logging.info(templates_path) logging.info(templates_path)
self.templates = TemplateLookup(directories=templates_path) self.templates = TemplateLookup(directories=templates_path)
self.config = {} self.config = {}
self.custom_templates = {}
configs = self.default_configs[:] configs = self.default_configs[:]
self._define_config(configs) self._define_config(configs)
@ -128,6 +129,9 @@ class ConfigService(abc.ABC):
def data(self) -> Dict[str, Any]: def data(self) -> Dict[str, Any]:
return {} return {}
def custom_template(self, name: str, template: str) -> None:
self.custom_templates[name] = template
def get_text(self, name: str) -> str: def get_text(self, name: str) -> str:
raise CoreError( raise CoreError(
f"node({self.node.name} service({self.name}) unknown template({name})" f"node({self.node.name} service({self.name}) unknown template({name})"
@ -136,7 +140,10 @@ class ConfigService(abc.ABC):
def get_templates(self) -> Dict[str, str]: def get_templates(self) -> Dict[str, str]:
templates = {} templates = {}
for name in self.files: for name in self.files:
if self.templates.has_template(name): if name in self.custom_templates:
template = self.custom_templates[name]
template = inspect.cleandoc(template)
elif self.templates.has_template(name):
template = self.templates.get_template(name).source template = self.templates.get_template(name).source
else: else:
template = self.get_text(name) template = self.get_text(name)
@ -147,7 +154,11 @@ class ConfigService(abc.ABC):
def create_files(self) -> None: def create_files(self) -> None:
data = self.data() data = self.data()
for name in self.files: for name in self.files:
if self.templates.has_template(name): if name in self.custom_templates:
text = self.custom_templates[name]
text = inspect.cleandoc(text)
self.render_text(name, text, data)
elif self.templates.has_template(name):
self.render_template(name, data) self.render_template(name, data)
else: else:
text = self.get_text(name) text = self.get_text(name)

View file

@ -90,6 +90,7 @@ class CoreClient:
self.emane_model_configs = {} self.emane_model_configs = {}
self.emane_config = None self.emane_config = None
self.service_configs = {} self.service_configs = {}
self.config_service_configs = {}
self.file_configs = {} self.file_configs = {}
self.mobility_players = {} self.mobility_players = {}
self.handling_throughputs = None self.handling_throughputs = None

View file

@ -30,8 +30,7 @@ class ConfigServiceConfigDialog(Dialog):
self.core = app.core self.core = app.core
self.node_id = node_id self.node_id = node_id
self.service_name = service_name self.service_name = service_name
self.service_configs = app.core.service_configs self.service_configs = app.core.config_service_configs
self.file_configs = app.core.file_configs
self.radiovar = tk.IntVar() self.radiovar = tk.IntVar()
self.radiovar.set(2) self.radiovar.set(2)
@ -68,40 +67,25 @@ class ConfigServiceConfigDialog(Dialog):
def load(self): def load(self):
try: try:
self.app.core.create_nodes_and_links() self.app.core.create_nodes_and_links()
# default_config = self.app.core.get_node_service( service = self.core.config_services[self.service_name]
# self.node_id, self.service_name self.dependencies = service.dependencies[:]
# ) self.executables = service.executables[:]
# self.default_startup = default_config.startup[:] self.filenames = service.files[:]
# self.default_validate = default_config.validate[:] self.startup_commands = service.startup[:]
# self.default_shutdown = default_config.shutdown[:] self.validation_commands = service.validate[:]
# custom_configs = self.service_configs self.shutdown_commands = service.shutdown[:]
# if ( self.validation_mode = service.validation_mode
# self.node_id in custom_configs self.validation_time = service.validation_timer
# and self.service_name in custom_configs[self.node_id] self.validation_period.set(service.validation_period)
# ):
# service_config = custom_configs[self.node_id][self.service_name]
# else:
# service_config = default_config
service_config = self.core.config_services[self.service_name] response = self.core.client.get_config_service_defaults(self.service_name)
self.dependencies = service_config.dependencies[:]
self.executables = service_config.executables[:]
self.filenames = service_config.files[:]
self.startup_commands = service_config.startup[:]
self.validation_commands = service_config.validate[:]
self.shutdown_commands = service_config.shutdown[:]
self.validation_mode = service_config.validation_mode
self.validation_time = service_config.validation_timer
self.validation_period.set(service_config.validation_period)
response = self.core.client.get_config_service_templates(self.service_name)
self.original_service_files = response.templates self.original_service_files = response.templates
self.temp_service_files = dict(self.original_service_files) self.temp_service_files = dict(self.original_service_files)
file_configs = self.file_configs
if ( node_configs = self.service_configs.get(self.node_id, {})
self.node_id in file_configs service_config = node_configs.get(self.service_name, {})
and self.service_name in file_configs[self.node_id] custom_templates = service_config.get("templates", {})
): for file, data in custom_templates.items():
for file, data in file_configs[self.node_id][self.service_name].items():
self.temp_service_files[file] = data self.temp_service_files[file] = data
except grpc.RpcError as e: except grpc.RpcError as e:
show_grpc_error(e) show_grpc_error(e)
@ -270,7 +254,7 @@ class ConfigServiceConfigDialog(Dialog):
tab = ttk.Frame(self.notebook, padding=FRAME_PAD) tab = ttk.Frame(self.notebook, padding=FRAME_PAD)
tab.grid(sticky="nsew") tab.grid(sticky="nsew")
tab.columnconfigure(0, weight=1) tab.columnconfigure(0, weight=1)
self.notebook.add(tab, text="Configuration", sticky="nsew") self.notebook.add(tab, text="Validation", sticky="nsew")
frame = ttk.Frame(tab) frame = ttk.Frame(tab)
frame.grid(sticky="ew", pady=PADY) frame.grid(sticky="ew", pady=PADY)

View file

@ -33,12 +33,13 @@ message GetConfigServicesResponse {
repeated ConfigService services = 1; repeated ConfigService services = 1;
} }
message GetConfigServiceTemplatesRequest { message GetConfigServiceDefaultsRequest {
string name = 1; string name = 1;
} }
message GetConfigServiceTemplatesResponse { message GetConfigServiceDefaultsResponse {
map<string, string> templates = 1; map<string, string> templates = 1;
map<string, string> config = 2;
} }
message GetNodeConfigServiceRequest { message GetNodeConfigServiceRequest {

View file

@ -107,7 +107,7 @@ service CoreApi {
// config services // config services
rpc GetConfigServices (configservices.GetConfigServicesRequest) returns (configservices.GetConfigServicesResponse) { rpc GetConfigServices (configservices.GetConfigServicesRequest) returns (configservices.GetConfigServicesResponse) {
} }
rpc GetConfigServiceTemplates (configservices.GetConfigServiceTemplatesRequest) returns (configservices.GetConfigServiceTemplatesResponse) { rpc GetConfigServiceDefaults (configservices.GetConfigServiceDefaultsRequest) returns (configservices.GetConfigServiceDefaultsResponse) {
} }
rpc GetNodeConfigService (configservices.GetNodeConfigServiceRequest) returns (configservices.GetNodeConfigServiceResponse) { rpc GetNodeConfigService (configservices.GetNodeConfigServiceRequest) returns (configservices.GetNodeConfigServiceResponse) {
} }