'Creates a group from a group snapshot or a group of cinder vols.
:returns: An implicit update for the volumes model that is
interpreted by the manager as a successful operation.'

@utils.trace_method
def create_group_from_src(self, context, group, volumes, group_snapshot=None, sorted_snapshots=None, source_group=None, sorted_source_vols=None):

    LOG.debug('VOLUMES    %s    ', ',    '.join([vol['id'] for vol in volumes]))
    model_update = None
    volumes_model_update = []
    if group_snapshot:
        vols = zip(volumes, sorted_snapshots)
        for (volume, snapshot) in vols:
            update = self.create_volume_from_snapshot(volume, snapshot)
            update['id'] = volume['id']
            volumes_model_update.append(update)
    elif (source_group and sorted_source_vols):
        hosts = [source_vol['host'] for source_vol in sorted_source_vols]
        flexvols = self._get_flexvol_names_from_hosts(hosts)
        snapshot_name = ('snapshot-temp-' + source_group['id'])
        self.zapi_client.create_cg_snapshot(flexvols, snapshot_name)
        vols = zip(volumes, sorted_source_vols)
        for (volume, source_vol) in vols:
            self._clone_backing_file_for_volume(source_vol['name'], volume['name'], source_vol['id'], source_snapshot=snapshot_name)
            volume_model_update = (self._get_volume_model_update(volume) or {})
            volume_model_update.update({'id': volume['id'], 'provider_location': source_vol['provider_location']})
            volumes_model_update.append(volume_model_update)
        for flexvol_name in flexvols:
            self.zapi_client.wait_for_busy_snapshot(flexvol_name, snapshot_name)
            self.zapi_client.delete_snapshot(flexvol_name, snapshot_name)
    else:
        LOG.error('Unexpected    set    of    parameters    received    when    creating    group    from    source.')
        model_update = {'status': fields.GroupStatus.ERROR}
    return (model_update, volumes_model_update)
