X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=tests%2Futils%2Flttngtest%2Flttngctl.py;h=5b937dc8acfd8cecc885fdb47af322f75236c91e;hb=45ce5eede99b4bd47067cd235629291540182fb8;hp=c2afa885f56f14448ea9c5c30bd0688afcfd9a25;hpb=a631186c95826a55d870eca56c801de93441b900;p=lttng-tools.git diff --git a/tests/utils/lttngtest/lttngctl.py b/tests/utils/lttngtest/lttngctl.py index c2afa885f..5b937dc8a 100644 --- a/tests/utils/lttngtest/lttngctl.py +++ b/tests/utils/lttngtest/lttngctl.py @@ -107,28 +107,92 @@ class EventRule(abc.ABC): class LogLevelRule: + def __eq__(self, other): + # type (LogLevelRule) -> bool + if type(self) != type(other): + return False + + return self.level == other.level + + +@enum.unique +class LogLevel(enum.Enum): pass +@enum.unique +class UserLogLevel(LogLevel): + EMERGENCY = 0 + ALERT = 1 + CRITICAL = 2 + ERROR = 3 + WARNING = 4 + NOTICE = 5 + INFO = 6 + DEBUG_SYSTEM = 7 + DEBUG_PROGRAM = 8 + DEBUG_PROCESS = 9 + DEBUG_MODULE = 10 + DEBUG_UNIT = 11 + DEBUG_FUNCTION = 12 + DEBUG_LINE = 13 + DEBUG = 14 + + +@enum.unique +class JULLogLevel(LogLevel): + OFF = 2147483647 + SEVERE = 1000 + WARNING = 900 + INFO = 800 + CONFIG = 700 + FINE = 500 + FINER = 400 + FINEST = 300 + ALL = -2147483648 + + +@enum.unique +class Log4jLogLevel(LogLevel): + OFF = 2147483647 + FATAL = 50000 + ERROR = 40000 + WARN = 30000 + INFO = 20000 + DEBUG = 10000 + TRACE = 5000 + ALL = -2147483648 + + +@enum.unique +class PythonLogLevel(LogLevel): + CRITICAL = 50 + ERROR = 40 + WARNING = 30 + INFO = 20 + DEBUG = 10 + NOTSET = 0 + + class LogLevelRuleAsSevereAs(LogLevelRule): def __init__(self, level): - # type: (int) + # type: (LogLevel) self._level = level @property def level(self): - # type: () -> int + # type: () -> LogLevel return self._level class LogLevelRuleExactly(LogLevelRule): def __init__(self, level): - # type: (int) + # type: (LogLevel) self._level = level @property def level(self): - # type: () -> int + # type: () -> LogLevel return self._level @@ -137,15 +201,27 @@ class TracepointEventRule(EventRule): self, name_pattern=None, # type: Optional[str] filter_expression=None, # type: Optional[str] - log_level_rule=None, # type: Optional[LogLevelRule] - name_pattern_exclusions=None, # type: Optional[List[str]] ): self._name_pattern = name_pattern # type: Optional[str] self._filter_expression = filter_expression # type: Optional[str] - self._log_level_rule = log_level_rule # type: Optional[LogLevelRule] - self._name_pattern_exclusions = ( - name_pattern_exclusions - ) # type: Optional[List[str]] + + def _equals(self, other): + # type (TracepointEventRule) -> bool + # Overridden by derived classes that have supplementary attributes. + return True + + def __eq__(self, other): + # type (TracepointEventRule) -> bool + if type(self) != type(other): + return False + + if self.name_pattern != other.name_pattern: + return False + + if self.filter_expression != other.filter_expression: + return False + + return self._equals(other) @property def name_pattern(self): @@ -157,6 +233,31 @@ class TracepointEventRule(EventRule): # type: () -> Optional[str] return self._filter_expression + +class UserTracepointEventRule(TracepointEventRule): + def __init__( + self, + name_pattern=None, # type: Optional[str] + filter_expression=None, # type: Optional[str] + log_level_rule=None, # type: Optional[LogLevelRule] + name_pattern_exclusions=None, # type: Optional[List[str]] + ): + TracepointEventRule.__init__(self, name_pattern, filter_expression) + self._log_level_rule = log_level_rule # type: Optional[LogLevelRule] + self._name_pattern_exclusions = ( + name_pattern_exclusions + ) # type: Optional[List[str]] + + if log_level_rule and not isinstance(log_level_rule.level, UserLogLevel): + raise ValueError("Log level rule must use a UserLogLevel as its value") + + def _equals(self, other): + # type (UserTracepointEventRule) -> bool + return ( + self.log_level_rule == other.log_level_rule + and self.name_pattern_exclusions == other.name_pattern_exclusions + ) + @property def log_level_rule(self): # type: () -> Optional[LogLevelRule] @@ -168,7 +269,7 @@ class TracepointEventRule(EventRule): return self._name_pattern_exclusions -class UserTracepointEventRule(TracepointEventRule): +class Log4jTracepointEventRule(TracepointEventRule): def __init__( self, name_pattern=None, # type: Optional[str] @@ -176,16 +277,108 @@ class UserTracepointEventRule(TracepointEventRule): log_level_rule=None, # type: Optional[LogLevelRule] name_pattern_exclusions=None, # type: Optional[List[str]] ): - TracepointEventRule.__init__(**locals()) + TracepointEventRule.__init__(self, name_pattern, filter_expression) + self._log_level_rule = log_level_rule # type: Optional[LogLevelRule] + self._name_pattern_exclusions = ( + name_pattern_exclusions + ) # type: Optional[List[str]] + if log_level_rule and not isinstance(log_level_rule.level, Log4jLogLevel): + raise ValueError("Log level rule must use a Log4jLogLevel as its value") -class KernelTracepointEventRule(TracepointEventRule): + def _equals(self, other): + # type (Log4jTracepointEventRule) -> bool + return ( + self.log_level_rule == other.log_level_rule + and self.name_pattern_exclusions == other.name_pattern_exclusions + ) + + @property + def log_level_rule(self): + # type: () -> Optional[LogLevelRule] + return self._log_level_rule + + @property + def name_pattern_exclusions(self): + # type: () -> Optional[List[str]] + return self._name_pattern_exclusions + + +class JULTracepointEventRule(TracepointEventRule): def __init__( self, name_pattern=None, # type: Optional[str] filter_expression=None, # type: Optional[str] log_level_rule=None, # type: Optional[LogLevelRule] name_pattern_exclusions=None, # type: Optional[List[str]] + ): + TracepointEventRule.__init__(self, name_pattern, filter_expression) + self._log_level_rule = log_level_rule # type: Optional[LogLevelRule] + self._name_pattern_exclusions = ( + name_pattern_exclusions + ) # type: Optional[List[str]] + + if log_level_rule and not isinstance(log_level_rule.level, JULLogLevel): + raise ValueError("Log level rule must use a JULLogLevel as its value") + + def _equals(self, other): + # type (JULTracepointEventRule) -> bool + return ( + self.log_level_rule == other.log_level_rule + and self.name_pattern_exclusions == other.name_pattern_exclusions + ) + + @property + def log_level_rule(self): + # type: () -> Optional[LogLevelRule] + return self._log_level_rule + + @property + def name_pattern_exclusions(self): + # type: () -> Optional[List[str]] + return self._name_pattern_exclusions + + +class PythonTracepointEventRule(TracepointEventRule): + def __init__( + self, + name_pattern=None, # type: Optional[str] + filter_expression=None, # type: Optional[str] + log_level_rule=None, # type: Optional[LogLevelRule] + name_pattern_exclusions=None, # type: Optional[List[str]] + ): + TracepointEventRule.__init__(self, name_pattern, filter_expression) + self._log_level_rule = log_level_rule # type: Optional[LogLevelRule] + self._name_pattern_exclusions = ( + name_pattern_exclusions + ) # type: Optional[List[str]] + + if log_level_rule and not isinstance(log_level_rule.level, PythonLogLevel): + raise ValueError("Log level rule must use a PythonLogLevel as its value") + + def _equals(self, other): + # type (PythonTracepointEventRule) -> bool + return ( + self.log_level_rule == other.log_level_rule + and self.name_pattern_exclusions == other.name_pattern_exclusions + ) + + @property + def log_level_rule(self): + # type: () -> Optional[LogLevelRule] + return self._log_level_rule + + @property + def name_pattern_exclusions(self): + # type: () -> Optional[List[str]] + return self._name_pattern_exclusions + + +class KernelTracepointEventRule(TracepointEventRule): + def __init__( + self, + name_pattern=None, # type: Optional[str] + filter_expression=None, # type: Optional[str] ): TracepointEventRule.__init__(**locals()) @@ -204,24 +397,24 @@ class Channel(abc.ABC): @abc.abstractmethod def add_context(self, context_type): # type: (ContextType) -> None - pass + raise NotImplementedError @property @abc.abstractmethod def domain(self): # type: () -> TracingDomain - pass + raise NotImplementedError @property @abc.abstractmethod def name(self): # type: () -> str - pass + raise NotImplementedError @abc.abstractmethod def add_recording_rule(self, rule) -> None: # type: (Type[EventRule]) -> None - pass + raise NotImplementedError class SessionOutputLocation(abc.ABC): @@ -239,6 +432,17 @@ class LocalSessionOutputLocation(SessionOutputLocation): return self._path +class NetworkSessionOutputLocation(SessionOutputLocation): + def __init__(self, set_url): + # type (str) + self._set_url = set_url + + @property + def url(self): + # type: () -> str + return self._set_url + + class ProcessAttributeTracker(abc.ABC): """ Process attribute tracker used to filter before the evaluation of event @@ -275,72 +479,72 @@ class ProcessIDProcessAttributeTracker(ProcessAttributeTracker): @abc.abstractmethod def track(self, pid): # type: (int) -> None - pass + raise NotImplementedError @abc.abstractmethod def untrack(self, pid): # type: (int) -> None - pass + raise NotImplementedError class VirtualProcessIDProcessAttributeTracker(ProcessAttributeTracker): @abc.abstractmethod def track(self, vpid): # type: (int) -> None - pass + raise NotImplementedError @abc.abstractmethod def untrack(self, vpid): # type: (int) -> None - pass + raise NotImplementedError class UserIDProcessAttributeTracker(ProcessAttributeTracker): @abc.abstractmethod def track(self, uid): # type: (Union[int, str]) -> None - pass + raise NotImplementedError @abc.abstractmethod def untrack(self, uid): # type: (Union[int, str]) -> None - pass + raise NotImplementedError class VirtualUserIDProcessAttributeTracker(ProcessAttributeTracker): @abc.abstractmethod def track(self, vuid): # type: (Union[int, str]) -> None - pass + raise NotImplementedError @abc.abstractmethod def untrack(self, vuid): # type: (Union[int, str]) -> None - pass + raise NotImplementedError class GroupIDProcessAttributeTracker(ProcessAttributeTracker): @abc.abstractmethod def track(self, gid): # type: (Union[int, str]) -> None - pass + raise NotImplementedError @abc.abstractmethod def untrack(self, gid): # type: (Union[int, str]) -> None - pass + raise NotImplementedError class VirtualGroupIDProcessAttributeTracker(ProcessAttributeTracker): @abc.abstractmethod def track(self, vgid): # type: (Union[int, str]) -> None - pass + raise NotImplementedError @abc.abstractmethod def untrack(self, vgid): # type: (Union[int, str]) -> None - pass + raise NotImplementedError class Session(abc.ABC): @@ -353,13 +557,13 @@ class Session(abc.ABC): @abc.abstractmethod def name(self): # type: () -> str - pass + raise NotImplementedError @property @abc.abstractmethod def output(self): # type: () -> Optional[Type[SessionOutputLocation]] - pass + raise NotImplementedError @abc.abstractmethod def add_channel( @@ -370,27 +574,32 @@ class Session(abc.ABC): ): # type: (TracingDomain, Optional[str], BufferSharingPolicy) -> Channel """Add a channel with default attributes to the session.""" - pass + raise NotImplementedError @abc.abstractmethod def start(self): # type: () -> None - pass + raise NotImplementedError @abc.abstractmethod def stop(self): # type: () -> None - pass + raise NotImplementedError @abc.abstractmethod def destroy(self): # type: () -> None - pass + raise NotImplementedError @abc.abstractmethod def is_active(self): # type: () -> bool - pass + raise NotImplementedError + + @abc.abstractmethod + def rotate(self): + # type: () -> None + raise NotImplementedError @abc.abstractproperty def kernel_pid_process_attribute_tracker(self): @@ -462,7 +671,7 @@ class Controller(abc.ABC): Create a session with an output. Don't specify an output to create a session without an output. """ - pass + raise NotImplementedError @abc.abstractmethod def start_session_by_name(self, name): @@ -470,7 +679,7 @@ class Controller(abc.ABC): """ Start a session by name. """ - pass + raise NotImplementedError @abc.abstractmethod def start_session_by_glob_pattern(self, pattern): @@ -478,7 +687,7 @@ class Controller(abc.ABC): """ Start sessions whose name matches `pattern`, see GLOB(7). """ - pass + raise NotImplementedError @abc.abstractmethod def start_sessions_all(self): @@ -486,7 +695,7 @@ class Controller(abc.ABC): Start all sessions visible to the current user. """ # type: () -> None - pass + raise NotImplementedError @abc.abstractmethod def stop_session_by_name(self, name): @@ -494,7 +703,7 @@ class Controller(abc.ABC): """ Stop a session by name. """ - pass + raise NotImplementedError @abc.abstractmethod def stop_session_by_glob_pattern(self, pattern): @@ -502,7 +711,7 @@ class Controller(abc.ABC): """ Stop sessions whose name matches `pattern`, see GLOB(7). """ - pass + raise NotImplementedError @abc.abstractmethod def stop_sessions_all(self): @@ -510,7 +719,7 @@ class Controller(abc.ABC): Stop all sessions visible to the current user. """ # type: () -> None - pass + raise NotImplementedError @abc.abstractmethod def destroy_session_by_name(self, name): @@ -518,7 +727,7 @@ class Controller(abc.ABC): """ Destroy a session by name. """ - pass + raise NotImplementedError @abc.abstractmethod def destroy_session_by_glob_pattern(self, pattern): @@ -526,7 +735,7 @@ class Controller(abc.ABC): """ Destroy sessions whose name matches `pattern`, see GLOB(7). """ - pass + raise NotImplementedError @abc.abstractmethod def destroy_sessions_all(self): @@ -534,7 +743,7 @@ class Controller(abc.ABC): """ Destroy all sessions visible to the current user. """ - pass + raise NotImplementedError @abc.abstractmethod def list_sessions(self): @@ -542,4 +751,28 @@ class Controller(abc.ABC): """ List all sessions visible to the current user. """ - pass + raise NotImplementedError + + @abc.abstractmethod + def rotate_session_by_name(self, name, wait=True): + # type: (str, bool) -> None + """ + Rotate a session + """ + raise NotImplementedError + + @abc.abstractmethod + def schedule_size_based_rotation(self, name, size_bytes): + # type: (str, int) -> None + """ + Schedule automatic size-based rotations. + """ + raise NotImplementedError + + @abc.abstractmethod + def schedule_time_based_rotation(self, name, period_seconds): + # type: (str, int) -> None + """ + Schedule automatic time-based rotations. + """ + raise NotImplementedError