def _register_action(self, pack, action): content = self._meta_loader.load(action) pack_field = content.get("pack", None) if not pack_field: content["pack"] = pack pack_field = pack if pack_field != pack: raise Exception( 'Model is in pack "%s" but field "pack" is different: %s' % (pack, pack_field)) # Add in "metadata_file" attribute which stores path to the pack metadata file relative to # the pack directory metadata_file = content_utils.get_relative_path_to_pack_file( pack_ref=pack, file_path=action, use_pack_cache=True) content["metadata_file"] = metadata_file action_api = ActionAPI(**content) try: action_api.validate() except jsonschema.ValidationError as e: # We throw a more user-friendly exception on invalid parameter name msg = six.text_type(e) is_invalid_parameter_name = "does not match any of the regexes: " in msg if is_invalid_parameter_name: match = re.search("'(.+?)' does not match any of the regexes", msg) if match: parameter_name = match.groups()[0] else: parameter_name = "unknown" new_msg = ( 'Parameter name "%s" is invalid. Valid characters for parameter name ' "are [a-zA-Z0-0_]." % (parameter_name)) new_msg += "\n\n" + msg raise jsonschema.ValidationError(new_msg) raise e # Use in-memory cached RunnerTypeDB objects to reduce load on the database if self._use_runners_cache: runner_type_db = self._runner_type_db_cache.get( action_api.runner_type, None) if not runner_type_db: runner_type_db = action_validator.get_runner_model(action_api) self._runner_type_db_cache[ action_api.runner_type] = runner_type_db else: runner_type_db = None action_validator.validate_action(action_api, runner_type_db=runner_type_db) model = ActionAPI.to_model(action_api) action_ref = ResourceReference.to_string_reference( pack=pack, name=str(content["name"])) # NOTE: Here we only retrieve existing object to perform an upsert if it already exists in # the database. To do that, we only need access to the "id" attribute (and ref and pack # for our ActionDB abstraction). Retrieving only those fields is fast and much efficient # especially for actions like aws pack ones which contain a lot of parameters. existing = action_utils.get_action_by_ref( action_ref, only_fields=["id", "ref", "pack"]) if not existing: LOG.debug("Action %s not found. Creating new one with: %s", action_ref, content) else: LOG.debug( "Action %s found. Will be updated from: %s to: %s", action_ref, existing, model, ) model.id = existing.id try: model = Action.add_or_update(model) extra = {"action_db": model} LOG.audit("Action updated. Action %s from %s.", model, action, extra=extra) except Exception: LOG.exception("Failed to write action to db %s.", model.name) raise
def _register_action(self, pack, action): content = self._meta_loader.load(action) pack_field = content.get('pack', None) if not pack_field: content['pack'] = pack pack_field = pack if pack_field != pack: raise Exception('Model is in pack "%s" but field "pack" is different: %s' % (pack, pack_field)) # Add in "metadata_file" attribute which stores path to the pack metadata file relative to # the pack directory metadata_file = content_utils.get_relative_path_to_pack_file(pack_ref=pack, file_path=action, use_pack_cache=True) content['metadata_file'] = metadata_file action_api = ActionAPI(**content) try: action_api.validate() except jsonschema.ValidationError as e: # We throw a more user-friendly exception on invalid parameter name msg = six.text_type(e) is_invalid_parameter_name = 'does not match any of the regexes: ' in msg if is_invalid_parameter_name: match = re.search('\'(.+?)\' does not match any of the regexes', msg) if match: parameter_name = match.groups()[0] else: parameter_name = 'unknown' new_msg = ('Parameter name "%s" is invalid. Valid characters for parameter name ' 'are [a-zA-Z0-0_].' % (parameter_name)) new_msg += '\n\n' + msg raise jsonschema.ValidationError(new_msg) raise e # Use in-memory cached RunnerTypeDB objects to reduce load on the database if self._use_runners_cache: runner_type_db = self._runner_type_db_cache.get(action_api.runner_type, None) if not runner_type_db: runner_type_db = action_validator.get_runner_model(action_api) self._runner_type_db_cache[action_api.runner_type] = runner_type_db else: runner_type_db = None action_validator.validate_action(action_api, runner_type_db=runner_type_db) model = ActionAPI.to_model(action_api) action_ref = ResourceReference.to_string_reference(pack=pack, name=str(content['name'])) existing = action_utils.get_action_by_ref(action_ref) if not existing: LOG.debug('Action %s not found. Creating new one with: %s', action_ref, content) else: LOG.debug('Action %s found. Will be updated from: %s to: %s', action_ref, existing, model) model.id = existing.id try: model = Action.add_or_update(model) extra = {'action_db': model} LOG.audit('Action updated. Action %s from %s.', model, action, extra=extra) except Exception: LOG.exception('Failed to write action to db %s.', model.name) raise
def _register_action(self, pack, action): content = self._meta_loader.load(action) pack_field = content.get('pack', None) if not pack_field: content['pack'] = pack pack_field = pack if pack_field != pack: raise Exception( 'Model is in pack "%s" but field "pack" is different: %s' % (pack, pack_field)) # Add in "metadata_file" attribute which stores path to the pack metadata file relative to # the pack directory metadata_file = content_utils.get_relative_path_to_pack_file( pack_ref=pack, file_path=action, use_pack_cache=True) content['metadata_file'] = metadata_file action_api = ActionAPI(**content) try: action_api.validate() except jsonschema.ValidationError as e: # We throw a more user-friendly exception on invalid parameter name msg = six.text_type(e) is_invalid_parameter_name = 'does not match any of the regexes: ' in msg if is_invalid_parameter_name: match = re.search( '\'(.+?)\' does not match any of the regexes', msg) if match: parameter_name = match.groups()[0] else: parameter_name = 'unknown' new_msg = ( 'Parameter name "%s" is invalid. Valid characters for parameter name ' 'are [a-zA-Z0-0_].' % (parameter_name)) new_msg += '\n\n' + msg raise jsonschema.ValidationError(new_msg) raise e # Use in-memory cached RunnerTypeDB objects to reduce load on the database if self._use_runners_cache: runner_type_db = self._runner_type_db_cache.get( action_api.runner_type, None) if not runner_type_db: runner_type_db = action_validator.get_runner_model(action_api) self._runner_type_db_cache[ action_api.runner_type] = runner_type_db else: runner_type_db = None action_validator.validate_action(action_api, runner_type_db=runner_type_db) model = ActionAPI.to_model(action_api) action_ref = ResourceReference.to_string_reference( pack=pack, name=str(content['name'])) existing = action_utils.get_action_by_ref(action_ref) if not existing: LOG.debug('Action %s not found. Creating new one with: %s', action_ref, content) else: LOG.debug('Action %s found. Will be updated from: %s to: %s', action_ref, existing, model) model.id = existing.id try: model = Action.add_or_update(model) extra = {'action_db': model} LOG.audit('Action updated. Action %s from %s.', model, action, extra=extra) except Exception: LOG.exception('Failed to write action to db %s.', model.name) raise