'Migrate the volume to the specified host.
Backend assisted volume migration will occur if and only if;
1. Same LeftHand backend
2. Volume cannot be attached
3. Volumes with snapshots cannot be migrated
4. Source and Destination clusters must be in the same management group
Volume re-type is not supported.
Returns a boolean indicating whether the migration occurred, as well as
model_update.
:param ctxt: Context
:param volume: A dictionary describing the volume to migrate
:param host: A dictionary describing the host to migrate to, where
host[\'host\'] is its name, and host[\'capabilities\'] is a
dictionary of its reported capabilities.'

@cinder_utils.trace
def migrate_volume(self, ctxt, volume, host):

    false_ret = (False, None)
    if ('location_info' not in host['capabilities']):
        return false_ret
    host_location = host['capabilities']['location_info']
    (driver, cluster, vip) = host_location.split('    ')
    client = self._login()
    LOG.debug('enter:    migrate_volume:    id=%(id)s,    host=%(host)s,    cluster=%(cluster)s', {'id': volume['id'], 'host': host, 'cluster': self._client_conf['hpelefthand_clustername']})
    try:
        cluster_info = client.getClusterByName(cluster)
        LOG.debug('Cluster    info:    %s', cluster_info)
        virtual_ips = cluster_info['virtualIPAddresses']
        if (driver != self.__class__.__name__):
            LOG.info('Cannot    provide    backend    assisted    migration    for    volume:    %s    because    volume    is    from    a    different    backend.', volume['name'])
            return false_ret
        if (vip != virtual_ips[0]['ipV4Address']):
            LOG.info('Cannot    provide    backend    assisted    migration    for    volume:    %s    because    cluster    exists    in    different    management    group.', volume['name'])
            return false_ret
    except hpeexceptions.HTTPNotFound:
        LOG.info('Cannot    provide    backend    assisted    migration    for    volume:    %s    because    cluster    exists    in    different    management    group.', volume['name'])
        return false_ret
    finally:
        self._logout(client)
    client = self._login()
    try:
        volume_info = client.getVolumeByName(volume['name'])
        LOG.debug('Volume    info:    %s', volume_info)
        if (volume_info['iscsiSessions'] is not None):
            LOG.info('Cannot    provide    backend    assisted    migration    for    volume:    %s    because    the    volume    has    been    exported.', volume['name'])
            return false_ret
        snap_info = client.getVolume(volume_info['id'], 'fields=snapshots,snapshots[resource[members[name]]]')
        LOG.debug('Snapshot    info:    %s', snap_info)
        if (snap_info['snapshots']['resource'] is not None):
            LOG.info('Cannot    provide    backend    assisted    migration    for    volume:    %s    because    the    volume    has    snapshots.', volume['name'])
            return false_ret
        options = {'clusterName': cluster}
        client.modifyVolume(volume_info['id'], options)
    except hpeexceptions.HTTPNotFound:
        LOG.info('Cannot    provide    backend    assisted    migration    for    volume:    %s    because    volume    does    not    exist    in    this    management    group.', volume['name'])
        return false_ret
    except hpeexceptions.HTTPServerError as ex:
        LOG.error('Exception:    %s', ex)
        return false_ret
    finally:
        self._logout(client)
    return (True, None)
