#!/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 cloud  stack

import os, sys, time
import XenAPIPlugin
sys.path.extend(["/opt/xensource/sm/"])
import util
import cloudstack_pluginlib as lib
import logging

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

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

SWIFT = "/opt/cloud/bin/swift"

MAX_SEG_SIZE = 5 * 1024 * 1024 * 1024

def upload(args):
    url = args['url']
    account = args['account']
    username = args['username']
    key = args['key']
    container = args['container']
    ldir = args['ldir']
    lfilename = args['lfilename']
    isISCSI = args['isISCSI']
    segment = 0
    logging.debug("#### VMOPS upload %s to swift ####", lfilename)
    savedpath = os.getcwd()
    os.chdir(ldir)
    try :
        if isISCSI == 'ture':
            cmd1 = [ lvchange , "-ay", lfilename ] 
            util.pread2(cmd1)
            cmd1 = [ lvdisplay, "-c", lfilename ]
            lines = util.pread2(cmd).split(':');
            size = long(lines[6]) * 512
            if size > MAX_SEG_SIZE :
                segment = 1
        else :
            size = os.path.getsize(lfilename)
            if size > MAX_SEG_SIZE :        
                segment = 1
        if segment :             
            cmd = [SWIFT, "-A", url, "-U", account + ":" + username, "-K", key, "upload", "-S", str(MAX_SEG_SIZE), container, lfilename]
        else :
            cmd = [SWIFT, "-A", url ,"-U", account + ":" + username, "-K", key, "upload", container, lfilename]
        util.pread2(cmd)
        return 'true'
    finally:
        os.chdir(savedpath)
    return 'false'


@echo
def swift(session, args):
    op = args['op']
    if op == 'upload':
        return upload(args)
    elif op == 'download':
        return download(args)
    elif op == 'delete' :
        cmd = ["st", "-A https://" + hostname + ":8080/auth/v1.0 -U " + account + ":" + username + " -K " + token + " delete " + rfilename]
    else :
        logging.debug("doesn't support swift operation  %s " % op )
        return 'false'
    try:
        util.pread2(cmd)
        return 'true'
    except:
        return 'false'
   
if __name__ == "__main__":
    XenAPIPlugin.dispatch({"swift": swift})
