示例#1
0
    def _register_action_alias(self, pack, action_alias):
        content = self._meta_loader.load(action_alias)
        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))

        action_alias_api = ActionAliasAPI(**content)
        action_alias_api.validate()
        action_alias_db = ActionAliasAPI.to_model(action_alias_api)

        try:
            action_alias_db.id = ActionAlias.get_by_name(
                action_alias_api.name).id
        except ValueError:
            LOG.info('ActionAlias %s not found. Creating new one.',
                     action_alias)

        try:
            action_alias_db = ActionAlias.add_or_update(action_alias_db)
            extra = {'action_alias_db': action_alias_db}
            LOG.audit('Action alias updated. Action alias %s from %s.',
                      action_alias_db,
                      action_alias,
                      extra=extra)
        except Exception:
            LOG.exception('Failed to create action alias %s.',
                          action_alias_api.name)
            raise
示例#2
0
    def match(self, action_alias_match_api, **kwargs):
        """
            Run a chatops command

            Handles requests:
                POST /actionalias/match
        """
        command = action_alias_match_api.command
        try:
            # 1. Get aliases
            aliases_resp = super(ActionAliasController,
                                 self)._get_all(**kwargs)
            aliases = [ActionAliasAPI(**alias) for alias in aliases_resp.json]
            # 2. Match alias(es) to command
            matches = match_command_to_alias(command, aliases)
            if len(matches) > 1:
                raise ActionAliasAmbiguityException(
                    "Command '%s' matched more than 1 pattern" % command,
                    matches=matches,
                    command=command)
            elif len(matches) == 0:
                raise ActionAliasAmbiguityException(
                    "Command '%s' matched no patterns" % command,
                    matches=[],
                    command=command)
            return [self._match_tuple_to_dict(match) for match in matches]
        except ActionAliasAmbiguityException as e:
            LOG.exception('Command "%s" matched (%s) patterns.', e.command,
                          len(e.matches))
            return abort(http_client.BAD_REQUEST, str(e))
示例#3
0
    def _register_aliases(self, aliases=None):
        registered_count = 0

        for alias in aliases:
            LOG.debug('Loading alias from %s.', alias)
            try:
                content = self._meta_loader.load(alias)
                action_alias_api = ActionAliasAPI(**content)
                action_alias_db = ActionAliasAPI.to_model(action_alias_api)

                try:
                    action_alias_db.id = ActionAlias.get_by_name(
                        action_alias_api.name).id
                except ValueError:
                    LOG.info('ActionAlias %s not found. Creating new one.',
                             alias)

                try:
                    action_alias_db = ActionAlias.add_or_update(
                        action_alias_db)
                    extra = {'action_alias_db': action_alias_db}
                    LOG.audit('Action alias updated. Action alias %s from %s.',
                              action_alias_db,
                              alias,
                              extra=extra)
                except Exception:
                    LOG.exception('Failed to create action alias %s.',
                                  action_alias_api.name)

            except Exception:
                LOG.exception('Failed registering alias from %s.', alias)
            else:
                registered_count += 1

        return registered_count
示例#4
0
    def help(self, filter, pack, limit, offset, **kwargs):
        """
            Get available help strings for action aliases.

            Handles requests:
                GET /actionalias/help
        """
        try:
            aliases_resp = super(ActionAliasController, self)._get_all(**kwargs)
            aliases = [ActionAliasAPI(**alias) for alias in aliases_resp.json]
            return generate_helpstring_result(aliases, filter, pack, int(limit), int(offset))
        except (TypeError) as e:
            LOG.exception('Helpstring request contains an invalid data type: %s.', six.text_type(e))
            return abort(http_client.BAD_REQUEST, six.text_type(e))
示例#5
0
    def _get_action_alias_db(self, pack, action_alias):
        """
        Retrieve ActionAliasDB object.
        """
        content = self._meta_loader.load(action_alias)
        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))

        action_alias_api = ActionAliasAPI(**content)
        action_alias_api.validate()
        action_alias_db = ActionAliasAPI.to_model(action_alias_api)

        return action_alias_db
示例#6
0
    def _get_action_alias_db(self,
                             pack,
                             action_alias,
                             ignore_metadata_file_error=False):
        """
        Retrieve ActionAliasDB object.

        :param ignore_metadata_file_error: True to ignore the error when we can't infer
                                            metadata_file attribute (e.g. inside tests).
        :type ignore_metadata_file_error: ``bool``
        """
        content = self._meta_loader.load(action_alias)
        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
        try:
            metadata_file = content_utils.get_relative_path_to_pack_file(
                pack_ref=pack, file_path=action_alias, use_pack_cache=True)
        except ValueError as e:
            if not ignore_metadata_file_error:
                raise e
        else:
            content["metadata_file"] = metadata_file

        # Pass override information
        altered = self._override_loader.override(pack, "aliases", content)

        action_alias_api = ActionAliasAPI(**content)
        action_alias_api.validate()
        action_alias_db = ActionAliasAPI.to_model(action_alias_api)

        return action_alias_db, altered