improved gitignore for generated proto files, added new initial separate config service proto, incorporated into grpc api

This commit is contained in:
Blake Harnden 2020-01-18 13:52:15 -08:00
parent 43fe81a86e
commit 0af6a7a620
7 changed files with 161 additions and 4 deletions

View file

@ -12,6 +12,14 @@ import netaddr
from core import utils
from core.api.grpc import core_pb2, core_pb2_grpc
from core.api.grpc.configservices_pb2 import (
GetConfigServiceRequest,
GetConfigServiceResponse,
GetConfigServicesRequest,
GetConfigServicesResponse,
SetConfigServiceRequest,
SetConfigServiceResponse,
)
class InterfaceHelper:
@ -1078,6 +1086,26 @@ class CoreGrpcClient:
request = core_pb2.GetInterfacesRequest()
return self.stub.GetInterfaces(request)
def get_config_services(self) -> GetConfigServicesResponse:
request = GetConfigServicesRequest()
return self.stub.GetConfigServices(request)
def get_config_service(
self, session_id: int, node_id: int, name: str
) -> GetConfigServiceResponse:
request = GetConfigServiceRequest(
session_id=session_id, node_id=node_id, name=name
)
return self.stub.GetConfigService(request)
def set_config_service(
self, session_id: int, node_id: int, name: str, config: Dict[str, str]
) -> SetConfigServiceResponse:
request = SetConfigServiceRequest(
session_id=session_id, node_id=node_id, name=name, config=config
)
return self.stub.SetConfigService(request)
def connect(self) -> None:
"""
Open connection to server, must be closed manually.

View file

@ -10,6 +10,15 @@ import grpc
from grpc import ServicerContext
from core.api.grpc import core_pb2, core_pb2_grpc, grpcutils
from core.api.grpc.configservices_pb2 import (
ConfigService,
GetConfigServiceRequest,
GetConfigServiceResponse,
GetConfigServicesRequest,
GetConfigServicesResponse,
SetConfigServiceRequest,
SetConfigServiceResponse,
)
from core.api.grpc.events import EventStreamer
from core.api.grpc.grpcutils import (
get_config_options,
@ -101,6 +110,10 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
except CoreError:
context.abort(grpc.StatusCode.NOT_FOUND, f"node {node_id} not found")
def validate_service(self, name: str, context: ServicerContext) -> None:
if name not in self.coreemu.service_manager.services:
context.abort(grpc.StatusCode.NOT_FOUND, f"unknown service {name}")
def StartSession(
self, request: core_pb2.StartSessionRequest, context: ServicerContext
) -> core_pb2.StartSessionResponse:
@ -1429,3 +1442,55 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
return core_pb2.EmaneLinkResponse(result=True)
else:
return core_pb2.EmaneLinkResponse(result=False)
def GetConfigServices(
self, request: GetConfigServicesRequest, context: ServicerContext
) -> GetConfigServicesResponse:
services = []
for service in self.coreemu.service_manager.services.values():
service_proto = ConfigService(
name=service.name,
group=service.group,
executables=service.executables,
dependencies=service.dependencies,
directories=service.directories,
startup=service.startup,
validate=service.validate,
shutdown=service.shutdown,
validation_mode=service.validation_mode.value,
validation_timer=service.validation_timer,
validation_period=service.validation_period,
)
services.append(service_proto)
return GetConfigServicesResponse(services=services)
def GetConfigService(
self, request: GetConfigServiceRequest, context: ServicerContext
) -> GetConfigServiceResponse:
session = self.get_session(request.session_id, context)
node = self.get_node(session, request.node_id, context)
self.validate_service(request.name, context)
service = node.config_services.get(request.name)
if service:
config = service.get_config()
else:
service = self.coreemu.service_manager.get_service(request.name)
config = {x.id: x.default for x in service.default_configs}
return GetConfigServiceResponse(config=config)
def SetConfigService(
self, request: SetConfigServiceRequest, context: ServicerContext
) -> SetConfigServiceResponse:
session = self.get_session(request.session_id, context)
node = self.get_node(session, request.node_id, context)
self.validate_service(request.name, context)
service = node.config_services.get(request.name)
if service:
service.set_config(request.config)
return SetConfigServiceResponse(result=True)
else:
context.abort(
grpc.StatusCode.NOT_FOUND,
f"node {node.name} missing service {request.name}",
)