def listimage(server):              #images list
        data.server_header(server,200)
	temp = []
	print "!!!!!!!!!",data.im
	
        for keys in data.im:
		d={}
		d["id"]=keys
		d["name"]=data.im[keys][1]
		temp.append(d)
	m={}
	m["images"]=temp
        server.wfile.write(create.json_out(m))
        pass
def query(server,attributes):
        data.server_header(server,attributes)
        try:
                vmid = int(attributes)
                #print "Details of virtual machine with id",vmid
                v_name = data.vmdetails[vmid][0]
                machine_id = data.vmdetails[vmid][2]
                mtype = data.vmdetails[vmid][3]
                #print "{vmid:",vmid,", name: ",v_name,"instance_type: ",machine_id,"pmid: ",mtype
		'''server.wfile.write('{ \n' ) 
		server.wfile.write(' vmid : %d\n ' % int(vmid)) 
		server.wfile.write(' name :%s \n' % str(v_name)) 
		server.wfile.write(' instance_type: %d \n' % int(mtype)) 
		server.wfile.write(' pmid:%d \n }' % int(machine_id))
                '''
		server.wfile.write(create.json_out({"vmid":vmid, "name":v_name, "instance_type": mtype, "pmid": machine_id}))
        except Exception,e:
                print str(e)
                server.wfile.write(create.json_out({"status":0}))
def destroy(server,attributes):
	data.server_header(server,attributes)
	try:
		vmid = int(attributes[0])
		print "Trying to delete virtual machine with id",vmid
		v_name = data.vmdetails[vmid][0]
		machine_id = data.vmdetails[vmid][2]
		vmtype=data.vmdetails[vmid][3]

		remote_machine = data.pm[machine_id]
		remote_machine_add = remote_machine[0]
		path = 'remote+ssh://'+remote_machine_add+'/system'
		print "Remote ssh to virtual machine location",path
		conn = libvirt.open(path)
		try:
			r = conn.lookupByName(v_name)
		except:
			print "The said virtual machine does not exist on any physical machine."
		if r.isActive():
			r.destroy()
		r.undefine()
		print "vm_type",vmtype
		print "heyaa",data.final_types[vmtype-1]
		#data.final_types[vmtype-1][2]=data.final_types[vmtype-1][2]*1024/100000;
		print "byee",data.final_types[vmtype-1]
		req=data.final_types[vmtype-1]
		print data.pm[machine_id]
		print "req",req
		data.pm[machine_id][1]+=req[1]
		data.pm[machine_id][2]+=req[2]
		data.pm[machine_id][3]+=req[3]
		print data.pm[machine_id]
		del data.vmdetails[vmid]
		print "Virtual machine deleted and domain undefined."

		server.wfile.write(create.json_out({"status":1}))
	except:
		server.wfile.write(create.json_out({"status":0}))
