Files
nova/plugins/xenserver/xenapi/etc/xapi.d/plugins/migration
T
Zaina Afoulki 1df56a5c4a Adds Instance UUID to rsync debug logging
This commit adds the instance uuid to the rsync debug output in
the debug logs. The issue we were seeing is that when multiple
migrations are ongoing at the same time, it's not easy to
track the rsync progress of each migration.
Fixes: bug #1215629

Change-Id: Iec662bdc0aed1c6f54ecaa062335dc5504ac030f
2013-08-22 16:09:09 -05:00

76 lines
2.5 KiB
Python
Executable File

#!/usr/bin/env python
# Copyright 2010 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
XenAPI Plugin for transferring data between host nodes
"""
import utils
import pluginlib_nova
pluginlib_nova.configure_logging('migration')
logging = pluginlib_nova.logging
def move_vhds_into_sr(session, instance_uuid, sr_path, uuid_stack):
"""Moves the VHDs from their copied location to the SR."""
staging_path = "/images/instance%s" % instance_uuid
imported_vhds = utils.import_vhds(sr_path, staging_path, uuid_stack)
utils.cleanup_staging_area(staging_path)
return imported_vhds
def _rsync_vhds(instance_uuid, host, staging_path, user="root"):
ssh_cmd = 'ssh -o StrictHostKeyChecking=no'
if not staging_path.endswith('/'):
staging_path += '/'
dest_path = '%s@%s:/images/instance%s/' % (user, host, instance_uuid)
rsync_cmd = ["/usr/bin/rsync", "-av", "--progress", "-e", ssh_cmd,
staging_path, dest_path]
# NOTE(hillad): rsync's progress is carriage returned, requiring
# universal_newlines for real-time output.
rsync_proc = utils.make_subprocess(rsync_cmd, stdout=True, stderr=True,
universal_newlines=True)
while True:
rsync_progress = rsync_proc.stdout.readline()
if not rsync_progress:
break
logging.debug("[%s] %s" % (instance_uuid, rsync_progress))
utils.finish_subprocess(rsync_proc, rsync_cmd)
def transfer_vhd(session, instance_uuid, host, vdi_uuid, sr_path, seq_num):
"""Rsyncs a VHD to an adjacent host."""
staging_path = utils.make_staging_area(sr_path)
try:
utils.prepare_staging_area(
sr_path, staging_path, [vdi_uuid], seq_num=seq_num)
_rsync_vhds(instance_uuid, host, staging_path)
finally:
utils.cleanup_staging_area(staging_path)
if __name__ == '__main__':
utils.register_plugin_calls(move_vhds_into_sr, transfer_vhd)