The Following Script will
1.)Check for the Compute Hosts which are Down 
2.)Check for the Instance in the Down Hosts
3.)Check for Compute Hosts which are Up
4.)Calculate the Vcpu and Memory needed for Instance which are in Down Host
5.)Calculate the free Vcpu and Memory in the Up Hosts
7.)Find proper Host for each Instance in the Down Host
8.)Once proper Compute Hosts are Found for each Instance the Mysql entries are modified and the Instance is hard rebooted .
#! / usr / bin / env python
# - * - Coding: utf-8 - * -
import time
import os
import re
import MySQLdb
import subprocess
from subprocess import Popen, PIPE
# Determine whether the compute nodes down, compute_down_list is a list of nodes calculate downtime
#Returns a list of Nodes which are down
def select_compute_down_host ():
 nova_service_list = os.popen ("nova-manage service list 2> /dev/null").read().strip().split("\n")
 compute_down_list = [] 
 for compute_num in range (len (nova_service_list)):
  new_val = ( nova_service_list [compute_num] )
  if 'nova-compute' in new_val:
   if 'enabled' in new_val:
    if 'XXX' in new_val:
     compute_down_list.append (nova_service_list [compute_num] .split () [1])
 if len(compute_down_list) == 0:
  print "No Downtime Computing Nodes, The Program Automatically Exit!"
  exit (0)
 else:
  compute_down_list = list (set (compute_down_list))
 return compute_down_list
# Determine whether the compute nodes Up, compute_up_list is a list of nodes calculate downtime
# Returns a list of Nodes Which are Up
def select_compute_up_host ():
        nova_service_list = os.popen ("nova-manage service list 2> /dev/null").read().strip().split("\n")
        compute_up_list = []
        for compute_num in range (len (nova_service_list)):
                new_val = ( nova_service_list [compute_num] )
                if 'nova-compute' in new_val:
                        if 'enabled' in new_val:
                                if ':-)' in new_val:
                                        compute_up_list.append (nova_service_list [compute_num] .split () [1])
        if len(compute_up_list) == 0:
                print "No Compute Node's are UP, The Program Automatically Exit!"
                exit (0)
        else:
                compute_up_list = list (set (compute_up_list))
        return compute_up_list
# Dertermine which instances are down, down_instance_list is the list of instance which are down 
# Return a Tuple of Intance which are down # Input is a List of Down Nodes
def instance_in_down_node(down_nodes, host = 'controller', user = 'nova', passwd = 'nova4key', db = 'nova'):
        instances_dict = {}
        down_instances_list = []
        connection_mysql = MySQLdb.connect (host = host, user = user, passwd = passwd, db = db) #, charset = 'utf8')
 cursor = connection_mysql.cursor ()
 connection_mysql.autocommit(True)
 for node in down_nodes:
  sql_select = "select uuid from instances where host = '%s' and vm_state = 'active'" %(node)
  cursor.execute (sql_select)
  instances_name = cursor.fetchall ()
  if instances_name == ():
   pass
  else:
   instances_dict [node] = instances_name
   down_instances_list.append (instances_dict [node])
 if down_instances_list == []:
               print '\ n no downtime on the compute nodes running virtual machines \ n'
               exit ()
#for node in down_instances_list:
# for instance in node:
#  print instance[0]
#  usage_of_instance = usage_instance(instance[0])
#  print usage_of_instance[0],usage_of_instance[1],usage_of_instance[2]
 cursor.close ()
        connection_mysql.commit ()
        connection_mysql.close ()
 return down_instances_list
#Determines the Resource usage of Down Instance
#Input a instanc UUID and return its Vcpu, memory and inatnce Type as a list
def usage_instance(instances, host = 'controller', user = 'nova', passwd = 'nova4key', db = 'nova'):
 connection_mysql = MySQLdb.connect (host = host, user = user, passwd = passwd, db = db) #, charset = 'utf8')
 cursor = connection_mysql.cursor ()
 connection_mysql.autocommit(True)
 instance_dict = {}
 type_down_instance_list = []
 usage_type_down_instance_list = []
 instances_type_details = []
