def get_sorted_service_list( hostname: HostName, *, filter_mode: Optional[Literal["only_clustered", "include_clustered"]] = None, skip_ignored: bool = True, ) -> List[Service]: sorted_services_unresolved = sorted( get_check_table(hostname, filter_mode=filter_mode, skip_ignored=skip_ignored).values(), key=lambda service: service.description, ) if config.is_cmc(): return sorted_services_unresolved unresolved = [(service, set(config.service_depends_on(hostname, service.description))) for service in sorted_services_unresolved] resolved: List[Service] = [] while unresolved: resolved_descriptions = {service.description for service in resolved} newly_resolved = [ service for service, dependencies in unresolved if dependencies <= resolved_descriptions ] if not newly_resolved: problems = [ "%r (%s / %s)" % (s.description, s.check_plugin_name, s.item) for s, _ in unresolved ] raise MKGeneralException("Cyclic service dependency of host %s. Problematic are: %s" % (hostname, ", ".join(problems))) unresolved = [(s, d) for s, d in unresolved if s not in newly_resolved] resolved.extend(newly_resolved) return resolved
def get_dependencies(hostname, servicedesc): result = "" for dep in config.service_depends_on(hostname, servicedesc): result += _format_nagios_object( "servicedependency", { "use": config.service_dependency_template, "host_name": hostname, "service_description": dep, "dependent_host_name": hostname, "dependent_service_description": servicedesc, }) return result
def _get_sorted_check_table(hostname, remove_duplicates=False, filter_mode=None, skip_ignored=True): # type: (HostName, bool, Optional[str], bool) -> List[Service] # Convert from dictionary into simple tuple list. Then sort it according to # the service dependencies. # TODO: Use the Service objects from get_check_table once it returns these objects is_cmc = config.is_cmc() unsorted = [ (service, [] if is_cmc else config.service_depends_on( hostname, service.description)) for service in get_check_table(hostname, remove_duplicates=remove_duplicates, filter_mode=filter_mode, skip_ignored=skip_ignored).values() ] unsorted.sort(key=lambda x: x[0].description) ordered = [] # type: List[Service] while len(unsorted) > 0: unsorted_descrs = {entry[0].description for entry in unsorted} left = [] at_least_one_hit = False for check in unsorted: deps_fulfilled = True for dep in check[1]: # dependencies if dep in unsorted_descrs: deps_fulfilled = False break if deps_fulfilled: ordered.append(check[0]) at_least_one_hit = True else: left.append(check) if len(left) == 0: break if not at_least_one_hit: raise MKGeneralException( "Cyclic service dependency of host %s. Problematic are: %s" % (hostname, ",".join(unsorted_descrs))) unsorted = left return ordered