#!/usr/bin/env python

# Copyright 2010 OpenStack LLC.
# 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 transfering data between host nodes
"""

import cPickle as pickle
try:
    import json
except ImportError:
    import simplejson as json
import os
import os.path
import shlex
import shutil
import subprocess

import XenAPIPlugin

import utils

from pluginlib_nova import *
configure_logging('migration')


def move_vhds_into_sr(session, args):
    """Moves the VHDs from their copied location to the SR"""
    params = pickle.loads(exists(args, 'params'))
    instance_uuid = params['instance_uuid']
    sr_path = params['sr_path']
    uuid_stack = params['uuid_stack']

    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 json.dumps(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 = "nohup /usr/bin/rsync -av -e %(ssh_cmd)s %(staging_path)s"\
               " %(dest_path)s" % locals()
    rsync_proc = utils.make_subprocess(rsync_cmd, stdout=True, stderr=True)
    utils.finish_subprocess(rsync_proc, rsync_cmd)


def transfer_vhd(session, args):
    """Rsyncs a VHD to an adjacent host"""
    params = pickle.loads(exists(args, 'params'))
    instance_uuid = params['instance_uuid']
    host = params['host']
    vdi_uuid = params['vdi_uuid']
    sr_path = params['sr_path']
    seq_num = params['seq_num']

    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)

    return ""


if __name__ == '__main__':
    XenAPIPlugin.dispatch({'transfer_vhd': transfer_vhd,
                           'move_vhds_into_sr': move_vhds_into_sr})
