def check_operating_systems(self, name, definition): if not self._strict_type_checks: return field = 'operating_systems' operating_systems = definition.get(field) DOC_URL = HISTOGRAMS_DOC_URL + "#operating_systems" if not operating_systems: # operating_systems is optional return for operating_system in operating_systems: if not utils.is_valid_os(operating_system): ParserError('Histogram "%s" has unknown operating system "%s" in %s.\n%s' % (name, operating_system, field, DOC_URL)).handle_later()
def __init__(self, category, name, definition, strict_type_checks=False): self._category = category self._name = name self._definition = definition self._strict_type_checks = strict_type_checks type_check_event_fields(self.identifier, name, definition) # Check method & object string patterns. if strict_type_checks: for method in self.methods: string_check(self.identifier, field='methods', value=method, min_length=1, max_length=MAX_METHOD_NAME_LENGTH, regex=IDENTIFIER_PATTERN) for obj in self.objects: string_check(self.identifier, field='objects', value=obj, min_length=1, max_length=MAX_OBJECT_NAME_LENGTH, regex=IDENTIFIER_PATTERN) # Check release_channel_collection rcc_key = 'release_channel_collection' rcc = definition.get(rcc_key, 'opt-in') allowed_rcc = ["opt-in", "opt-out"] if rcc not in allowed_rcc: ParserError("%s: Value for %s should be one of: %s" % (self.identifier, rcc_key, ", ".join(allowed_rcc))).handle_later() # Check record_in_processes. record_in_processes = definition.get('record_in_processes') for proc in record_in_processes: if not utils.is_valid_process_name(proc): ParserError(self.identifier + ': Unknown value in record_in_processes: ' + proc).handle_later() # Check products. products = definition.get('products', []) for product in products: if not utils.is_valid_product(product): ParserError(self.identifier + ': Unknown value in products: ' + product).handle_later() # Check operating_systems. operating_systems = definition.get('operating_systems', []) for operating_system in operating_systems: if not utils.is_valid_os(operating_system): ParserError(self.identifier + ': Unknown value in operating_systems: ' + operating_system).handle_later() # Check extra_keys. extra_keys = definition.get('extra_keys', {}) if len(extra_keys.keys()) > MAX_EXTRA_KEYS_COUNT: ParserError( "%s: Number of extra_keys exceeds limit %d." % (self.identifier, MAX_EXTRA_KEYS_COUNT)).handle_later() for key in extra_keys.iterkeys(): string_check(self.identifier, field='extra_keys', value=key, min_length=1, max_length=MAX_EXTRA_KEY_NAME_LENGTH, regex=IDENTIFIER_PATTERN) # Check expiry. if 'expiry_version' not in definition: ParserError("%s: event is missing required field expiry_version" % (self.identifier)).handle_later() # Finish setup. # Historical versions of Events.yaml may contain expiration versions # using the deprecated format 'N.Na1'. Those scripts set # self._strict_type_checks to false. expiry_version = definition.get('expiry_version', 'never') if not utils.validate_expiration_version( expiry_version) and self._strict_type_checks: ParserError('{}: invalid expiry_version: {}.'.format( self.identifier, expiry_version)).handle_now() definition['expiry_version'] = utils.add_expiration_postfix( expiry_version)
def validate_values(self, definition): """This function checks that the fields have the correct values. :param definition: the dictionary containing the scalar properties. :raises ParserError: if a scalar definition field contains an unexpected value. """ if not self._strict_type_checks: return # Validate the scalar kind. scalar_kind = definition.get('kind') if scalar_kind not in SCALAR_TYPES_MAP.keys(): ParserError(self._name + ' - unknown scalar kind: ' + scalar_kind + '.\nSee: {}'.format(BASE_DOC_URL)).handle_later() # Validate the collection policy. collection_policy = definition.get('release_channel_collection', None) if collection_policy and collection_policy not in [ 'opt-in', 'opt-out' ]: ParserError(self._name + ' - unknown collection policy: ' + collection_policy + '.\nSee: {}#optional-fields'.format(BASE_DOC_URL) ).handle_later() # Validate operating_systems. operating_systems = definition.get('operating_systems', []) for operating_system in operating_systems: if not utils.is_valid_os(operating_system): ParserError(self._name + ' - invalid entry in operating_systems: ' + operating_system + '.\nSee: {}#optional-fields'.format(BASE_DOC_URL) ).handle_later() # Validate record_in_processes. record_in_processes = definition.get('record_in_processes', []) for proc in record_in_processes: if not utils.is_valid_process_name(proc): ParserError(self._name + ' - unknown value in record_in_processes: ' + proc + '.\nSee: {}'.format(BASE_DOC_URL)).handle_later() # Validate product. products = definition.get('products', []) for product in products: if not utils.is_valid_product(product): ParserError(self._name + ' - unknown value in products: ' + product + '.\nSee: {}'.format(BASE_DOC_URL)).handle_later() # Validate the expiration version. # Historical versions of Scalars.json may contain expiration versions # using the deprecated format 'N.Na1'. Those scripts set # self._strict_type_checks to false. expires = definition.get('expires') if not utils.validate_expiration_version( expires) and self._strict_type_checks: ParserError( '{} - invalid expires: {}.\nSee: {}#required-fields'.format( self._name, expires, BASE_DOC_URL)).handle_later()