def checkurl(server,url,typefile):
	host_name = url
	if '?' in url:
		host_name, arguments = url.split('?')
	components = host_name.split('/')
	if 'attach' in components:
			
		
	#if 'detach' in components:
		
		
	if 'create' in components:
		final_argument_list = []
		arg_split = arguments.split('&')
		if 'volume' in components:
			for i in xrange(0,2):
				final_argument_list.append((arg_split[i].split('='))[1])
			print final_argument_list
			data.server_header(server,final_argument_list)
			global VOLUME_LIST
                	args=final_argument_list
                	volume_name = str(args[0])
              		volume_size = args[1]
              		actual_size = str(int(float(volume_size)*(1024**3)))
			#os.system('sudo rbd create %s --size %s'%(str(volume_name),str(actual_size)))
			try:
				os.system('sudo rbd create ' + volume_name + ' --size ' + volume_size +' -k /etc/ceph/ceph.client.admin.keyring')
				#rbdInstance.create(ioctx,str(volume_name),actual_size)
				os.system('sudo modprobe rbd')
				os.system('sudo rbd map ' + volume_name + ' --pool rbd --name client.admin -k /etc/ceph/ceph.client.admin.keyring')
				#os.system('sudo mkfs.ext4 -m0 /dev/rbd/rbd/' + volume_name)
			
				#os.system('sudo rbd map %s --pool %s --name client.admin'%(str(volume_name),str(POOL_NAME)));
				global VOLUME_LIST
				volume_id=len(VOLUME_LIST)
				VOLUME_LIST[int(volume_id)]=volume_name
				print VOLUME_LIST
				server.wfile.write(json_out({"volumeid":volume_id+1}))
			except:
				server.wfile.write(json_out({"volumeid":'0'}))
		else:
			for i in xrange(0,3):
				final_argument_list.append((arg_split[i].split('='))[1])
			print final_argument_list
			create.create(server,final_argument_list)
			#return jsonify(volumeid=volume_id)
		#else:
		#	create.create(server,final_argument_list)
	if 'destroy' in components:
	  	final_argument_list = []
		arg_split = arguments.split('=')
		if 'volume' in components:
			final_argument_list.append(arg_split[1])
			global VOLUME_LIST
			args=final_argument_list
			volume_id = int(args[0])-1
			if volume_id in VOLUME_LIST:
				volume_name=str(VOLUME_LIST[int(volume_id)])
			else:
				print "here\n"
			try:
				os.system('sudo rbd unmap /dev/rbd/%s/%s'%(POOL_NAME,volume_name))
				os.system("sudo rbd rm %s"%(volume_name))
				server.wfile.write(json_out({"status":'1'}))
			except:
				server.wfile.write(json_out({"status":'0'}))
			#rbdInstance.remove(ioctx,volume_name)
		else:
		        final_argument_list.append(arg_split[1])
		        delete.destroy(server,final_argument_list)
		        pass
	if 'types' in components:
		data.server_header(server,200)
	  	try:
			f = typefile
			fopen = open(f)
			server.wfile.write(create.json_out(json.load(fopen)))
		except Exception,e:
			print str(e)
			server.wfile.write(create.json_out({"status":0}))
	if 'query' in components:
		if 'volume' in components:
			print 'volume'
		else:
			print "entered!!"
			final_argument_list = int(arguments.split('=')[1])
			query(server,final_argument_list)
	if 'list' in components:
		listimage(server)
