#!/usr/bin/python
import os
import logging
import sys
import socket
from cloudutils.cloudException import CloudRuntimeException, CloudInternalException
from cloudutils.utilities import initLoging, bash
from cloudutils.configFileOps import  configFileOps
from cloudutils.globalEnv import globalEnv
from cloudutils.networkConfig import networkConfig
from cloudutils.syscfg import sysConfigFactory

from optparse import OptionParser
    
def getUserInputs():
    print "Welcome to Cloud Agent Setup:"

    cfo = configFileOps("/etc/cloud/agent/agent.properties")
    oldMgt = cfo.getEntry("host")

    mgtSvr = raw_input("Please input the Management Server Name/IP:[%s]"%oldMgt)
    if mgtSvr == "":
        mgtSvr = oldMgt
    try:
        socket.getaddrinfo(mgtSvr, 443)
    except:
        print "Failed to resolve %s. Please input correct server name or IP."%mgtSvr
        exit(1)

    oldToken = cfo.getEntry("zone")
    zoneToken = raw_input("Please input the Zone Id:[%s]"%oldToken)
    
    if zoneToken == "":
        zoneToken = oldToken

    oldPod = cfo.getEntry("pod")
    podId = raw_input("Please input the Pod Id:[%s]"%oldPod)
    
    if podId == "":
       podId  = oldToken
    
    oldCluster = cfo.getEntry("cluster")
    clusterId = raw_input("Please input the Cluster Id:[%s]"%oldCluster)
    if clusterId == "":
        clusterId = oldCluster

    try:
        defaultNic = networkConfig.getDefaultNetwork()
    except:
        print "Failed to get default route. Please configure your network to have a default route"
        exit(1)
        
    defNic = defaultNic.name
    network = raw_input("Please choose which network used to create VM:[%s]"%defNic)
    if network == "":
        if defNic == "":
            print "You need to specifiy one of Nic or bridge on your system"
            exit(1)
        elif network == "":
            network = defNic

    return [mgtSvr, zoneToken, network, podId, clusterId]

if __name__ == '__main__':
    initLoging("/var/log/cloud/setupAgent.log")
    glbEnv = globalEnv()

    glbEnv.mode = "Agent"
    glbEnv.agentMode = "Agent"
    parser = OptionParser()
    parser.add_option("-a", action="store_true", dest="auto", help="auto mode")
    parser.add_option("-m", "--host", dest="mgt", help="management server name or IP")
    parser.add_option("-z", "--zone", dest="zone", help="zone id")
    parser.add_option("-p", "--pod", dest="pod", help="pod id")
    parser.add_option("-c", "--cluster", dest="cluster", help="cluster id")
    parser.add_option("-g", "--guid", dest="guid", help="guid")
    parser.add_option("--pubNic", dest="pubNic", help="public nic")
    parser.add_option("--prvNic", dest="prvNic", help="private nic")
    parser.add_option("--guestNic", dest="guestNic", help="guest nic")

    (options, args) = parser.parse_args()
    if options.auto is None:
        userInputs = getUserInputs()
        glbEnv.mgtSvr = userInputs[0]
        glbEnv.zone = userInputs[1]
        glbEnv.defaultNic = userInputs[2]
        glbEnv.pod = userInputs[3]
        glbEnv.cluster = userInputs[4]
        #generate UUID
        glbEnv.uuid = configFileOps("/etc/cloud/agent/agent.properties").getEntry("guid")
        if glbEnv.uuid == "":
            glbEnv.uuid = bash("uuidgen").getStdout()
    else:
        for para, value in options.__dict__.items():
            if value is None:
                print "Missing operand:%s"%para
                print "Try %s --help for more information"%sys.argv[0]
                sys.exit(1)

        glbEnv.uuid = options.guid
        glbEnv.mgtSvr = options.mgt
        glbEnv.zone = options.zone
        glbEnv.pod = options.pod
        glbEnv.cluster = options.cluster
        glbEnv.nics.append(options.prvNic)
        glbEnv.nics.append(options.pubNic)
        glbEnv.nics.append(options.guestNic)
        
    print "Starting to configure your system:"
    syscfg = sysConfigFactory.getSysConfigFactory(glbEnv)
    try:
        syscfg.config()
        print "Cloud Agent setup is Done!"
    except (CloudRuntimeException,CloudInternalException), e:
        print e
        print "Try to restore your system:"
        try:
            syscfg.restore()
        except:
            pass
