Iterates over a list of container configuration ids, expanding groups of container configurations.

    :param config_ids: List of container configuration ids.
    :type config_ids: collections.Iterable[dockermap.map.input.InputConfigId | dockermap.map.input.MapConfigId]
    :param maps: Extended container maps.
    :type maps: dict[unicode | str, dockermap.map.config.main.ContainerMap]
    :return: Expanded MapConfigId tuples.
    :rtype: collections.Iterable[dockermap.map.input.InputConfigId]

def expand_groups(config_ids, maps):
    """
    Iterates over a list of container configuration ids, expanding groups of container configurations.

    :param config_ids: List of container configuration ids.
    :type config_ids: collections.Iterable[dockermap.map.input.InputConfigId | dockermap.map.input.MapConfigId]
    :param maps: Extended container maps.
    :type maps: dict[unicode | str, dockermap.map.config.main.ContainerMap]
    :return: Expanded MapConfigId tuples.
    :rtype: collections.Iterable[dockermap.map.input.InputConfigId]
    """
    for config_id in config_ids:
        if config_id.map_name == '__all__':
            c_maps = six.iteritems(maps)
        else:
            c_maps = (config_id.map_name, maps[config_id.map_name]),
        if isinstance(config_id, InputConfigId):
            instance_name = config_id.instance_names
        elif isinstance(config_id, MapConfigId):
            instance_name = (config_id.instance_name, )
        else:
            raise ValueError("Expected InputConfigId or MapConfigId tuple; found {0}."
                             "".format(type(config_id).__name__))
        for map_name, c_map in c_maps:
            if config_id.config_name == '__all__' and config_id.config_type == ItemType.CONTAINER:
                for config_name in six.iterkeys(c_map.containers):
                    yield MapConfigId(config_id.config_type, map_name, config_name, instance_name)
            else:
                group = c_map.groups.get(config_id.config_name)
                if group is not None:
                    for group_item in group:
                        if isinstance(group_item, MapConfigId):
                            yield group_item
                        elif isinstance(group_item, six.string_types):
                            config_name, __, instance = group_item.partition('.')
                            yield MapConfigId(config_id.config_type, map_name, config_name,
                                              (instance, ) if instance else instance_name)
                        else:
                            raise ValueError("Invalid group item. Must be string or MapConfigId tuple; "
                                             "found {0}.".format(type(group_item).__name__))
                else:
                    yield MapConfigId(config_id.config_type, map_name, config_id.config_name, instance_name)