def checkurl(server,url,typefile):
	host_name = url
	if '?' in url:
		host_name, arguments = url.split('?')
	components = host_name.split('/')
	if 'attach' in components:
		global VOLUME_LIST
	  	final_argument_list = []
		arg_split = arguments.split('=')
		final_argument_list.append(arg_split[1])
		args=final_argument_list
		vid=int(args[0])
		volid=int(args[1])-1
		machid=data.vmdetails[vid][2]
		m_addr=data.pm[machid][0]
		path = 'remote+ssh://'+m_addr+'/system'
		vm_na=data.vmdetails[vid][0]
		if int(VOLUME_LIST[volid][2])==0:  #that volume is not already attached to something
		        try:
		       		connect = libvirt.open(path)
		       		dom=connect.lookupByName(vm_na)
		       		f=open("/etc/ceph/ceph.conf",'r')
		       		l=f.readlines()
		       		l1=f.split("\n")
		       		host=l1[2].split('=')[1]
		       		f.close()
		       		xml="<disk type='network' device='disk'>   \
		        		<source protocol='rbd' name='rbd/"+VOLUME_LIST[volid][0]+"'> \
		                	<host name="+str(host)+" port='6789'/> \
					 </source> \
					 <target dev='hdb' bus='virtio'/>  \
					</disk>"
			       	dom.attachDevice(xml)
			       	server.wfile.write(json_out({"status":1}))
			       	VOLUME_LIST[volid][2]=1
			       	VOLUME_LIST[volid][3]=int(vid)
			except:
			        server.wfile.write(json_out({"status":0}))
		else:
			server.wfile.write(json_out({"Storage Already attached to some machine so! status":0}))
					
		
	if 'detach' in components:
		global VOLUME_LIST
	  	final_argument_list = []
		arg_split = arguments.split('=')
		final_argument_list.append(arg_split[1])
		args=final_argument_list
		#vid=int(args[0])
		volid=int(args[0])-1
		if volid in VOLUME_LIST:
			if VOLUME_LIST[volid][2]==1:
				vid=VOLUME_LIST[volid][3]
				machid=data.vmdetails[vid][2]
				m_addr=data.pm[machid][0]
				path = 'remote+ssh://'+m_addr+'/system'
				vm_na=data.vmdetails[volid][0]
				try:
				       connect = libvirt.open(path)
				       dom=connect.lookupByName(vm_na)
				       f=open("/etc/ceph/ceph.conf",'r')
				       l=f.readlines()
				       l1=f.split("\n")
				       host=l1[2].split('=')[1]
				       f.close()
				       xml="<disk type='network' device='disk'>   \
			        		<source protocol='rbd' name='rbd/"+VOLUME_LIST[volid][0]+"'> \
			                	<host name="+str(host)+" port='6789'/> \
						 </source> \
						 <target dev='hdb' bus='virtio'/>  \
						</disk>"
				       dom.detachDevice(xml)
				       server.wfile.write(json_out({"status":1}))
				       VOLUME_LIST[vid][2]=0
			       	       VOLUME_LIST[vid][3]=int(vid)
				except:
			       	       server.wfile.write(json_out({"status":0}))
			else:
			       	server.wfile.write(json_out({"status":0}))
		else:
		       	server.wfile.write(json_out({"status":0}))		
		
		
	if 'create' in components:
		final_argument_list = []
		arg_split = arguments.split('&')
		if 'volume' in components:
			for i in xrange(0,2):
				final_argument_list.append((arg_split[i].split('='))[1])
			print final_argument_list
			data.server_header(server,final_argument_list)
			global VOLUME_LIST
                	args=final_argument_list
                	volume_name = str(args[0])
              		volume_size = args[1]
              		actual_size = str(int(float(volume_size)*(1024**3)))   #as size was mentioned in GB's so conversion into bytes
			#os.system('sudo rbd create %s --size %s'%(str(volume_name),str(actual_size)))
			try:
				global MID
				rbdInstance.create(ioctx,volume_name,int(actual_size))
				os.system('sudo rbd map %s --pool %s --name client.admin'%(volume_name,str(POOL_NAME)));
				#os.system('sudo rbd create ' + volume_name + ' --size ' + volume_size +' -k /etc/ceph/ceph.client.admin.keyring')
				#rbdInstance.create(ioctx,str(volume_name),actual_size)
				#os.system('sudo modprobe rbd')
				#os.system('sudo rbd map ' + volume_name + ' --pool rbd --name client.admin -k /etc/ceph/ceph.client.admin.keyring')
				#os.system('sudo mkfs.ext4 -m0 /dev/rbd/rbd/' + volume_name)
			
				#os.system('sudo rbd map %s --pool %s --name client.admin'%(str(volume_name),str(POOL_NAME)));
				global VOLUME_LIST
				MID=MID+1
				volume_id=MID
				VOLUME_LIST[int(volume_id)]=[volume_name,volume_size,0,0]
				print "list is",VOLUME_LIST
				server.wfile.write(json_out({"volumeid":volume_id+1}))
			except:
				server.wfile.write(json_out({"volumeid":'0'}))
		else:
			for i in xrange(0,3):
				final_argument_list.append((arg_split[i].split('='))[1])
			print final_argument_list
			create.create(server,final_argument_list)
			#return jsonify(volumeid=volume_id)
		#else:
		#	create.create(server,final_argument_list)
	if 'destroy' in components:
	  	final_argument_list = []
		arg_split = arguments.split('=')
		if 'volume' in components:
			final_argument_list.append(arg_split[1])
			global VOLUME_LIST
			args=final_argument_list
			volume_id = int(args[0])-1
			if volume_id in VOLUME_LIST:
				volume_name=str(VOLUME_LIST[int(volume_id)][0])
			else:
				server.wfile.write(json_out({"status":'0'}))
			try:
				os.system('sudo rbd unmap /dev/rbd/%s/%s'%(POOL_NAME,volume_name))
				rbdInstance.remove(ioctx,volume_name)
				#os.system("sudo rbd rm %s"%(volume_name))
				server.wfile.write(json_out({"status":'1'}))
				del VOLUME_LIST[volume_id]
			except:
				server.wfile.write(json_out({"status":'0'}))
			#rbdInstance.remove(ioctx,volume_name)
		else:
		        final_argument_list.append(arg_split[1])
		        delete.destroy(server,final_argument_list)
		        pass
	if 'types' in components:
		data.server_header(server,200)
	  	try:
			f = typefile
			fopen = open(f)
			server.wfile.write(create.json_out(json.load(fopen)))
		except Exception,e:
			print str(e)
			server.wfile.write(create.json_out({"status":0}))
