renamed config service dependency finder method to startup_paths, added pydocs to config service related methods
This commit is contained in:
parent
09aa882017
commit
45fb32c834
3 changed files with 88 additions and 16 deletions
|
@ -101,6 +101,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
|
|||
:param context:
|
||||
:return: session object that satisfies, if session not found then raise an
|
||||
exception
|
||||
:raises Exception: raises grpc exception when session does not exist
|
||||
"""
|
||||
session = self.coreemu.sessions.get(session_id)
|
||||
if not session:
|
||||
|
@ -117,6 +118,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
|
|||
:param node_id: node id
|
||||
:param context:
|
||||
:return: node object that satisfies. If node not found then raise an exception.
|
||||
:raises Exception: raises grpc exception when node does not exist
|
||||
"""
|
||||
try:
|
||||
return session.get_node(node_id)
|
||||
|
@ -126,6 +128,14 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
|
|||
def validate_service(
|
||||
self, name: str, context: ServicerContext
|
||||
) -> Type[ConfigService]:
|
||||
"""
|
||||
Validates a configuration service is a valid known service.
|
||||
|
||||
:param name: name of service to validate
|
||||
:param context: grpc context
|
||||
:return: class for service to validate
|
||||
:raises Exception: raises grpc exception when service does not exist
|
||||
"""
|
||||
service = self.coreemu.service_manager.services.get(name)
|
||||
if not service:
|
||||
context.abort(grpc.StatusCode.NOT_FOUND, f"unknown service {name}")
|
||||
|
@ -138,7 +148,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
|
|||
Start a session.
|
||||
|
||||
:param request: start session request
|
||||
:param context: grcp context
|
||||
:param context: grpc context
|
||||
:return: start session response
|
||||
"""
|
||||
logging.debug("start session: %s", request)
|
||||
|
@ -235,7 +245,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
|
|||
Stop a running session.
|
||||
|
||||
:param request: stop session request
|
||||
:param context: grcp context
|
||||
:param context: grpc context
|
||||
:return: stop session response
|
||||
"""
|
||||
logging.debug("stop session: %s", request)
|
||||
|
@ -1475,6 +1485,13 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
|
|||
def GetConfigServices(
|
||||
self, request: GetConfigServicesRequest, context: ServicerContext
|
||||
) -> GetConfigServicesResponse:
|
||||
"""
|
||||
Gets all currently known configuration services.
|
||||
|
||||
:param request: get config services request
|
||||
:param context: grpc context
|
||||
:return: get config services response
|
||||
"""
|
||||
services = []
|
||||
for service in self.coreemu.service_manager.services.values():
|
||||
service_proto = ConfigService(
|
||||
|
@ -1497,6 +1514,13 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
|
|||
def GetNodeConfigService(
|
||||
self, request: GetNodeConfigServiceRequest, context: ServicerContext
|
||||
) -> GetNodeConfigServiceResponse:
|
||||
"""
|
||||
Gets configuration, for a given configuration service, for a given node.
|
||||
|
||||
:param request: get node config service request
|
||||
:param context: grpc context
|
||||
:return: get node config service response
|
||||
"""
|
||||
session = self.get_session(request.session_id, context)
|
||||
node = self.get_node(session, request.node_id, context)
|
||||
self.validate_service(request.name, context)
|
||||
|
@ -1511,6 +1535,13 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
|
|||
def GetConfigServiceDefaults(
|
||||
self, request: GetConfigServiceDefaultsRequest, context: ServicerContext
|
||||
) -> GetConfigServiceDefaultsResponse:
|
||||
"""
|
||||
Get default values for a given configuration service.
|
||||
|
||||
:param request: get config service defaults request
|
||||
:param context: grpc context
|
||||
:return: get config service defaults response
|
||||
"""
|
||||
service_class = self.validate_service(request.name, context)
|
||||
service = service_class(None)
|
||||
templates = service.get_templates()
|
||||
|
@ -1536,6 +1567,14 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
|
|||
def GetNodeConfigServiceConfigs(
|
||||
self, request: GetNodeConfigServiceConfigsRequest, context: ServicerContext
|
||||
) -> GetNodeConfigServiceConfigsResponse:
|
||||
"""
|
||||
Get current custom templates and config for configuration services for a given
|
||||
node.
|
||||
|
||||
:param request: get node config service configs request
|
||||
:param context: grpc context
|
||||
:return: get node config service configs response
|
||||
"""
|
||||
session = self.get_session(request.session_id, context)
|
||||
configs = []
|
||||
for node in session.nodes.values():
|
||||
|
@ -1557,6 +1596,13 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
|
|||
def GetNodeConfigServices(
|
||||
self, request: GetNodeConfigServicesRequest, context: ServicerContext
|
||||
) -> GetNodeConfigServicesResponse:
|
||||
"""
|
||||
Get configuration services for a given node.
|
||||
|
||||
:param request: get node config services request
|
||||
:param context: grpc context
|
||||
:return: get node config services response
|
||||
"""
|
||||
session = self.get_session(request.session_id, context)
|
||||
node = self.get_node(session, request.node_id, context)
|
||||
services = node.config_services.keys()
|
||||
|
@ -1565,6 +1611,13 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
|
|||
def SetNodeConfigService(
|
||||
self, request: SetNodeConfigServiceRequest, context: ServicerContext
|
||||
) -> SetNodeConfigServiceResponse:
|
||||
"""
|
||||
Set custom config, for a given configuration service, for a given node.
|
||||
|
||||
:param request: set node config service request
|
||||
:param context: grpc context
|
||||
:return: set node config service response
|
||||
"""
|
||||
session = self.get_session(request.session_id, context)
|
||||
node = self.get_node(session, request.node_id, context)
|
||||
self.validate_service(request.name, context)
|
||||
|
|
|
@ -18,7 +18,7 @@ class ConfigServiceDependencies:
|
|||
"""
|
||||
# helpers to check validity
|
||||
self.dependents = {}
|
||||
self.booted = set()
|
||||
self.started = set()
|
||||
self.node_services = {}
|
||||
for service in services.values():
|
||||
self.node_services[service.name] = service
|
||||
|
@ -31,18 +31,18 @@ class ConfigServiceDependencies:
|
|||
self.visited = set()
|
||||
self.visiting = set()
|
||||
|
||||
def boot_paths(self) -> List[List["ConfigService"]]:
|
||||
def startup_paths(self) -> List[List["ConfigService"]]:
|
||||
"""
|
||||
Find services sets based on dependencies.
|
||||
Find startup path sets based on service dependencies.
|
||||
|
||||
:return: lists of lists of services that can be started in parallel
|
||||
"""
|
||||
paths = []
|
||||
for name in self.node_services:
|
||||
service = self.node_services[name]
|
||||
if service.name in self.booted:
|
||||
if service.name in self.started:
|
||||
logging.debug(
|
||||
"skipping service that will already be booted: %s", service.name
|
||||
"skipping service that will already be started: %s", service.name
|
||||
)
|
||||
continue
|
||||
|
||||
|
@ -50,10 +50,10 @@ class ConfigServiceDependencies:
|
|||
if path:
|
||||
paths.append(path)
|
||||
|
||||
if self.booted != set(self.node_services):
|
||||
if self.started != set(self.node_services):
|
||||
raise ValueError(
|
||||
"failure to boot all services: %s != %s"
|
||||
% (self.booted, self.node_services.keys())
|
||||
"failure to start all services: %s != %s"
|
||||
% (self.started, self.node_services.keys())
|
||||
)
|
||||
|
||||
return paths
|
||||
|
@ -109,8 +109,8 @@ class ConfigServiceDependencies:
|
|||
self._visit(service)
|
||||
|
||||
# add service when bottom is found
|
||||
logging.debug("adding service to boot path: %s", current_service.name)
|
||||
self.booted.add(current_service.name)
|
||||
logging.debug("adding service to startup path: %s", current_service.name)
|
||||
self.started.add(current_service.name)
|
||||
self.path.append(current_service)
|
||||
self.visiting.remove(current_service.name)
|
||||
|
||||
|
|
|
@ -285,22 +285,41 @@ class CoreNodeBase(NodeBase):
|
|||
self.nodedir = None
|
||||
self.tmpnodedir = False
|
||||
|
||||
def add_config_service(self, service_class: "ConfigServiceType"):
|
||||
def add_config_service(self, service_class: "ConfigServiceType") -> None:
|
||||
"""
|
||||
Adds a configuration service to the node.
|
||||
|
||||
:param service_class: configuration service class to assign to node
|
||||
:return: nothing
|
||||
"""
|
||||
name = service_class.name
|
||||
if name in self.config_services:
|
||||
raise CoreError(f"node({self.name}) already has service({name})")
|
||||
self.config_services[name] = service_class(self)
|
||||
|
||||
def set_service_config(self, name: str, data: Dict[str, str]) -> None:
|
||||
"""
|
||||
Sets configuration service custom config data.
|
||||
|
||||
:param name: name of configuration service
|
||||
:param data: custom config data to set
|
||||
:return: nothing
|
||||
"""
|
||||
service = self.config_services.get(name)
|
||||
if service is None:
|
||||
raise CoreError(f"node({self.name}) does not have service({name})")
|
||||
service.set_config(data)
|
||||
|
||||
def start_config_services(self) -> None:
|
||||
boot_paths = ConfigServiceDependencies(self.config_services).boot_paths()
|
||||
for boot_path in boot_paths:
|
||||
for service in boot_path:
|
||||
"""
|
||||
Determins startup paths and starts configuration services, based on their
|
||||
dependency chains.
|
||||
|
||||
:return: nothing
|
||||
"""
|
||||
startup_paths = ConfigServiceDependencies(self.config_services).startup_paths()
|
||||
for startup_path in startup_paths:
|
||||
for service in startup_path:
|
||||
service.start()
|
||||
|
||||
def makenodedir(self) -> None:
|
||||
|
|
Loading…
Add table
Reference in a new issue