# print ("Checking Usage of Instance {}".format(instances))
 sql_select = "select instance_type_id from instances where uuid = '%s' " %(instances)
 cursor.execute (sql_select)
 instances_type = cursor.fetchall ()
 instance_dict [instances] = instances_type
 type_down_instance_list.append (instance_dict [instances])
 for node in type_down_instance_list:
  for instance in node:
   type_instance = instance[0]
#   print type_instance
 sql_select = "select vcpus,memory_mb,id from instance_types where id = '%d'" %(type_instance)
# print sql_select
 cursor.execute (sql_select)
 instances_type_details = cursor.fetchall ()
# print instances_type_details
 instance_dict [instances_type_details] =  instances_type_details
 usage_type_down_instance_list.append (instance_dict [instances_type_details])
# print usage_type_down_instance_list
 for instance in usage_type_down_instance_list:
  for instance_details in instance:
#   print instance_details[0],instance_details[1],instance_details[2]
   return instance_details
# 
 cursor.close ()
        connection_mysql.commit ()
        connection_mysql.close ()
#Determine Resouce left in a Compute Node which is UP
#Inputs a Node name and Returns free Vcpu and free Memory of that node
def usage_of_compute_node(node, host = 'controller', user = 'nova', passwd = 'nova4key', db = 'nova'):
 # Connect to the database
        instance_dict = {}
 usage_instance_detail = []
 free = []
 connection_mysql = MySQLdb.connect (host = host, user = user, passwd = passwd, db = db) #, charset = 'utf8')
        cursor = connection_mysql.cursor ()
 connection_mysql.autocommit(True)
# print node
 sql_select = "select vcpus,vcpus_used,free_ram_mb from compute_nodes where  hypervisor_hostname = '%s'" %(node)
# print sql_select
        cursor.execute (sql_select)
        instance_usage = cursor.fetchall ()
        instance_dict [node] = instance_usage
 usage_instance_detail.append (instance_dict [node])
 
 for node in usage_instance_detail:
  for detail in node:
   free_vcpu = (detail[0] - detail[1])
   free_mem = detail[2]
#   print detail[0],detail[1],detail[2]
#   print ("Free Vcpu {} : :Free Memory {}".format(free_vcpu,free_mem))
   free.append (free_vcpu)
   free.append (free_mem)
 cursor.close ()
        connection_mysql.commit ()
        connection_mysql.close ()
 return free
#Update the database of of the node usage
#Inputs a instance UUID and Node name # the details of the Node are updated including the resource usage of new instance
def update_compute_node_usage(instance,node,host = 'controller', user = 'nova', passwd = 'nova4key', db = 'nova'):
 free_instance = []
 free_node = []
 instance_dict = {}
 instance_details = []
 node_details = []
# print instance,node
 free_instance = usage_instance(instance)
# print free_instance[1],free_instance[2] 
 instance_memory = free_instance[1]
 instance_vcpu = free_instance[0]
 connection_mysql = MySQLdb.connect (host = host, user = user, passwd = passwd, db = db) #, charset = 'utf8')
        cursor = connection_mysql.cursor ()
 connection_mysql.autocommit(True)
 sql_select = "select root_gb from instances where uuid = '%s'" %(instance)
# print sql_select
        cursor.execute (sql_select)
        storage = cursor.fetchall ()
        instance_dict [instance] = storage
        instance_details.append (instance_dict [instance])
 for instance in instance_details:
  for details in instance:
#   print details[0]
   instance_space = details[0]
# print ("Instance details Vcpu={},Memory={},Space={}".format(instance_vcpu,instance_memory,instance_space))
 sql_select = "select vcpus_used,memory_mb_used,free_ram_mb,local_gb_used,running_vms,disk_available_least from compute_nodes where hypervisor_hostname = '%s'" %(node)
