raise ConfigError('barectf metadata error', e)
def _augment_metadata_env(self, meta):
- env = meta.env
-
- env['domain'] = 'bare'
- env['tracer_name'] = 'barectf'
version_tuple = barectf.get_version_tuple()
- env['tracer_major'] = version_tuple[0]
- env['tracer_minor'] = version_tuple[1]
- env['tracer_patch'] = version_tuple[2]
- env['barectf_gen_date'] = str(datetime.datetime.now().isoformat())
+ base_env = {
+ 'domain': 'bare',
+ 'tracer_name': 'barectf' ,
+ 'tracer_major': version_tuple[0],
+ 'tracer_minor': version_tuple[1],
+ 'tracer_patch': version_tuple[2],
+ 'barectf_gen_date': str(datetime.datetime.now().isoformat()),
+ }
+
+ base_env.update(meta.env)
+ meta.env = base_env
@property
def version(self):
@prefix.setter
def prefix(self, value):
- if not is_valid_identifier(value):
+ if not _is_valid_identifier(value):
raise ConfigError('prefix must be a valid C identifier')
self._prefix = value
])
-def is_valid_identifier(iden):
+def _is_valid_identifier(iden):
if not _re_iden.match(iden):
return False
raise ConfigError('invalid trace packet header type', e)
for stream_name, stream in meta.streams.items():
- if not is_valid_identifier(stream_name):
+ if not _is_valid_identifier(stream_name):
raise ConfigError('stream name "{}" is not a valid C identifier'.format(stream_name))
self._cur_entity = _Entity.STREAM_PACKET_CONTEXT
try:
for ev_name, ev in stream.events.items():
- if not is_valid_identifier(ev_name):
+ if not _is_valid_identifier(ev_name):
raise ConfigError('event name "{}" is not a valid C identifier'.format(ev_name))
self._cur_entity = _Entity.EVENT_CONTEXT
self._cur_entity = _Entity.EVENT_PAYLOAD
- if ev.payload_type is None:
- raise ConfigError('missing payload type in event "{}"'.format(ev_name), e)
-
try:
self._validate_entity(ev.payload_type)
except Exception as e:
raise ConfigError('invalid payload type in event "{}"'.format(ev_name), e)
- if not ev.payload_type.fields:
- raise ConfigError('empty payload type in event "{}"'.format(ev_name), e)
+ if stream.is_event_empty(ev):
+ raise ConfigError('event "{}" is empty'.format(ev_name))
except Exception as e:
raise ConfigError('invalid stream "{}"'.format(stream_name), e)
if len(self._meta.streams) > 1:
# yes
if t is None:
- raise ConfigError('need "stream_id" field in trace packet header type, but trace packet header type is missing')
+ raise ConfigError('need "stream_id" field in trace packet header type (more than one stream), but trace packet header type is missing')
if type(t) is not metadata.Struct:
- raise ConfigError('need "stream_id" field in trace packet header type, but trace packet header type is not a structure type')
+ raise ConfigError('need "stream_id" field in trace packet header type (more than one stream), but trace packet header type is not a structure type')
if 'stream_id' not in t.fields:
- raise ConfigError('need "stream_id" field in trace packet header type')
+ raise ConfigError('need "stream_id" field in trace packet header type (more than one stream)')
# validate "magic" and "stream_id" types
if type(t) is not metadata.Struct:
if len(stream.events) > 1:
# yes
if t is None:
- raise ConfigError('need "id" field in stream event header type, but stream event header type is missing')
+ raise ConfigError('need "id" field in stream event header type (more than one event), but stream event header type is missing')
if type(t) is not metadata.Struct:
- raise ConfigError('need "id" field in stream event header type, but stream event header type is not a structure type')
+ raise ConfigError('need "id" field in stream event header type (more than one event), but stream event header type is not a structure type')
if 'id' not in t.fields:
- raise ConfigError('need "id" field in stream event header type')
+ raise ConfigError('need "id" field in stream event header type (more than one event)')
# validate "id" and "timestamp" types
if type(t) is not metadata.Struct:
raise ConfigError('invalid event context type for event "{}"'.format(ev_name), e)
# validate event payload type
- if ev.payload_type is None:
- raise ConfigError('event payload type must exist in event "{}"'.format(ev_name))
-
- # TODO: also check arrays, sequences, and variants
- if type(ev.payload_type) is metadata.Struct:
- if not ev.payload_type.fields:
- raise ConfigError('event payload type must have at least one field for event "{}"'.format(ev_name))
-
try:
self._validate_entity_type_histology(ev.payload_type)
except Exception as e:
raise ConfigError('"fields" property of structure type object must be an associative array')
for field_name, field_node in fields.items():
- if not is_valid_identifier(field_name):
+ if not _is_valid_identifier(field_name):
raise ConfigError('"{}" is not a valid field name for structure type'.format(field_name))
try:
# do not validate type names for the moment; will be done in a
# second phase
for type_name, type_node in types.items():
- if not is_valid_identifier(type_name):
+ if not _is_valid_identifier(type_name):
raise ConfigError('"{}" is not a valid type name for variant type'.format(type_name))
try:
offset = node['offset']
if offset is None:
- self.set_default_offset_seconds()
- self.set_default_offset_cycles()
+ clock.set_default_offset_seconds()
+ clock.set_default_offset_cycles()
else:
if not _is_assoc_array_prop(offset):
raise ConfigError('"offset" property of clock object must be an associative array')
if 'cycles' in offset:
offset_cycles = offset['cycles']
- if not _is_int_prop(offset_cycles):
- raise ConfigError('"cycles" property of clock object\'s offset property must be an integer')
+ if offset_cycles is None:
+ clock.set_default_offset_cycles()
+ else:
+ if not _is_int_prop(offset_cycles):
+ raise ConfigError('"cycles" property of clock object\'s offset property must be an integer')
- if offset_cycles < 0:
- raise ConfigError('invalid clock offset cycles: {}'.format(offset_cycles))
+ if offset_cycles < 0:
+ raise ConfigError('invalid clock offset cycles: {}'.format(offset_cycles))
- clock.offset_cycles = offset_cycles
+ clock.offset_cycles = offset_cycles
# seconds
if 'seconds' in offset:
offset_seconds = offset['seconds']
- if not _is_int_prop(offset_seconds):
- raise ConfigError('"seconds" property of clock object\'s offset property must be an integer')
+ if offset_seconds is None:
+ clock.set_default_offset_seconds()
+ else:
+ if not _is_int_prop(offset_seconds):
+ raise ConfigError('"seconds" property of clock object\'s offset property must be an integer')
- if offset_seconds < 0:
- raise ConfigError('invalid clock offset seconds: {}'.format(offset_seconds))
+ if offset_seconds < 0:
+ raise ConfigError('invalid clock offset seconds: {}'.format(offset_seconds))
- clock.offset_seconds = offset_seconds
+ clock.offset_seconds = offset_seconds
# absolute
if 'absolute' in node:
raise ConfigError('"clocks" property (metadata) must be an associative array')
for clock_name, clock_node in clocks_node.items():
- if not is_valid_identifier(clock_name):
+ if not _is_valid_identifier(clock_name):
raise ConfigError('invalid clock name: "{}"'.format(clock_name))
if clock_name in self._clocks:
if env_name in env:
raise ConfigError('duplicate environment variable "{}"'.format(env_name))
- if not is_valid_identifier(env_name):
+ if not _is_valid_identifier(env_name):
raise ConfigError('invalid environment variable name: "{}"'.format(env_name))
if not _is_int_prop(env_value) and not _is_str_prop(env_value):
event.context_type = t
- if 'payload-type' not in event_node:
- raise ConfigError('missing "payload-type" property in event object')
-
- if event_node['payload-type'] is not None:
+ if 'payload-type' in event_node and event_node['payload-type'] is not None:
try:
t = self._create_type(event_node['payload-type'])
except Exception as e:
if not _is_str_prop(prefix_node):
raise ConfigError('"prefix" property (configuration) must be a string')
- if not is_valid_identifier(prefix_node):
+ if not _is_valid_identifier(prefix_node):
raise ConfigError('"prefix" property (configuration) must be a valid C identifier')
return prefix_node
return None
def _get_include_paths(self, include_node):
+ if include_node is None:
+ return []
+
if _is_str_prop(include_node):
return [include_node]
- elif _is_array_prop(include_node):
+
+ if _is_array_prop(include_node):
for include_path in include_node:
if not _is_str_prop(include_path):
raise ConfigError('invalid include property: expecting array of strings')