def get_config_groups(self, groups_conf, groups_pillar_name):
        '''
        get info from groups in config, and from the named pillar

        todo: add specification for the minion to use to recover pillar
        '''
        # Get groups
        # Default to returning something that'll never match
        ret_groups = {
            'default': {
                'users': set(),
                'commands': set(),
                'aliases': {},
                'default_target': {},
                'targets': {}
            }
        }

        # allow for empty groups in the config file, and instead let some/all of this come
        # from pillar data.
        if not groups_conf:
            use_groups = {}
        else:
            use_groups = groups_conf
        # First obtain group lists from pillars, then in case there is any overlap, iterate over the groups
        # that come from pillars.  The configuration in files on disk/from startup
        # will override any configs from pillars.  They are meant to be complementary not to provide overrides.
        log.debug('use_groups %s', use_groups)
        try:
            groups_gen = itertools.chain(self._groups_from_pillar(groups_pillar_name).items(), use_groups.items())
        except AttributeError:
            log.warning('Failed to get groups from %s: %s or from config: %s',
                groups_pillar_name,
                self._groups_from_pillar(groups_pillar_name),
                use_groups
            )
            groups_gen = []
        for name, config in groups_gen:
            log.info('Trying to get %s and %s to be useful', name, config)
            ret_groups.setdefault(name, {
                'users': set(), 'commands': set(), 'aliases': {},
                'default_target': {}, 'targets': {}
            })
            try:
                ret_groups[name]['users'].update(set(config.get('users', [])))
                ret_groups[name]['commands'].update(set(config.get('commands', [])))
                ret_groups[name]['aliases'].update(config.get('aliases', {}))
                ret_groups[name]['default_target'].update(config.get('default_target', {}))
                ret_groups[name]['targets'].update(config.get('targets', {}))
            except (IndexError, AttributeError):
                log.warning("Couldn't use group %s. Check that targets is a dictionary and not a list", name)

        log.debug('Got the groups: %s', ret_groups)
        return ret_groups
get info from groups in config, and from the named pillar

        todo: add specification for the minion to use to recover pillar