'Creates a clone of the specified volume.'

def create_cloned_volume(self, volume, src_vref):

    volume_metadata = utils.get_metadata(volume)
    pool = utils.get_pool_from_host(volume.host)
    specs = common.ExtraSpecs.from_volume(volume)
    tier = specs.tier
    base_lun_name = utils.get_base_lun_name(src_vref)
    source_lun_id = self.client.get_lun_id(src_vref)
    snap_name = utils.construct_snap_name(volume)
    rep_update = dict()
    if utils.is_snapcopy_enabled(volume):
        new_lun_id = emc_taskflow.fast_create_cloned_volume(client=self.client, snap_name=snap_name, lun_id=source_lun_id, lun_name=volume.name, base_lun_name=base_lun_name)
        location = self._build_provider_location(lun_type='smp', lun_id=new_lun_id, base_lun_name=base_lun_name)
        volume_metadata['snapcopy'] = 'True'
        volume_metadata['async_migrate'] = 'False'
    else:
        (async_migrate, provision) = utils.calc_migrate_and_provision(volume)
        new_lun_id = emc_taskflow.create_cloned_volume(client=self.client, snap_name=snap_name, lun_id=source_lun_id, lun_name=volume.name, lun_size=volume.size, base_lun_name=base_lun_name, pool_name=pool, provision=provision, tier=tier, async_migrate=async_migrate)
        location = self._build_provider_location(lun_type='lun', lun_id=new_lun_id, base_lun_name=volume.name)
        volume_metadata['snapcopy'] = 'False'
        volume_metadata['async_migrate'] = six.text_type(async_migrate)
        rep_update = self.setup_lun_replication(volume, new_lun_id)
    model_update = {'provider_location': location, 'metadata': volume_metadata}
    model_update.update(rep_update)
    return model_update