def create(server,arguments):
	data.server_header(server,arguments)
	if(1):
		vm_name = str(arguments[0])		# The name of VM
		vm_type = int(arguments[1])		# The Type(tid) of VM
		image_type = int(arguments[2])	# The ID of VM
		type_properties=[]
		type_properties = data.final_types[vm_type-1]  ## from types file, requirements of Virtual Machine
		print "dfg" ,type_properties
		if "_64" in data.im[image_type][1]:
			r=64
		else:
			r=32
		m,useid = get_machine(type_properties,r)		# Get the physical machine to host the VM

		if useid == 0:
			print "NO MACHINES AVAILABLE FOR THE TASK"
			return
		print "Machine id",useid,"selected"
		machine_addr = m[0]
		
		images_list = data.im[image_type]  #dictionary
		location_user = images_list[0]
		filename = images_list[1]
		location_image = images_list[2]			#Find the location of image
				
		print "HRRAY!!anfdjnfv",m[0]," ",m[0].split('@')[0] 
		if not os.path.isfile('./'+filename): 
			subprocess.call(["scp",':'.join([location_user,location_image]),"."]) 
		try: 
			subprocess.call(["scp","./"+filename,':'.join([machine_addr,"/home/"+m[0].split('@')[0]+'/Desktop'])]) 
		except: 
			print "cannot copy"
		path = 'remote+ssh://'+m[0]+'/system'
		print "Remote ssh to machine location ---- ",path
		try:
			conn = lbv.open(path)
		except:
			print "Could Not Open Connection\n"
			return

		system_info = conn.getCapabilities()	#get PM capabilities
		node_info = conn.getInfo()
		print "HERE I AM",node_info[1],node_info[2]
		emulator_path = system_info.split("emulator>")
		
		emulator_path = emulator_path[1].split("<")[0]	#location of xen/qemu
		
		emulator1 = system_info.split("<domain type=")
	
		emulator1 = emulator1[1].split(">")[0]		#emulator present xen/qemu
		
		arch_type = system_info.split("<arch>")
		arch_type = arch_type[1].split("<")[0]

		data.type_p[useid] = [emulator_path ,emulator1, arch_type] #machine id as key--- stores physical machine arch details
#		print emulator_path ,emulator1, arch_type
		arch = data.type_p[useid]

		hyper_type = conn.getType().lower()
		print "Type of Connection --- ",hyper_type
		## check whether Xen or Qemu
		print "again",type_properties	
		print "final once",data.final_types
		#type_properties[2] = (type_properties[2]*test_number)/1024
		print "last again",type_properties	
		print "final again",data.final_types
		'''if not os.path.isfile('~/'+images_list[1]):
#                       p = subprocess.Popen(["ssh",location_user])
                        print machine_addr,location_image
                        #subprocess.call(["scp",':'.join([location_user,location_image]),'/var/lib/libvirt/images/'])
                        subprocess.call(["scp",images_list[0]+':'+images_list[2],''])
                        #print "scp",':'.join([location_user,location_image]),':'.join([machine_addr,'/var/lib/libvirt/images/'+images_list[1][0]])
#                       p.kill()
		'''
		#xml = create_xml(vm_name, type_properties,images_list[0],'/var/lib/libvirt/images/',hyper_type,image_type,arch)  ## type_properties has tid,cpu,ram,disk
		xml = create_xml(vm_name, type_properties,images_list[0],"/home/"+m[0].split('@')[0]+'/Desktop/'+filename,hyper_type,image_type,arch)  ## type_properties has tid,cpu,ram,disk

