Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
ó
±EYc@sdZddlZddlmZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlmZddlmZddlmZddlmZddlmZdd	lmZdd
lmZddlmZddlm Z dd
lm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%ddl&Z&ddl'm(Z(ddl)m*Z+ddl,m-Z-ddl.m/Z/ddl.m0Z0ddl.m1Z1ddl.m2Z2ddl.m3Z4ddl.m5Z5ddl6Z,ddl7m8Z9ddl7m:Z;ddl,m<Z=ddl,m>Z>ddl?m@Z@dd l?mAZAdd!l?mBZBdd"l?mCZCdd#l,mDZDdd$lEmFZGdd%l,mHZHdd&lImJZJdd'lImKZLdd(lMmNZOddlMm3ZPddl,m3Z3dd)l,mQZQddlRm-ZSdd*lRmTZTdd+lRmUZUdd,lVmWZXdd-lYmZZZdd.lRm[Z[dd/lRm\Z\dd0lRm]Z]dd$l^mFZ_dd1lRm`Z`dd2lambZbdd3lamcZddd/lam\Zedd4lamfZgdd5lamhZhdd6lamiZidd7lamjZjdd8lamkZkdd9lamlZmdd:lnmoZodd;lnmpZpdd<lnmqZqddlam3Zrdd=lamsZtdd>lumvZvdd?lRmwZwdd@lRmxZxddAlymzZzddBlym{Z{da}e~aej€eƒZ‚e,jƒj„Z„dCeejeej…jfZ†idDdE6dFdG6Z‡dHe%jˆZ‰dIZŠdZ‹dJZŒejdKdLdMdNdOgƒZŽdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dagZdb„Zeƒd|Z‘d}Z’d~Z“dZ”d€Z•dZ–d‚Z—dƒZ˜d„Z™d…gZšd†Z›d‡gZœdˆZd‰ZždŠZŸd‹Z dŒZ¡dZ¢dŽZ£dZ¤dZ¥d‘Z¦d’Z§d“Z¨d”Z©d•Zªd–Z«dsZ¬e¬dcZ­d—Z®d˜Z¯d™Z°ie¤e/j±6e¤e/j²6e§e/j³6e§e/j´6e§e/jµ6Z¶ie¥e/j±6e¥e/j²6e¨e/j³6e¨e/j´6e¨e/jµ6Z·dšZ¸dtZ¹idudu6dvdw6dxdy6Zºdze[j»fd{„ƒYZ¼dS(›sb
A connection to a hypervisor through libvirt.

Supports KVM, LXC, QEMU, UML, XEN and Parallels.

iÿÿÿÿN(tdeque(tgreenthread(ttpool(tetree(t	connector(tprocessutils(tlog(t	jsonutils(tloopingcall(texcutils(t	fileutils(timportutils(tstrutils(t	timeutils(tunits(trange(tbase(tblock_device(tarch(thv_type(tpower_state(ttask_states(tutils(tvm_mode(tserial(ttype(tcontext(t	exception(t_(t_LE(t_LI(t_LW(timage(tmodel(tobjects(tfields(tmigrate_data(tmanager(tversion(tconfigdrive(tdiagnostics(tapi(tguestfs(tdriver(tfirewall(thardware(timages(t	blockinfo(tconfig(tguest(thost(timagebackend(t
imagecache(tinstancejobtracker(t	migration(tdmcrypt(tlvm(t	rbd_utils(tvif(tremotefs(tnetutils(twatchdog_actions(tcinder(t
encryptorss%s.%ss/usr/share/OVMF/OVMF_CODE.fdtx86_64s/usr/share/AAVMF/AAVMF_CODE.fdtaarch64idsAUTO: sconsole=tty0 console=ttyS0tGuestNumaConfigtcpusettcputunet
numaconfigtnumatunes=iscsi=nova.virt.libvirt.volume.iscsi.LibvirtISCSIVolumeDrivers:iser=nova.virt.libvirt.volume.iser.LibvirtISERVolumeDrivers9local=nova.virt.libvirt.volume.volume.LibvirtVolumeDrivers<fake=nova.virt.libvirt.volume.volume.LibvirtFakeVolumeDrivers7rbd=nova.virt.libvirt.volume.net.LibvirtNetVolumeDrivers<sheepdog=nova.virt.libvirt.volume.net.LibvirtNetVolumeDrivers7nfs=nova.virt.libvirt.volume.nfs.LibvirtNFSVolumeDrivers=smbfs=nova.virt.libvirt.volume.smbfs.LibvirtSMBFSVolumeDrivers7aoe=nova.virt.libvirt.volume.aoe.LibvirtAOEVolumeDriversIglusterfs=nova.virt.libvirt.volume.glusterfs.LibvirtGlusterfsVolumeDriversSfibre_channel=nova.virt.libvirt.volume.fibrechannel.LibvirtFibreChannelVolumeDriversCscality=nova.virt.libvirt.volume.scality.LibvirtScalityVolumeDrivers:gpfs=nova.virt.libvirt.volume.gpfs.LibvirtGPFSVolumeDriversCquobyte=nova.virt.libvirt.volume.quobyte.LibvirtQuobyteVolumeDrivers:hgst=nova.virt.libvirt.volume.hgst.LibvirtHGSTVolumeDriversCscaleio=nova.virt.libvirt.volume.scaleio.LibvirtScaleIOVolumeDrivers=disco=nova.virt.libvirt.volume.disco.LibvirtDISCOVolumeDriversIvzstorage=nova.virt.libvirt.volume.vzstorage.LibvirtVZStorageVolumeDrivercCs.d„}d„}|tj_|tj_dS(sÃeventlet.tpool.Proxy doesn't work with old-style class in __str__()
    or __repr__() calls. See bug #962840 for details.
    We perform a monkey patch to replace those two instance methods.
    cSs
t|jƒS(N(tstrt_obj(tself((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt
str_method²scSs
t|jƒS(N(treprRH(RI((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytrepr_methodµsN(RtProxyt__str__t__repr__(RJRL((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytpatch_tpool_proxy­s		iiiiiiiiii	ii
iii
tqcow2itVIR_PERF_PARAM_tcmtt	mbm_localtmbmlt	mbm_totaltmbmtt
LibvirtDriverc	BsÕ
eZied6ed6ed6ed6ed6Zed„Zd„Zed„ƒZd„Z	d	„Z
d
„Zd„Zd„Z
d
„Zd„Zd„Zd„Zd„Zd„Zd„ZeeƒZed„ƒZed„ƒZed„ƒZd„Zd„Zd„Zd„Zd„Zd„Zd„Z dd„Z!dedd „Z#d!„Z$deded"„Z%d#„Z&dd$„Z'ed%„ƒZ(d&„Z)d'„Z*d(„Z+d)„Z,d*„Z-d+„Z.d,„Z/d-„Z0d.„Z1d/„Z2d0„Z3dddd1„Z4d2„Z5d3„Z6dd4„Z7dd5„Z8d6„Z9d7„Z:d8„Z;d9„Z<d:„Z=d;„Z>d<„Z?d=„Z@d>„ZAd?„ZBd@„ZCdA„ZDdB„ZEdC„ZFdD„ZGdE„ZHdF„ZIedG„ƒZJddH„ZKdI„ZLdddJ„ZMdK„ZNddL„ZOdM„ZPdN„ZQdO„ZRdPdPdQ„ZSddR„ZTdS„ZUdT„ZVddU„ZWddV„ZXdW„ZYdX„ZZdY„Z[dddZ„Z\d[„Z]d\„Z^d]„Z_d^„Z`d_„Zad`„Zbda„Zcedb„ƒZdeedddc„ƒZeeddd„ƒZfede„ƒZgdf„Zhedgdh„ƒZiedi„ƒZjedj„ƒZkedk„ƒZldl„Zmdgdddddeddm„Zndn„Zoddddgdo„Zpdp„Zqdq„Zrdr„Zseds„ƒZtddt„Zudu„Zvewdv„Zxdw„Zydx„Zzddy„Z{ddz„Z|d{„Z}d|„Z~d}„Zd~„Z€d„Zd€„Z‚d„Zƒd‚„Z„dƒ„Z…ed„„ƒZ†d…„Z‡d†„Zˆd‡„Z‰dˆ„ZŠd‰„Z‹dddŠ„ZŒd‹„ZdŒ„ZŽd„ZdŽ„Zd„Z‘d„Z’d‘„Z“d’„Z”d“„Z•d”„Z–d•„Z—d–„Z˜d—„Z™d˜„Zšd™„Z›dš„Zœd›„Zdœ„Zžd„ZŸdž„Z dŸ„Z¡d „Z¢d¡„Z£dddd¢„Z¤d£„Z¥d¤„Z¦ddd¥„Z§d¦„Z¨d§„Z©d¨„Zªe«j¬d©„ƒZ­ddeeddª„Z®d«„Z¯d¬„Z°d­„Z±deeedd®„Z²d¯„Z³ed°„ƒZ´d±„Zµd²„Z¶d³„Z·d´„Z¸dµ„Z¹d¶„Zºd·„Z»d¸„Z¼d¹„Z½dº„Z¾d»„Z¿d¼„ZÀd½„ZÁd¾„ZÂd¿„ZÃdÀ„ZÄdÁ„ZÅeed„ZÆdÄZÇddĄZÈddńZÉddƄZÊdDŽZËdȄZÌdɄZÍdʄZÎd˄ZÏd̄ZÐd̈́ZÑedd΄ZÒdτZÓdЄZÔdфZÕd҄ZÖedӄƒZ×dԄZØdՄZÙdքZÚdׄZÛd؄ZÜdلZÝdڄZÞdۄZßdd܄Zàdd݄ZáeddބZâd߄Zãddà„Zäddá„Zåddâ„Zædã„Zçeddä„Zèddå„Zéddæ„Zêdç„Zëdè„Zìedé„Zídê„Zîdë„Zïdì„Zðedí„Zñdî„ZòddPdPdï„Zódð„Zôedñ„ƒZõedò„ƒZöedó„ƒZ÷dô„Zødedõ„Zùdö„Zúded÷„Zûdø„Züedù„ƒZýdú„Zþdû„Zÿedü„ƒZdý„Zdþ„Zdÿ„Zd„Zed„ƒZd„Zd„Zd„Zd„Z	RS(thas_imagecachetsupports_recreatetsupports_migrate_to_same_hosttsupports_attach_interfacetsupports_device_taggingcCsett|ƒj|ƒtdkr=tjdƒatt_ntj	|j
ƒ|d|jd|jƒ|_
d|_d|_d|_d|_g|_tjtd|j
ƒ|_tjƒ|_tj|jƒ|ƒ|_d|_tj ƒ|_!t"j#t$j%ƒ|_&i|_'ddddd	d
g|_(t$jj)dk|_*xrt$jj'D]d}|j+d
ƒ\}}}||j(kr¦t,j-t.dƒi|d6|d6ƒqOn||j'|<qOWt/j0ƒ|_1t2j0ƒ|_3id„d6|j4d6|j5d6|j6d6}|j7t$jj8ƒ|_9t:j;ƒ|_<t=j>ƒ|_?d|_@|_Ai|_BtCjDƒ|_EdS(Ntlibvirttlifecycle_event_handlertconn_event_handlerR2tdefaulttnonetwritethrought	writebackt
directsynctunsafetkvmtqemut=sGInvalid cachemode %(cache_mode)s specified for disk type %(disk_type)s.t
cache_modet	disk_typecSsdS(N(tNone(((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt<lambda>sR-tostautoi(skvmsqemu(FtsuperRXt__init__R^RlRt
import_moduletlibvirt_migrateR2tHostt_urit
emit_eventt_handle_conn_eventt_hostt
_initiatort	_fc_wwnnst	_fc_wwpnst_capst_supported_perf_eventsR,tload_drivertDEFAULT_FIREWALL_DRIVERtfirewall_drivertlibvirt_viftLibvirtGenericVIFDrivert
vif_driverR+tdriver_dict_from_configt_get_volume_driverstvolume_driverst_disk_cachemodeR4tImageCacheManagertimage_cache_managerR3tBackendtCONFtuse_cow_imagest
image_backendtdisk_cachemodestvalid_cachemodest	virt_typet_conn_supports_start_pausedt	partitiontLOGtwarningRR>tAPIt_volume_apiR t
_image_apit!_get_host_sysinfo_serial_hardwaret_get_host_sysinfo_serial_ost_get_host_sysinfo_serial_autotgettsysinfo_serialt_sysinfo_serial_funcR5tInstanceJobTrackertjob_trackerR;tRemoteFilesystemt	_remotefst_live_migration_flagst_block_migration_flagstactive_migrationsR-tnuma_get_reserved_huge_pagest_reserved_hugepages(RItvirtapit	read_onlytmode_strRktsepRjtsysinfo_serial_funcs((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRqKsf									



	cCstS(N(tlibvirt_volume_drivers(RI((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR…•scCs@|jdkr9d|_|jtjƒs9d|_q9n|jS(NRbRc(R‡Rlt_supports_direct_ioR‹tinstances_path(RI((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytdisk_cachemode˜s
	cCsMy|j}|j}Wntk
r*dSX|jj||ƒ}||_dS(s0Set cache mode on LibvirtConfigGuestDisk object.N(tsource_typetdriver_cachetAttributeErrorRŽR›(RItconfR°R±Rj((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_set_cache_mode§s	

	cCsy|jjƒ}|jjj}tjjdksH|tjtj	fkrut
jtdƒitjjd6|d6ƒndS(s0Warn about untested driver configurations.

        This will log a warning message about untested driver or host arch
        configurations to indicate to administrators that the quality is
        unknown. Currently, only qemu or kvm on intel 32- or 64-bit systems
        is tested upstream.
        RhRgsÏThe libvirt driver is not tested on %(type)s/%(arch)s by the OpenStack project and thus its quality can not be ensured. For more information, see: http://docs.openstack.org/developer/nova/support-matrix.htmlRRN(sqemuskvm(
Rxtget_capabilitiesR2tcpuRR‹R^RtI686tX86_64R“R”R(RItcapsthostarch((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_do_quality_warnings³scCs8tjtdƒi|d6|d6ƒ|j||ƒdS(Ns2Connection event '%(enabled)d' reason '%(reason)s'tenabledtreason(R“tinfoRt_set_host_enabled(RIR¼R½((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRwÆscCs&djg|D]}t|ƒ^q
ƒS(Nt.(tjoinRG(RIR&tx((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_version_to_stringËsc
Cs•|jjƒ|jƒ|jƒ|jƒ|_tjjdkrqtjj	oWtjj
rqtjt
dƒƒntjjdkrtjƒn|jjtƒsÇtjtdƒ|jtƒƒ‚ntjjdkr|jjdtƒrtjtdƒ|jtƒƒ‚ntjjdkr^|jjtƒr^tjtd	ƒ|jtƒƒ‚n|jjtƒs™tjt
d
ƒi|jtƒd6ƒntjjdkrê|jjdtƒrêtjt
dƒi|jtƒd6ƒntjƒ}tjjdkr‘|tkr‘|jjtj|ƒtj|ƒƒr‘tjtd
ƒi|d6|jtj|ƒƒd6|jtj|ƒƒd6ƒ‚ndS(NtlxcsÖRunning libvirt-lxc without user namespaces is dangerous. Containers spawned by Nova will be run as the host's root user. It is highly suggested that user namespaces be used in a public or multi-tenant environment.Rgs,Nova requires libvirt version %s or greater.Rhthv_vers)Nova requires QEMU version %s or greater.t	parallelssARunning Nova with parallels virt_type requires libvirt version %ss£Running Nova with a libvirt version less than %(version)s is deprecated. The required minimum version of libvirt will be raised to %(version)s in the next release.R&sRunning Nova with a QEMU version less than %(version)s is deprecated. The required minimum version of QEMU will be raised to %(version)s in the next release.sƒRunning Nova with qemu/kvm virt_type on %(arch)s requires libvirt version %(libvirt_ver)s and qemu version %(qemu_ver)s, or greaterRtlibvirt_vertqemu_ver(sqemuskvm(sqemuskvm(skvmsqemu(Rxt
initializeR»t_parse_migration_flagst_get_supported_perf_eventsR}R‹R^Rtuid_mapstgid_mapsR“R”RR*t	force_tcgthas_min_versiontMIN_LIBVIRT_VERSIONRt
NovaExceptionRRÃtMIN_QEMU_VERSIONtMIN_LIBVIRT_PARALLELS_VERSIONtNEXT_MIN_LIBVIRT_VERSIONtNEXT_MIN_QEMU_VERSIONRt	from_hosttMIN_LIBVIRT_OTHER_ARCHR›tMIN_QEMU_OTHER_ARCH(RIR2tkvm_arch((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt	init_hostÎsZ


	
							
cCscd}|tjO}tjjdkr5|tjO}n|tjO}|}}|tjO}||fS(Nitxen(R^tVIR_MIGRATE_LIVER‹RtVIR_MIGRATE_PEER2PEERtVIR_MIGRATE_UNDEFINE_SOURCEtVIR_MIGRATE_NON_SHARED_INC(RItmigration_flagstlive_migration_flagstblock_migration_flags((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_prepare_migration_flagss



cCs2tjjdkstjjr.|tjO}n|S(N(R‹R^tlive_migration_tunnelledRltVIR_MIGRATE_TUNNELLED(RIRà((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt _handle_live_migration_tunnelled/scCs#|jjdtdtƒrtStS(Ntlv_verRÅ(RxRÏtMIN_LIBVIRT_POSTCOPY_VERSIONtMIN_QEMU_POSTCOPY_VERSIONtTruetFalse(RI((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_is_post_copy_available5s	cCsBtjjr>|jƒr(|tjO}q>tjtdƒƒn|S(NsLThe live_migration_permit_post_copy is set to True, but it is not supported.(R‹R^tlive_migration_permit_post_copyRìtVIR_MIGRATE_POSTCOPYR“R¾R(RIRà((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt _handle_live_migration_post_copy;s
cCs•|jjdtdtƒro|jƒrP|tj@dkrPtjt	dƒƒq‘t
jjr‘|tjO}q‘n"t
jjr‘tjt	dƒƒn|S(NRçRÅisThe live_migration_permit_post_copy is set to True and post copy live migration is available so auto-converge will not be in use.sPThe live_migration_permit_auto_converge is set to True, but it is not supported.(
RxRÏt!MIN_LIBVIRT_AUTO_CONVERGE_VERSIONtMIN_QEMU_AUTO_CONVERGERìR^RîR“R¾RR‹t#live_migration_permit_auto_convergetVIR_MIGRATE_AUTO_CONVERGE(RIRà((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt$_handle_live_migration_auto_convergeDs	cCs‚|jƒ\}}|j|ƒ}|j|ƒ}|j|ƒ}|j|ƒ}|j|ƒ}|j|ƒ}||_||_dS(N(RãRæRïRôR¢R£(RIRáRâ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRÊSs							cCs
|jjƒS(N(Rxtget_connection(RI((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_connectionqscCs²tjjdkr'tjjp!d}n‡tjjdkrNtjjpHd}n`tjjdkrutjjpod}n9tjjdkrœtjjp–d}ntjjp«d	}|S(
Ntumls
uml:///systemRÛsxen:///RÄslxc:///RÆsparallels:///systemsqemu:///system(R‹R^Rtconnection_uri(turi((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRuvscCskidd6dd6dd6}tjj}tjjp?|j|ƒ}|dkrctjd|ƒ‚n||S(Nsqemu+tcp://%s/systemRgRhsxenmigr://%s/systemRÛR(R‹R^Rtlive_migration_uriR›RlRtLiveMigrationURINotAvailable(tdestturisRRù((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_live_migration_uri„s
cCs;d}tjj}|dkr+d|}n|o:t|ƒS(NRhRgstcp://%s(sqemuskvm(RlR‹R^RRG(RüRùR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_migrate_uri“s

cCs4y|jj|ƒtSWntjk
r/tSXdS(s2Efficient override of base instance_exists method.N(Rxt	get_guestRêRRÑRë(RItinstance((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytinstance_exists¥s
cCs:g}x-|jjdtƒD]}|j|jƒqW|S(Ntonly_running(Rxtlist_guestsRëtappendtname(RItnamesR1((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytlist_instances­scCs:g}x-|jjdtƒD]}|j|jƒqW|S(NR(RxRRëRtuuid(RItuuidsR1((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytlist_instance_uuids´scCs(x!|D]}|jj||ƒqWdS(sPlug VIFs into networks.N(Rƒtplug(RIRtnetwork_infoR:((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt	plug_vifs»s
cCsOxH|D]@}y|jj||ƒWqtjk
rF|sG‚qGqXqWdS(sUnplug VIFs from networks.N(RƒtunplugRRÑ(RIRR
t
ignore_errorsR:((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_unplug_vifsÀs
cCs|j||tƒdS(N(RRë(RIRR
((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytunplug_vifsÉscCsntj|ƒ}tjj|dƒ}|jjdƒ}tjdi|d6|d6d|ƒt	j
||ƒdS(Ntrootfstrootfs_device_namesQAttempting to teardown container at path %(dir)s with root device: %(rootfs_dev)stdirt
rootfs_devR(t
libvirt_utilstget_instance_pathRntpathRÁtsystem_metadataR›R“tdebugtdisk_apitteardown_container(RIRt	inst_patht
container_dirR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_teardown_containerÌs	ic
s=yaˆjjˆƒ}tjjr`ˆj|ƒ}x-|D]"\}}tjd|d|ƒq7WnWntjk
r}d}nXd}|dk	ršy|j
}|jƒWqštj
k
r–}t}	|jƒ}
|
tjkræt}	ng|
tjkr"|jˆjƒ}|tjkrMt}	qMn+|
tjkrg|jƒ}tjjdkrM|dkrMt}	qMnæ|
tjkr°tjtdƒdˆƒtdƒ}
tjd	|
ƒ‚n|
tjkrM|j ƒt!j"krMtjtd
ƒi|
d6|d6|d
6dˆƒt#j$ƒ4}|dkrAt|_%ˆj&ˆ|dƒdSWdQXqMn|	s—t#j$ƒ/tj't(dƒi|
d6|d6dˆƒWdQXq—qšXn‡‡‡fd†}itd6‰t)j*||ƒ}|j+ddƒj,ƒˆdrtj-t.dƒdˆƒˆj&ˆƒn"tjjdkr9ˆj/ˆƒndS(NR2tportiÿÿÿÿRÄs-internal error: Some processes refused to dies+Cannot destroy instance, operation time outRsoperation time outR½sYError from libvirt during destroy. Code=%(errcode)s Error=%(e)s; attempt %(attempt)d of 3terrcodetetattemptiis?Error from libvirt during destroy. Code=%(errcode)s Error=%(e)scsÚy%ˆjˆƒ}|j}|j}Wn9tjk
r`tjtdƒdˆƒtj	ƒ‚nX|t
jkr˜tjtdƒdˆƒtj	ƒ‚n||krÖtjtdƒdˆƒtˆd<tj	ƒ‚ndS(s+Called at an interval until the VM is gone.s*During wait destroy, instance disappeared.Rs Instance destroyed successfully.sInstance may be started again.t
is_runningN(
tget_infotstatetidRtInstanceNotFoundR“R¾RRtLoopingCallDoneRtSHUTDOWNRê(texpected_domidtdom_infoR't	new_domid(RtkwargsRI(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_wait_for_destroy.s"	

R%tintervalgà?s Going to destroy instance again.(0RxRR‹tserial_consoleR¼t_get_serial_ports_from_guesttrelease_portRR)RlR(tpoweroffR^tlibvirtErrorRëtget_error_codetVIR_ERR_NO_DOMAINRêtVIR_ERR_OPERATION_INVALIDtget_power_stateRR+tVIR_ERR_INTERNAL_ERRORtget_error_messageRtVIR_ERR_OPERATION_TIMEOUTR“R”RRtInstancePowerOffFailuretVIR_ERR_SYSTEM_ERRORtget_int1terrnotEBUSYR	tsave_and_reraise_exceptiontreraiset_destroyterrorRRtFixedIntervalLoopingCalltstarttwaitR¾RR (RIRR$R1tserialsthostnameR!t	old_domidR#tis_okayR"R'terrmsgR½tctxtR0ttimer((RR/RIsM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyREÖsv!
		
	

		
cCs-|j|ƒ|j||||||ƒdS(N(REtcleanup(RIRRR
tblock_device_infot
destroy_disksR$((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytdestroyZs
c	Cs¡y†|jj|ƒ}y|jƒWn_tjk
r„}tjƒ;|jƒ}tj	t
dƒi|d6|d6d|ƒWdQXnXWntjk
rœnXdS(Ns@Error from libvirt during undefine. Code=%(errcode)s Error=%(e)sR"R#R(
RxRtdelete_configurationR^R6R	RCR7R“RFRRR)(RIRR1R#R"((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_undefine_domain`s
)cCsx|r|j||tƒnt}x|r<y|j||ƒWnñtjk
r}	y|j|ƒj}
Wntjk
r‰t	j
}
nX|
t	j
krÂtjt
dƒd|ƒ|j|ƒq9t}|	jƒ}tjtdƒi|d6|	d6d|ƒd}tjd|ƒ‚q%tk
r2t}‚q%Xt}q%Wtj|ƒ}
x8|
D]0}|d}|d	}|dk	r|jd
ƒd}nd|krÿd
|dkrÿ|dd
}tj||j||ƒ}|rÿ|j||ƒ}|j|qÿny|j||ƒWqStk
r‚}tjƒL}|ryt|_ tjt
dƒi|j!d
ƒd6|d6d|ƒnWdQXqSXqSW|r×t"jj#dkr²|j$||ƒnt"jj#dkr×|j%|ƒq×nt}|rûd|krû|j&}n|s|rgt'|j(j!ddƒƒ}|j)|ƒ}t*|dƒ|j(d<|rZt|_+n|j,ƒn|j-|ƒdS(Ns0Instance may be still running, destroy it again.Rs@Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)sR"R#sError unfiltering instance.R½tconnection_infotmount_devicet/itdatat	volume_ids=Ignoring Volume Error on vol %(vol_id)s during delete %(exc)stvol_idtexcR8trbdtis_shared_block_storagetclean_attemptst0i(.RRêtunfilter_instanceR^R6R&R'RR)RR+R“R”RRERëR7RtInstanceTerminationFailuret	ExceptionR+tblock_device_info_get_mappingRlt
rpartitionR?tget_encryption_metadataR–t_get_volume_encryptort
detach_volumet_disconnect_volumeR	RCRDR›R‹timages_typet_cleanup_lvmt_cleanup_rbdR_tintRtdelete_instance_filesRGtcleanedtsaveRV(RIRRR
RRRSR$tdestroy_vifstretryR#R'R"R½tblock_device_mappingtvolRWtdisk_devR[t
encryptiont	encryptorR]ROR_tattemptstsuccess((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRQnsŠ	


	


				
cCsftj|j||ƒƒ}ttjg|D]}|d^q+ƒ}x|D]}tj|ƒqKWdS(s0Detaches encrypted volumes attached to instance.RN(Rtloadstget_instance_disk_infotfilterR7tis_encryptedt
delete_volume(RIRRRtdiskstdisktencrypted_volumesR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_detach_encrypted_volumesÒs	 
c
cs°|jƒ}tj|ƒ}|r+d|nd}d|}d|}|j|ƒ}t|ƒdkrx|j|ƒ}nx1|D])}	|	jdƒt|	jdƒƒfVqWdS(	s†Returns an iterator over serial port(s) configured on guest.

        :param mode: Should be a value in (None, bind, connect)
        s[@mode='%s']ts$./devices/serial[@type='tcp']/sources%./devices/console[@type='tcp']/sourceiR2tserviceN(tget_xml_descRt
fromstringtfindalltlenR›Rn(
RIR1tmodetxmlttreet
xpath_modet
serial_tcptconsole_tcpttcp_devicestsource((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR3Ûs


cCs.tjdtjjdtjjdtjjƒS(Ntpoolt	ceph_conftrbd_user(R9t	RBDDriverR‹R^timages_rbd_pooltimages_rbd_ceph_confR”(((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_rbd_driverïs	csJˆjtjkr$‡fd†}n‡fd†}tjƒj|ƒdS(Ncs|jˆjƒo|jdƒS(Ns
disk.local(t
startswithR	tendswith(R(R(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRmüscs|jˆjƒS(N(R™R	(R(R(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRmÿs(t
task_stateRtRESIZE_REVERTINGRXR˜tcleanup_volumes(RIRt	filter_fn((RsM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRmöscCsQ|jdƒdk	r(|j||ƒn|j|ƒ}|rMtj|ƒndS(s/Delete all LVM disks for given instance object.tephemeral_key_uuidN(R›RlRƒt
_lvm_disksR8tremove_volumes(RIRRRR€((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRls
cstjjr™tjjdtjjƒ‰tjjˆƒs=gSd|j‰‡fd†}‡fd†}tj	ˆƒ}t
||ƒ}t||ƒ}|SgS(s0Returns all LVM disks for given instance object.s/devs%s_cs
|jˆƒS(N(R™(R(tpattern(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytbelongs_to_instancescstjjˆ|ƒS(N(RnRRÁ(R(tvg(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytfullpaths(R‹R^timages_volume_groupRnRRÁtexistsR	R8tlist_volumesR}tmap(RIRR£R¥tlogical_volumest
disk_namesR€((R¢R¤sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR s
cCs7tjƒ}tj|tjtjjdtdtj	ƒS(Ntenforce_multipathR2(
Rtget_root_helperRtget_connector_propertiesR‹tmy_block_storage_ipR^tvolume_use_multipathRêR2(RIRtroot_helper((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytget_volume_connector s	cCsÇtj|ƒd}tjj|ƒrGtjdd|dtddƒn|jj	|dƒ}|jƒr|j
tjdtƒn|jt
jkrÃ|j|ƒ|j||ƒ|j||ƒndS(	Nt_resizetrms-rftdelay_on_retryRyiRR(RRRnRR§RtexecuteRêRR tremove_snaptRESIZE_SNAPSHOT_NAMER2R‹RVRRb(RIRR
ttargett	root_disk((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_cleanup_resize(s


cCs>|jdƒ}||jkr3tjd|ƒ‚n|j|S(Ntdriver_volume_typetdriver_type(R›R†RtVolumeDriverNotFound(RIRWR½((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_volume_driverCscCs#|j|ƒ}|j||ƒdS(N(R¿tconnect_volume(RIRWt	disk_infot
vol_driver((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_connect_volumeIscCs#|j|ƒ}|j||ƒdS(N(R¿tdisconnect_volume(RIRWRvRÂ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRjMscCs|j|ƒ}|j||ƒS(N(R¿t
get_config(RIRWRÁRÂ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_volume_configQscCstj||}|S(N(R?tget_volume_encryptor(RIRWRwRx((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRhUs		cCsO|jdkrK|jdkrKtjdi|jd6|jd6d|ƒndS(sõPerform some checks for volumes configured for discard support.

        If discard is configured for the volume, and the guest is using a
        configuration known to not work, we will log a message explaining
        the reason why.
        tunmaptvirtiosÀAttempting to attach volume %(id)s with discard support enabled to an instance using an unsupported configuration. target_bus = %(bus)s. Trim commands will not be issued to the storage device.tbusR(RN(tdriver_discardt
target_busR“RR(RIR³R((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt _check_discard_for_attach_volumeZs
	

c	CsF|jj|ƒ}|jdƒd}	i|	d6|d6|d6}
i}d|kr_|d}nd|kswd|krÆtjjd	krÆtjjd
krÆtdƒtjj}tj|ƒ‚qÆnt	j
|tjj|j|
ƒ}
|j||
ƒ|j
||
ƒ}|j|ƒ|j||ƒyr|j|jƒ}|tjtjfk}|r~|j||ƒ}|j||n|j|dtd
|ƒWn§tk
rA}tjtdƒ|d|ƒt|tjƒr|jƒ}|tjkr|j||	ƒtj d|	ƒ‚qnt!j"ƒ|j||	ƒWdQXnXdS(NRYitdevice_nametdisk_bustdevice_typeRZtlogical_block_sizetphysical_block_sizeRgRhsbVolume sets block size, but the current libvirt hypervisor '%s' does not support custom block sizet
persistenttlives)Failed to attach volume at mountpoint: %sRtdevice(#RxRRfR‹R^RRRtInvalidHypervisorTypeR/tget_info_from_bdmt
image_metaRÃRÆR´RÍR:RtRUNNINGtPAUSEDRht
attach_volumet
attach_deviceRêRdR“Rt
isinstanceR6R7tVIR_ERR_OPERATION_FAILEDRjtDeviceIsBusyR	RC(RIRRWRt
mountpointRÏRÐRwR1RvtbdmRZtmsgRÁR³R'RÔRxtexR"((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRÛksN

	

		

cCs|j|ƒ}|jdtdtƒ}y|jƒWntk
rHnXz°|jƒre|jƒn|j|dtdtƒx|jƒrt	j
dƒqW|jdtƒ|røx#|jdtƒrÙt	j
dƒq·W|j|tj
tjƒnWd|jj|ƒXdS(	s+Swap existing disk with a new block device.t
dump_inactivetdump_sensitivetcopyt	reuse_extgà?tpivottwait_for_job_cleanN(tget_block_deviceR†Rêt	abort_jobRdthas_persistent_configurationRUtrebasetwait_for_jobttimetsleeptresizeRtGitKiRxtwrite_instance_config(RIR1t	disk_pathtnew_patht	resize_totdevR‹((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_swap_volume¢s$

"c
CsF|jj|ƒ}|jdƒd}|j|ƒsItjd|ƒ‚ni|d6tjtj	j
|ƒd6dd6}|j||ƒ|j||ƒ}	|	j
sÆ|j||ƒttdƒƒ‚n|jd	ƒ}
tjjtjƒ|
|jƒ}tj|ƒ}||d
<|jƒ|j|||	j
|ƒ|j||ƒdS(NRYitlocationRøRÊRRsSwap only supports host devicesRRW(RxRRftget_diskRtDiskNotFoundR/tget_disk_bus_for_disk_devR‹R^RRÃRÆtsource_pathRjtNotImplementedErrorRR›R"tBlockDeviceMappingtget_by_volume_and_instancetnova_contexttget_admin_contextR	tdriver_block_devicetconvert_volumeRqRù(
RItold_connection_infotnew_connection_infoRRàR÷R1RvRÁR³R[Rát
driver_bdm((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytswap_volumeÊs,
		

cCsˆy"|jj|ƒ}|jƒ}Wn_tjk
rƒtjtjj	||j
|ƒ}|jtj
ƒ||||j
d|ƒ}nX|S(NRR(RxRR†RR)R/t
get_disk_infoR‹R^RRØt_get_guest_xmlRR(RIRR
RRR1R‹RÁ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_existing_domain_xmlés			
c
Cs[|jdƒd}y|jj|ƒ}|j|jƒ}|tjtjfk}|j|j|dt	d|ƒ}	|r›|j
||ƒ}
|
j|n|	ƒWn¡tj
k
rÒtjtdƒd|ƒnutjk
r÷tjd|ƒ‚nPtjk
rF}|jƒ}|tjkr@tjtdƒd|ƒqG‚nX|j||ƒdS(NRYiRÓRÔs+During detach_volume, instance disappeared.RRú(RfRxRR:RRÙRÚtdetach_device_with_retryRûRêRhRiRR)R“R”RtDeviceNotFoundRüR^R6R7R8Rj(
RIRWRRàRwRvR1R'RÔtwait_for_detachRxRãt
error_code((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRiùs4			

cCs|jj|ƒ}|jj||ƒ|jj||gƒ|jj||||jtj	j
|jƒ}yG|j|jƒ}|tj
tjfk}|j|dtd|ƒWn[t	jk
rtjtdƒd|dtƒ|jj||ƒtjd|jƒ‚nXdS(NRÓRÔs!attaching network adapter failed.Rtexc_infot
instance_uuid(RxRRƒRR€tsetup_basic_filteringRÅtflavorR‹R^RR:RRÙRÚRÜRêR6R“RFRRRtInterfaceAttachFailedR	(RIRRØR:R1tcfgR'RÔ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytattach_interface&s"	
	cCsn|jj|ƒ}|jj|||j|jtjj|jƒ}yZ|jj	||ƒ|j
|jƒ}|tjtj
fk}|j|dtd|ƒWnËtjk
ri}|jƒ}|tjkrètjtdƒd|ƒqj|jdƒ}	|j|	ƒ}
|
rCtjtdƒd|dtƒtjd|jƒ‚ntjtd	ƒi|	d
6d|ƒnXdS(NRÓRÔs.During detach_interface, instance disappeared.Rtaddresss!detaching network adapter failed.RRsWDetaching interface %(mac)s failed  because the device is no longer found on the guest.tmac(RxRRƒRÅRØRR‹R^RRR:RRÙRÚt
detach_deviceRêR6R7R8R“R”RR›tget_interface_by_macRFRRtInterfaceDetachFailedR	(RIRR:R1RR'RÔRãRRt	interface((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytdetach_interface:s0

	cCs¾itd6dd6|d6i|jd6dd6dd	6|jd
6|jd6d6}|jrk|j|dd
<n|jdkr‡d|d<n
||d<|jdƒr°|j|d<n
d|d<|S(Nt	is_publictactivetstatusRt	kernel_idtsnapshottimage_locationt	availabletimage_statetowner_idt
ramdisk_idt
propertiestos_typetamitdisk_formattcontainer_formattbare(RëR"t
project_idR(R*R,tobj_attr_is_setR-(RIRØRtimg_fmttsnp_nametmetadata((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_create_snapshot_metadatacs$


	


cCsRy|jj|ƒ}|j}Wn)tjk
rJtjd|jƒ‚nX|jj||ƒ}t	j
|ƒ\}}	t	j|ƒ}
|
dkr™|	}
nt
jjp¨|
}|dksÃ|dkrÌd}n|j|j|||dƒ}tjƒj}
|j|jƒ}|jjdtjƒr§|
dkr§t
jjr§t
jjr§t}y|j|ƒjƒWq­tjk
r£}|j ƒ}|tj!kr¤t"}q¤q­Xnt"}|t#j$krÅt"}n|j%||||ƒ|j&j'||d|
ƒ}|rt(j)t*dƒd	|ƒnt(j)t*d
ƒd	|ƒ|dt+j,ƒyt|dt+j-dt+j,ƒ|j.||
|||j/ƒ|d
<|j0|||||ƒ|jj1|||dt"ƒWn}t2tj3tj4fk
r·}t5|ƒt2krt(j6t7dƒi|d6ƒn|j8d
dƒ}|r6it9|ƒd6}n|j:|dtdtƒ|dt+j,dt+j-ƒ|
dkr™|r™t"}|j%||||ƒnt
jj;}t<j=|ƒt>j?d|ƒî}zgt@jAjB||
ƒ}|rt@jC|dƒ|jD||||||	||jƒn|jE||ƒWd|j0|||||ƒt(j)t*dƒd	|ƒX|dt+j-dt+j,ƒt	jF|ƒ }|jj1||||ƒWdQXWdQXn~tGk
r4tHjIƒ_t(jtJdƒƒ|j8d
dƒ}|rit9|ƒd6}n|j:|dtdtƒWdQXnXt(j)t*dƒd	|ƒdS(seCreate snapshot from a running VM instance.

        This command only works with qemu 0.14+
        tinstance_idR8R^trawRRt
image_typesBeginning live snapshot processRsBeginning cold snapshot processR›texpected_stateRútpurge_propssFPerforming standard snapshot because direct snapshot failed: %(error)sRFturltalso_destroy_volumeRRiÁNs*Snapshot extracted, beginning image uploadsFailed to snapshot imagesSnapshot image upload complete(KRxRt_domainRR)tInstanceNotRunningR	R—R›Rt	find_disktget_disk_type_from_pathRlR‹R^tsnapshot_image_formatR4RØtuuid4thexR:RÏR2tHV_DRIVER_QEMUtephemeral_storage_encryptionR¼tworkaroundstdisable_libvirt_livesnapshotRêRêRëR6R7tVIR_ERR_CONFIG_UNSUPPORTEDRëRR+t_prepare_domain_for_snapshotRR#R“R¾RRtIMAGE_PENDING_UPLOADtIMAGE_UPLOADINGtdirect_snapshott	image_reft_snapshot_domaintupdateRÿtImageUnacceptablet	ForbiddenRR”RtpopRGtcleanup_direct_snapshottsnapshots_directoryR
tensure_treeRttempdirRnRRÁtchmodt_live_snapshottsnapshot_extractt	file_openRdR	RCR(RIRRtimage_idtupdate_task_stateR1tvirt_domR#Rõt
source_formatR°timage_formatR3t
snapshot_nameR't
live_snapshotRãRtsnapshot_backendR#tfailed_snaptsnapshot_directoryttmpdirtout_patht
image_file((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR#€sÒ
		


			





		



cCsQtjjdkrM|rM|tjks7|tjkrM|j||ƒqMndS(NRÄ(R‹R^RRRÙRÚtsuspend(RIRR`R'R((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRH(scCs¯d}tjjdkr«|r«|tjkrC|jd|ƒ}n*|tjkrm|jd|dtƒ}n|dk	r«|j	|t
j|ƒƒ|j|||ƒq«ndS(NRÄtdomaintpause(
RlR‹R^RRRÙt_create_domainRÚRêt_attach_pci_devicestpci_managertget_instance_pci_devst_attach_sriov_ports(RIRR`R\R'RR1((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRM/scCsktjjdks%|jjtƒr4tjƒ‚n|jj	ddƒ}t
j|ƒsgtjƒ‚ndS(NRgRhthw_qemu_guest_agentR„(skvmsqemu(
R‹R^RRxRÏtMIN_LIBVIRT_SET_ADMIN_PASSWDRtSetAdminPasswdNotSupportedR)R›Rtbool_from_stringtQemuGuestAgentNotEnabled(RIRØthw_qga((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_can_set_admin_password?scCsÏ|j|jƒ|jj|ƒ}|jjjdƒ}|s^|jdkrUd}q^d}ny|j||ƒWnVtj	k
rÊ}|j
ƒ}tdƒi|d6|d6|d6}tj
|ƒ‚nXdS(	Nt
os_admin_usertwindowst
AdministratortrootsaError from libvirt while set password for username "%(user)s": [Error Code %(error_code)s] %(ex)stuserRRã(RuRØRxRR)R›R*tset_user_passwordR^R6R7RRRÑ(RIRtnew_passR1RzRãRRâ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytset_admin_passwordHs			cCsetjjdks%|jjtƒr=tjd|jƒ‚n|j	j
dtƒsatjƒ‚ndS(NRgRhR5Ro(skvmsqemu(
R‹R^RRxRÏtMIN_LIBVIRT_FSFREEZE_VERSIONRtInstanceQuiesceNotSupportedR	R)R›RëRs(RIRRØ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_can_quiesce[s	c	Cs£|j||ƒy3|jj|ƒ}|r8|jƒn
|jƒWnYtjk
rž}|jƒ}tdƒi|j	d6|d6|d6}t
j|ƒ‚nXdS(NsXError from libvirt while quiescing %(instance_name)s: [Error Code %(error_code)s] %(ex)st
instance_nameRRã(R€RxRtfreeze_filesystemstthaw_filesystemsR^R6R7RRRRÑ(	RIRRRØtquiescedR1RãRRâ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt
_set_quiescedds
	
cCs|j|||tƒdS(sFreeze the guest filesystems to prepare for snapshot.

        The qemu-guest-agent must be setup to execute fsfreeze.
        N(R…Rê(RIRRRØ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytquiescetscCs|j|||tƒdS(s*Thaw the guest filesystems after snapshot.N(R…Rë(RIRRRØ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt	unquiesce{sc	CsÜ|j|ƒ}	|jdtdtƒ}
y|	jƒWntk
rHnXtj|d|ƒ}tj|d|dtƒ}|d}
tj	||
|ƒt}y |j
|||tƒt}WnTtjk
r}|j
jdtƒrì‚ntjtdƒi|d6d	|ƒnXz||jƒr/|jƒn|	j|
d
tdtdtƒx|	jƒrmtjd
ƒqQW|	jƒtj|
tjƒƒWd|jj|
ƒ|rÁ|j
|||tƒnXtj|
d||ƒdS(s&Snapshot an instance without downtime.RäRåtformattbasenames.deltatos_require_quiesces(Skipping quiescing instance: %(reason)s.R½RRæRçtshallowgà?NRQ(RêR†RêRëRdRt
get_disk_sizetget_disk_backing_fileRëtcreate_cow_imageR…RRÑR)R›R“R¾RRìRURíRîRïRðtchownRntgetuidRxRôtextract_snapshot(RIRRR1RõReR]R^RØRøR‹t
src_disk_sizet
src_back_patht
disk_deltaR„terr((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRWsH
		



cCsEy|jj|||ƒWn$tk
r@tjtdƒƒnXdS(s·Send a snapshot status update to Cinder.

        This method captures and logs exceptions that occur
        since callers cannot do anything useful with these exceptions.

        Operations on the Cinder side waiting for this will time out if
        a failure occurs sending the update.

        :param context: security context
        :param snapshot_id: id of snapshot being updated
        :param status: new status value

        s9Failed to send updated snapshot status to volume service.N(R–tupdate_snapshot_statusRdR“RR(RIRtsnapshot_idR!((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_volume_snapshot_update_statusÀs
cCsÔ|jƒ}tj|ƒ}tjƒ}|j|ƒg}	g}
g}x2|jD]'}|jdkrkqPn|jdkr€qPn|j
dksž|j
|kr´|j|jƒqPni|jd6|j
d6|jd6|j
d6|jd6|jd6|jd6}
|
ddk	rQ|
d}tjjtjj|ƒ|ƒ}|	j||fƒqP|
ddkrP|
j|
|fƒqPqPW|	r§|
r§tdƒ}tj|ƒ‚ntjƒ}xZ|	D]R\}}tjƒ}||_||_d|_d
|_d|_|j|ƒqºWx¦|
D]ž\}
}tjƒ}|
d|_d|_|
d|_
d
|_||_|
djdƒd}d||f|_|
d|_|
d|_|j|ƒqWx9|D]1}tjƒ}||_d|_|j|ƒqÀW|j ƒ}t!j"d|d|ƒy-|j|dt#dt#dt#dt#ƒdSWn-t$j%k
rst!jt&dƒd|ƒnXy)|j|dt#dt#dt#dt'ƒWn0t$j%k
rÏt!jt&dƒd|ƒ‚nXdS(sÜPerform volume snapshot.

           :param guest: VM that volume is attached to
           :param volume_id: volume UUID to snapshot
           :param new_file: relative path to new qcow2 file present on share

        RRøRtcurrent_filetsource_protocoltsource_nametsource_hoststsource_portstglustertnetfssFound no disk to snapshot.tfiletexternalRQtnetworkRYis%s/%stnossnap xml: %sRtno_metadatat	disk_onlyRçR†NsPUnable to create quiesced VM snapshot, attempting again with quiescing disabled.s@Unable to create VM snapshot, failing volume_snapshot operation.(RžRŸ((R†RR‡tvconfigtLibvirtConfigGuestt	parse_domtdevicest	root_namet
target_devRlRRRþRšR›RœRRnRRÁtdirnameRRRÑtLibvirtConfigGuestSnapshottLibvirtConfigGuestSnapshotDiskRR°R#tdriver_nametadd_disktsplittto_xmlR“RRêR^R6RRë(RIRRR1R[tnew_fileR‹txml_doctdevice_infot
disks_to_snaptnetwork_disks_to_snapt
disks_to_skipt
guest_diskRÁR™t
new_file_pathRâR#tcurrent_nametnew_filenamet	snap_disktold_dirRøtsnapshot_xml((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_volume_snapshot_create×s–	








						
	
		


		
cCsPtjj|||jƒ}tj|ƒ}|rL|j|||j|ƒndS(N(R"RRR	RRtrefresh_connection_infoR–(RIRRR[RáR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_volume_refresh_connection_infoEs	cstjdi|d6dˆƒyˆjjˆƒ}Wn)tjk
r^tjdˆjƒ‚nX|ddkrtjt	dƒ|dƒ‚n|j
dd
ƒ‰ˆd
krÅtjt	d	ƒƒ‚ny!ˆjˆˆ|ˆ|d
ƒWnPt
k
r8tjƒ1tjtdƒdˆƒˆjˆˆdƒWd
QXnXˆjˆˆdƒ‡‡‡‡‡fd†}tj|ƒ}|jddƒjƒd
S(sCreate snapshots of a Cinder volume via libvirt.

        :param instance: VM instance object reference
        :param volume_id: id of volume being snapshotted
        :param create_info: dict of information used to create snapshots
                     - snapshot_id : ID of snapshot
                     - type : qcow2 / <other>
                     - new_file : qcow2 file created by Cinder which
                     becomes the VM's active image after
                     the snapshot is complete
        s/volume_snapshot_create: create_info: %(c_info)stc_infoRR5RRQsUnknown type: %sR—s#snapshot_id required in create_infoR³sMError occurred during volume_snapshot_create, sending error status to Cinder.RFNtcreatingcsPˆjjˆˆƒ}|jdƒdkrLˆjˆˆˆƒtjƒ‚ndS(NR!RÄ(R–tget_snapshotR›RÂRR*(R#(RRRIR—R[(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_wait_for_snapshot|s
R1gà?(R“RRxRRR)R=R	RÑRR›RlRÀRdR	RCRR˜RRGRHRI(RIRRR[tcreate_infoR1RÆRP((RRRIR—R[sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytvolume_snapshot_createNs4	


c	Cs·|j}|dk	rKtdƒi|d6}tj|ƒtj|ƒ‚n|dkrfd}g}n$|}tj|ƒj	}d|g}|j
|jƒtj
ddd||ŒdS(	sERebase a device tied to a guest using qemu-img.

        :param guest:the Guest which owns the device being rebased
        :type guest: nova.virt.libvirt.guest.Guest
        :param device: the guest block device to rebase
        :type device: nova.virt.libvirt.guest.BlockDevice
        :param active_disk_object: the guest block device to rebase
        :type active_disk_object: nova.virt.libvirt.config.                                    LibvirtConfigGuestDisk
        :param rebase_base: the new parent in the backing chain
        :type rebase_base: None or string
        sƒSomething went wrong when deleting a volume snapshot: rebasing a %(protocol)s network disk using qemu-img has not been fully testedtprotocolR„s-Fsqemu-imgRís-bN(RšRlRR“RFRRÑR.t
qemu_img_infotfile_formatRRþRR¶(	R1RÕtactive_disk_objecttrebase_basetactive_protocolRâtbacking_filetqemu_img_extra_argt
b_file_fmt((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_rebase_with_qemu_img‡s 		
	c	sétjd|d|ƒ|ddkrLtdƒ|d}tj|ƒ‚ny|jj|ƒ}Wn)tjk
rtjd|j	ƒ‚nXd!‰d!}|jƒ‰tj
ˆƒ}	tjƒ}
|
j|	ƒd!‰x~|
jD]s}|jdkrùqÞn|jd!ksÞ|jd!krqÞn|j|krÞ|j‰|j}|j}|‰PqÞqÞWˆd!ksy|d!kr±|d!kr±tdƒ|}tjd	ˆd|ƒtj|ƒ‚ntjd
ˆd|ƒ‡‡‡fd†}
|dd!kreˆ}|d
}|d!k	r)|d!k	r)|
|ˆjƒ}nytj|d!k	}Wn*tk
rltjtdƒƒt}nXtjdi|d6|d6tjj d6t!|ƒd6d|ƒ|j"|ƒ}|j#ƒr9|j$|d|ƒ}|dkrýtjdd|ƒnxb|j%dt&ƒr5tjdd|ƒt'j(dƒqWqåtjdd|ƒ|j)||ˆ|ƒn€d!}d!}ˆ}ytj*WnXtk
rÜdj+gt,D]}t!|ƒ^qŸƒ}tdƒ|}tj-|ƒ‚nX|d!k	r|
|dˆjƒ}|
|d
ˆjƒ}n|p%|d}|p5|d
}tjdi|d6|d6|d6d|ƒ|j"|ƒ}|j.||dt&ƒ}|dkr¬tjdd|ƒnx6|j%dt&ƒrätjd d|ƒt'j(dƒq¯Wd!S("s‹Note:
            if file being merged into == active image:
                do a blockRebase (pull) operation
            else:
                do a blockCommit operation
            Files must be adjacent in snap chain.

        :param instance: instance object reference
        :param volume_id: volume UUID
        :param snapshot_id: snapshot UUID (unused currently)
        :param delete_info: {
            'type':              'qcow2',
            'file_to_merge':     'a.img',
            'merge_target_file': 'b.img' or None (if merging file_to_merge into
                                                  active image)
          }
        s'volume_snapshot_delete: delete_info: %sRRRQsUnknown delete_info type %sR5Rs0Disk with id: %s not found attached to instance.sDomain XML: %ssfound device at %sc
sK|dkr*tdƒ}tj|ƒ‚ntjdˆƒtjdˆƒ|}d}|}d}ˆjjdƒd}||krŒˆdSxd|dk	rò|jjdƒd}||krætjd|jƒ|j}|j}Pn|j	}qW|dkr!tdƒ|}tj|ƒ‚ntjd	|j|ƒd
ˆ|f}	|	S(Nsfilename cannot be NonesXML: %ssactive disk object: %sRYis[0]sfound match: %ssno match found for %ssindex of match (%s) is %ss%s[%s](
RlRRRÑR“RR›R±tindext
backing_store(
tfilenameRÔRâtfilename_to_mergetmatched_nametbRÓtcurrent_filenametsource_filenametmy_snap_dev(RÌtmy_devR‹(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt
_get_snap_dev÷s4		
tmerge_target_filet
file_to_mergesMRelative blockrebase support was not detected. Continuing with old behaviour.sBdisk: %(disk)s, base: %(base)s, bw: %(bw)s, relative: %(relative)sRtbwtrelativeis blockRebase started successfullytabort_on_errors&waiting for blockRebase job completiongà?sDGuest is not running so doing a block rebase using "qemu-img rebase"RÀs•Relative blockcommit support was not detected. Libvirt '%s' or later is required for online deletion of file/network storage-backed volume snapshots.smwill call blockCommit with commit_disk=%(commit_disk)s commit_base=%(commit_base)s commit_top=%(commit_top)s tcommit_disktcommit_baset
commit_tops blockCommit started successfullys&waiting for blockCommit job completionN(/R“RRRRÑRxRR)R=R	RlR†RR‡R¦R§R¨R©RªR«RRþRšRÔR^t VIR_DOMAIN_BLOCK_REBASE_RELATIVER²R”RRët
libvirt_guesttBlockDevicetREBASE_DEFAULT_BANDWIDTHRGRêt	is_activeRíRîRêRïRðRÒt VIR_DOMAIN_BLOCK_COMMIT_RELATIVERÁt%MIN_LIBVIRT_BLOCKJOB_RELATIVE_VERSIONtInvalidtcommit(RIRRR[R—tdelete_infoRâR1tactive_diskR´RµR¹RÎRÝtrebase_diskRÍRáRøtresulttmy_snap_basetmy_snap_topRãRÂtverRäRå((RÌRÜR‹sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_volume_snapshot_delete´sÆ
			$	'

	





	
	

	

cCsy |j||||d|ƒWnPtk
rrtjƒ1tjtdƒd|ƒ|j||dƒWdQXnX|j||dƒ|j|||ƒdS(NRïsMError occurred during volume_snapshot_delete, sending error status to Cinder.Rterror_deletingtdeleting(	RöRdR	RCR“RRR˜RÂ(RIRRR[R—Rï((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytvolume_snapshot_delete‰s

c	Cs©|dkr“y|j|ƒ}Wn2tjk
rS}tjd|d|ƒt}nX|rwtjtdƒd|ƒdStjt	dƒd|ƒn|j
||||ƒS(s6Reboot a virtual machine, given an instance reference.tSOFTsInstance soft reboot failed: %sRs$Instance soft rebooted successfully.Ns3Failed to soft reboot instance. Trying hard reboot.(t_soft_rebootR^R6R“RRëR¾RR”Rt_hard_reboot(	RIRRR
treboot_typeRRtbad_volumes_callbacktsoft_reboot_successR#((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytrebootšs

cCs\|jj|ƒ}|j|jƒ}|j}|tjkrI|jƒn|jtj	|dƒƒxót
tjj
ƒD]ß}|jj|ƒ}|j|jƒ}|j}||krG|tjtjgkr'tjtdƒd|ƒ|jd|jƒtj|j|ƒ}|jddƒjƒtStjtdƒd|ƒtSntjdƒquWtS(	s–Attempt to shutdown and restart the instance gracefully.

        We use shutdown and create here so we can return if the guest
        responded and actually rebooted. Note that this method only
        succeeds if the guest responds to acpi. Therefore we return
        success or failure so we can fall back to a hard reboot if
        necessary.

        :returns: True if the reboot succeeded
        tallsInstance shutdown successfully.RRhR1gà?sBInstance may have been rebooted during soft reboot, so return now.i(RxRR:R(RRÙtshutdownt_prepare_pci_devices_for_useRlRmRR‹R^twait_soft_reboot_secondsR+tCRASHEDR“R¾RRjR<RRGt_wait_for_runningRHRIRêRRðRë(RIRR1R'RLRÂR.RP((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRû±s4	
		cs:ˆjˆƒˆjˆƒtjˆƒ}tj|ƒtjtj	j
ˆˆj|ƒ}ˆj|ˆ||ˆjd|ƒ}|j
dk	r»ˆjˆj||ƒ}ˆj|ˆ||ƒnˆj||ˆ||d|dtdtƒˆjtjˆdƒƒ‡‡fd†}	tj|	ƒ}
|
jddƒjƒdS(	s9Reboot a virtual machine, given an instance reference.

        Performs a Libvirt reset (if supported) on the domain.

        If Libvirt reset is unavailable this method actually destroys and
        re-creates the domain to ensure the reboot happens, as the guest
        OS cannot ignore this action.
        RRRtvifs_already_pluggedRcsMˆjˆƒj}|tjkrItjtdƒdˆƒtjƒ‚ndS(s4Called at an interval until the VM is running again.sInstance rebooted successfully.RN(	R&R'RRÙR“R¾RRR*(R'(RRI(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_wait_for_reboot	s
R1gà?N(RERVRRR
RTR/R
R‹R^RRØRt
auth_tokenRlt_get_instance_disk_infoRt_create_images_and_backingt_create_domain_and_networkRêRRlRmRRGRHRI(RIRRR
RRtinstance_dirRÁR‹tbacking_disk_infoRRP((RRIsM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRüâs6


				
	cCs|jj|ƒjƒdS(sPause VM instance.N(RxRRi(RIR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRi#	scCs*|jj|ƒ}|jƒ|jƒdS(sUnpause paused VM instance.N(RxRtresumetsync_guest_time(RIRR1((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytunpause'	s
c	Cs®tjtjg}y|jj|ƒ}Wntjk
r?tSX|j|jƒ}||kr{t	j
tdƒd|ƒtSt	jd|d|ƒ|j
ƒ|}xêtjj|ƒD]Ö}|jj|ƒ}|j|jƒ}||kr
t	j
tdƒ|d|ƒtS|dkrs|}y't	jd||d|ƒ|j
ƒWq}tjk
rot	jdd|ƒq´q}Xn
|d8}tjdƒq´Wt	j
td	ƒ|d|ƒtS(
sŠAttempt to shutdown the instance gracefully.

        :param instance: The instance to be shutdown
        :param timeout: How long to wait in seconds for the instance to
                        shutdown
        :param retry_interval: How often in seconds to signal the instance
                               to shutdown while waiting

        :returns: True if the shutdown succeeded
        sInstance already shutdown.Rs$Shutting down instance from state %ss0Instance shutdown successfully after %d seconds.is:Instance in state %s after %d seconds - resending shutdowns1Ignoring libvirt exception from shutdown request.is*Instance failed to shutdown in %d seconds.(RR+RRxRRR)RêR:R“R¾RRRtsixtmovesRR^R6RïRðRë(	RIRttimeouttretry_intervaltSHUTDOWN_STATESR1R'tretry_countdowntsec((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_clean_shutdown-	sL


		


icCs-|r|j|||ƒn|j|ƒdS(s!Power off the specified instance.N(RRE(RIRRR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt	power_offv	scCs|j||||ƒdS(s Power on the specified instance.N(Rü(RIRRR
RR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytpower_on|	scCs¹y|jj|ƒjƒWn˜tjk
r´}|jƒ}|tjkrYtjƒ‚n'|tj	kr€tj
d|jƒ‚ntjt
dƒi|jd6|d6|d6ƒ‚nXdS(sATrigger crash dump by injecting an NMI to the specified instance.R5sbError from libvirt while injecting an NMI to %(instance_uuid)s: [Error Code %(error_code)s] %(ex)sRRRãN(RxRt
inject_nmiR^R6R7tVIR_ERR_NO_SUPPORTRtTriggerCrashDumpNotSupportedR9R=R	R“R(RIRRãR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyttrigger_crash_dump„	s
cCsL|jj|ƒ}|j|tj|ƒƒ|j|||ƒ|jƒdS(sSuspend the specified instance.N(RxRt_detach_pci_devicesRlRmt_detach_sriov_portstsave_memory_state(RIRRR1((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRg˜	s
	c	
CsÈtjtjj||jd|ƒ}|j|||ƒ}|j|||||d|dtƒ}|j	|t
j|ƒƒ|j||||ƒt
j|j|ƒ}|jddƒjƒ|jƒdS(sresume the specified instance.RRRR1gà?N(R/R
R‹R^RRØRRRêRkRlRmRnRRGRRHRIR(	RIRRR
RRRÁR‹R1RP((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR¡	s 						cCs‡yV|jj|ƒ}|j|jƒ}tjtjtjtjf}||krUdSWntj	k
rlnX|j
||||ƒdS(s)resume guest state when a host is booted.N(RxRR:RRÙt	SUSPENDEDtNOSTATERÚRRÑRü(RIRRR
RRR1R'tignored_states((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytresume_state_on_host_bootµ	scCsttj|ƒ}|j||ƒ}tjj|dƒ}tj||ƒd}	|jdƒrg|j	}	ni|	p‚t
jjp‚|j
d6t
jjp˜|jd6t
jjp®|jd6}
tjt
jj||dtƒ}tj|j||d|d|d	d
ƒ}|j|||dd	d
d|
d|d|ƒ|j|||||d|
ƒ}
|j|ƒ|j|
d
|ƒdS(sLoads a VM using rescue images.

        A rescue is normally performed when something goes wrong with the
        primary images and data needs to be corrected/recovered. Rescuing
        should not edit or over-ride the original image, only allow for
        data recovery.

        sunrescue.xmlR(RZR"R(trescuet
admin_passR
tsuffixs.rescuetmappingtdisk_imagestpost_xml_callbackN(RRRRnRRÁt
write_to_fileRlR0R(R‹R^trescue_image_idRLtrescue_kernel_idR"trescue_ramdisk_idR(R/R
RRêt	functoolstpartialt_create_configdrivet
_create_imageRRERj(RIRRR
RØtrescue_passwordR
tunrescue_xmltunrescue_xml_pathR.t
rescue_imagesRÁt
gen_confdriveR‹((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR'Í	s>


			
csItjˆƒ}tjj|dƒ}tj|ƒ}|jjˆƒ}|j}|j	ˆƒ|j
||ƒtj|ƒtjj|dƒ}xFtj
|ƒD]5}	tjj|	ƒrÅtj|	ƒqtj|	ƒqWtjg|jˆƒD]}
|
jdƒrì|
^qìƒtjjdkrE‡fd†}tjƒj|ƒndS(sGReboot the VM which is being rescued back into primary images.
        sunrescue.xmls*.rescues.rescueR^cs|jˆjƒo|jdƒS(Ns.rescue(R™R	Rš(R(R(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRm
sN(RRRnRRÁt	load_fileRxRR<RERjtfile_deletetglobtiglobtisdirtshutiltrmtreeR8R¡R RšR‹R^RkRXR˜R(RIRR
R
R7R‹R1R\trescue_filestrescue_filetlvmdiskRž((RsM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytunrescueú	s$	

cCsdS(N((RIRt	instances((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytpoll_rebooting_instances
sc
stjtjjˆ||ƒ}tjˆj|ˆd|d|d|ƒ}	ˆj|ˆ|dd|d|d|d|ƒˆj	ˆƒˆj
|ˆ|||d|ƒ}
ˆj||
ˆ||d|d|	ƒtj
ddˆƒ‡‡fd	†}tj|ƒ}|jd
dƒjƒdS(NR(tfilesR
R*RRR,sInstance is runningRcsMˆjˆƒj}|tjkrItjtdƒdˆƒtjƒ‚ndS(s.Called at an interval until the VM is running.sInstance spawned successfully.RN(	R&R'RRÙR“R¾RRR*(R'(RRI(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_wait_for_boot:
s
R1gà?(R/R
R‹R^RR1R2R3R4t _ensure_console_log_for_instanceRRR“RRRGRHRI(
RIRRRØtinjected_filestadmin_passwordR
RRRÁR9R‹RHRP((RRIsM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytspawn
s6			

			cCs/tjdd|ddtdtƒ\}}|S(Ntddsif=%ssiflag=nonblocktrun_as_roottcheck_exit_code(RR¶RêRë(RItptytoutR•((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_flush_libvirt_consoleF
s	cCsMtjtdƒi|d6|d6ƒt|dƒ}|j|ƒWdQX|S(Ns data: %(data)r, fpath: %(fpath)rRZtfpathsa+(R“R¾Rtopentwrite(RIRZRStfp((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_append_to_fileN
s
c
CsÈ|jj|ƒ}|jƒ}tj|ƒ}i}|jdƒ}x>|D]6}|jdƒ}	|j|	gƒ||	j|ƒqIW|jdƒr’xý|jdƒD]é}
|
j	dƒ}|dkrÉq¢n|jdƒ}|säq¢ntjj
|ƒstjtdƒd|ƒdStj|tjƒƒtj|d	ƒN}
tj|
tƒ\}}|d
krtjtdƒ|d|ƒn|SWdQXq¢Wn|jdƒrûxc|jdƒD]C}|j	dƒ}|dkrØq±n|jdƒ}|sóq±nPq±Wntjƒ‚|j|ƒ}tjj
|ƒrAtj|tjƒƒn|j|ƒ}|j||ƒ}tj|d	ƒN}
tj|
tƒ\}}|d
krºtjtdƒ|d|ƒn|SWdQXdS(
Ns./devices/consoleRR s./sourceRsVInstance is configured with a file console, but the backing file is not (yet?) presentRR„trbis0Truncated console log returned, %d bytes ignoredRP(RxRR†RR‡RˆR›t
setdefaultRtfindRlRnRR§R“R¾RRRRRYRt
last_bytestMAX_CONSOLE_BYTESRtConsoleNotAvailablet_get_console_log_pathRRRW(RIRRR1R‹RŒt
console_typest
console_nodestconsole_nodetconsole_typetfile_consoletsource_nodeRRVtlog_datat	remainingtpty_consoleRPtconsole_logRZRS((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytget_console_outputV
sf
	
cCsUtjƒ}tj|krNtjtdƒitjd6dj|ƒd6ƒntjS(NsLmy_ip address (%(my_ip)s) was not found on any of the interfaces: %(ifaces)stmy_ips, tifaces(t
compute_utilstget_machine_ipsR‹RjR“R”RRÁ(RItips((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytget_host_ip_addr¢
s
$csC‡‡fd†}|ˆjƒ}tjj}tjd|d|ƒS(Ncskˆjjˆƒ}|jƒ}tj|ƒ}|jdƒ}|dk	rU|jdƒStj	ddƒ‚dS(Ns./devices/graphics[@type='vnc']R!Rbtvnc(
RxRR†RR‡RZRlR›RtConsoleTypeUnavailable(RR1R‹txml_domtgraphic(RRI(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytget_vnc_port_for_instance«
s
R2R!(RR‹Rptvncserver_proxyclient_addresstctypet
ConsoleVNC(RIRRRtR!R2((RRIsM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytget_vnc_consoleª
s
csQ‡‡fd†}|ˆjƒ}tjj}tjd|d|dd|dƒS(Ncszˆjjˆƒ}|jƒ}tj|ƒ}|jdƒ}|dk	rd|jdƒ|jdƒfStj	ddƒ‚dS(Ns!./devices/graphics[@type='spice']R!ttlsPortRbtspice(
RxRR†RR‡RZRlR›RRq(RR1R‹RrRs(RRI(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytget_spice_ports_for_instance¾
sR2R!iRyi(RR‹Rztserver_proxyclient_addressRvtConsoleSpice(RIRRR{tportsR2((RRIsM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytget_spice_console½
s
cCsa|jj|ƒ}x6|j|ddƒD]\}}tjd|d|ƒSWtjddƒ‚dS(NRŠtbindR2R!RbR(RxRR3Rvt
ConsoleSerialRRq(RIRRR1RKR!((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytget_serial_consoleÐ
s
	c	CsÔttdƒs tjdƒtStjj|dƒ}t}d}zJywtj	|tj
tjBtjBƒ}d}t
j
d|ƒ}|jd|ƒtj||ƒtjdi|d6ƒWnÌtk
r@}|jtjkrtjd	i|d6|d
6ƒt}qŠtjƒ)tjtdƒi|d6|d
6ƒWdQXnJtk
r‰}tjƒ)tjtdƒi|d6|d
6ƒWdQXnXWd|dk	rªtj|ƒnytj|ƒWntk
rÎnXX|S(NtO_DIRECTs/This python runtime does not support direct I/Os.directio.testiiÿÿÿÿRÂs#Path '%(path)s' supports direct I/ORs5Path '%(path)s' does not support direct I/O: '%(ex)s'Rãs7Error on '%(path)s' while checking direct I/O: '%(ex)s'(thasattrRnR“RRëRRÁRêRlRTtO_CREATtO_WRONLYRƒtmmapRUtOSErrorRAtEINVALR	RCRFRRdtclosetunlink(tdirpathttestfilethasDirectIOtfdt
align_sizetmR#((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR­×
sD
#			

#
cCsC|s tjd|d|ƒntj|||d|d|ƒdS(NR6s%dGRNtspecified_fs(Rtcreate_imageRtmkfs(R¹tephemeral_sizetfs_labelR*tis_block_devRR’((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_create_ephemeralscCs+tjd|d|ƒtjd|ƒdS(s%Create a swap file of specified size.R6s%dMtswapN(RR“RR”(R¹tswap_mbR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_create_swapscCstjjtj|ƒdƒS(Nsconsole.log(RnRRÁRR(R((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR^scCs?|j|ƒ}tjd|d|ƒtj|dƒjƒdS(Ns&Ensure instance console log exists: %sRta(R^R“RRRYRŠ(RIRtconsole_file((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRIsR„cCs tjjtj|ƒd|ƒS(Nsdisk.config(RnRRÁRR(RR)((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_disk_config_path5scCstjjdkrdSdS(NR^R6(R‹R^Rk(((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_disk_config_image_type:scCs t|jdƒƒpd|kS(sžDetermines whether the VM is booting from volume

        Determines whether the disk mapping indicates that the VM
        is booting from a volume.
        RLR(tboolR›(Rtdisk_mapping((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_is_booted_from_volumeAscCs5|r1d|ks*d|ks*d|kr1tSntS(s½Determines whether the VM has a local disk

        Determines whether the disk mapping indicates that the VM
        has a local disk (e.g. ephemeral, swap disk and config-drive).
        s
disk.locals	disk.swapsdisk.config(RêRë(RR¡((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_has_local_diskKscCsvd
}|js3tjj}|dkr3d
}q3ntjjdkrNd
}ntjjr{|jdƒr{t|j	ƒ}nd
}tjj
s–d
}ntj|dtjjƒ}|jdƒ}	t
|||	||fƒrr|j}
y8tj|j|jƒ|||	||d|ddƒWqrtk
rn}tjƒ/tjtd	ƒi|
d
6|d6d|ƒWd
QXqrXnd
S(sÄInjects data in a disk image

        Helper used for injecting data in a disk image file system.

        Keyword arguments:
          injection_image -- An Image object we're injecting into
          instance -- a dict that refers instance specifications
          network_info -- a dict that refers network speficications
          admin_pass -- a string used to set an admin password
          files -- a list of files needs to be injected
        iRÄtkey_datatlibvirt_virt_typeR3R’t	mandatoryRGs2Error injecting data into image %(img_id)s (%(e)s)timg_idR#RN(sfiles(RlR"R‹R^tinject_partitionRt
inject_keyR›RGR¤tinject_passwordR<tget_injected_network_templatetanyRLRtinject_datat	get_modelt_connRdR	RCR“RFR(RItinjection_imageRR
R(RGttarget_partitiontkeytnetR3R§R#((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_inject_dataYs6				
cs/ˆjˆ|ƒ}tjj‡‡‡fd†‰‡fd†}
tjtjˆƒƒtj	t
dƒdˆƒ|s›iˆjd6ˆjd6ˆj
d6}n|dr9tj|dƒ}|
dƒjd	tjd
|d|d|dƒ|dr9tj|dƒ}|
dƒjd	tjd
|d|d|dƒq9nˆjƒ}tjjd
krstjˆdƒjdƒnˆj|ˆ|ˆ|||	||
|ƒ
tjˆjƒ}tj|ƒ}ˆjj}d|krRˆdƒ}tjˆjdddˆjd|j ƒ}d||f}|t!j"}|jd	|d
|d|d|d|ƒnxt#t$j%|ƒƒD]ð\}}ˆt&j'|ƒƒ}|j(dƒ}|rÓˆj)|ƒrÓt*dƒ|}t+j,d|ƒ‚ntjˆjdd|dˆjd|j ƒ}|dt!j"}d|d|f}|jd	|d
|d|d|d|dd|ƒqhWd|kr+|d}d}t$j-|ƒ}t$j.|ƒr£|d}n4|d dkr×t/j0|d!|ƒr×|d }n|dkr+|t!j1}ˆdƒjd	ˆj2d
|dd"|d|d#|ƒq+ndS($Ncsˆjjˆ|ˆ|ƒS(N(RR (tfnameR7(RRIR)(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR šscsˆ|ddƒS(NR7R6((Rµ(R (sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR6žssCreating imageRRZR"R(tkernelt
fetch_funcRRÕtramdiskR÷RRys
disk.localR–t
ephemeral0R*R—sephemeral_%s_%stsizeR•tguest_formats%s format is not supportedtdetailssephemeral%dR’s	disk.swapit	swap_sizeR™Røsswap_%sRš(3R¢R‹R^RkR
RTRRR“R¾RRLR"R(R4tget_cache_fnametcachetfetch_raw_imaget
get_flavorRRRt_create_and_inject_local_rootRtget_fs_type_for_os_typeR*tget_file_extension_for_os_typeRtephemeral_gbR1R2R˜R—RRòt	enumerateR+t block_device_info_get_ephemeralsR/tget_eph_diskR›tis_supported_fs_formatRRtInvalidBDMFormattblock_device_info_get_swaptswap_is_usableRtvolume_in_mappingtMiR›(RIRRR¡R)R+R
RRRGR(tinject_filestfallback_from_hosttbooted_from_volumeR6Rµt	inst_typetos_type_with_defaulttfile_extensionRÅt
disk_imagetfnRºtidxtephR’RâR*RšR™((R RRIR)sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR4‘s¦



			


	





cs]tj|ƒo%|	o%tjjdk}|s7tjˆdƒ}|jjt	j
}
|
dksl|dkrud}
n|jj
|d|tjjƒ‰|jtjkr¼ˆjtjƒnˆjr㇇‡fd†}|}n	tj}|jˆ|ˆ|ˆd||
|
ƒ|rY|jˆ||||ƒqYn"|rYtjtdƒd|ƒndS(	NiþÿÿÿRZis.rescueRcsCyˆjˆˆdƒWn$tjk
r>tj||ŽnXdS(NRZ(tcloneRRORtfetch_image(targsR/(tbackendRR+(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytclone_fallback_to_fetchss@File injection into a boot from volume instance is not supportedR(R'trequired_byR‹R^R¨R4R¾Rtroot_gbRRòRlRR RkR›Rt
RESIZE_FINISHtcreate_snapRR¸tSUPPORTS_CLONERÚt_try_fetch_image_cacheR´R“R”R(RIRRRÑR)R+R
R(RGRÏRÐtneed_injectt
root_fnameRºRÝR·((RÜRR+sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRÂs0				


c

Cs©|j||ƒ|_d}tj|ƒr¥tjtdƒd|ƒ|jj	|d||j
ƒƒ}|jƒs¥i}|rŠ||d<ntj
|d|d|d|d|ƒ}	tjd	|	ƒ}
|
“|j||ƒ}tjtd
ƒi|d6d|ƒy|
j|ƒWnEtjk
rW}tjƒ!tjtdƒ|d|ƒWdQXnXWdQXz|j||d|ƒWdtjjd
kržtj|ƒnXq¥ndS(NsUsing config driveRsdisk.configR(tcontenttextra_mdR
trequest_contexttinstance_mds!Creating config drive at %(path)sRs+Creating config drive failed with error: %sR^(t_build_device_metadatatdevice_metadataRlR'RÞR“R¾RRR RŸR§tinstance_metadatatInstanceMetadatatConfigDriveBuilderRžt
make_driveRtProcessExecutionErrorR	RCRFRtimport_fileR‹R^RkRnR‹(
RIRRR(RGR
R)tconfig_drive_imageRçtinst_mdtcdbtconfig_drive_local_pathR#((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR3-sD		



cCsÔtjjdkrdSyrx4|D],}|d}|jj|ƒ}|jƒq Wx4|D],}|d}|jj|ƒ}|jƒqWWWnEtjk
rÏ}tj	d|dd|ddt
j|ƒƒ‚nXdS(NRÛthypervisor_nameR(RR½(R‹R^RRxtdevice_lookup_by_nametdettachtresetR6RtPciDevicePrepareFailedRt	text_type(RItpci_devicesRøtlibvirt_dev_addrtlibvirt_devR]((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRas




cCs~y-x&|D]}|j|j|ƒdtƒ|jƒ}tj|ƒ}tjƒ}|j|ƒxÅg|j	D]}t
|tjƒrm|^qmD]•}|j|j
|j|jg}	tj|jƒ}
g|	D]}t|dƒ^qÌg|
D]}t|dƒ^qëkrtjddd|ƒ‚qqWq
WWnJtjk
ry}|jƒ}
|
tjkrstjtdƒƒqz‚nXdS(NRÔiR½RRøs:Instance disappeared while detaching a PCI device from it.(Rt_get_guest_pci_deviceRêR†RR‡R¦R§R¨R©RÝtLibvirtConfigGuestHostdevPCIRhRÊtslottfunctiont	pci_utilst
parse_addressRRnRtPciDeviceDetachFailedR^R6R7R8R“R”R(RIR1tpci_devsRøR‹R´tguest_configtdthdevthdbsftdbsfRÂRãR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR s*

"%	cCspy+x$|D]}|j|j|ƒƒq
WWn>tjk
rktjtdƒi|d6|jd6ƒ‚nXdS(Ns0Attaching PCI devices %(dev)s to %(dom)s failed.Røtdom(RÜRÿR^R6R“RFRR((RIR1RRø((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRkžs
cCs,x%|D]}|dtjkrtSqWtS(Nt	vnic_type(t
network_modeltVNIC_TYPE_DIRECTRêRë(R
R:((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_has_sriov_port¨s
cCsÌ|dkr|jj}n|dkr+dS|j|ƒrÈx‹|D]€}|dtjkrA|jj|||j|j	t
jj|j
ƒ}tjdi|d6|jd6d|ƒ|j|ƒqAqAWndS(NR
s)Attaching SR-IOV port %(port)s to %(dom)sR!RR(Rlt
info_cacheR
RRtVNIC_TYPES_SRIOVRƒRÅRØRR‹R^RRxR“RR(RÜ(RIRRR1R
R:R((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRn¯s"
		c
CsÉ|jj}|dkrdS|j|ƒrÅg|D]@}|dtjkr2|djdƒdk	r2|dd^q2}tj|dƒ}g|D]}|j	|kr‘|^q‘}	|j
||	ƒndS(NR
tprofiletpci_slotR(RR
RlRRRR›RlRmRR (
RIRRR1R
R:tsriov_pci_addressesRtpci_devt
sriov_devs((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR!Ãs
-
cCs4idt6dt6}|}tjƒ}yªtjj|tjƒ}|j	|krÐ|j	sv|j
r¹|j
jtƒr¹||_	|rt|nt
|_
|jƒtjd||ƒqÐtjd||ƒnWn\tjk
rtjtdƒtjƒn0tk
r/tjtdƒtjdtƒnXdS(	søEnables / Disables the compute service on this host.

           This doesn't override non-automatic disablement with an automatic
           setting; thereby permitting operators to keep otherwise
           healthy hosts out of rotation.
        tdisabledR¼s%Updating compute service status to %ss5Not overriding manual compute service status with: %ssECannot update service status on host "%s" since it is not registered.sICannot update service status on host "%s" due to an unexpected exception.RN(RêRëRRR"tServicetget_by_compute_hostR‹R2Rtdisabled_reasonR™tDISABLE_PREFIXtDISABLE_REASON_UNDEFINEDRqR“RRtComputeHostNotFoundR”RRd(RIR¼tdisable_reasontstatus_nametdisable_servicetctxR…((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR¿Ûs0	


		
		

	cCs„tjj}tjj}tjjdks<tjjdkrj|dkrQd}n|dkr†tjƒSn|dks‚|dkr†dStjjdkrÒtjjdkrÒtdƒtjj}t	j
|ƒ‚n|dkr|dkrtdƒ}t	j
|ƒ‚n6|dkr>|dk	r>tdƒ}t	j
|ƒ‚ntjd	i|d
6|pZdd6ƒtjƒ}||_
||_|S(
NRgRhs
host-modelRbsuConfig requested an explicit CPU model, but the current libvirt hypervisor '%s' does not support selecting CPU modelstcustomsCConfig requested a custom CPU model, but no model name was providedsEA CPU model name should not be set when a host CPU model is requesteds0CPU mode '%(mode)s' model '%(model)s' was chosenRŠR„R!(R‹R^tcpu_modet	cpu_modelRRlR¦tLibvirtConfigGuestCPURRRíR“RRŠR!(RIRŠR!RâR¶((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_guest_cpu_model_config

s6	
	
			cCse|jƒ}|dkrdStj||d|ƒ}|j|_|j|_|j|_||_|S(Nt
numa_topology(R'RlR-tget_best_cpu_topologytsocketstcorestthreadstnuma(RIRRØtguest_cpu_numa_configtinstance_numa_topologyR¶ttopology((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_guest_cpu_config1
s	c
	CstjjrV|jjdtdtjƒsVtdƒitd6}t	j
|ƒ‚qVn|jj|||ƒ}|dkrÖ|dkrÖ|j
ƒrÖ|jj||dƒ}|j
ƒrÖ|}tjdd	|ƒqÖn||}	|j|	d
|	d|	d|j|d
|jjƒƒS(NRÅRs?Volume sets discard option, qemu %(qemu)s or later is required.Rhsdisk.configR^tflatsEConfig drive not found in RBD, falling back to the instance directoryRRÊRøRtextra_specs(R‹R^thw_disk_discardRxRÏtMIN_QEMU_DISCARD_VERSIONR2RCRRRíRR R§R“Rtlibvirt_infoR¯tget_version(
RIRRR¡RÒR7RâR t
flat_imageRÁ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_guest_disk_configB
s.		



cCs(|jj|||ƒ}|jddƒS(NRYtploop(RR tlibvirt_fs_info(RIRRR7R ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_guest_fs_configd
s	c CsÐg}|d}	tj|ƒ}
tjjdk}|r}tjƒ}d|_tj	j
tj|ƒdƒ|_
|j|ƒn^|tjkrtjjdkr|rî|j|dƒ}
|j|
ƒ|j|dƒ}d|_|j|ƒqÛd|	krÛ|j|dƒ}|j|ƒqÛn¼|rr|j|d|	|ƒ}|j|ƒ|j|d|	|ƒ}|j|ƒnd|	kr¦|j|d|	|ƒ}|j|ƒnd	|	krï|j|d	|	|ƒ}|j|ƒtj|jƒ|_nxQttj|ƒƒD]:\}}|j|tj|ƒ|	|ƒ}|j|ƒqWd
|	krŒ|j|d
|	|ƒ}|j|ƒtj|jƒ|_n|r˜dnd}||	krÛ|j|||	||jƒƒ}|j|ƒnx„tj|
|ƒD]p}|d
}tj|dƒ}|	|}|j||ƒ|j ||ƒ}|j|ƒ||d
<|j!ƒqîWx|D]}|j"|ƒqiW|j#j$dƒrÌ|j#j%}tj&ƒ}d|_'||_(|j|ƒn|S(NR*RÄtmountRRÆsdisk.rescueRs/mnt/rescues
disk.locals	disk.swapsdisk.config.rescuesdisk.configRWRXt
hw_scsi_modeltscsi()R+ReR‹R^RR¦tLibvirtConfigGuestFilesysR°RnRRÁRRt
source_dirRRtEXER<t
target_dirR9Rtprepend_devR«tdefault_ephemeral_deviceRÆRÇR/RÈtdefault_swap_deviceRŸtget_bdms_to_connectRÃRÆRqR´R)R›R>tLibvirtConfigGuestControllerRR!( RIRRØRÁR'RRRÒR*R©R¡Rttmount_rootfstfstfsrescuetfsost
diskrescuetdiskost	disklocalR×RØtdiskephtdiskswaptconfig_namet
diskconfigRuRWtvol_devR¾RRR>tscsi_controller((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_guest_storage_configj
sª
			!
			
						
		






		cCs|jjƒ}|jjS(sÝGet a UUID from the host hardware

        Get a UUID for the host hardware reported by libvirt.
        This is typically from the SMBIOS data, unless it has
        been overridden in /etc/libvirt/libvirtd.conf
        (RxRµR2R	(RIR¹((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR˜Õ
scCs–tjjdƒs0tdƒ}tj|ƒ‚ntdƒT}|jƒjƒ}|sutdƒ}tj|ƒ‚nt	t
j|dƒƒSWdQXdS(sfGet a UUID from the host operating system

        Get a UUID for the host operating system. Modern Linux
        distros based on systemd provide a /etc/machine-id
        file containing a UUID. This is also provided inside
        systemd based containers and can be provided by other
        init systems too, since it is just a plain text file.
        s/etc/machine-ids7Unable to get host UUID: /etc/machine-id does not exists1Unable to get host UUID: /etc/machine-id is emptyiN(RnRR§RRRÑRTtreadR±RGR	tUUID(RIRâtftlines((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR™ß
s	cCs*tjjdƒr|jƒS|jƒSdS(Ns/etc/machine-id(RnRR§R™R˜(RI((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRšö
s
cCsatjƒ}tjƒ|_tjƒ|_tjƒ|_|j	ƒ|_
|j|_d|_
|S(NsVirtual Machine(R¦tLibvirtConfigGuestSysinfoR&t
vendor_stringtsystem_manufacturertproduct_stringtsystem_producttversion_string_with_packagetsystem_versionRt
system_serialR	tsystem_uuidt
system_family(RIRtsysinfo((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_guest_config_sysinfoü
s	cCs|tj|jƒ}tjƒ}|\|_|_|_|_t	j
jdkrZd|_nt	j
jdkrxd|_n|S(	NRÛRÆR£RgRhtyes(sxens	parallels(skvmsqemu(
RRRR¦RRhRÊRRR‹R^Rtmanaged(RIt
pci_deviceRRø((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRÿ
scCstjƒ}tjƒ|_|j|_tjƒ|_|j	dkr]d|_|j	|_n|dk	r±tj
ƒ}|j|_|j|_|j|_|j|_||_ntjƒ}|j}|j|_|j|_|j|_|j|_|j|_|j |_ ||_|S(sGet metadata config for guest.R„R N(R„N(!R¦t"LibvirtConfigGuestMetaNovaInstanceR&R`tpackagetdisplay_nameRRïtcreationTimeRLRltroottypetrootidtLibvirtConfigGuestMetaNovaOwnertuser_idtuseridt	user_nametusernameR/t	projectidtproject_nametprojectnametownert LibvirtConfigGuestMetaNovaFlavorRt	memory_mbtmemorytvcpusRÅt	ephemeralRßRR™(RIRRtmetatometatfmetaR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_guest_config_metas0			cCsCi}x6tjjD](}|jdƒ\}}}|||<qW|S(NRi(R‹R^thw_machine_typeR’(RItmappingsR*t	host_archRtmachine_type((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_machine_type_mappings9s
cCsÐd}|jjdƒdk	r-|jj}nŸ|jjjtjkrNd}n|jjjtjkrod}n|jjjtj	tj
fkr™d}ntjjrÌ|j
ƒ}|j|jjjƒ}n|S(NR‚svexpress-a15tvirtss390-ccw-virtio(RlR)R›R‚R2R¶RtARMV7tAARCH64tS390tS390XR‹R^R†(RIRØR¹t	mach_typeRƒ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_machine_type@s		!	cCség}t|ƒdkr;|dd!}tjtdƒƒnx§|D]Ÿ}yi|ƒ}g|jdƒD]}t|ƒ^qd}|d|_|d|_|d|_|j	|ƒWqBt
tfk
ràtjtdƒ|ƒqBXqBW|S(Niis+Too many id maps, only included first five.t:iisInvalid value for id mapping %s(R‰R“R”RR±RnRHR¹tcountRt
ValueErrort
IndexError(tklasstmap_stringstidmapst
map_stringtidmaptitvalues((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_create_idmaps[s

	(


cCsœg}tjjdkrOtjjrO|jtjtjjƒ}|j|ƒntjjdkr˜tjjr˜|jtj	tjjƒ}|j|ƒn|S(NRÄ(
R‹R^RRÌR™R¦tLibvirtConfigGuestUIDMaptextendRÍtLibvirtConfigGuestGIDMap(RItid_mapsRÌRÍ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_guest_idmapsmsc
	Cs|jjƒ}dddg}tg|D]%}d||jjƒkr(|^q(ƒ}|rr|rrtjƒ‚n|s…|d	kr‰dS|jdkrªt	j
ƒ|_nd|j|j_xJ|D]B}d|}	|	|jkrÄt
|j|t|j|	ƒƒqÄqÄWdS(
Ntsharestperiodtquotas
quota:cpu_RÄRgRhi(slxcskvmsqemu(Rxtis_cpu_control_policy_capableR¬R3tkeysRtUnsupportedHostCPUControlPolicyRDRlR¦tLibvirtConfigGuestCPUTuneR|RŸtsetattrRn(
RIR1RRtis_ablet	cputuningtkt
wants_cputuneRR²((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_update_guest_cputuneys (


cCs‡|rƒtjƒ}xj|jD]_}tjƒ}|j|_|j|_|jtj	|_|rkd|_
n|jj|ƒqW|SdS(Ntshared(R¦tLibvirtConfigGuestCPUNUMAtcellstLibvirtConfigGuestCPUNUMACellR(RCtcpusR{RRót	memAccessR(RIR/twants_hugepagestguest_cpu_numat
instance_cellt
guest_cell((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt"_get_cpu_numa_config_from_instance’s
cCs\xUtD]M}|jj|ƒr|j|ƒ}tjdtdƒi|d6ƒ‚qqWtS(NR½s#Invalid libvirt version %(version)sR&(tBAD_LIBVIRT_CPU_POLICY_VERSIONSRxthas_versionRÃRtCPUPinningNotSupportedRRê(RIRõtver_((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_has_cpu_policy_support¬s
cCs|dks|dkrtSg|jdjD]}|j^q-}|jƒ|d}x3|jD](}|jdk	r`|j|kr`tSq`WtS(snDetermine if the guest / host topology implies the
           use of huge pages for guest RAM backing
        iiN(RlRëR®tmempagestsize_kbtsorttpagesizeRê(RIt
host_topologytinstance_topologytpagetavail_pagesizetcell((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_wants_hugepages´s#

cCsG|jƒr(|dk	r(tjƒ‚n|jƒ}|j||j||ƒƒ}|skt|dddƒS|r0tj	ƒ}tj
ƒ}g}	tjƒ}
g|jD]}tj
ƒ^q¥}x|jD]}
x	t|jƒD]ø\}}|j|
jkrÝ||}||_|
jg|_d|_|
jj|
jƒ|j|}xŒ|jD]~}tjƒ}||_|jr¢|jƒr¢|j|}t|gƒ|_n|
j|_|	j|jƒ|jj|ƒqPWqÝqÝWqÇWtjƒ}t|	ƒ|_||_|jjdtj dƒƒt!j"|ƒrÇ|j#j$t%ƒsMtj&ƒ‚nt!j'td„|jDƒƒ||ƒ\}}tj(ƒ}||_)d|_*t+j,j-|_.|j/j|ƒ||j_n|
|_0||_1xAtt2|j|j1ƒƒD]$\}\}}||_||_qõWtd|||ƒSt|d|dƒSdS(s†Returns the config objects for the guest NUMA specs.

        Determines the CPUs that the guest can be pinned to if the guest
        specifies a cell topology and the host supports it. Constructs the
        libvirt XML config object representing the NUMA topology selected
        for the guest. Returns a tuple of:

            (cpu_set, guest_cpu_tune, guest_cpu_numa, guest_numa_tune)

        With the following caveats:

            a) If there is no specified guest NUMA topology, then
               all tuple elements except cpu_set shall be None. cpu_set
               will be populated with the chosen CPUs that the guest
               allowed CPUs fit within, which could be the supplied
               allowed_cpus value if the host doesn't support NUMA
               topologies.

            b) If there is a specified guest NUMA topology, then
               cpu_set will be None and guest_cpu_numa will be the
               LibvirtConfigGuestCPUNUMA object representing the guest's
               NUMA topology. If the host supports NUMA, then guest_cpu_tune
               will contain a LibvirtConfigGuestCPUTune object representing
               the optimized chosen cells that match the host capabilities
               with the instance's requested topology. If the host does
               not support NUMA, then guest_cpu_tune and guest_numa_tune
               will be None.
        tstrictR²R(css|]}|jVqdS(N(R((t.0R¶((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pys	<genexpr>EstfifoN(3t_has_numa_supportRlRtNUMATopologyUnsupportedt_get_host_numa_topologyR¶RÅRBR¦R¥tLibvirtConfigGuestNUMATunet LibvirtConfigGuestNUMATuneMemoryR®t!LibvirtConfigGuestNUMATuneMemNodeRÆR(tcellidtnodesetRŠRR°t LibvirtConfigGuestCPUTuneVCPUPintcpu_pinningR»tsetRCR›tvcpupint$LibvirtConfigGuestCPUTuneEmulatorPintemulatorpinR¾toperatort
attrgetterR-tis_realtime_enabledRxRÏtMIN_LIBVIRT_REALTIME_VERSIONtRealtimePolicyNotSupportedtvcpus_realtime_topologyt"LibvirtConfigGuestCPUTuneVCPUSchedR|t	schedulerR‹R^trealtime_scheduler_prioritytpriorityt	vcpuschedR{tmemnodestzip(RIR/Rtallowed_cpusRØR0R.tguest_cpu_tunetguest_numa_tunetallpcpustnuma_memRt
numa_memnodest	host_cellt
guest_node_idtguest_config_celltnodetobject_numa_cellR¶t
pin_cpusettpcpuRÖtvcpus_rttvcpus_emRáR—RÄtmemnode((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_guest_numa_configÊs‚

		
		
									
		cCsU|dkrtj}n9|dkr0tj}n!|dkrHtj}n	tj}|S(s-Returns the guest OS type based on virt type.RÄR÷RÛ(RRBtUMLtXENtHVM(RIRtret((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_guest_os_typeas	cCs¥|jdƒrwtjj|dƒ|_|dkrCd||_qwd|tf|_|dkrw|jd7_qwn|jdƒr¡tjj|d	ƒ|_ndS(
NR"s
kernel.rescueRÛs
ro root=%ss
root=%s %sRhs no_timer_checkR(sramdisk.rescue(R›RnRRÁt	os_kernelt
os_cmdlinetCONSOLEt	os_initrd(RIR'R1RRtroot_device_name((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_set_guest_for_rescuemscCs±tjj|dƒ|_|dkr4d||_n1d|tf|_|dkre|jd7_n|jr‰tjj|dƒ|_n|jj	dƒr­|jj
|_ndS(	NR¶RÛs
ro root=%ss
root=%s %sRhs no_timer_checkR¸tos_command_line(RnRRÁRúRûRüR(RýR)R›R(RIRR1RRRþRØ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_set_guest_for_inst_kernelzs	cCsstjƒ}|dkr7tjtdƒƒd|_n	d|_|j|ƒ|dkro|j|||ƒndS(NRws6Configuring timezone for windows instance to localtimet	localtimetutcRg(R¦tLibvirtConfigGuestClockR“R¾Rtoffsett	set_clockt_set_kvm_timers(RIR1R*RØRtclk((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt
_set_clock‹s	
c	Csþtjƒ}d|_d|_tjƒ}d|_d|_|j|ƒ|j|ƒtj|ƒ}|tjtj	fkr«tjƒ}d|_t
|_|j|ƒn|dkrú|jj
ttƒrútjƒ}d|_t|_|j|ƒndS(NtpittdelaytrtctcatchupthpetRwthypervclock(R¦tLibvirtConfigGuestTimerRt
tickpolicyt	add_timerRtget_archRR·R¸RëtpresentRxRÏt MIN_LIBVIRT_HYPERV_TIMER_VERSIONtMIN_QEMU_HYPERV_TIMER_VERSIONRê(	RIRR*RØttmpitttmrtct	guestarchttmhpetttmhyperv((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRœs*				

					cCs|dkrI|jjjtjtjfkrI|jjtjƒƒqIn|d	kss|dkr¢|j	t
jkr¢|jjtjƒƒ|jjtj
ƒƒn|d
krý|dkrýtjƒ}t|_t|_d|_t|_|jj|ƒndS(NRÛRÄR÷RÆRhRgRwiÿ(slxcsumls	parallelssxen(sqemuskvm(R2R¶RR·R¸tfeaturesRR¦tLibvirtConfigGuestFeaturePAER*RR÷tLibvirtConfigGuestFeatureACPItLibvirtConfigGuestFeatureAPICtLibvirtConfigGuestFeatureHyperVRêtrelaxedt	spinlockstspinlock_retriestvapic(RIR1R*R¹Rthv((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt
_set_features¿s!				cCsCtjj}|dkr?|tkr?tjdtd|ƒ‚ndS(NRgRhtallowedR(skvmsqemu(R‹R^RtALLOWED_QEMU_SERIAL_PORTSRtSerialPortNumberLimitExceeded(RIt	num_portsR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_check_number_of_serial_console×s
	cCs;tj|ƒ}tjjrÓtj||ƒ}|tjtj	fkrQt
j}nt
j}|j
|ƒxÍtjj|ƒD]R}|ƒ}	||	_d|	_tjj|	_tj|	jƒ|	_|j|	ƒqzWnd|tjtj	fkrt
jƒ}
d|
_nt
jƒ}
d|
_|j|ƒ|
_|j|
ƒdS(NttcptsclplmR (RRR‹R2R¼R-tget_number_of_serial_portsRRŠR‹R¦tLibvirtConfigGuestConsoletLibvirtConfigGuestSerialR+RRRR!Rtproxyclient_addresstlisten_hosttacquire_porttlisten_portt
add_devicettarget_typeR^Rþ(RIR1RRRØt
guest_archR*tconsole_clsR!tconsolet
consolelog((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_create_serial_console_devicesÞs.	
				c	Csxd}tjƒ}tj|ƒ}|jtjkr?d|_n`tj	j
dkr]d|_nB|tjtj
tjfkr‡d|_ntjjrŸd|_n|jjdƒrê|jj|_|j|krêtjd|jƒ‚qên|jjd	d
ƒ}t|jjdd
ƒƒ}||krAtjd|d
|ƒ‚n|rg|rg|tjtj|_n|j|ƒdS(NtvgatcirrustvmvgaRÛtqxlRÆthw_video_modelR!thw_video_ramishw_video:ram_max_mbtreq_vramtmax_vram(svgascirrussvmvgasxensqxl(R¦tLibvirtConfigGuestVideoRRR*RRöRR‹R^RRtPPCtPPC64tPPC64LERzR¼R)R›R@RtInvalidVideoModeRnR3tRequestedVRamTooHighRRÎRótvramR5(	RIR1RØRtVALID_VIDEO_DEVICEStvideoRt	video_ramRC((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_add_video_drivers.cCsEtjƒ}d|_d|_dd|jf|_|j|ƒdS(Ntunixsorg.qemu.guest_agent.0s /var/lib/libvirt/qemu/%s.%s.sock(R¦tLibvirtConfigGuestChannelRttarget_nameRRþR5(RIR1Rtqga((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_add_qga_device&s		cCs±tjƒ}|jjddƒ}|jjddƒ}|r]t|ƒ|_t|ƒ|_ntjj	}|r—t
jj|ƒr—t
jd|ƒ‚n||_|j|ƒdS(Nshw_rng:rate_bytesishw_rng:rate_periodR(R¦tLibvirtConfigGuestRngR3R›Rnt
rate_bytestrate_periodR‹R^trng_dev_pathRnRR§RtRngDeviceNotExistRÜR5(RIR1Rt
rng_deviceRUR trng_path((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_add_rng_device.s	cCsš|jjdtƒr;tjdd|ƒ|j||ƒn|jjdƒdk}|jjddƒ}tj|ƒ}|r–|r–|j	||ƒndS(NRos2Qemu guest agent is enabled through image metadataRthw_rng_modelRÉshw_rng:allowedR„(
R)R›RëR“RRSR3RRrR[(RIR1RRRØt
rng_is_virtiotrng_allowed_strtrng_allowed((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_set_qemu_guest_agent;sc	Cs¸t}|r6x'|jD]}|jrt}PqqWntj|ƒ}d}|r„|j||ƒ}|r„tj	ƒ}||_
q„n|r´|sŸtj	ƒ}nt|_t|_n|S(N(
RëR®R¿RêR-RÙRlt%_get_memory_backing_hugepages_supportR¦tLibvirtConfigGuestMemoryBackingt	hugepagestlockedtsharedpages(	RIt
inst_topologyRFRt
wantsmempagesRÄt
wantsrealtimet
membackingtpages((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt _get_guest_memory_backing_configGs(		cCs|jƒstjƒ‚n|jƒ}|dkrBtjƒ‚ng|jdjD]}|j^qS}|jƒ|d}g}xt	|jƒD]\}}	|	j
r’|	j
|kr’xX|jD]J}
||
jkrÀt
jƒ}|g|_|	j
|_|j|ƒPqÀqÀWq’q’W|S(Ni(t_has_hugepage_supportRtMemoryPagesUnsupportedRËRlR®R¼R½R¾RÆR¿RâRÏR¦t#LibvirtConfigGuestMemoryBackingPageRÐR(RIRfRFRÀRÂRÃtsmallestRjtguest_cellidt	inst_cellRó((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRaas(#


cCs|dk	r|S|jS(N(RlR(RIRORR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_flavor„scCsetjtjg}|jjƒ}|jjj|kod|jjtƒodt	j
jt|jjjƒS(N(
RR¸R‰RxRµR2R¶RÏtMIN_LIBVIRT_UEFI_VERSIONRnRR§tDEFAULT_UEFI_LOADER_PATH(RItsupported_archsR¹((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_has_uefi_support‰s
cCs‚ttjjƒdks+|jjtƒr/gSg}|jƒ}x:tjjD],}|j||dƒrN|j	|ƒqNqNW|S(NiR(
R‰R‹R^tenabled_perf_eventsRxRÏtMIN_LIBVIRT_PERF_VERSIONt
_get_cpu_infot_supported_perf_eventR(RItsupported_eventst
host_cpu_infotevent((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRˑscCsst|jƒ}tt|ƒs9tjtdƒ|ƒtS|tkrot||krotjtdƒ|ƒtSt	S(Ns&Libvirt doesn't support event type %s.s$Host does not support event type %s.(
tLIBVIRT_PERF_EVENT_PREFIXtupperR„R^R“R”RRëtPERF_EVENTS_CPU_FLAG_MAPPINGRê(RIR}tcpu_featurestlibvirt_perf_event_name((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRzžsc	CsÝ|dkr3|jtjkrÙtjj|_qÙn¦|dkrj|jjj	t	j
t	jfkr„|j|ƒ|_
tjƒ|_n|jjdƒ}|tjjkr|jƒrøtsÖtjtdƒƒtant|jjj	|_d|_qtjƒ‚n|j ||ƒ|_!|jjdƒdkrXt#j$|j%jdd	ƒƒ|_&qÙ|jj'|_&no|d
kr‹d|_(t)|_*nN|dkr¬d
|_+||_,n-|dkrÙ|jtj-krÙd|_(qÙndS(NRÛRgRhthw_firmware_types^uefi support is without some kind of functional testing and therefore considered experimental.tpflashthw_boot_menushw:boot_menuR£RÄs
/sbin/initR÷s/usr/bin/linuxRÆ(skvmsqemu(.R*RR÷R‹R^txen_hvmloader_patht	os_loaderR2R¶RR·R¸RfReR¦tLibvirtConfigGuestSMBIOSt	os_smbiosR)R›R#tFirmwareTypetUEFIRvtuefi_loggedR“R”RRêRttos_loader_typeRtUEFINotSupportedRtos_mach_typeRlRRrR3tos_bootmenuR…tos_init_pathRüRûRútos_rootRB(	RIR1RR¹RRØRRþRƒ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_configure_guest_by_virt_type®s>!			c		Cs`|r"|j|||||ƒn:|jrJ|j||||||ƒntj|ƒ|_dS(N(RÿR"RR/tget_boot_ordertos_boot_dev(	RIRR1RþR'RRRØRÁ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_conf_non_lxc_umlÖs
	
cCsz|dkrj|j||||ƒ|jjjtjtjfkr[tjƒ}d|_qvtj	ƒ}ntjƒ}|S(NRhRgtsclp(sqemuskvm(
R;R2R¶RRŠR‹R¦R/R6R0(RIRR1RRRØR¹t
consolepty((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_create_consolesâs!cCsÛ|s
dS|stjƒ}n|j|_|j|_|j|_|j|_|j|_|jr‘tjd|jd|j	d|j
ƒ|_n	d|_g|j
D]$}tjd|jd|jƒ^q¤}||_
|S(sUpdate VirtCPUModel object according to libvirt CPU config.

        :param:cpu_config: vconfig.LibvirtConfigGuestCPU presenting the
                           instance's virtual cpu configuration.
        :param:vcpu_model: VirtCPUModel object. A new object will be created
                           if None.

        :return: Updated VirtCPUModel object, or None if cpu_config is None

        NR*R+R,Rtpolicy(R"tVirtCPUModelRtvendorR!RŠtmatchR*tVirtCPUTopologyR+R,R0RlRtVirtCPUFeatureRRš(RIt
cpu_configt
vcpu_modelRYR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_cpu_config_to_vcpu_modelñs&					1	cCsÙtjƒ}|j|_|j|_|j|_|j|_|j|_|jr|jj|_|jj	|_	|jj
|_
n|jrÕxH|jD]:}tjƒ}|j
|_
|j|_|jj|ƒq”Wn|S(s§Create libvirt CPU config according to VirtCPUModel object.

        :param:vcpu_model: VirtCPUModel object.

        :return: vconfig.LibvirtConfigGuestCPU.

        (R¦R&RR!RŠRRœR0R*R+R,RtLibvirtConfigGuestCPUFeatureRRštadd(RIR¡R RYtxf((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_vcpu_model_to_cpu_configs"			cCsW|j}tj|ƒ}	|d}
tjj}tjƒ}||_|j|_|j	|_	|j
tj|_
|j|_tjƒ}
tj|dƒ}|j|j||
|ƒ}|j|_|j|_|j|_|j|j|j|ƒ|_|jj|j||ƒƒ|jƒ|_x|jD]}|j |ƒq*W|j!|||ƒ|j"|||j#|jƒ|_$|j%|j$|j&ƒ|_&d|
kr¶t'j(|
ddƒ}nd}|rÎ||_*nt+j,|ƒpé|j-|ƒ|_.|j/j0ƒ}|j1|||||||ƒ|dkrN|j2||||||	||ƒn|j3||j.||ƒ|j4||j.||ƒ|j5|||||||j.ƒ}x|D]}|j6|ƒq«Wx?|D]7}|j7j8||||||j/ƒ}|j6|ƒqÉW|j9||||||ƒ}|dkrGd|_:|j6|ƒn|j;|j.|ƒ}|rr|j6|ƒntj<j=r»tj<j>r»|dkr»tj?ƒ}d
|_@|j6|ƒntA}tjBj=r"|dkr"tjCƒ}d|_:tjBjD|_DtjBjE|_F|j6|ƒtG}ntj<j=rƒ|dkrƒtjCƒ}d|_:tj<jD|_Dtj<jH|_F|j6|ƒtG}n|rŸ|jI|||ƒn|dkrÄ|jJ||||ƒn|dkrxWtj|ƒD]}|j6|jK|ƒƒqàWn'tL|ƒdkr*tMjNd|ƒ‚nd|jOkrUtPjQtRdƒd|ƒn|jOjSdƒp||jOjSdƒp|d}|jTjSd|ƒ}|dkrétUjV|ƒrÔtjWƒ}||_X|j6|ƒqétMjYd|ƒ‚n|dkrStjjZdkrStj[ƒ}|d kr+d|_\n	d	|_\tjjZ|_]|j6|ƒn|S(!sýGet config data for parameters.

        :param rescue: optional dictionary that should contain the key
            'ramdisk_id' if a ramdisk is needed for the rescue image and
            'kernel_id' if a kernel is needed for the rescue image.
        R*RRyRøRÄR÷RÆRPRÛscom.redhat.spice.0RpRzRhRgiRthw_watchdog_actions˜Old property name "hw_watchdog_action" is now deprecated and will be removed in the next release. Use updated property name "hw:watchdog_action" insteadRshw:watchdog_actionRtactionRÉN(slxcsuml(slxcsumlsxen(slxcsuml(slxcsumlsxen(sqemuskvm(sxensqemuskvm(sxensqemuskvm(sqemuskvm(^RRRR‹R^RR¦R§RR	RzRRóR{R|R-tget_vcpu_pin_setRlRmRôR(RCRDRFRkRiR3RRRžR”R}tadd_perf_eventR«R1RER¶R¢R¡RRDRlRþRtget_from_instanceRùR*RxRµR“R–R&R	RVR5RƒRÅR™Rt_get_guest_pointer_modelRzR¼t
agent_enabledRPRQRëRptLibvirtConfigGuestGraphicstkeymaptvncserver_listentlistenRêt
server_listenRNR`RÿR‰RtPciDeviceUnsupportedHypervisorR3R“R”RR›R)R=tis_valid_watchdog_actiontLibvirtConfigGuestWatchdogR¨tInvalidWatchdogActiontmem_stats_period_secondstLibvirtConfigMemoryBalloonR!R (RIRR
RØRÁR'RRRRRR¡RR1RäRtguest_numa_configR}RþR¹tstorage_configsR0R:R˜tpointertchanneltadd_video_drivertgraphicsRtwatchdog_actiontbarktballoon((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_guest_config2sô		
	


					
		
		
			cCsÎ|jjdtjƒ}|dkrLtjjrLd}tjt	dƒƒn|dkrÊtj
js}tjjrŠtjj
rŠ|j|ƒStjsŸtjjrµtjt	dƒƒqÊtjddƒ‚ndS(Nthw_pointer_modelt	usbtablets˜The option "use_usb_tablet" has been deprecated for Newton in favor of the more generic "pointer_model". Please update nova.conf to address this change.s—USB tablet requested for guests by host configuration. In order to accept this request VNC should be enabled or SPICE and SPICE agent disabled on host.R!(R)R›R‹t
pointer_modelRlR^tuse_usb_tabletR“R”RRpR¼RzR­t_get_guest_usb_tabletRt UnsupportedPointerModelRequested(RIR*RØRÅ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR¬æs	
	cCswd}|tjkr6tjƒ}d|_d|_n=tjsKtj	j
ratjt
dƒƒntjddƒ‚|S(Nttablettusbs„USB tablet requested for guests by host configuration. In order to accept this request the machine mode should be configured as HVM.R!RÄ(RlRR÷R¦tLibvirtConfigGuestInputRRÊR‹RÅR^RÆR“R”RRRÈ(RIR*RÉ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRÇ
s			cCs£t|ƒ}di|d6|d6|d6|d6|d6}	tjtj|	ƒd|ƒ|j|||||||ƒ}
|
jƒ}tjdi|d	6d|ƒ|S(
NsžStart _get_guest_xml network_info=%(network_info)s disk_info=%(disk_info)s image_meta=%(image_meta)s rescue=%(rescue)s block_device_info=%(block_device_info)sR
RÁRØR'RRRsEnd _get_guest_xml xml=%(xml)sR‹(RGR“RRt
mask_passwordRÂR²(RIRRR
RÁRØR'RRtnetwork_info_strRâR³R‹((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRs			cCs"|jj|ƒ}|j|jƒS(søRetrieve information from libvirt for a specific instance name.

        If a libvirt error is encountered during lookup, we might raise a
        NotFound exception or Error exception depending on how severe the
        libvirt error is.

        (RxRR&(RIRR1((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR&9scCsštj|ƒ}|pi}|jdiƒ}|j||ƒr³tj|ƒ}tj|ƒ}tj	|t
jj||ƒ}|j
|d|ƒ|ddd}	tj|	ƒ}
n'|jj|dƒ}|j|jƒ}
tjj|dƒ}tj|ƒtj|
d|ƒ}
yQ|
r*|
|jd<nt
jjsBt
jjra|jƒ}tj||ƒnWn1t k
r•t!j"ƒ|j#|ƒWdQXnXdS(	NR*RWRZtdevice_pathRRRR($RRR›R¢R+ReRtget_root_bdmR/R×R‹R^RRÃtimgmodeltLocalBlockImageRR R®R¯RnRRÁR
RTRtsetup_containerRRÌRÍRžtchown_for_id_mapsRdR	RCt_create_domain_cleanup_lxc(RIRRØRRRÁRR¡RtRºRõtimage_modelR RRR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_create_domain_setup_lxcFs6	
	

cCs£tj|ƒ}tjj|dƒ}y|j|ƒj}Wntjk
rVd}nX|t
jkrtj
d|d|ƒtjd|ƒntjd|ƒdS(NRs.Attempting to unmount container filesystem: %sRR(RRRnRRÁR&R'RR)RlRRÙR“RRtclean_lxc_namespaceR(RIRRRR'((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRÔns
	
ccsOtjjdkrdVdS|j||||ƒz	dVWd|j|ƒXdS(sPContext manager to handle the pre and post instance boot,
           LXC specific disk operations.

           An image or a volume path will be prepared and setup to be
           used by the container, prior to starting it.
           The disk will be disconnected and unmounted if a container has
           failed to start.
        RÄN(R‹R^RRÖRÔ(RIRRØRRRÁ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_lxc_disk_handler‚s
	cCs‚|r7tjj||jƒ}|dk	rF|ƒqFntj|ƒ}|sR|re|jd|ƒntjƒs~|jƒn|S(sÐCreate a domain.

        Either domain or xml must be passed in. If both are passed, then
        the domain definition is overwritten from the xml.

        :returns guest.Guest: Guest just created
        RiN(	RçtGuesttcreateRxRltlaunchRt
is_neutrontenable_hairpin(RIR‹RhRRiR,R1((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRj›s	

cCsItjtdƒi|d6|jd6d|ƒtjrEtjƒ‚ndS(NsANeutron Reported failure on event %(event)s for instance %(uuid)sR}R	R(R“RFRR	R‹tvif_plugging_is_fatalRtVirtualInterfaceCreateException(RIt
event_nameR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_neutron_failed_callback³s
	cCs9g|D].}|jdtƒtkrd|df^qS(NR snetwork-vif-pluggedR((R›RêRë(RIR
R:((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_neutron_events»sc
CsGz#|r"|jƒr"|jƒnWd|j||d|d|ƒXdS(NR
RR(RêR5RQ(RIRRR
RRR1((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_cleanup_failed_startÄs
cCsÖtj|ƒ}x’|D]Š}|d}
|rd|
krd|
dkr|
dd}tj||j||
ƒ}|r |j|
|ƒ}|j||q qqWtj}|j	rçt
jƒrç|	rç|rç|rç|j|ƒ}ng}t
|ƒ}d	}y»|jj||d|d|jƒ‘|j||ƒ|jj||ƒ|jj||ƒ|j||j||ƒ&|j|d|d|d|
ƒ}Wd	QX|jj||ƒWd	QXWntjk
rütjƒ|j|||||ƒWd	QXnÃtj j!k
rit"j#t$d
ƒi|j%d6d|ƒtj&r¿|j|||||ƒtjƒ‚q¿nVt'k
r¾t"j(t)d
ƒd|ƒtjƒ|j|||||ƒWd	QXnX|rÒ|j*ƒn|S(s,Do required network setup and create domain.RWRZR[tdeadlineterror_callbackRiRR,Ns?Timeout waiting for vif plugging callback for instance %(uuid)sR	RsFailed to start libvirt guest(+R+ReR?RgR–RhRÛR‹tvif_plugging_timeoutR‘RRÜRâR RlR§twait_for_instance_eventRáRR€Rtprepare_instance_filterRØRØRjtapply_instance_filterRRßR	RCRãteventletRtTimeoutR“R”RR	RÞRdRFRR(RIRR‹RR
RÁRRRRRR,RtRuRWR[RwRxRteventsRiR1((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRÍst	

					


	



cCsDy|jjƒ}Wn(tjk
r=tjtdƒƒdSXtjsK|St	j
ƒ}d}y|jjƒ}WnFtjk
r¸}|j
ƒ}tjtdƒi|d6|d6ƒnX|r||ks:tdƒit|ƒd6t|ƒd6f}tj|ƒ‚q:n.t|ƒd	|kr:tjtd
ƒƒ‚nt|ƒS(szGet available vcpu number of physical computer.

        :returns: the number of cpu core instances can be used.

        sZCannot get the number of cpu, because this function is not implemented for this platform. iscCouldn't retrieve the online CPUs due to a Libvirt error: %(error)s with error code: %(error_code)sRFRsŠInvalid vcpu_pin_set config, one or more of the specified cpuset is not online. Online cpuset(s): %(online)s, requested cpuset(s): %(req)stonlinetreqiÿÿÿÿs9Invalid vcpu_pin_set config, out of hypervisor cpu range.N(Rxt
get_cpu_countR^R6R“R”RR‹tvcpu_pin_setR-R©Rltget_online_cpusR7RtsortedRRíR‰(RIttotal_pcpust
available_idstonline_pcpusRãRRâ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_vcpu_totals2			cCs˜tjjdkr*tjtjjƒ}n9tjjdkrQtjƒjƒ}nt	j
tjƒ}x.tj
|ƒD]\}}|tj||<qsW|S(s!Get local storage info of the compute node in GB.

        :returns: A dict containing:
             :total: How big the overall usable filesystem is (in gigabytes)
             :free: How much space is free (in gigabytes)
             :used: How much space is used (in gigabytes)
        R8R^(R‹R^RkR8tget_volume_group_infoR¦RXR˜t
get_pool_infoRtget_fs_infoR®Rt	iteritemsRRò(R¾R©tv((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_local_gb_infoEs
cCsÀd}tjjdkr |dSx™|jjƒD]ˆ}y5|jƒ}|dk	rj|tt|ƒƒ7}nWn=tj	k
rª}t
jtdƒi|j
d6|d6ƒnXtjdƒq0W|S(sƒGet vcpu usage number of physical computer.

        :returns: The total number of vcpu(s) that are currently being used.

        iRÄisJcouldn't obtain the vcpu count from domain id: %(uuid)s, exception: %(ex)sR	RãN(R‹R^RRxRtget_vcpus_infoRlR‰tlistR6R“R”RR	RRð(RIttotalR1R|R#((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_vcpu_used\s	cCs|jjƒ}tƒ}xb|jD]W}xN|jD]C}tj|jƒtj|ƒtj|j	ƒf}|j
|ƒq2Wq"W|S(s&Get hypervisor instance capabilities

        Returns a list of tuples that describe instances the
        hypervisor is capable of hosting.  Each tuple consists
        of the triplet (arch, hypervisor_type, vm_mode).

        :returns: List of tuples describing instance capabilities
        (RxRµRþtgueststdomtypeRtcanonicalizeRRtostypeR(RIR¹t
instance_capstgtdttinstance_cap((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_instance_capabilitiesus		cCs|jjƒ}tƒ}|jjj|d<|jjj|d<|jjj|d<tƒ}tt	|jj
ddgƒƒ|d<|jjj|d<|jjj|d<|jjj
|d<||d	<tƒ}x'|jjjD]}|j|jƒqÛW||d
<|S(sˆGet cpuinfo information.

        Obtains cpu feature from virConnect.getCapabilities.

        :return: see above description

        RR!RœR®iR*R+R,R0R(RxRµtdictR2R¶RR!RœR‰tgetattrR0R*R+R,RÓRR¤R(RIR¹tcpu_infoR0RRY((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRyŠs 			%
	
csè‡fd†}ˆjj|ƒ}|jdƒ}tjƒ}|j|ƒd|jj|jj|jj	|jj
f}i|jd6|d6d|jjd6d|jj
d6}|jj|d	<d
||d<|j|||ƒƒ|S(sReturns a dict of PCI device.cs
x²|jjD]¤}|jdkr3itjjd6S|jdkr
t|jƒdkr
d|jdd|jdd|jdd|jddf}itjjd6|d	6Sq
Wˆj	j
tƒsùtj
tj|ƒŒ}|rùitjjd6Snitjjd6S(
sIGet a PCI device's device type.

            An assignable PCI device can be a normal PCI device,
            a SR-IOV Physical Function (PF), or a SR-IOV Virtual
            Function (VF). Only normal PCI devices or SR-IOV VFs
            are assignable, while SR-IOV PFs are always owned by
            hypervisor.
            tvirt_functionstdev_typet
phys_functionis%04x:%02x:%02x.%01xiiitparent_addr(tpci_capabilitytfun_capabilityRR#t
PciDeviceTypetSRIOV_PFR‰tdevice_addrstSRIOV_VFRxRÏt&MIN_LIBVIRT_PF_WITH_NO_VFS_CAP_VERSIONRtis_physical_functiontget_pci_address_fieldstSTANDARD(tcfgdevtpci_addresstfun_captphys_addressR(RI(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_device_typeªs*	
		is%04x:%02x:%02x.%1xtdev_idRs%04xt
product_idt	vendor_idt	numa_nodes"label_%(vendor_id)s_%(product_id)stlabel(RxR÷tXMLDescR¦tLibvirtConfigNodeDevicet	parse_strRRhRÊRRRR!R"R#RN(RItdevnameRtvirtdevtxmlstrRRRÕ((RIsM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_pcidev_info§s&'
			
cCsét|dtƒstjgƒSy|jjƒp4g}Wnttjk
r®}|jƒ}|tj	kr¨t
|_tj
tdƒi|jƒd6|d6ƒtjgƒS‚nXg}x$|D]}|j|j|ƒƒq¼Wtj|ƒS(sGet host PCI devices information.

        Obtains pci devices information from libvirt, and returns
        as a JSON string.

        Each device information is a dictionary, with mandatory keys
        of 'address', 'vendor_id', 'product_id', 'dev_type', 'dev_id',
        'label' and other optional device specific information.

        Refer to the objects/pci_device.py for more idea of these keys.

        :returns: a JSON string containing a list of the assignable PCI
                  devices information
        t_list_devices_supporteds3URI %(uri)s does not support listDevices: %(error)sRùRF(RRêRtdumpsRxtlist_pci_devicesR^R6R7RRëR,R“R”RRuRR+(RIt	dev_namesRãRtpci_infoR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_pci_passthrough_devicesês 
	

cCsÿxatD]Y}|jj|ƒrt|dtƒs\tjtdƒ|j|ƒƒt	|_
ntSqWittj
tjf6ttjtjf6}|jjƒ}t}xS|jƒD]E\}}|jjj|kr²|jj|ttjƒr²t	}q²q²W|S(Nt_bad_libvirt_numa_version_warns You are running with libvirt version %s which is known to have broken NUMA support. Consider patching or updating libvirt on this host if you need NUMA support.(tBAD_LIBVIRT_NUMA_VERSIONSRxR¸RRëR“R”RRÃRêR2tMIN_LIBVIRT_NUMA_VERSIONRR·R¸tMIN_LIBVIRT_NUMA_VERSION_PPCRFRGRµtitemsR2R¶RÏtMIN_QEMU_NUMA_HUGEPAGE_VERSIONRC(RIRõtsupport_matrixR¹tis_supportedtarchsRÇ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRÉs$

cCs[tjtjtjtjg}|jjƒ}|jjj|koZ|jj	t
ttjƒS(N(
RR·R¸RGRFRxRµR2R¶RÏtMIN_LIBVIRT_HUGEPAGE_VERSIONR7RC(RIRuR¹((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRl,sc
Cs|jƒsdS|jjƒ}|jj}|dksA|jrEdSg}tjƒ}|jj	ƒ}|ry||M}n|}d„}xg|jD]\}t
d„|jDƒƒ}tt
t
t
d„|jDƒƒƒƒ}	||M}g|	D]}
|
|@^qê}	g|	D]}
t|
ƒdkr|
^q}	g}|jƒr’g|jD]B}tjd|jd|jddd	|||j|jƒƒ^qG}ntjd
|jd|d|jtjd
dddd|	dt
gƒd|ƒ}|j|ƒq’Wtjd|ƒS(NcSs%|jj|iƒ}|j|dƒS(Ni(R¦R›(RItcell_idt	page_sizeRÄ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_reserved_memory_for_cellHscss|]}|jVqdS(N(R((RÇR¶((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pys	<genexpr>Mscss-|]#}|jr!t|jƒndVqdS(N((tsiblingsttuple(RÇR¶((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pys	<genexpr>OsiR½RÿtuseditreservedR(RCR{t	cpu_usagetmemory_usageR?tpinned_cpusR¼R®(RÉRxRµR2R0RlR®R-R©RñRÓR°RòR©R‰RlR¼R"tNUMAPagesTopologyRºRÿR(tNUMACellR{RRóRtNUMATopology(
RIR¹R0R®Rätonline_cpusR>RÄRCR?tsibR¼Rj((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRË6sB
			
+R	cCsûg}xî|D]æ}|d}xÓ|dD]Ç}|d}|jdƒrT|d}n|d}tjd|d|ƒ|j||ƒ}	|	r(td|d|d	|	d
d|	dd
|	dd|	dƒ}
tjd|
d|ƒ|j|
ƒq(q(Wq
W|S(sRReturn usage info for volumes attached to vms on
           a given host.
        Rt
instance_bdmsRÎs/dev/iR[s%Trying to get stats for the volume %stvolumetrd_reqitrd_bytesitwr_reqitwr_bytesis„Got volume usage stats for the volume=%(volume)s, rd_req=%(rd_req)d, rd_bytes=%(rd_bytes)d, wr_req=%(wr_req)d, wr_bytes=%(wr_bytes)d(R™R“Rtblock_statsR
R(RIRtcompute_host_bdmst	vol_usageRKRRáRàR[t	vol_statststats((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytget_all_volume_usagems.




	





cCsÂy,|jj|ƒ}|j}|j|ƒSWntjk
r‹}|jƒ}tjt	dƒi|j
d6|d6|d6|d6d|ƒn3tjk
r½tjt	dƒ|j
d|ƒnXdS(	s/Note that this function takes an instance name.s‚Getting block stats failed, device might have been detached. Instance=%(instance_name)s Disk=%(disk)s Code=%(errcode)s Error=%(e)sRRR"R#RsSCould not find domain in libvirt for instance %s. Cannot get block stats for deviceN(
RxRR<t
blockStatsR^R6R7R“R¾RRRR)(RIRtdisk_idR1RhR#R"((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRQs	
	cCsidd6dd6dd6S(Ns	127.0.0.1RtfakeuserRttfakepasswordtpassword((RIRb((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytget_console_pool_info§s
cCs|jj|ƒdS(N(R€trefresh_security_group_rules(RItsecurity_group_id((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR]¯scCs|jj|ƒdS(N(R€trefresh_instance_security_rules(RIR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR_²scCsQ|jƒ}i}|jƒ|d<|jƒ|d<|jjƒ|d<|d|d<|jƒ|d<|jjƒ|d<|d|d	<|jjƒ|d
<|jjƒ|d<|jj	ƒ|d<t
j|jƒƒ|d
<|d}|j
ƒ}|tj|}|tj|d<|jƒ|d<|jƒ}|rC|jƒ|d<n
d|d<|S(sRetrieve resource information.

        This method is called when nova-compute launches, and
        as part of a periodic task that records the results in the DB.

        :param nodename: unused in this driver
        :returns: dictionary containing resource info
        tsupported_instancesR|RzRÿtlocal_gbt
vcpus_usedtmemory_mb_usedRAt
local_gb_usedthypervisor_typethypervisor_versionthypervisor_hostnameRtfreetdisk_available_leasttpci_passthrough_devicesR(N(RüR	RöRxtget_memory_mb_totalRtget_memory_mb_usedtget_driver_typeR7tget_hostnameRR-Ryt#_get_disk_over_committed_size_totalRRòR1RËt_to_jsonRl(RItnodenametdisk_info_dictRZtdisk_free_gbtdisk_over_committedtavailable_leastR(((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytget_available_resourceµs.



cCs„|jjƒjƒrdStj|ƒ}tjj|ƒs>dSt	j
d|ƒ\}}tjd|d|ƒtj
|ƒi|d6S(sCheck if instance files located on shared storage.

        This runs check on the destination host, and then calls
        back to the source host to check the results.

        :param context: security context
        :param instance: nova.objects.instance.Instance object
        :returns:
         - tempfile: A dict containing the tempfile info on the destination
                     host
         - None:

            1. If the instance path is not existing.
            2. If the image backend is shared block storage type.
        RsfCreating tmpfile %s to verify with other compute node that the instance is on the same shared storage.RRÕN(RRÜR_RlRRRnRR§ttempfiletmkstempR“RRŠ(RIRRRŒRttmp_file((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt#check_instance_shared_storage_localìs	

cCstjj|dƒS(NRÕ(RnRR§(RIRRZ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt$check_instance_shared_storage_remotescCstj|dƒdS(NRÕ(R
tdelete_if_exists(RIRRZ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt%check_instance_shared_storage_cleanupscCsÛ|d}|tjtj}|js5|jjrU|d}	|jd|	|ƒn|j|jd|ƒ|j|ƒ}
t	j
ƒ}|
|_tjj
|_|dk	r¶||_n|dk	rÎ||_n||_|S(sÑCheck if it is possible to execute live migration.

        This runs checks on the destination host, and then calls
        back to the source host to check the results.

        :param context: security context
        :param instance: nova.db.sqlalchemy.models.Instance
        :param block_migration: if true, prepare for block migration
        :param disk_over_commit: if true, allow disk over commit
        :returns: a LibvirtLiveMigrateData object
        RiRN(RRóR‹treserved_host_disk_mbR¡R!t_compare_cpuRlt _create_shared_storage_test_fileR"tLibvirtLiveMigrateDataRÕR^RkR7tblock_migrationtdisk_over_committdisk_available_mb(RIRRtsrc_compute_infotdst_compute_infoR‚Rƒtdisk_available_gbR„tsource_cpu_infoRÕRZ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt"check_can_live_migrate_destinations 

		cCs|j}|j|ƒdS(svDo required cleanup on dest host after check_can_live_migrate calls

        :param context: security context
        N(RÕt!_cleanup_shared_storage_test_file(RIRtdest_check_dataRÕ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt(cleanup_live_migration_destination_check;s	cCsšt|tjƒs4tjƒ}|j|ƒ|}ntj}|j|j	|ƒ|_
|j|||ƒ|_|j
|d|ƒ}|j||ƒ}|j||ƒ}	d|krÅ|jƒ|_n|jr2|jƒrtdƒ}
tjd|
d|ƒ‚nd|kr/|j|||j|j|ƒn|rx|jdƒ}|rÎ|jjtƒrÎdjgtD]}t|ƒ^qjƒ}
td	ƒi|jd
6|
d6}tj |d|ƒtj!d|ƒ‚n|r/|j"t#j$@d
kr/tdƒi|jd
6}tj |d|ƒtj!d|ƒ‚q/qxnF|jpN|j
pN|oN|	sxtdƒ}
tj%d|
d|ƒ‚nt&j'|dt(ƒ}||_)|S(sêCheck if it is possible to execute live migration.

        This checks if the live migration can succeed, based on the
        results from check_can_live_migrate_destination.

        :param context: security context
        :param instance: nova.db.sqlalchemy.models.Instance
        :param dest_check_data: result of check_can_live_migrate_destination
        :param block_device_info: result of _get_instance_block_device_info
        :returns: a LibvirtLiveMigrateData object
        RRR‚s4Block migration can not be used with shared storage.R½RRƒRtRÀsCannot block migrate instance %(uuid)s with mapped volumes. Selective block device migration feature requires libvirt version %(libvirt_ver)sR	RÇRisŽCannot block migrate instance %(uuid)s with mapped volumes. Selective block device migration is not supported with tunnelled block migrations.svLive migration can not be used without shared storage except a booted from volume VM which does not have a local disk.Rá(*RÝtmigrate_data_objtLiveMigrateDataR"Rtfrom_legacy_dictR‹R2t_check_shared_storage_test_fileRÕtis_shared_instance_patht_is_shared_block_storageR_R|R¢R£tis_on_shared_storageR‚RRtInvalidLocalStoraget!_assert_dest_node_has_enough_diskR„RƒR›RxRÏt)MIN_LIBVIRT_BLOCK_LM_WITH_VOLUMES_VERSIONRÁRGR	R“RFtMigrationPreCheckErrorR£R^RåtInvalidSharedStorageRRRêtinstance_relative_path(RIRRR‹RRtmd_objR‘tdisk_info_textRÑthas_local_diskR½RáRÂRõRât
instance_path((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytcheck_can_live_migrate_sourceDsf
					

					
		c	Cs’|jdƒr=tjj|jkr=|jjƒjƒr=tS|j	r_|jjƒj
ƒr_tS|jrŽtt
j|j||ƒƒƒrŽtStS(s(Check if all block storage of an instance can be shared
        between source and destination of a live migration.

        Returns true if the instance is volume backed and has no local disks,
        or if the image backend is the same on source and destination and the
        backend shares block storage between compute nodes.

        :param instance: nova.objects.instance.Instance object
        :param dest_check_data: dict with boolean fields image_type,
                                is_shared_instance_path, and is_volume_backed
        R7(R0R‹R^RkR7RRÜR_RêR‘tis_file_in_instance_pathtis_volume_backedR RR{R|Rë(RIRR‹RR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR’­s
				cCsêd}|r|tj}n|j|d|ƒ}tj|ƒ}d}	|rtxJ|D]}
|	t|
dƒ7}	qSWn%x"|D]}
|	t|
dƒ7}	q{W||	dkrætdƒi|jd6|d6|	d6}tj	d	|ƒ‚nd
S(s:Checks if destination has enough disk for block migration.iRRt	disk_sizetvirt_disk_sizes„Unable to migrate %(instance_uuid)s: Disk of instance is too large(available on destination host:%(available)s < need:%(necessary)s)RR%t	necessaryR½N(
RRÎR|RR{RnRR	RR—(RIRRtavailable_mbRƒRRR%Røt
disk_infosR£R¾R½((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR•Îs$	

	
c
Cs'tjjdkrdS|dkrÛtj|ƒ}tjtdƒ|ƒt	j
ƒ}|d|_|d|_|d|_
|dd|_|dd	|_|dd
|_x:|dD]}|jt	j|ƒƒq¸Wn|j|ƒ}d}td
ƒ}y8|jƒ}	tjd|	d|ƒ|jj|	ƒ}
Wn›tjk
rÑ}|jƒ}|tjkrŒtjdi|jƒd6|d6ƒdStj|i|d6|d6ƒtjd|i|d6|d6ƒ‚nX|
dkr#tj|i|
d6|d6ƒtj d|i|
d6|d6ƒ‚ndS(sCheck the host is compatible with the requested CPU

        :param guest_cpu: nova.objects.VirtCPUModel or None
        :param host_cpu_str: JSON from _get_cpu_info() method

        If the 'guest_cpu' parameter is not None, this will be
        validated for migration compatibility with the host.
        Otherwise the 'host_cpu_str' JSON string will be used for
        validation.

        :returns:
            None. if given cpu info is not compatible to this server,
            raise exception.
        RgNs"Instance launched has CPU info: %sRR!RœR0R*R+R,RsEhttp://libvirt.org/html/libvirt-libvirt-host.html#virCPUCompareResults8CPU doesn't have compatibility.

%(ret)s

Refer to %(u)sscpu compare xml: %sRsZURI %(uri)s does not support cpu comparison. It will be proceeded though. Error: %(error)sRùRFRøtuR½i(skvm(!R‹R^RRlRR{R“R¾RR¦tLibvirtConfigCPURR!RœR*R+R,tadd_featuretLibvirtConfigCPUFeatureR¦RR²RRxtcompare_cpuR6R7RRuRFRR—tInvalidCPUInfo(
RIt	guest_cputhost_cpu_strRR¾R¶RYR¦R‘tcpu_xmlRøR#R((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR÷sB


		cCsTtj}tjd|ƒ\}}tjd|d|ƒtj|ƒtjj	|ƒS(s(Makes tmpfile under CONF.instances_path.Rs]Creating tmpfile %s to notify to other compute nodes that they should mount the same storage.R(
R‹R®RwRxR“RRnRŠRR‰(RIRRŒRRy((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR€7s		

cCsitjtjdƒtjjtj|ƒ}tjj|ƒsFt}nt	}t
jd||d|ƒ|S(ssConfirms existence of the tmpfile under CONF.instances_path.

        Cannot confirm tmpfile return False.
        s_Check if temp file %s exists to indicate shared storage is being used for migration. Exists? %sRN(RntutimeR‹R®RlRRÁR§RëRêR“R(RIRÕRRyR§((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRAs			cCs)tjjtj|ƒ}tj|ƒdS(s;Removes existence of the tmpfile under CONF.instances_path.N(RnRRÁR‹R®tremove(RIRÕRy((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRŠXscCs³|jj||ƒ|jj||ƒtttjƒƒ}xq|r®|jj||ƒr]Pn|jƒt	|ƒdkržt
dƒ}tj||j
ƒ‚ntjdƒq>WdS(s[Ensure that an instance's filtering rules are enabled.

        When migrating an instance, we need the filtering rules to
        be configured on the destination host before starting the
        migration.

        Also, when restarting the compute service, we need to ensure
        that filtering rules exist for all running services.
        is)The firewall filter for %s does not existiN(R€RRèRþRR‹tlive_migration_retry_counttinstance_filter_existsRQR‰RRRÑRRRð(RIRR
t
timeout_countRâ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt#ensure_filtering_rules_for_instance]s		
cCs|jjƒdS(N(R€tfilter_defer_apply_on(RI((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRµyscCs|jjƒdS(N(R€tfilter_defer_apply_off(RI((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR¶|scCsGtj|ƒs$tjd|ƒ‚n|j|||||||ƒdS(s§Spawning live_migration operation for distributing high-load.

        :param context: security context
        :param instance:
            nova.db.sqlalchemy.models.Instance object
            instance object that is migrated.
        :param dest: destination host
        :param post_method:
            post operation method.
            expected nova.compute.manager._post_live_migration.
        :param recover_method:
            recovery method when any exception occurs.
            expected nova.compute.manager._rollback_live_migration.
        :param block_migration: if true, do block migration.
        :param migrate_data: a LibvirtLiveMigrateData object

        RKN(Rtis_valid_hostnameRtInvalidHostnamet_live_migration(RIRRRütpost_methodtrecover_methodR‚R$((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytlive_migrations
	cCse|jj|ƒ}|j}y|jƒWn5tjk
r`}tjtdƒ|d|ƒ‚nXdS(skAborting a running live-migration.

        :param instance: instance object that is in migration

        sFailed to cancel migration %sRN(	RxRR<tabortJobR^R6R“RFR(RIRR1RR#((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytlive_migration_abortžs	
c	Csäd
}tjj|k}tjj|k}tjjr=|sPtjjrq|rqtdƒ}tjd|ƒ‚n|rà|j	dƒ|k}|j	dƒ|k}tjjr´|sÇtjjrà|ràt
jtd	ƒƒqàndS(Ns0.0.0.0s	127.0.0.1s::s::1s^Your libvirt version does not support the VIR_DOMAIN_XML_MIGRATABLE flag or your destination node does not support retrieving listen addresses.  In order for live migration to work properly, you must configure the graphics (VNC and/or SPICE) listen addresses to be either the catch-all address (0.0.0.0 or ::) or the local address (127.0.0.1 or ::1).R½RpRzs«Your libvirt version does not support the VIR_DOMAIN_XML_MIGRATABLE flag, and the graphics (VNC and/or SPICE) listen addresses on the destination node do not match the addresses on the source node. Since the source node has listen addresses set to either the catch-all address (0.0.0.0 or ::) or the local address (127.0.0.1 or ::1), the live migration will succeed, but the VM will continue to listen on the current addresses.(s0.0.0.0s	127.0.0.1s::s::1(
R‹RpR°RzR²R¼RRtMigrationErrorR›R“R”R(RItlisten_addrstLOCAL_ADDRSt	local_vnctlocal_spiceRâtdest_local_vnctdest_local_spice((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt*_check_graphics_addresses_can_live_migrate¯s	cCs1tjjr-tdƒ}tjd|ƒ‚ndS(NsYour libvirt version does not support the VIR_DOMAIN_XML_MIGRATABLE flag or your destination node does not support retrieving listen addresses.  In order for live migration to work properly you must either disable serial console or upgrade your libvirt version.R½(R‹R2R¼RRR¿(RIRâ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt"_verify_serial_console_is_disabled×scCsîy’|jr|j}n	|j}tj|ƒ}	|jjƒ}
|
sM|	rg|j|	ƒ|jƒnd}d|kr¹|j
dk	r¹|j
}|tj@dkr¹|j
|ƒ}q¹nd}d}
|jjƒrþ|	sã|jrþtj|||jƒ}n|jjtƒrWitjjd6|d6|d6}
|tj@dkrW|
jdƒqWn|j|j|ƒd|d|d|
d	|dtjjƒWnBtk
rÖ}tjƒ!tjtd
ƒ|d|ƒWdQXnXtjd
d|ƒdS(s•Invoke the live migration operation

        :param context: security context
        :param instance:
            nova.db.sqlalchemy.models.Instance object
            instance object that is migrated.
        :param dest: destination host
        :param block_migration: if true, do block migration.
        :param migrate_data: a LibvirtLiveMigrateData object
        :param guest: the guest domain object
        :param device_names: list of device names that are being migrated with
            instance

        This method is intended to be run in a background thread and will
        block that thread until the migration is finished or failed.
        ttarget_connect_addrit	bandwidthtdestination_xmlt
migrate_diskstmigrate_uritflagstparamst
domain_xmlsLive Migration failure: %sRNs'Migration operation thread has finished(R‚R£R¢Rstgraphics_listen_addrsRxtis_migratable_xml_flagRÆRÇRlRÈR^RåRÿtbdmstget_updated_guest_xmlRÆRÏR–R‹tlive_migration_bandwidthRQtmigrateRþRdR	RCR“RFRR(RIRRRüR‚R$R1tdevice_namesRàRÀtmigratable_flagRÌtnew_xml_strRÎR#((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_live_migration_operationãsX			

			


*ccstjj}tjj}tjj}|tjjjkrKtjjj}n|tjjjkrrtjjj}n|tjjj	kr™tjjj	}nt
||ƒ}|t|dƒ}||dt|ƒ}x;t|dƒD])}t
||ƒt
|||ƒfVqæWdS(s³Calculate downtime value steps and time between increases.

        :param data_gb: total GB of RAM and disk to transfer

        This looks at the total downtime steps and upper bound
        downtime value and uses an exponential backoff. So initially
        max downtime is increased by small amounts, and as time goes
        by it is increased by ever larger amounts

        For example, with 10 steps, 30 second step delay, 3 GB
        of RAM and 400ms target maximum downtime, the downtime will
        be increased every 90 seconds in the following progression:

        -   0 seconds -> set downtime to  37ms
        -  90 seconds -> set downtime to  38ms
        - 180 seconds -> set downtime to  39ms
        - 270 seconds -> set downtime to  42ms
        - 360 seconds -> set downtime to  46ms
        - 450 seconds -> set downtime to  55ms
        - 540 seconds -> set downtime to  70ms
        - 630 seconds -> set downtime to  98ms
        - 720 seconds -> set downtime to 148ms
        - 810 seconds -> set downtime to 238ms
        - 900 seconds -> set downtime to 400ms

        This allows the guest a good chance to complete migration
        with a small downtime value.
        iN(
R‹R^tlive_migration_downtimetlive_migration_downtime_stepstlive_migration_downtime_delaytnovaR³tLIVE_MIGRATION_DOWNTIME_MINt!LIVE_MIGRATION_DOWNTIME_STEPS_MINt!LIVE_MIGRATION_DOWNTIME_DELAY_MINRntfloatR(tdata_gbtdowntimetstepsRRRR—((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_migration_downtime_stepsgsc
Cs7g}g}g}|jtj@dkr´|jjtƒr´tjj||j	ƒ}t
j||ƒ}t
j|ƒ}	x>|	D]3}
t
|
djddƒdƒ}|j|ƒqzWnxv|jƒD]h}|jsÁ|jrßqÁn|jdkrôqÁn|j|kr	qÁn|j|jƒ|j|jƒqÁW||fS(sbGet list of disks to copy during migration

        :param context: security context
        :param instance: the instance being migrated
        :param guest: the Guest instance being migrated

        Get the list of disks to copy during migration.

        :returns: a list of local source paths and a list of device names to
            copy
        iRXRYiR tblock(sfilesblock(R£R^RåRxRÏR–R"tBlockDeviceMappingListtget_by_instance_uuidR	R+tget_block_device_infoReRGtrsplitRt
get_all_diskstreadonlyt	shareableR°R«Rþ(
RIRRR1t
disk_pathsRÖt
block_devicestbdm_listRRtblock_device_mappingsRáRÎRø((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_live_migration_copy_disk_pathsšs4
						
 c	CsÊ|jjtjtj}|dkr/d}nd}xŠ|D]‚}yBtj|ƒj}|tj}|dkryd}n||7}Wq<tk
r½}t	j
tdƒi|d6|d6ƒq<Xq<W||S(sRCalculate total amount of data to be transferred

        :param instance: the nova.objects.Instance being migrated
        :param disk_paths: list of disk paths that are being migrated
        with instance

        Calculates the total amount of data that needs to be
        transferred during the live migration. The actual
        amount copied will be larger than this, due to the
        guest OS continuing to dirty RAM while the migration
        is taking place. So this value represents the minimal
        data size possible.

        :returns: data size to be copied in GB
        iisUnable to stat %(disk)s: %(ex)sRRã(RRzRRÎRòRntstattst_sizeRˆR“R”R(	RIRRîtram_gbtdisk_gbRRºtsize_gbR#((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_live_migration_data_gbÇs	

	cCs|r
|jS|jS(N(R£R¢(RItis_block_migration((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_migration_flagsìsc
Cstƒ}|j||
ƒ}t|j|ƒƒ}
|j}d}|j|jƒ}d}tjƒ}|}d}d}|j	|ƒ}xpt
rö|jƒ}|jt
jkrþ|	jƒsÍtjdd|ƒqþtj||ƒ|_tjd|jd|ƒn|jt
jkr&tjdd|ƒnÀ|jt
jkrÀtj|||j|||ƒtjƒ}||}|dks”|dks”||jkr¦|j}|}ntj
j}ttj
j|ƒ}tj|||||||jƒrBy|jƒWqBt
jk
r>}tj t!dƒ|d|ƒ|j"|ƒ‚qBXn|rtj#|j$|j||jƒrtj%|||ƒn|j}tj&||||
|ƒ}|ddkr³d	}|j'dkråt(|j)d	|j'ƒ}ntj*||||ƒtj}|d
dkr tj+}n|t,dƒi|dd
6|d6|j-d6|j)d6|j'd6d|ƒ|j|kr³|t,dƒi|jd6|d6||d6d|ƒq³n|d}n&|jt
j.krtj+t,dƒd|ƒ||||||ƒPná|jt
j/krctj0t1dƒd|ƒtj2|j3|||ƒ||||||ƒPnƒ|jt
j4krÇtj t!dƒd|ƒtj2|j3|||ƒ||||||ddƒPntj t!dƒ|jd|ƒtj5dƒq‡W|j"|ƒdS(Niiÿÿÿÿs!Operation thread is still runningRs!Fixed incorrect job type to be %dsMigration not running yetsFailed to abort migration %si
idi<s¥Migration running for %(secs)d secs, memory %(remaining)d%% remaining; (bytes processed=%(processed_memory)d, remaining=%(remaining_memory)d, total=%(total_memory)d)itsecsRftprocessed_memorytremaining_memoryttotal_memorysZData remaining %(remaining)d bytes, low watermark %(watermark)d bytes %(last)d seconds agot	watermarktlastis!Migration operation has completedsMigration operation has aborteds!Migration operation was cancelledtmigration_statust	cancelleds!Unexpected migration job type: %dgà?(6RRøRþRåR6RlRúR‚Rït_is_post_copy_enabledRêtget_job_infoRR^tVIR_DOMAIN_JOB_NONEtreadyR“RRst
find_job_typetVIR_DOMAIN_JOB_UNBOUNDEDt	run_tasksR¤tdata_remainingR‹tlive_migration_progress_timeoutRnt!live_migration_completion_timeouttshould_abortR!RëR6R”Rt_clear_empty_migrationtshould_switch_to_postcopytmemory_iterationttrigger_postcopy_switchtupdate_downtimetmemory_totaltroundtmemory_remainingt
save_statsR¾Rtmemory_processedtVIR_DOMAIN_JOB_COMPLETEDtVIR_DOMAIN_JOB_FAILEDRFRtrun_recover_tasksRxtVIR_DOMAIN_JOB_CANCELLEDRð(RIRRR1RüRºR»R‚R$tfinish_eventRîton_migration_failureRâtdowntime_stepsR6tcurdowntimeRàtnRHt
progress_timetprogress_watermarktprevious_data_remainingtis_post_copy_enabledR¾tnowtelapsedtprogress_timeouttcompletion_timeoutR#Rftlg((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_live_migration_monitorñsÜ			
	

		


	
			

	




cCsBy|j|j=Wn*tk
r=tjtdƒd|ƒnXdS(Ns6There are no records in active migrations for instanceR(R¤R	tKeyErrorR“R”R(RIR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR—s

csZ|jjˆƒ}g}	g}
|jrE|j|ˆ|ƒ\}	}
ntj|j|ˆ|||||
ƒ}tjj	ƒ}t
ƒ|jˆj<‡fd†}
|j
|
|ƒtjdƒz…y?tjddˆƒ|j|ˆ||||||||	ƒ
Wn?tk
r=}tjtdƒi|d6dˆdtƒ‚nXWdtjd	dˆƒXdS(
s,Do live migration.

        :param context: security context
        :param instance:
            nova.db.sqlalchemy.models.Instance object
            instance object that is migrated.
        :param dest: destination host
        :param post_method:
            post operation method.
            expected nova.compute.manager._post_live_migration.
        :param recover_method:
            recovery method when any exception occurs.
            expected nova.compute.manager._rollback_live_migration.
        :param block_migration: if true, do block migration.
        :param migrate_data: a LibvirtLiveMigrateData object

        This fires off a new thread to run the blocking migration
        operation, and then this thread monitors the progress of
        migration and controls its operation
        cs!tjddˆƒ|jƒdS(Ns'Migration operation thread notificationR(R“Rtsend(tthreadR}(R(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytthread_finishedÇsis%Starting monitoring of live migrationRs"Error monitoring migration: %(ex)sRãRNs%Live migration monitoring is all done(RxRR‚RòRRLRÙRêR}tEventRR¤R	tlinkRïRðR“RR*RdR”RRê(RIRRRüRºR»R‚R$R1RîRÖtopthreadRR.Rã((RsM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR¹žs<			
cCs*|jƒr&|tj@dkr&tSntS(Ni(RìR^RîRêRë(RIRà((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRßscCsHy|j|jjdƒWn&tk
rCtjd|jƒ‚nXdS(Nsforce-completeR5(R¤R	RR+RtNoActiveMigrationForInstance(RIR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytlive_migration_force_completeås

	c	Cs~ytj|||ƒWn`tjk
ry|s6‚ntjdi|d6|d6ƒtjd|d|d|dtƒnXdS(NsaImage %(image_id)s doesn't exist anymore on image service, attempting to copy image from %(host)sRZR2tsrcRütreceive(RRÚRt
ImageNotFoundR“Rt
copy_imageRê(RIRRRZRRÐ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_try_fetch_imageìs	cCs·tj|ƒ}|jr³tjj|dƒ}tjj|ƒs^|j|||j||ƒn|jr³tjj|dƒ}tjj|ƒs°|j|||j||ƒq°q³ndS(s?Download kernel and ramdisk for instance in instance directory.R¶R¸N(	RRR"RnRRÁR§R8R((RIRRRÐR
tkernel_pathtramdisk_path((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_fetch_instance_kernel_ramdiskûs		
		c	Cs}z |j||||||ƒWdt}|r;|j}n|sxtj||ƒ}tjj|ƒrxtj	|ƒqxnXdS(s8Clean up destination node after a failed live migration.N(
RTRêR‘Rt get_instance_path_at_destinationRnRR§R?R@(	RIRRR
RRRSR$R‘R
((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt&rollback_live_migration_at_destinationscCs]|dk	rtj|ƒ}ntjd|d|ƒ|j}|j}|j}	|sùtj	||ƒ}
t
jj|
ƒrŽt
jd|
ƒ‚ntjd|
d|ƒt
j|
ƒ|rNi}xG|D]?}t
jj|dƒ}
t
jj|
|
ƒ}|d||<qÄWtjd|d|ƒt
jj|
dƒ}tj|tj|ƒƒn|sÐtjdd|ƒ|j|||
|d	|jƒtj|ƒrÐtjd
krÐd|j|
f}|jj||
ƒqÐn|	sù|j|ƒ|j||ƒqùntj|ƒ}t |ƒr*tjdd|ƒnxI|D]A}|d
}t!j"|tj#j$|j%|ƒ}|j&||ƒq1Wtjdd|ƒtj'}xt(|ƒD]}y|j)||ƒPWqŸt*j+k
r||dkrã‚qtj,t-dƒi|d6|d6d|ƒt.j/dƒqŸXqŸW|s=t0j1dgƒ}n	g|_2tj3j4|_5tj6j7|_8tj9j:|_;tj#j<|_=|j>|_?xÈ|D]À}|d
}|j@dƒr•t!j"|tj#j$|j%|ƒ}t0jAƒ}|d|_B||_C|d|_D|d|_E|d|_F|j@dƒ|_G|j@dƒ|_H|j2jI|ƒq•q•W|S(sPreparation live migration.s&migrate_data in pre_live_migration: %sRRsCreating instance directory: %sRs(Creating disk.info with the contents: %ss	disk.infosQChecking to make sure images and backing files are present before live migration.RÐtiso9660s%s:%s/disk.configs)Connecting volumes before live migration.RWs$Plugging VIFs before live migration.is6plug_vifs() failed %(cnt)d. Retry up to %(max_retry)d.tcntt	max_retryRÒRRÊRøRˆt
boot_indexN(JRlRR{R“RR_R‘R‚RR<RnRR§RtDestinationDiskExiststmkdirR‰RÁR-R-RR2R'RÞR‹tconfig_drive_formatR¡t	copy_fileRIR;R+ReR‰R/R×R^RRØRÃR±RRRRðR”RRRðR"RRÒRpR°tgraphics_listen_addr_vncRzR²tgraphics_listen_addr_spiceR2R1tserial_listen_addrtlive_migration_inbound_addrRÈR}tsupported_perf_eventsR›tLibvirtLiveMigrateBDMInfoRRWRÊRøRRˆRAR(RIRRRRR
RÁR$R_R‘RùR
timage_disk_infoR¾Rft
image_pathtimage_disk_info_pathR4RtRáRWR@R?Rutbdmi((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytpre_live_migration)s²			

	
		


	


	

	


	


c	
sœy,|jd|d|d|d|d|ƒWnitjk
r—ˆsK‚ntjdi|d6ˆd6d|ƒ‡fd	†}	|jd|	d|ƒnXdS(
NR·RRÕRZRºsaImage %(image_id)s doesn't exist anymore on image service, attempting to copy image from %(host)sR2Rc	s&tjd|d|dˆdtƒdS(NR4RüR2R5(RR7Rê(R¹(RÐ(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytcopy_from_hostËs(R¿RR6R“R(
RIR R·RRÕRZRRºRÐRQ((RÐsM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRã¹s	c
Csº|sg}nxŽ|D]†}tjj|dƒ}tjj||ƒ}|drƒtjj|ƒrƒtj|d||dƒq|drtjj|dƒ}	|jj||t	j
jƒ}
|	jdƒr|
j
d|jd|	d|jd	|	d
|dd|dtjƒqœ|	jdƒrm|jƒ}|j}|
j
d|jd	d
|d
|tjd|ƒqœ|j|
tj||	|j||d|ƒqqW|j||d|ƒdS(sY:param context: security context
           :param instance:
               nova.db.sqlalchemy.models.Instance object
               instance object that is migrated.
           :param instance_dir:
               instance path to use, calculated externally to handle block
               migrating an instance with an old style instance path
           :param disk_info:
               disk info specified in _get_instance_disk_info (list of dicts)
           :param fallback_from_host:
               host where we can retrieve images if the glance images are
               not available.

        RRÏRR¢R}R·R–R*RÕRºR•R™sswap_%sRšRÐN(RnRR‰RÁR§RR“RR R‹R^RkR™R¿R˜R*RRòRÁR™R›RÎRãRÚRLR;(
RIRRR
RÁRÐR¾Rt
instance_diskt
cache_nameR RÒRš((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRÓsJ	

			
	


	c
Cs½tj|ƒ}|j|ƒ}|j}x|D]‡}|dd}	|j||	|ƒ}
d|ddkrŽ|ddd}||
dd<n|djdƒd}|j|
|ƒq.WdS(NRWRtmultipath_idRZRXRYi(R+ReR²R–tinitialize_connectionRfRj(
RIRRRRR$RtRt
volume_apiRuR[RWRTRv((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytpost_live_migrations		
		cCs|j||ƒdS(sÄUnplug VIFs from networks at source.

        :param context: security context
        :param instance: instance object reference
        :param network_info: instance network information
        N(R(RIRRR
((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytpost_live_migration_at_source8scCs2|jj|ƒ}|jƒ}|jj|ƒdS(skPost operation of live migration at destination host.

        :param context: security context
        :param instance:
            nova.db.sqlalchemy.models.Instance object
            instance object that is migrated.
        :param network_info: instance network information
        :param block_migration: if true, post operation of block_migration.
        N(RxRR†Rô(RIRRR
R‚RRR1R‹((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt"post_live_migration_at_destinationAsc	Cs9tj|ƒ}tƒ}x2|D]*}|djdƒd}|j|ƒqWg}tj|ƒ}	d„}
tjj	dkr¡|	j
dƒjtj
kr¡d}nd}|
|	|ƒ\}}
}}xpt|
ƒD]b\}}||jd	ƒ}|jd
ƒp	|jdƒ}|dkr,||jd}n||jd}|sYtjd
|ƒqÏn|dkr{tjd|ƒqÏn||kr«tjdi|d6|d6ƒqÏn|d
krS||jd	ƒdkr8d}xwtj|ƒD]K\}}}x9|D]1}tjj||ƒ}|tjj|ƒ7}qüWqæWq˜ttjj|ƒƒ}nE|dkrw|rwtj|ƒ}n!tjdi|d6|d6ƒqÏ||jd	ƒ}|dkrètj|ƒ}tj|ƒ}t|ƒ|}nd}|}d}|ji|d	6|d6|d6|d6|d6|d6ƒqÏW|S(s€Get the non-volume disk information from the domain xml

        :param str instance_name: the name of the instance (domain)
        :param str xml: the libvirt domain xml for the instance
        :param dict block_device_info: block device info for BDMs
        :returns disk_info: list of dicts with keys:

          * 'type': the disk type (str)
          * 'path': the disk path (str)
          * 'virt_disk_size': the virtual disk size (int)
          * 'backing_file': backing file of a disk image (str)
          * 'disk_size': physical disk size (int)
          * 'over_committed_disk_size': virt_disk_size - disk_size or 0
        RXRYicSsD|jd|ƒ|jd|ƒ|jd|ƒ|jd|ƒfS(Ns
.//devices/%ss.//devices/%s/sources.//devices/%s/drivers.//devices/%s/target(Rˆ(tdocRÐ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt
find_nodespsRÆsos/typet
filesystemRRR RøRs/skipping disk for %s as it does not have a pathRæs,skipping disk because it looks like a volumes5skipping disk %(path)s (%(target)s) as it is a volumeRR¹R:isCskipping disk %(path)s (%(target)s) - unable to determine if volumeRQR„R¢RÏR¡tover_committed_disk_size(sfilesblock(sqcow2sploop( R+ReRÓRfR¤RR‡R‹R^RRZttextRRBRÆR›tattribR“RRntwalkRRÁtgetsizeRnR8tget_volume_sizeRRRRŒR(RIRR‹RRRttvolume_devicesRuRvRÁRZR[t	node_typet
disk_nodest
path_nodestdriver_nodesttarget_nodesR?t	path_nodeRkRR¹tdk_sizeRŒtdirnamest	filenamesRYRVRÏt	virt_sizetover_commit_size((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR
Usv		
				
!	cCs¯y"|jj|ƒ}|jƒ}Wnktjk
r}|jƒ}tjtdƒi|j	d6|d6|d6d|ƒt
jd|jƒ‚nXt
j|j|j	||ƒƒS(NseError from libvirt while getting description of %(instance_name)s: [Error Code %(error_code)s] %(ex)sRRRãRR5(RxRR†R^R6R7R“R”RRRR)R	RR-R
(RIRRRR1R‹RãR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyR|»s

cCsˆd}|jjƒ}|s|Sg|D]}|jƒ^q&}tjƒ}i|d6}tjj||dtƒ}d„|Dƒ}tj	j
||ƒ}	xê|D]â}y¸tj|ƒ}
|
j
ƒ}d}|
j|kr|	r|
j|	krtj||
j|	|
jƒ}n|j|
j|d|ƒ}
|
s6wžnx"|
D]}|t|dƒ7}q=WWntjk
r®}|jƒ}tjtdƒi|
jd6|d	6|d
6ƒnÅtk
r6}|jtjtjfkrûtjtdƒi|
jd6ƒqs|jtjkr0tjtd
ƒi|
jd6ƒqs‚n=t j!k
rr}tjtdƒi|
jd6|d6ƒnXt"j#dƒqžW|S(s8Return total over committed disk size for all instances.iR	t	use_slavecSsi|]}||j“qS((R	(RÇtinst((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pys
<dictcomp>çs	RRR]seError from libvirt while getting description of %(instance_name)s: [Error Code %(error_code)s] %(ex)sRRRãsPeriodic task is updating the host stat, it is trying to get disk %(i_name)s, but disk file was removed by concurrent operations such as resize.ti_names½Periodic task is updating the host stat, it is trying to get disk %(i_name)s, but access is denied. It is most likely due to a VM that exists on the compute node but is not managed by Nova.sÁPeriodic task is updating the host stats, it is trying to get disk info for %(i_name)s, but the backing volume block device was removed by concurrent operations such as resize. Error: %(error)sRFN($Rxtlist_instance_domainst
UUIDStringRRR"tInstanceListtget_by_filtersRêRçtbdms_by_instance_uuidRçRÙR†RlR	R+RéR
RRnR^R6R7R“R”RRˆRAtENOENTtESTALEtEACCESRtVolumeBDMPathNotFoundRRð(RItdisk_over_committed_sizetinstance_domainsRtinstance_uuidsR"tfilterstlocal_instance_listtlocal_instancesRÒR1R‹RRR¥R¾RãRR#((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRoÏsb
			
	
	

cCs|jj|d|ƒdS(s/See comments of same method in firewall_driver.R
N(R€Rb(RIRR
((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRb%scCs|jjƒgS(N(RxRn(RItrefresh((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytget_available_nodes*scCs
|jjƒS(s)Return the current CPU state of the host.(Rxt
get_cpu_stats(RI((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytget_host_cpu_stats-scCstjdddƒ\}}|S(s'Returns the result of calling "uptime".tenvsLANG=Ctuptime(RR¶(RIRQR•((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytget_host_uptime1scCs|jj||ƒdS(s!Manage the local cache of images.N(R‰RN(RIRt
all_instances((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytmanage_image_cache6scCssy[tjj|ƒrZtjdd|ƒtjd||ƒ|sZ|jj||ƒqZnWntk
rnnXdS(s?Used only for cleanup in case migrate_disk_and_power_off fails.R´s-rftmvN(RnRR§RR¶R¡t
remove_dirRd(RIRüt	inst_basetinst_base_resizetshared_storage((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_cleanup_remote_migration:s
cCsÃtjjdkrtS||jƒk}|s¿tjƒjd}tj	j
||ƒ}yR|jj||ƒtj	j
|ƒr”t}tj|ƒn|jj||ƒWq¿tk
r»q¿Xn|S(NR^s.tmp(R‹R^RkRêRoR	RARBRnRRÁR¡tcreate_fileR§R‹tremove_fileRd(RIRüRŒRŽRyttmp_path((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_is_storage_shared_withFs
c	#sÂtjddˆƒtj|ƒ}	tj|	ƒp:ˆjj}
|jˆjjk}|j|
k}ˆj	ˆd|ƒ}
ˆj
ˆ|
ƒ}|r•|s›|rÅtdƒ}tj
tjd|ƒƒ‚ntj|
ƒ}tjjdkr|rtdƒ}tj
tjd|ƒƒ‚ntjˆƒ}|d}ˆj||ƒ}|s¦yˆjj||ƒWq¦tjk
r¢}td	ƒ|}tj
tjd|ƒƒ‚q¦Xnˆjˆ||ƒtj|ƒ}x?|D]7}|d
}|djdƒd
}ˆj||ƒqÏWywt j!d||ƒ|rBd}t j!dd|ƒn‡‡fd†}‡‡fd†}ˆj#ƒ}xª|D]¢}|d}t$j%j&|ƒ}t$j%j'||ƒ}|dkoÝ|j(ddƒ|j(ddƒksy|dt)k} tj*||d|d|d|d| ƒqyqyWt$j%j'|dƒ}!t$j%j+|!ƒr€t$j%j'|dƒ}"tj*|!|"d|d|d|ƒnWn:t,k
r½t-j.ƒˆj/||||ƒWdQXnX|
S(Ns#Starting migrate_disk_and_power_offRRRsUnable to resize disk down.R½R8s3Migration is not supported for LVM backed instancesR³s#not able to execute ssh command: %sRWRXRYiRŠRCs-pcsˆjjˆ|jƒS(N(RŸtadd_jobtpid(tprocess(RRI(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRm¨scsˆjjˆ|jƒS(N(RŸt
remove_jobR•(R–(RRI(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRmªsRs	disk.swapR™iRR2t
on_executet
on_completiontcompressions	disk.info(0R“RR+RÇRtget_bdm_ephemeral_disk_sizeRRÅRßR|R¢RRtInstanceFaultRollbacktResizeErrorRR{R‹R^RkR—RRR“R¡t
create_dirRRðRReRfRjRR¶RlRÁRnRR‰RÁR›tNO_COMPRESSION_TYPESR7R§RdR	RCR(#RIRRRüRR
RRRRt
ephemeralsteph_sizet	root_downtephemeral_downR›RÑR½RÁRŒRRŽR#RtRuRWRvR˜R™t
active_flavorR¾timg_pathRµt	from_pathRštsrc_disk_info_pathtdst_disk_info_path((RRIsM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytmigrate_disk_and_power_off_sŠ		
	




$	

cCsM|j|ƒj}|tjkrItjtdƒd|ƒtjƒ‚ndS(NsInstance running successfully.R(	R&R'RRÙR“R¾RRR*(RIRR'((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRÖscCsG|dkr|jj}n!|dkr6|jj}nd}|tjS(sKDetermines the disk size from instance properties

        Returns the disk size by using the disk name to determine whether it
        is a root or an ephemeral disk, then by checking properties of the
        instance returns the size converted to bytes.

        Returns 0 if the disk name not match (disk, disk.local).
        Rs
disk.locali(RRßRÅRRò(Rt	disk_nameRº((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_disk_size_from_instanceÝs
c	CsC|d}tjdddddd||ƒtjd||ƒd	S(
sConverts a raw disk to qcow2.t_qcowsqemu-imgtconverts-fR6s-ORQRŠN(RR¶(Rt	path_qcow((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_disk_raw_to_qcow2òs
c	CsC|d}tjdddddd||ƒtjd||ƒd	S(
sConverts a qcow2 disk to raw.t_rawsqemu-imgR­s-fRQs-OR6RŠN(RR¶(Rtpath_raw((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_disk_qcow2_to_rawús
cCsÌt|tjƒs#tjdƒdSt}|r–|jtjkr–tj	|j
|ƒr–tj|ƒr–|j|j
ƒt
}tj|j
tjƒ}n|r¯tj||ƒn|rÈ|j|j
ƒndS(sAttempts to resize a disk to size

        :param image: an instance of nova.virt.image.model.Image

        Attempts to resize a disk by checking the capabilities and
        preparing the format, then calling disk.api.extend.

        Note: Currently only support disk extend.
        s"Skipping resize of non-local imageN(RÝRÐtLocalFileImageR“RRëRˆtFORMAT_QCOW2Rtcan_resize_imageRtis_image_extendableR²Rêt
FORMAT_RAWR›R¯(RIR Rºt	converted((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_disk_resizes 
c
Csítjdd|ƒtjtjj|||ƒ}
|j|||
dd|dddt	d|j
ƒ|j|ƒtj
|j||d|ƒ}tj|ƒ}x¤|D]œ}|d}
tjj|
ƒ}|j||ƒ}|rtj|
|d	ƒ}|j||ƒn|d
kr¤|d	dkr¤tjr¤|j|dƒq¤q¤W|j||||
|d|ƒ}|j|||||
d|d|	d
td|ƒ}|	rÖtj|j|ƒ}|j ddƒj!ƒ|j"ƒntjdd|ƒdS(NsStarting finish_migrationRR*R
RRRÏRÐRRsdisk.configR6RRR,R1gà?s'finish_migration finished successfully.(#R“RR/R
R‹R^RR4RlRëtsource_computeRIR1R2R3RR{RnRR‰R«RÐR³R¹RŒR¯RRRêRRGRRHRIR(RIRR6RRÁR
RØtresize_instanceRRRtblock_disk_infoR9R¾RRªRºR R‹R1RP((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytfinish_migration%sR	

		

%				
cCsCytj|ƒWn+tk
r>}|jtjkr?‚q?nXdS(sbMake sure that a failed migrate doesn't prevent us from rolling
        back in a revert.
        N(R?R@RˆRARw(RIRŒR#((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_cleanup_failed_migrations
cCs¢tjdd|ƒtj|ƒ}|d}tjj|ƒra|j|ƒtj	d||ƒn|j
j|dƒ}|jƒrçzHy|jtj
ƒWn-tjk
rÈtjtdƒtj
ƒnXWd|jtj
dtƒXntjtjj||j|ƒ}	|j||||	|jd|ƒ}
|j||
|||	d|d	|d
tƒ|r‹tj|j|ƒ}|jddƒj ƒntjd
d|ƒdS(Ns Starting finish_revert_migrationRR³RŠRs Failed to rollback snapshot (%s)RRRRRR1gà?s.finish_revert_migration finished successfully.(!R“RRRRnRR§R¾RR¶RR trollback_to_snapR¸RtSnapshotNotFoundR”RR·RêR/R
R‹R^RRØRRRRGRRHRI(RIRRR
RRRRŒRRºRÁR‹RP((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytfinish_revert_migration—sH


				cCs|j||ƒdS(s,Confirms a resize, destroying the source VM.N(R»(RIR6RR
((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytconfirm_migrationÑsc	CsÕigd6gd6}ytj|ƒ}Wntk
r;|SXddg}x†|D]~\}}|j|ƒ}x`|D]X}xO|jƒD]A}|jdkr„|jdƒr„||j|jdƒƒq„q„WqqWqOW|S(	s1get the list of io devices from the xml document.tvolumesRks./devices/disks./devices/interfaceR¹Rø(s./devices/disksvolumes(s./devices/interfacesifaces(RR‡RdRˆtgetchildrenttagR›R(	R´RòRZtblocksRæR²tsectionRítchild((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_io_devicesÕs
	
)c
Cs^|jj|ƒ}|j}i}y9x2|jƒD]$}|j|dt|jƒd<q1WWntjk
rpnX|j	ƒ}t
j|ƒ}x–|dD]Š}ym|j|ƒ}	|	d||d<|	d||d<|	d||d	<|	d
||d<|	d||d
<Wq—tjk
r q—Xq—WxÌ|dD]À}
y£|j
|
ƒ}	|	d||
d<|	d||
d<|	d||
d<|	d
||
d<|	d||
d<|	d||
d<|	d||
d<|	d||
d<Wq0tjk
rïq0Xq0W|jƒ|d<y9|jƒ}x&|jƒD]}|||d|<q WWntjtfk
rYnX|S(NR¶t_timeRÃit	_read_reqit_readit
_write_reqit_writeit_errorsRkt_rxt_rx_packetst
_rx_errorst_rx_dropt_txit_tx_packetsit
_tx_errorsit_tx_dropR{smemory-(RxRR<RýRïRGR(R^R6R†RXRÉRWtinterfaceStatst	maxMemorytmemoryStatsR£R²(
RIRR1RhtoutputtvcpuR‹tdom_ioR¹RURtmemR²((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytget_diagnosticsçsR	&cCsš|jj|ƒ}|j}|jƒ}tj|ƒ}|j|jƒ\}}}}	}
tj|ƒ}t	j
|jƒ}t	j|t	j
ƒƒ}
tjdtj|ddd|ddd|
ƒ}|tj|j_|tj|j_y.x'|jƒD]}|jd|jƒq÷WWntjk
r+nXtj|ƒ}xn|d	D]b}yE|j|ƒ}|jd
|dd|d
d|dd|dƒWqFtjk
r§qFXqFWx–|dD]Š}ym|j |ƒ}|j!d|d
d|dd|dd|dd|dd|dd|dd|dƒWq·tjk
r@q·Xq·W|j"r–|j#dƒ}x6t$|ƒD]%\}}|j%d ƒ|j"|_&qjWn|S(!NR'R+R^tconfig_drivet
hypervisor_ostlinuxR†RïRÃt
read_bytesit
read_requestsitwrite_bytesitwrite_requestsiRkt	rx_octetst	rx_errorstrx_dropt
rx_packetst	tx_octetsit	tx_errorsittx_dropit
tx_packetsis./devices/interface/macR('RxRR<R†RR‡t_get_domain_infoR'RÞR
tnormalize_timetlaunched_att
delta_secondstutcnowR(tDiagnosticsRt	STATE_MAPRRÎtmemory_detailstmaximumRARýtadd_cpuRïR^R6RXRÉRWR°RØtadd_nictnic_detailsRˆRÆR›tmac_address(RIRR1RhR‹R´R'tmax_memRÞtnum_cputcpu_timeRàRñR†tdiagsRÜRÝR¹RURtnodesRÓRí((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytget_instance_diagnostics#sb	!		







	 cCsßd}|jr|jjƒnd}t|jtjƒrHtjƒ}not|tjƒr·|j	dkrxtj
ƒ}q·|j	dkr–tjƒ}q·|j	dkr·tjƒ}q·n|dk	rÛ|dk	rÛ||_
n|S(sFDetermins the device bus and it's hypervisor assigned address
        R?tideRÊN(Rltdevice_addrtformat_addressRÝR¦t"LibvirtConfigGuestDeviceAddressPCIR"tPCIDeviceBustLibvirtConfigGuestDiskRÌt
SCSIDeviceBustIDEDeviceBustUSBDeviceBusR(RøRÊR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_prepare_device_busms	csÚd„‰tjj||jƒ}d„|Dƒ}tjj||jƒ}‡fd†|Dƒ}g}|jj|ƒ}|jƒ}	tj	|	ƒ}
t
jƒ}|j|
ƒx|j
D]}t|t
jƒr=|j|jƒ}
|
sëqµn|j|ƒ}tjd|
jd|
jgƒ}|r-||_n|j|ƒnt|t
jƒrµ|j|jƒ}|smqµn|j|ƒ}tjd|jgƒ}|r¦||_n|j|ƒqµqµW|rÖtjd|ƒ}|SdS(sBuilds a metadata object for instance devices, that maps the user
           provided tag to the hypervisor assigned device address.
        cSstj|jƒS(N(Rt	strip_devRÎ(Rá((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt_get_device_name†scSs%i|]}|jr||j“qS((RÅR(RÇR:((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pys
<dictcomp>‹s	cs(i|]}|jr|ˆ|ƒ“qS((RÅ(RÇRá(R
(sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pys
<dictcomp>‘s	RttagsR©N(R"tVirtualInterfaceListRèR	RçRxRR†RR‡R¦R§R¨R©RÝtLibvirtConfigGuestInterfaceR›tmac_addrRtNetworkInterfaceMetadataRRÅRÊRRR«tDiskMetadatatInstanceDeviceMetadata(RIRRtvifsttagged_vifsRÒttagged_bdmsR©R1R‹RrRRøR:RÊRÕRátdev_meta((R
sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRê‚sJ		
		cCsYtj|ƒ}tjd|d|ƒtj|tjƒ}|jjƒj	ƒ}|pX|S(Ns(Checking instance files accessibility %sR(
RRR“RRntaccesstW_OKRRÜR_(RIRRtshared_instance_pathtshared_block_storage((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytinstance_on_disk·scCs|jj||ƒdS(N(R€R(RIRtnw_info((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytinject_network_infoÄsc	CsÈtj|ƒ}|d}|d}xrtjjdƒD]^}ytjd||ƒPWntk
rgnXytjd||ƒPWq6tk
r“q6Xq6Wd}x0||fD]"}t	j
j|ƒr«|}Pq«q«W|rpt	j
j|ƒrp|jj
|ƒtjtdƒ|d|ƒ|}ytj|ƒWqptk
rl}tjtdƒi|d6|d	6d|ƒqpXn|r¨t	j
j|ƒr¨tjtd
ƒ|d|ƒtStjtdƒ|d|ƒtS(NR³t_deliRŠsDeleting instance files %sRs-Failed to cleanup directory %(target)s: %(e)sR¹R#sDeletion of %s failedsDeletion of %s complete(RRRRRRR¶RdRlRnRR§RŸtterminate_jobsR“R¾RR?R@RˆRFRRëRê(	RIRR¹t
target_resizet
target_delR—tremaining_pathtpR#((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRoÇsH
	


cCstS(N(Rë(RI((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytneed_legacy_block_device_infoscCsqtj|tjj|dƒ}tj|tjj|dƒ}tj|tjj||||ƒ}tj|dƒS(NRtcdromRø(R/tget_disk_bus_for_device_typeR‹R^Rt
get_root_infoRRD(RIRRØtroot_bdmRÏt	cdrom_bust	root_info((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytdefault_root_device_namescGs¥ttj|Œƒ}xO|D]G}|jdk	rtjtdƒi|jd6d|ƒd|_qqWtj	||ƒ}t
jtj
jtjƒ|||jƒdS(Ns\Ignoring supplied device name: %(device_name)s. Libvirt can't honour user-supplied dev namesRÎR(Rþt	itertoolstchainRÎRlR“R”RR+RéR/tdefault_device_namesR‹R^RRRRØ(RIRRþtblock_device_listsRtRáRR((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt!default_device_names_for_instances
				cCs¶tj||ƒ}tjtjj||jd|ƒ}|j}|dk	rqt
jtdƒi|d6d|ƒnd|_tj
|tjj|j|d|dƒ}tj|dƒS(NRRs0Ignoring supplied device name: %(suggested_dev)st
suggested_devRR*Rø(R+RéR/R
R‹R^RRØRÎRlR“R”RR×RRD(RIRRÒtblock_device_objRRt
instance_infotsuggested_dev_nameRÁ((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pytget_device_name_for_instance%s			cCs"|tjtjtjtjgkS(N(RtFS_FORMAT_EXT2tFS_FORMAT_EXT3tFS_FORMAT_EXT4t
FS_FORMAT_XFS(RItfs_type((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRÉ9sN(
t__name__t
__module__RêRëtcapabilitiesRqR…tpropertyR¯R´R»RwRÃRÚRãRæRìRïRôRÊRöR¯tstaticmethodRuRþRÿRRRRRRR RERlRTRVRQRƒR3R˜RmRlR R²R»R¿RÃRjRÆRhRÍRÛRùR	RRiRRR4R#RHRMRuR}R€R…R†R‡RWR˜RÀRÂRÈRÒRöRùRRûRüRiRRRRRRgRR&R'RDRFRLRRRWRiRoRxRR‚R­R˜R›R^RIRžRŸR¢R£R´R4RÂR3RR RkRRnR!RR¿R'R1R9R<RVR˜R™RšRfRÿRR†RR™RžR«R¶R»RÅRôRùRÿRR	RR&R+R;RNRSR[R`RkRaRrRvRËRzR“R–R™R¢R¦RÂR¬RÇRR&RÖRÔt
contextlibtcontextmanagerRØRjRáRâRãRRöRüRR	RyR+R1RÉRlRËRVRQR\R]R_RvRzR{R}R‰RŒRžR’R•RR€RRŠR´RµR¶R¼R¾RÆRÇRÙRåRòRøRúR*RR¹RR3R8R;R=RPRãRRWRXRYR
R|RoRbR‚R„R‡R‰RR“R©RR«R¯R²R¹R½R¾RÁRÂRÉRßRRRêRRRoR&R-R2R7RÉ(((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyRXBs6
J						K																
„	c														6	(	 ,		)		¨											A		n			9.Ô		2@			I				-		)			L				/	
	9l	+3	 		
	.	'	!	k	
					!							–		
			#			&	"		
			#			
		(			&	²	$		
	(					
K	)				C	'		
	7	#					7	 		&	h"'	@	
							(		„3	-	%		¦		A			’E	f	V					t		%f	9		<	J	5	
		;	
		(iii(iii(iii(iii(iii(iii(iii(iii(iii(iii	i(iii(iii
(iii(iii(iii	(iii(iii(iii(iii(iii
(iii(iii(iii(iii(iii(iii(sqcow2(iii
(iii(iii(iii(½t__doc__tcollectionsRRBRAR1R<R.R‡R×RnR?RwRïR	RêRRtlxmlRtos_brick.initiatorRtoslo_concurrencyRtoslo_logRtloggingtoslo_serializationRtoslo_serviceRt
oslo_utilsR	R
RRR
RRt	six.movesRtnova.api.metadataRRìRÝRtnova.computeRRRRRRlRt	nova.conftnova.consoleRR2RRvRRRt	nova.i18nRRRRR tnova.networkR!RR"tnova.objectsR#R$Rtnova.pciR%RlRR&t	nova.virtRR'R(tnova.virt.diskR)Rtnova.virt.disk.vfsR*R+R,R-tnova.virt.imageRÐR.tnova.virt.libvirtR/R0R¦tlibvirt_firewallR1RçR2R3R4R5R6Rstnova.virt.libvirt.storageR7R8R9RR:Rtnova.virt.libvirt.volumeR;R<R=tnova.volumeR>R?RlR^RëRŒt	getLoggerR=R“R³R‹tIptablesFirewallDriverRRtRóR\RRRüt
namedtupleRBR¬RPRÐRÒRÔRÕRìR–R5R4R5R3R;R·R7R~RsRRRÓRptMIN_LIBVIRT_KVM_S390_VERSIONtMIN_QEMU_S390_VERSIONRtMIN_LIBVIRT_KVM_PPC64_VERSIONtMIN_QEMU_PPC64_VERSIONRðRñRŸtQEMU_MAX_SERIAL_PORTSR(RÚRèRéRŠR‹RERFRGR×RØRxR~R€t
ComputeDriverRX(((sM/home/tvault/.virtenv/lib/python2.7/site-packages/nova/virt/libvirt/driver.pyt<module>sT