#!/usr/bin/python
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.

# Version @VERSION@
#
# A plugin for executing script needed by vmops cloud 

import os, sys, time
import XenAPIPlugin
if os.path.exists("/opt/xensource/sm"):
    sys.path.extend(["/opt/xensource/sm/", "/usr/local/sbin/", "/sbin/"])
if os.path.exists("/usr/lib/xcp/sm"):
    sys.path.extend(["/usr/lib/xcp/sm/", "/usr/local/sbin/", "/sbin/"])
import util
import socket
import cloudstack_pluginlib as lib
import logging

lib.setup_logging("/var/log/cloud/cloud.log")

def echo(fn):
    def wrapped(*v, **k):
        name = fn.__name__
        logging.debug("#### CLOUD enter  %s ####" % name )
        res = fn(*v, **k)
        logging.debug("#### CLOUD exit  %s ####" % name )
        return res
    return wrapped

@echo
def forceShutdownVM(session, args):
    domId = args['domId']
    try:
        cmd = ["/opt/xensource/debug/xenops", "destroy_domain", "-domid", domId]
        txt = util.pread2(cmd)
    except:
        txt = '10#failed'
    return txt


@echo
def create_privatetemplate_from_snapshot(session, args):
    templatePath = args['templatePath']
    snapshotPath = args['snapshotPath']
    tmpltLocalDir = args['tmpltLocalDir']
    try:
        cmd = ["bash", "/opt/cloud/bin/create_privatetemplate_from_snapshot.sh",snapshotPath, templatePath, tmpltLocalDir]
        txt = util.pread2(cmd)
    except:
        txt = '10#failed'
    return txt

@echo
def upgrade_snapshot(session, args):
    templatePath = args['templatePath']
    snapshotPath = args['snapshotPath']
    try:
        cmd = ["bash", "/opt/cloud/bin/upgrate_snapshot.sh",snapshotPath, templatePath]
        txt = util.pread2(cmd)
    except:
        txt = '10#failed'
    return txt

@echo
def copy_vhd_to_secondarystorage(session, args):
    mountpoint = args['mountpoint']
    vdiuuid = args['vdiuuid']
    sruuid = args['sruuid']
    try:
        cmd = ["bash", "/opt/cloud/bin/copy_vhd_to_secondarystorage.sh", mountpoint, vdiuuid, sruuid]
        txt = util.pread2(cmd)
    except:
        txt = '10#failed'
    return txt

@echo
def copy_vhd_from_secondarystorage(session, args):
    mountpoint = args['mountpoint']
    sruuid = args['sruuid']
    namelabel = args['namelabel']
    try:
        cmd = ["bash", "/opt/cloud/bin/copy_vhd_from_secondarystorage.sh", mountpoint, sruuid, namelabel]
        txt = util.pread2(cmd)
    except:
        txt = '10#failed'
    return txt

@echo
def remove_corrupt_vdi(session, args):
    vdifile = args['vdifile']
    try:
        cmd = ['rm', '-f', vdifile]
        txt = util.pread2(cmd)
    except:
        txt = '10#failed'
    return txt

@echo
def setup_heartbeat_sr(session, args):
    host = args['host']
    sr = args['sr']
    try:
        cmd = ["bash", "/opt/cloud/bin/setup_heartbeat_sr.sh", host, sr]
        txt = util.pread2(cmd)
    except:
        txt = ''
    return txt

@echo
def setup_heartbeat_file(session, args):
    host = args['host']
    sr = args['sr']
    add = args['add']
    try:
        cmd = ["bash", "/opt/cloud/bin/setup_heartbeat_file.sh", host, sr, add]
        txt = util.pread2(cmd)
    except:
        txt = ''
    return txt

 
@echo
def heartbeat(session, args):
    host = args['host']
    timeout = args['timeout']
    interval = args['interval']
    try: 
       cmd = ["/bin/bash", "/opt/cloud/bin/launch_hb.sh", host, timeout, interval]
       txt = util.pread2(cmd)
    except:
       txt='fail'
    return txt

@echo
def asmonitor(session, args):
    try:
        perfmod = __import__("perfmon")
        result = perfmod.get_vm_group_perfmon(args)
        return result
    except:
        return 'fail'

if __name__ == "__main__":
    XenAPIPlugin.dispatch({"forceShutdownVM":forceShutdownVM, "upgrade_snapshot":upgrade_snapshot, "create_privatetemplate_from_snapshot":create_privatetemplate_from_snapshot, "copy_vhd_to_secondarystorage":copy_vhd_to_secondarystorage, "copy_vhd_from_secondarystorage":copy_vhd_from_secondarystorage, "setup_heartbeat_sr":setup_heartbeat_sr, "setup_heartbeat_file":setup_heartbeat_file, "heartbeat": heartbeat, "asmonitor": asmonitor, "remove_corrupt_vdi": remove_corrupt_vdi})