#		print xml
	
		connect_xml = conn.defineXML(xml)
		try:
			connect_xml.create()
			print "Task Done!" 
			vmachine_id = data.getvmid(useid)	#Get Virtual Machine unique ID -- useid is machineid!
			data.vmdetails[vmachine_id] = [vm_name, type_properties, useid,vm_type]			#store VM vs Phy machine details..
			print "vm ne kya liya",data.vmdetails[vmachine_id]
#			print "Here are details",fileHandling.machine_v_details,vmachine_id
			server.wfile.write(json_out({"vmid":vmachine_id}))
			data.pm[iterate][1] -= type_properties[3]
			data.pm[iterate][2] -= type_properties[2]
			data.pm[iterate][3] -= type_properties[1]
			
		except Exception,e:
			print str(e)
			server.wfile.write(json_out({"vmid":0}))
def checkurl(server, url, typefile):
    host_name = url
    if "?" in url:
        host_name, arguments = url.split("?")
    components = host_name.split("/")
    # if 'attach' in components:

    # if 'detach' in components:

    if "create" in components:
        final_argument_list = []
        arg_split = arguments.split("&")
        if "volume" in components:
            for i in xrange(0, 2):
                final_argument_list.append((arg_split[i].split("="))[1])
            print final_argument_list
            data.server_header(server, final_argument_list)
            global VOLUME_LIST
            args = final_argument_list
            volume_name = str(args[0])
            volume_size = args[1]
            actual_size = str(int(float(volume_size) * (1024 ** 3)))
            # os.system('sudo rbd create %s --size %s'%(str(volume_name),str(actual_size)))
            try:
                global MID
                rbdInstance.create(ioctx, volume_name, int(volume_size))
                os.system("sudo rbd map %s --pool %s --name client.admin" % (volume_name, str(POOL_NAME)))
                # os.system('sudo rbd create ' + volume_name + ' --size ' + volume_size +' -k /etc/ceph/ceph.client.admin.keyring')
                # rbdInstance.create(ioctx,str(volume_name),actual_size)
                # os.system('sudo modprobe rbd')
                # os.system('sudo rbd map ' + volume_name + ' --pool rbd --name client.admin -k /etc/ceph/ceph.client.admin.keyring')
                # os.system('sudo mkfs.ext4 -m0 /dev/rbd/rbd/' + volume_name)

                # os.system('sudo rbd map %s --pool %s --name client.admin'%(str(volume_name),str(POOL_NAME)));
                global VOLUME_LIST
                MID = MID + 1
                volume_id = MID
                VOLUME_LIST[int(volume_id)] = [volume_name, volume_size, 0, 0]
                print "list is", VOLUME_LIST
                server.wfile.write(json_out({"volumeid": volume_id + 1}))
            except:
                server.wfile.write(json_out({"volumeid": "0"}))
        else:
            for i in xrange(0, 3):
                final_argument_list.append((arg_split[i].split("="))[1])
            print final_argument_list
            create.create(server, final_argument_list)
            # return jsonify(volumeid=volume_id)
            # else:
            # 	create.create(server,final_argument_list)
    if "destroy" in components:
        final_argument_list = []
        arg_split = arguments.split("=")
        if "volume" in components:
            final_argument_list.append(arg_split[1])
            global VOLUME_LIST
            args = final_argument_list
            volume_id = int(args[0]) - 1
            if volume_id in VOLUME_LIST:
                volume_name = str(VOLUME_LIST[int(volume_id)][0])
            else:
                print "here\n"
            try:
                os.system("sudo rbd unmap /dev/rbd/%s/%s" % (POOL_NAME, volume_name))
                rbdInstance.remove(ioctx, volume_name)
                # os.system("sudo rbd rm %s"%(volume_name))
                server.wfile.write(json_out({"status": "1"}))
                del VOLUME_LIST[volume_id]
            except:
                server.wfile.write(json_out({"status": "0"}))
                # rbdInstance.remove(ioctx,volume_name)
        else:
            final_argument_list.append(arg_split[1])
            delete.destroy(server, final_argument_list)
            pass
    if "types" in components:
        data.server_header(server, 200)
        try:
            f = typefile
            fopen = open(f)
            server.wfile.write(create.json_out(json.load(fopen)))
        except Exception, e:
            print str(e)
            server.wfile.write(create.json_out({"status": 0}))