# print sql_select
 cursor.execute (sql_select)
        storage = cursor.fetchall ()
        instance_dict [node] = storage
        node_details.append (instance_dict [node])
 for host in node_details:
  for details in host:
   node_vcpus_used = details[0]
   node_memory_mb_used = details[1]
   node_free_ram_mb = details[2] 
   node_local_gb = details[3]
   node_running_vms = details[4]
   node_disk_available_least = details[5]
        #sql_select = "update compute_nodes set vcpus_used = '%s',memory_mb_used = '%s',free_ram_mb = '%s',local_gb_used = '%s',running_vms = '%s' ,disk_available_least = '%s' where hypervisor_hostname = '%s'" %(node_vcpus_used,node_memory_mb_used,node_free_ram_mb,node_local_gb,node_running_vms,node_disk_available_least,node)
        #print sql_select
 
 node_vcpus_used = node_vcpus_used + instance_vcpu
 node_memory_mb_used = node_memory_mb_used + instance_memory
 node_free_ram_mb = node_free_ram_mb - instance_memory
 node_local_gb = node_local_gb + instance_space
 node_running_vms = node_running_vms + 1
 node_disk_available_least = node_disk_available_least - instance_space
 sql_select = "update compute_nodes set vcpus_used = '%s',memory_mb_used = '%s',free_ram_mb = '%s',local_gb_used = '%s',running_vms = '%s' ,disk_available_least = '%s' where hypervisor_hostname = '%s'" %(node_vcpus_used,node_memory_mb_used,node_free_ram_mb,node_local_gb,node_running_vms,node_disk_available_least,node)
 print sql_select
 cursor.execute (sql_select)
 storage = cursor.fetchall ()
 connection_mysql.commit ()
 cursor.close ()
        connection_mysql.commit ()
        connection_mysql.close ()
#Intake a instance and node. If the node have enough resource to take in the instance the instance are moved into the node
def rescue_instance (instance,node,host = 'controller', user = 'nova', passwd = 'nova4key', db = 'nova'):
 connection_mysql = MySQLdb.connect (host = host, user = user, passwd = passwd, db = db) #, charset = 'utf8')
        cursor = connection_mysql.cursor ()
 connection_mysql.autocommit(True)
 print instance, node
 node_usage = usage_of_compute_node(node)
 instance_usage = usage_instance(instance)
 node_vcpu = node_usage[0]
 node_memory = node_usage[1]
 instance_vcpu = instance_usage[0]
 instance_memory = instance_usage[1]
# print ("Node Vcpu {} Node Memory {}".format(node_vcpu,node_memory))
# print ("Instance Vcpu {} Instanc Memory {}".format(instance_vcpu,instance_memory))
 if node_vcpu > instance_vcpu:
  if node_memory > instance_memory:
   print "Transfer possible"
   sql_select = "update instances set vm_state = 'stopped',power_state = 4 where uuid = '%s'"%(instance)
   print sql_select
         cursor.execute (sql_select)
         storage = cursor.fetchall ()
   connection_mysql.commit ()
   sql_select = "update instances set host = '%s' where uuid = '%s' and vm_state = 'stopped'"%(node,instance)
   print sql_select
                        cursor.execute (sql_select)
                        storage = cursor.fetchall ()
   connection_mysql.commit ()
   instance_reboot = "source /root/admin-openrc.sh;nova reboot --hard %s" %(instance)
   print instance_reboot
   subprocess.call(instance_reboot, shell=True ,stderr=subprocess.PIPE)
#   time.sleep(60) 
   update_compute_node_usage(instance,node)
   return 0
  else:
   print "Not Possible"
 else:
  print "not possible"
 cursor.close ()
        connection_mysql.commit ()
        connection_mysql.close ()
 return 1
