'Migrate from one slo/workload combination to another.
This requires moving the volume from its current SG to a
new or existing SG that has the target attributes.
:param array: the array serial number
:param device_id: the device number
:param srp: the storage resource pool
:param target_slo: the target service level
:param target_workload: the target workload
:param volume_name: the volume name
:param new_type: the volume type to migrate to
:param extra_specs: the extra specifications
:returns: bool'

def _migrate_volume(self, array, device_id, srp, target_slo, target_workload, volume_name, new_type, extra_specs):

    target_extra_specs = new_type['extra_specs']
    target_extra_specs[utils.SRP] = srp
    target_extra_specs[utils.ARRAY] = array
    target_extra_specs[utils.SLO] = target_slo
    target_extra_specs[utils.WORKLOAD] = target_workload
    target_extra_specs[utils.INTERVAL] = extra_specs[utils.INTERVAL]
    target_extra_specs[utils.RETRIES] = extra_specs[utils.RETRIES]
    is_compression_disabled = self.utils.is_compression_disabled(target_extra_specs)
    try:
        target_sg_name = self.masking.get_or_create_default_storage_group(array, srp, target_slo, target_workload, extra_specs, is_compression_disabled)
    except Exception as e:
        LOG.error('Failed    to    get    or    create    storage    group.    Exception    received    was    %(e)s.', {'e': e})
        return False
    storagegroups = self.rest.get_storage_groups_from_volume(array, device_id)
    if (not storagegroups):
        LOG.warning('Volume    :    %(volume_name)s    does    not    currently    belong    to    any    storage    groups.', {'volume_name': volume_name})
        self.masking.add_volume_to_storage_group(array, device_id, target_sg_name, volume_name, extra_specs)
    else:
        self.masking.remove_and_reset_members(array, device_id, volume_name, target_extra_specs, reset=True)
    vol_check = self.rest.is_volume_in_storagegroup(array, device_id, target_sg_name)
    if (not vol_check):
        LOG.error('Volume:    %(volume_name)s    has    not    been    added    to    target    storage    group    %(storageGroup)s.', {'volume_name': volume_name, 'storageGroup': target_sg_name})
        return False
    return True