def update_down_host(host = 'controller', user = 'nova', passwd = 'nova4key', db = 'nova'):
 down_nodes = select_compute_down_host ()
 instance_dict = {}
 down_host_usage = []
 connection_mysql = MySQLdb.connect (host = host, user = user, passwd = passwd, db = db) #, charset = 'utf8')
        cursor = connection_mysql.cursor ()
        connection_mysql.autocommit(True)
 for host in down_nodes:
                print ("The Node {} is Down".format(host))
  sql_select = "select memory_mb_used,vcpus_used,local_gb_used,running_vms,free_ram_mb,memory_mb,free_disk_gb,local_gb from compute_nodes where hypervisor_hostname = '%s'" %(host)
  print sql_select
  cursor.execute (sql_select)
         node = cursor.fetchall ()
         instance_dict [host] = node
         down_host_usage.append (instance_dict [host])
  for node in down_host_usage:
   for detail in node:
    memory_used = detail[0]
    vcpu_used = detail[1]
    local_gb_used = detail[2]
    running_vm = detail[3]
    free_ram = detail[4]
    memory_mb = detail[5]
    free_disk_gb = detail[6]
    local_gb = detail[7]
  memory_used = 512
  vcpu_used = 0
  local_gb_used = 0
  running_vm = 0
  free_ram = memory_mb - memory_used
  free_disk_gb = local_gb - local_gb_used
  sql_select = "update compute_nodes set memory_mb_used = '%s',vcpus_used = '%s',local_gb_used = '%s',running_vms = '%s',free_ram_mb = '%s',free_disk_gb = '%s' where hypervisor_hostname = '%s'" %(memory_used,vcpu_used,local_gb_used,running_vm,free_ram,free_disk_gb,host)
  print sql_select
                cursor.execute (sql_select)
  connection_mysql.commit ()
 cursor.close ()
 connection_mysql.commit ()
        connection_mysql.close ()
   
  
def select_compute_down_host_instances (host = 'controller', user = 'nova', passwd = 'nova4key', db = 'nova'):
 connection_mysql = MySQLdb.connect (host = host, user = user, passwd = passwd, db = db) #, charset = 'utf8')
 cursor = connection_mysql.cursor ()
 connection_mysql.autocommit(True)
 instances_dict = {}
 
 down_nodes = []
 #================================
 #Scanig For Nodes Which are Down
 #================================
 print "Scanning For Nodes Which Are Down.."
 down_nodes = select_compute_down_host ()
 for host in down_nodes:
  print ("The Node {} is Down".format(host))
 instance_down = []
 #====================================
 #Scaning for Instance Which are Down
 #====================================
 instance_down = instance_in_down_node(down_nodes)
 for node in instance_down:
  for instance in node:
   print ("The Instance {} is Down ".format(instance[0]))
  # print ("Usage Of Instance")
   usage_of_instance = usage_instance(instance)
  # print ("Vcpus {} : : Memory {} : : Instance_type {}".format(usage_of_instance[0],usage_of_instance[1],usage_of_instance[2]))
 
 up_nodes = []
 free_resource_node = []
 #==================================
 #Scaning for nodes which are UP
 #==================================
 up_nodes = select_compute_up_host ()
 for node in up_nodes:
  print ("The Node {} is Up".format(node))
  free_resource_node = usage_of_compute_node(node)
  #print ("Free Vcpus:{} , Free Memory:{}".format( free_resource_node[0],free_resource_node[1]))
  
 ###=====================================
 ###Rescue the instance from the Down Node
 ###=====================================
 for node in instance_down:
  for instance in node:  
   for live_node in up_nodes:
    success = rescue_instance(instance[0],live_node)
    if success == 0:
     break
    else:
     continue
 update_down_host()
 cursor.close ()
 connection_mysql.commit ()
 connection_mysql.close ()
if __name__ == "__main__":
 select_compute_down_host_instances ()