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    
idna / lib / python2.7 / site-packages / nova / network / linux_net.pyc
Size: Mime:
ó
±EYc@s"dZddlZddlZddlZddlZddlZddlZddlZddlm	Z	ddl
mZddl
mZddlmZddlmZddlmZdd	lmZddlZddlZdd
lmZddlmZmZmZddlmZdd
lmZddl m!Z"ddlm!Z!ej#e$ƒZ%ej&j'Z'd„Z(e(ƒZ)de*fd„ƒYZ+de*fd„ƒYZ,de*fd„ƒYZ-dd„Z.d„Z/d„Z0d„Z1d„Z2e3d„Z4e3d„Z5d„Z6d„Z7d „Z8d!„Z9d"„Z:d#„Z;d$„Z<d%„Z=d&„Z>d'„Z?d(„Z@e!jAd)d*eBƒd+„ƒZCd,„ZDd-„ZEd.„ZFd/„ZGd0„ZHd1„ZId2„ZJd3„ZKd4„ZLd5„ZMd6„ZNd7„ZOe!jAd8ƒd9„ƒZPe!jAd:ƒd;„ƒZQd<„ZRd=„ZSd>„ZTd?„ZUeVeVd@„ZWdA„ZXdB„ZYdC„ZZdD„Z[dE„Z\dF„Z]dG„Z^eVdH„Z_eVdI„Z`dJ„ZaeVdK„ZbeVeVdL„ZceBdM„ZddN„ZedO„ZfeVdP„ZgdQ„ZhdR„ZidS„ZjdT„ZkeValdU„ZmeBdV„ZndW„ZodX„ZpdYe*fdZ„ƒYZqd[eqfd\„ƒYZrd]„Zse!jAd^d*eBƒd_d`„ƒZte!jAd^d*eBƒd_da„ƒZudb„Zvdc„Zwdd„Zxdeeqfdf„ƒYZydgeqfdh„ƒYZze-ƒZ{didj„Z|dS(ksDImplements vlans, bridges, and iptables rules using linux utilities.iÿÿÿÿN(tprocessutils(tlog(t	jsonutils(texcutils(t	fileutils(timportutils(t	timeutils(t	exception(t_t_LEt_LW(tmodel(tobjects(tutilscCs"tjjtjƒddƒd S(s-Grab the name of the binary we're running in.iÿÿÿÿii(tostpathtbasenametinspecttstack(((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytget_binary_name7stIptablesRulecBs8eZdZeed„Zd„Zd„Zd„ZRS(srAn iptables rule.

    You shouldn't need to use this class directly, it's only used by
    IptablesManager.

    cCs(||_||_||_||_dS(N(tchaintruletwrapttop(tselfRRRR((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt__init__Fs			cCsF|j|jkoE|j|jkoE|j|jkoE|j|jkS(N(RRRR(Rtother((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt__eq__LscCs||kS(N((RR((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt__ne__RscCs9|jrdt|jf}n	|j}d||jfS(Ns%s-%ss[0:0] -A %s %s(Rtbinary_nameRR(RR((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt__repr__Us		(	t__name__t
__module__t__doc__tTruetFalseRRRR(((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR>s
		t
IptablesTablecBsweZdZd„Zed„Zed„Zed„Zeed„Z	d„Z
eed„Zd„Zed	„Z
RS(
sAn iptables table.cCsCg|_g|_tƒ|_tƒ|_tƒ|_t|_dS(N(trulestremove_rulestsettchainstunwrapped_chainst
remove_chainsR#tdirty(R((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRas		cCs$|r||jkS||jkSdS(N(R)R*(RtnameR((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt	has_chainis
cCs6|r|jj|ƒn|jj|ƒt|_dS(s¸Adds a named chain to the table.

        The chain name is wrapped to be unique for the component creating
        it, so different components of Nova can safely create identically
        named chains without interfering with one another.

        At the moment, its wrapped name is <binary name>-<chain name>,
        so if nova-compute creates a chain named 'OUTPUT', it'll actually
        end up named 'nova-compute-OUTPUT'.

        N(R)taddR*R#R,(RR-R((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt	add_chainoscCsp|r|j}n	|j}||krAtjtdƒ|ƒdSt|_|sc|jj|ƒn|j	|ƒ|s­|j
g|jD]}|j|kr‡|^q‡7_
ng|jD]}|j|kr·|^q·|_|rôdt
|f}n
d|f}|s>|j
g|jD]}||jkr|^q7_
ng|jD]}||jkrH|^qH|_dS(s×Remove named chain.

        This removal "cascades". All rule in the chain are removed, as are
        all rules in other chains that jump to it.

        If the chain is not found, this is merely logged.

        s1Attempted to remove chain %s which does not existNs-j %s-%ss-j %s(R)R*tLOGtwarningR
R#R,R+R/tremoveR'R&RRR(RR-Rt	chain_settrtjump_snippet((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytremove_chains*			
7.
 cCsÕ|r.||jkr.ttdƒ|ƒ‚nd|kradjt|j|jdƒƒƒ}nt||||ƒ}||jkr©t	j
di|d6|jd6ƒn(|jjt||||ƒƒt|_
dS(s=Add a rule to the table.

        This is just like what you'd feed to iptables, just without
        the '-A <chain name>' bit at the start.

        However, if you need to jump to one of your wrapped chains,
        prepend its name with a '$' which will ensure the wrapping
        is applied correctly.

        sUnknown chain: %rt$t sHSkipping duplicate iptables rule addition. %(rule)r already in %(rules)rRR&N(R)t
ValueErrorRtjointmapt_wrap_target_chaintsplitRR&R1tdebugtappendR#R,(RRRRRtrule_obj((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytadd_rule¨s'	cCs%|jdƒr!dt|dfS|S(NR8s%s-%si(t
startswithR(Rts((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR=ÂscCsžyT|jjt||||ƒƒ|sJ|jjt||||ƒƒnt|_WnCtk
r™tj	t
dƒi|d6|d6|d6|d6ƒnXdS(sÎRemove a rule from a chain.

        Note: The rule must be exactly identical to the one that was added.
        You cannot switch arguments around like you can with the iptables
        CLI tool.

        sLTried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r %(top)rRRRRN(R&R3RR'R@R#R,R:R1R2R
(RRRRR((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytremove_ruleÇs"

cCs–t|tjƒr$tj|ƒ}nt|jƒ}g|jD]!}|jt|ƒƒs=|^q=|_|t|jƒ}|dkr’t	|_
n|S(s Remove all rules matching regex.i(t
isinstancetsixtstring_typestretcompiletlenR&tmatchtstrR#R,(Rtregext	num_rulesR5tremoved((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytremove_rules_regexÚs4cCsqg|jD]*}|j|kr
|j|kr
|^q
}|rLt|_nx|D]}|jj|ƒqSWdS(sRemove all rules from a chain.N(R&RRR#R,R3(RRRRt
chained_rules((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytempty_chainås*
(R R!R"RR#R.R0R7R$RBR=RERQRS(((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR%^s	'		tIptablesManagercBsneZdZdd„Zd„Zd„Zd„Zd„Ze	j
ddeƒd„ƒZd	„Z
d
„ZRS(sšWrapper for iptables.

    See IptablesTable for some usage docs

    A number of chains are set up to begin with.

    First, nova-filter-top. It's added at the top of FORWARD and OUTPUT. Its
    name is not wrapped, so it's shared between the various nova workers. It's
    intended for rules that need to live at the top of the FORWARD and OUTPUT
    chains. It's in both the ipv4 and ipv6 set of tables.

    For ipv4 and ipv6, the built-in INPUT, OUTPUT, and FORWARD filter chains
    are wrapped, meaning that the "real" INPUT chain has a rule that jumps to
    the wrapped INPUT chain, etc. Additionally, there's a wrapped chain named
    "local" which is jumped to from nova-filter-top.

    For ipv4, the built-in PREROUTING, OUTPUT, and POSTROUTING nat chains are
    wrapped in the same was as the built-in filter chains. Additionally,
    there's a snat chain that is applied after the POSTROUTING chain.

    cCsŠ|st|_n	||_itƒd6tƒd6tƒd6|_itƒd6|_t|_xœ|j|jgD]ˆ}|djddtƒ|djdddtdt	ƒ|djd	ddtdt	ƒ|djd
ƒ|djdddtƒqqWiidd	dgd6d
d	dgd6dgd6d6idd	dgd6d6}x¥|D]}|dkrp|j}n|dkrˆ|j}nxdt
j||ƒD]O\}}x@|D]8}||j|ƒ||j|d|fdtƒq¯WqœWqRW|jdjddtƒ|jdjdddtƒ|jdjdƒ|jdjdddtƒ|jdjdƒ|jdjddƒdS(Ntfiltertnattmanglesnova-filter-topRtFORWARDs-j nova-filter-topRtOUTPUTtlocals	-j $localtINPUTt
PREROUTINGtPOSTROUTINGiis-j $%ssnova-postrouting-bottoms-j nova-postrouting-bottomtsnats-j $snats
float-snats-j $float-snat(t_executetexecuteR%tipv4tipv6R$tiptables_apply_deferredR0RBR#RGt	iteritems(RR`ttablestbuiltin_chainst
ip_versionttableR)R((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRsN	

	


 
cCs
t|_dS(N(R#Rc(R((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytdefer_apply_onEscCst|_|jƒdS(N(R$Rctapply(R((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytdefer_apply_offHs	cCsdx'tj|jƒD]}|jrtSqWtjr`x*tj|jƒD]}|jrFtSqFWntS(N(	RGt
itervaluesRaR,R#tCONFtuse_ipv6RbR$(RRh((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR,Ls			cCs7|jr
dS|jƒr&|jƒn
tjdƒdS(Ns'Skipping apply due to lack of new rules(RcR,t_applyR1R?(R((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRjVs
	
tiptablestexternalc
Cs,d|jfg}tjr4|d|jfg7}nxä|D]Ü\}}|jd|fddtddƒ\}}|jdƒ}xatj|ƒD]P\}}|j	||ƒ\}	}
|j
||	|
!||ƒ||	|
+t|_q‘W|jd	|fddtd
dj
|ƒddƒq;WtjdƒdS(
sApply the current in-memory set of iptables rules.

        This will blow away any rules left over from previous runs of the
        same component of Nova, and replace them with our current set of
        rules. This happens atomically, thanks to iptables-restore.

        Rpt	ip6tabless%s-saves-ctrun_as_roottattemptsis
s
%s-restoret
process_inputs,IPTablesManager.apply completed with successN(RaRmRnRbR`R#R>RGRdt_find_tablet
_modify_rulesR$R,R;R1R?(RRDtcmdRet
all_tablest_errt	all_linest
table_nameRhtstarttend((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRo^s"		
cCskt|ƒdkrdSy|jd|ƒd}Wntk
rEdSX||jdƒ|d}||fS(	Niis*%sitCOMMITi(ii(ii(RKtindexR:(RtlinesR|R}R~((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRvzs
csU|j}t|jƒ}|j‰|j}|j‰|sXdd|ddg}|}ng|D]}t|kr_|^q_}	g}
g}tjrt	j
tjƒ}g|	D]}|j|ƒr«|^q«}
x?|
D]7}g|	D]$}|jƒ|jƒkrà|^qà}	qÓW|
}
ntj
r¥t	j
tj
ƒ}g|	D]}|j|ƒr9|^q9}
x?|
D]7}g|	D]$}|jƒ|jƒkrn|^qn}	qaW|
}nt}d}xNt|	ƒD]@\}}|së|jdƒrþt}qþq¾|jdƒs¾Pq¾q¾W|sd}n|
}g}x|D]ý}t|ƒ}|jr|jdƒrg|jd	d
ƒd
}ng|	D]$}|jƒ|jƒkrn|^qn}g|	D]$}|jƒ|jƒkrŸ|^qŸ}	|rît|ƒd}t|ƒ}nt|ƒ}|jƒ||g7}q$||g7}q$W||7}t|	ƒ}	||	||+g|D]}d|f^qO|	||+g|D]}d
t|f^qv|	||+|	jdƒ}||	||+tƒ‰‡fd†}‡‡fd†}t|	ƒ}	|	jƒt||	ƒ}	t||	ƒ}	t|	ƒ}	|	jƒˆjƒxˆD]}ˆj|ƒq:W|	S(Ns#Generated by novat*Rs#Completed by novait:it[t]iiÿÿÿÿs:%s - [0:0]s:%s-%s - [0:0]csY|jdƒr(|jddƒd}n|jƒ}|ˆkrDtSˆj|ƒtSdS(NR„R…i(RCR>tstripR$R/R#(tline(t
seen_lines(sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt_weed_out_duplicatesés
cs|jdƒrr|jdƒd}|jdƒd}|jƒ}x¾ˆD]#}||krHˆj|ƒtSqHWn|jdƒr|jddƒd}|jƒ}x\ˆD]Q}t|ƒ}|jddƒd}|jƒ}||krªˆj|ƒtSqªWntS(NRƒis- [iR„R…R9(RCR>R†R3R$RMR#(R‡RRtrule_str(R+R'(sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt_weed_out_removesôs&



(R*tsortedR)R+R&R'RRmtiptables_top_regexRIRJtsearchR†tiptables_bottom_regexR$t	enumerateRCR#RMRR>tlistR€R(treverseRUtclearR3(Rt
current_linesRhR|R*R)R&t
fake_tableR‡t
new_filtert	top_rulestbottom_rulesRNttemp_filterRŠRDtseen_chainstrules_indexRt	our_rulest	bot_rulest
dup_filtertdupR-tcommit_indexR‰R‹((R+R'RˆsK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRw†sœ				
		
	(

(		(

(		
	
$
$


$'
	 



N(R R!R"tNoneRRiRkR,RjR
tsynchronizedR#RoRvRw(((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRTïs?			
		twcCs)t||ƒ}|j|ƒWdQXdS(N(topentwrite(tfiletdatatmodetf((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt
write_to_file%scCsLy3td|ƒ}|jƒ}||kSWdQXWntk
rGtSXdS(sëEnsure that the cmdline for a pid seems sane

    Because pids are recycled, blindly killing by pid is something to
    avoid. This provides the ability to include a substring that is
    expected in the cmdline as a safety check.
    s/proc/%d/cmdlineN(R¤treadtEnvironmentErrorR$(tpidRLR©tcmdline((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytis_pid_cmdline_correct*s
cCsetjdkr9tjdjddtjtjfƒntjdjddtjƒtjƒdS(s$Create forwarding rule for metadata.s	127.0.0.1RVR\sZ-s 0.0.0.0/0 -d 169.254.169.254/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination %s:%ssU-s 0.0.0.0/0 -d 169.254.169.254/32 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports %sN(Rmt
metadata_hosttiptables_managerRaRBt
metadata_portRj(((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytmetadata_forward9scCs@tj|ƒjdkr$|dks0|dkr4dSd|SdS(Nis	127.0.0.1s::1s-m addrtype --dst-type LOCALs-d %s(tnetaddrt	IPAddresstversion(tip((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt_iptables_destKs$cCsvdtjttjƒf}tjtjƒjdkrQtjdj	d|ƒntj
dj	d|ƒtjƒdS(s+Create the filter accept rule for metadata.s%-p tcp -m tcp --dport %s %s -j ACCEPTiRUR[N(RmR²R¸R°R´RµR¶R±RaRBRbRj(R((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytmetadata_acceptSscCs©tjr¥|r-tjr$tj}q6g}n	dg}x_|D]W}d||tjf}|r}tjr}|dtj7}ntjdjd|ƒq=WtjƒndS(Ns	0.0.0.0/0s"-s %s -d %s -j SNAT --to-source %ss -o %sRVR^(Rmtrouting_source_iptforce_snat_rangetpublic_interfaceR±RaRBRj(tip_rangetis_externalt
snat_ranget
dest_rangeR((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt
add_snat_ruleas				
cCsæt||ƒg}|rGx+tjD]}|jd||fƒq#Wn|r]t|dƒntjdjdd|tjfƒx2tj	D]'}tjdjdd||fƒq‹Wtjdjddi|d6ƒtj
ƒdS(	s!Basic networking setup goes here.sOPREROUTING -p ipv4 --ip-src %s --ip-dst %s -j redirect --redirect-target ACCEPTRVR]s-s %s -d %s/32 -j ACCEPTs-s %s -d %s -j ACCEPTsA-s %(range)s -d %(range)s -m conntrack ! --ctstate DNAT -j ACCEPTtrangeN(RÁRmR»R@tensure_ebtables_rulesR±RaRBR°tdmz_cidrRj(R½R¾R&R¿tdmz((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt	init_hostss&
	c
CsVtdd|dd|dt|ƒdtdtƒ\}}|rRtjd|ƒndS(	Ntarpings-Us-As-Is-cRstcheck_exit_codesarping error for IP %s(R_RMR#R$R1R?(R·tdevicetcounttoutterr((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytsend_arp_for_ip”s	c
Csjtdddt|ƒdd|dtddd	d
gƒtjrftjdkrft||tjƒndS(sBind IP to public interface.R·taddrR/s/32tdevRsRÈiiiþN(R_RMR#Rmtsend_arp_for_hatsend_arp_for_ha_countRÍ(tfloating_ipRÉ((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytbind_floating_ipžs
	c
Cs<tdddt|ƒdd|dtddd	d
gƒdS(s)Unbind a public IP from public interface.R·RÎtdels/32RÏRsRÈiiiþN(R_RMR#(RÒRÉ((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytunbind_floating_ip¨s	cCs8tddddddddd	td
ddd
gƒdS(sSets up local metadata IP.R·RÎR/s169.254.169.254/32tscopetlinkRÏtloRsRÈiiiþN(R_R#(((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytensure_metadata_ip¯scCsqtjdjdd|ƒtjdjdd|||fƒtjdjdd|||fƒtjƒdS(	s"Sets up forwarding rules for vlan.RURXs#-d %s -p udp --dport 1194 -j ACCEPTRVR\s,-d %s -p udp --dport %s -j DNAT --to %s:1194RYN(R±RaRBRj(t	public_iptportt
private_ip((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytensure_vpn_forward¶sc	CsÁd|}tjdj|ƒ}|rStdƒ}tj|i|d6|d6ƒnx7t|||ƒD]#\}}tjdj||ƒqfWtjƒ||dkr½t	t
||ƒŒndS(s#Ensure floating IP forwarding rule.s.*\s+%s(/32|\s+|$)RVs9Removed %(num)d duplicate rules for floating IP %(float)stnumtfloattbridgeN(R±RaRQR
R1R2tfloating_forward_rulesRBRjRÃtfloating_ebtables_rules(	RÒtfixed_ipRÉtnetworkRNROtmsgRR((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytensure_floating_forwardÇs
!
cCsnx7t|||ƒD]#\}}tjdj||ƒqWtjƒ||dkrjtt||ƒŒndS(s"Remove forwarding for floating IP.RVRàN(RáR±RaRERjtremove_ebtables_rulesRâ(RÒRãRÉRäRR((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytremove_floating_forwardÖs

cCs"d|d||dfgdfS(s.Makes sure only in-network traffic is bridged.saPREROUTING --logical-in %s -p ipv4 --ip-src %s ! --ip-dst %s -j redirect --redirect-target ACCEPTRàtcidrRV((RãRä((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRâßscCsÃg}d||f}|rU|jd|d|fƒ|jd|d|fƒn|jd|fƒ|jdd||ffƒ|jdd||ffƒ|jdd	||ffƒ|S(
Ns-s %s -j SNAT --to %ss
float-snats -d %ss -o %sR\s-d %s -j DNAT --to %sRYR]s8-s %s -m conntrack --ctstate DNAT -j SNAT --to-source %s(R@(RÒRãRÉR&R((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRáæsc
CsZy)tddd|dtdddgƒWn*tjk
rUtjtdƒ|ƒnXdS(	Nt	conntracks-Ds-rRsRÈiis'Error deleting conntrack entries for %s(R_R#RtProcessExecutionErrorR1RR	(Rã((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytclean_conntrackøs
cCsQd}tdd|ƒ\}}|jƒdk	rMtddd|dtƒndS(Nsnet.ipv4.ip_forwardtsysctls-nt1s-ws%s=1Rs(R_R†R#(t
sysctl_keytstdouttstderr((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt_enable_ipv4_forwardingstlock_gatewayRqc
Cs|s
dStƒy|jj}Wn(tk
rK|djdƒd}nXd|d|f}|d|dgg}g}tdd	d
d|dd
ƒ\}}x–|jdƒD]…}|jƒ}	|	r°|	ddkr°|	dd!krø|	dd!}
n
|	dd!}
|j|
ƒ|
d|kr5|j|
ƒq5q°q°W|sT|dd|krÉg}tddd
d|ƒ}|rò|\}}xk|jdƒD]W}|jƒ}	|	r”d|	kr”|j|	ƒtddd|	dd|dtƒq”q”Wnx9|D]1}
tdtddddgt	d|
|ƒŒqùWx9|D]1}
tdtddddgt	d|
|ƒŒq5Wx'|D]}	tddddt|	ŒqqWt
jrÉt
jdkrÉt
|d|t
jƒqÉnt
jrþtdddd	d|d d|dtƒndS("NRét/is%s/%stdhcp_servertbrdt	broadcastR·RÎtshowRÏRÖtglobals
itinetiþÿÿÿt	secondarytdynamiciiÿÿÿÿtroutetviaRÔRsRÈiþR/s-ftinet6tchangetcidr_v6(s	secondarysdynamic(RòRét	prefixlentAttributeErrort
rpartitionR_R>R@R#t_ip_bridge_cmdRmRÐRÑRÍRn(
RÏtnetwork_reftprefixtfull_ipt
new_ip_paramst
old_ip_paramsRËRÌR‡tfieldst	ip_paramst
old_routestresult((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytinitialize_gateway_devices`




)
)

	
cCstg}d}|dr"tj}nxBtjj||d|ƒD]%}|jr>|jt|ƒƒq>q>Wdj	|ƒS(s<Return a network's hosts config in dnsmasq leasefile format.t
multi_hostthosts
N(
R¡RmRRtFixedIPListtget_by_networktleasedR@t_host_leaseR;(tcontextRthostsRtfixedip((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytget_dhcp_leasesBs

	cCstg}tƒ}xU|D]M}|jr|jj|krc|jt|ƒƒ|j|jjƒqcqqWdj|ƒS(s/Get network's hosts config in dhcp-host format.s
(R(t	allocatedtvirtual_interfacetaddressR@t
_host_dhcpR/R;(RRtfixedipsRtmacsR((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytget_dhcp_hostsSs	
	cCsRg}x<tjj||ƒD]%}|jr|jt|ƒƒqqWdj|ƒS(s(Get network's DNS hosts in hosts format.s
(RRRRR@t	_host_dnsR;(RRRR((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt
get_dns_hosts_s
	cCsxtjd}xZddgD]L}xCddgD]5}i|d6|d6|d6}|jd	d
|ƒq-WqWtjƒdS(s.Allow DHCP and DNS traffic through to dnsmasq.RUiCi5tudpttcpRÏRÛtprotoR[s?-i %(dev)s -p %(proto)s -m %(proto)s --dport %(port)s -j ACCEPTN(R±RaRBRj(RÏRhRÛR%targs((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt_add_dnsmasq_accept_ruleshs
	cCsxtjd}xZddgD]L}xCddgD]5}i|d6|d6|d6}|jd	d
|ƒq-WqWtjƒdS(s7Remove DHCP and DNS traffic allowed through to dnsmasq.RUiCi5R#R$RÏRÛR%R[s?-i %(dev)s -p %(proto)s -m %(proto)s --dport %(port)s -j ACCEPTN(R±RaRERj(RÏRhRÛR%R&((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt_remove_dnsmasq_accept_rulests
	cCs/tjd}|jdd|ƒtjƒdS(NRWR]s:-o %s -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill(R±RaRBRj(RÏRh((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt_add_dhcp_mangle_rule‚s

	cCs/tjd}|jdd|ƒtjƒdS(NRWR]s:-o %s -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill(R±RaRERj(RÏRh((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt_remove_dhcp_mangle_ruleŠs

	cCsÅ|d}|dr5|dp$tjr5|d}ng}tjr¢xq|D]P}|jrK|j}|jr…|jt||ƒƒq›|jt|ƒƒqKqKWn|jtd|ƒƒdj	|ƒS(s/Get network's hosts config in dhcp-opts format.tgatewayRt
share_addressRõs
N(
Rmtshare_dhcp_addresstuse_single_default_gatewayRtvirtual_interface_idt
default_routeR@t_host_dhcp_optsR¡R;(RRRR+RRtvif_id((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt
get_dhcp_opts’s


	
			cCsbt|ƒr^y tjd|||dtƒWq^tjk
rZtjd|d|ƒ‚q^XndS(Ntdhcp_releaseRsRtmac_address(t
device_existsR
R`R#RRëRtNetworkDhcpReleaseFailed(RÏRR5((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytrelease_dhcp©scCsvt|dƒ}d}|dr+tj}ntjj||d|ƒ}t|t|||ƒƒt	||||ƒdS(NtconfRR(
t
_dhcp_fileR¡RmRRRRRªR trestart_dhcp(RRÏRtconffileRR((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytupdate_dhcp³s
	cCsst|dƒ}d}|dr+tj}ntjj||d|ƒ}t|t||ƒƒt	||||ƒdS(NRRR(
R:R¡RmRRRRRªR"R;(RRÏRt	hostsfileRR((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt
update_dns¿s
	cCst|ƒ}|rit|dƒ}t||jdƒdƒrVtdd|dtƒqitjd|ƒnt|ƒt	|ƒdS(NR9Rôiÿÿÿÿtkills-9Rss%Pid %d is stale, skip killing dnsmasq(
t_dnsmasq_pid_forR:R¯R>R_R#R1R?R(R*(RÏR­R<((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt	kill_dhcpËs
t
dnsmasq_startcCsÅt|dƒ}t|dƒ}t|t|||ƒƒtj|dƒt|ƒtj|dƒt|ƒ}|rùt||jdƒdƒræy(t	dd|dt
ƒt|ƒd	SWqötk
râ}t
jtd
ƒ|ƒqöXqùt
jd|ƒndd
tjtjƒdt|dƒddddtjdt|dƒdt|dƒd|ddd|d|d|dtjfdttj|dƒƒd t|dƒd!tjd"d#g}tjrã|jd$tjƒntj}	tjrH|j d%ƒr|	j|j d%ƒƒn|j d&ƒrH|	j|j d&ƒƒqHn|d'ro|jd(t|d)ƒƒn|	r…|jd*ƒnx|	D]}
|jd+|
ƒqŒWt	dt
|Œt|ƒd	S(,sµ(Re)starts a dnsmasq server for a given network.

    If a dnsmasq instance is already running then send a HUP
    signal causing it to reload, otherwise spawn a new instance.

    R9toptsi¤RôiÿÿÿÿR@s-HUPRsNskill -HUP dnsmasq threw %ss$Pid %d is stale, relaunching dnsmasqtenvsCONFIG_FILE=%ss
NETWORK_ID=%stidtdnsmasqs--strict-orders--bind-interfacess--conf-file=%ss
--pid-file=%sR­s--dhcp-optsfile=%ss--listen-address=%sRõs--except-interface=los$--dhcp-range=set:%s,%s,static,%s,%sstlabelt
dhcp_starttnetmasks--dhcp-lease-max=%sRés--dhcp-hostsfile=%ss--dhcp-script=%ss
--no-hostss--leasefile-ros--domain=%stdns1tdns2Rs--addn-hosts=%sRs--no-resolvs--server=%s(!R:RªR3RtchmodR)RAR¯R>R_R#R't	ExceptionR1terrorR	R?RtdumpsRmtdhcpbridge_flagfileRMtdnsmasq_config_filetdhcp_lease_timeRKR´t	IPNetworkt
dhcpbridgetdhcp_domainR@t
dns_servertuse_network_dns_serverstget(RRÏRRR<toptsfileR­texcRxtdns_serversRW((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR;Ûsj




				

tradvd_startcCsýt|dƒ}d||df}t||ƒtj|dƒt|ƒ}|rºt||ƒr§ytd|dtƒWq·tk
r£}t	j
tdƒ|ƒq·Xqºt	jd|ƒnd	d
dt|dƒddt|d
ƒg}tdt|ŒdS(NR9s¡
interface %s
{
   AdvSendAdvert on;
   MinRtrAdvInterval 3;
   MaxRtrAdvInterval 10;
   prefix %s
   {
        AdvOnLink on;
        AdvAutonomous on;
   };
};
Ri¤R@Rsskilling radvd threw %ss"Pid %d is stale, relaunching radvdtradvds-Cs%ss-pR­(
t_ra_fileRªRRMt_ra_pid_forR¯R_R#RNR1ROR	R?(RRÏRR<tconf_strR­R[Rx((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt	update_ra)s 

cCsQtjƒ}tj|jƒƒ}d|tj|jj|j|j	j
pLdfS(s8Return a host string for an address in leasefile format.s
%d %s %s %s *R‚(RtutcnowtcalendarttimegmtutctimetupleRmRSRRtinstancethostname(Rt	timestamptseconds_since_epoch((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRQs
	cCsd|S(NsNW-%s((R2((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt_host_dhcp_network[scCs¸|jj}t|ƒdkrYtjtdƒ|ƒ|jjd d|jjd}ntjr”t|j	ƒ}d|j
j|tj|j|fSd|j
j|tj|jfSdS(	s8Return a host string for an address in dhcp-host format.i?s!hostname %s too long, truncating.it-iÄÿÿÿs%s,%s.%s,%s,net:%ss%s,%s.%s,%sN(
RgRhRKR1R2R
RmR.RkR/RRRV(RRhtnet((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR_s 	cCsd|j|jjtjfS(Ns%s	%s.%s(RRgRhRmRV(R((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR!ws		cCs\g}|dk	r(|jt|ƒƒn|jdƒ|rO|jd|ƒndj|ƒS(sReturn an empty gateway option.t3s%st,N(R¡R@RkR;(R2R+tvalues((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR1}s
cOsCtjr/tjddjtt|ƒƒƒdStj||ŽSdS(s/Wrapper around utils._execute for fake_network.sFAKE NET: %sR9tfakeiN(sfakei(	Rmtfake_networkR1R?R;R<RMR
R`(Rxtkwargs((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR_‰s	"cCstjjd|ƒS(s Check if ethernet device exists.s/sys/class/net/%s(RRtexists(RÉ((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR6’scCs0tjtjƒtjjdtj||fƒS(sEReturn path to a pid, leases, hosts or conf file for a bridge/device.s
%s/nova-%s.%s(Rtensure_treeRmt
networks_pathRRtabspath(RÏtkind((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR:—scCs0tjtjƒtjjdtj||fƒS(s6Return path to a pid or conf file for a bridge/device.s%s/nova-ra-%s.%s(RRuRmRvRRRw(RÏRx((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR_ŸscCsot|dƒ}tjj|ƒrky,t|dƒ}t|jƒƒSWdQXWqkttfk
rgdSXndS(s¹Returns the pid for prior dnsmasq instance for a bridge/device.

    Returns None if no pid file exists.

    If machine has rebooted pid might be incorrect (caller should check).

    R­R5N(
R:RRRtR¤tintR«R:tIOErrorR¡(RÏtpid_fileR©((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRA§scCsPt|dƒ}tjj|ƒrLt|dƒ}t|jƒƒSWdQXndS(s·Returns the pid for prior radvd instance for a bridge/device.

    Returns None if no pid file exists.

    If machine has rebooted pid might be incorrect (caller should check).

    R­R5N(R_RRRtR¤RyR«(RÏR{R©((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR`¹scCs3dd|g}|j|ƒ|jd|gƒ|S(s1Build commands to add/del IPs to bridges/devices.R·RÎRÏ(textend(tactiontparamsRÉRx((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRÈs
c
Cs>|r:tjddd|d|dtdddd	gƒnd
S(sSet the device MTU.R·R×R(tmtuRsRÈiiiþN(R
R`R#(RÏR((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt_set_device_mtuÐscCsµx||gD]}t|ƒq
Wtjddd|dddd|dtƒ	xb||gD]T}tjddd	|d
dtƒtjddd	|dddtƒt||ƒqYWd
S(spCreate a pair of veth devices with the specified names,
    deleting any previous devices with those names.
    R·R×R/ttypetvethtpeerR-RsR(tuptpromisctonN(tdelete_net_devR
R`R#R€(t	dev1_namet	dev2_nameRRÏ((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt_create_veth_pairØscCs~ddtjg|}ytjdt|ŒSWnItk
ry}tjtdƒi|d6|d6ƒt	j
d|ƒ‚nXdS(Ns	ovs-vsctls--timeout=%sRss3Unable to execute %(cmd)s. Exception: %(exception)sRxRtinner_exception(Rmtovs_vsctl_timeoutR
R`R#RNR1ROR	RtOvsConfigurationFailure(R&t	full_argste((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt
_ovs_vsctlèscCs`ddd|dd||ddd|d|dd	|d
|g}|r\|d|g7}n|S(Ns--s--if-existssdel-portsadd-portR(t	Interfacesexternal-ids:iface-id=%ss external-ids:iface-status=activesexternal-ids:attached-mac=%ssexternal-ids:vm-uuid=%sstype=%s((RàRÏtiface_idtmactinstance_idtinterface_typeRx((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt_create_ovs_vif_cmdòs	
cCs`tt||||||ƒƒ|tjkr>t||ƒntjdi|d6|d6ƒdS(NsGMTU not set on %(interface_name)s interface of type %(interface_type)s.tinterface_nameR•(RR–t
network_modeltOVS_VHOSTUSER_INTERFACE_TYPER€R1R?(RàRÏR’R“R”RR•((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytcreate_ovs_vif_ports
	
cCs0tddd||gƒ|r,t|ƒndS(Ns--s--if-existssdel-port(RR‡(RàRÏt
delete_dev((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytdelete_ovs_vif_portscCstjdd|dtƒdS(Nsivs-ctlsadd-portRs(R
R`R#(RÏR’R“R”((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytcreate_ivs_vif_portscCs9tjdd|dtƒtjddd|dtƒdS(Nsivs-ctlsdel-portRsR·R×tdelete(R
R`R#(RÏ((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytdelete_ivs_vif_portsc
Csãt|ƒsßy5tjddd|dddtddd	d
gƒWn0tjk
rstjddd
|dtƒnX|r®tjddd|d|dtddd	d
gƒntjddd|ddtddd	d
gƒndS(NR·ttuntapR/R¨ttapRsRÈiiiþttunctls-bs-tR×R(RR„(R6R
R`R#RRë(RÏR5((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytcreate_tap_dev"s cCspt|ƒsltjdd|d|d|dtƒt|ƒtjddd|d	dtd
ddd
gƒndS(Nsfp-vdevR/s
--sockpaths
--sockmodeRsR·R×R(R„RÈiiiþ(R6R
R`R#R€(RÏtsockpathtsockmode((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt
create_fp_dev2s
cCs,t|ƒr(tjdd|dtƒndS(Nsfp-vdevRÔRs(R6R
R`R#(RÏ((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt
delete_fp_dev;scCs’t|ƒrŽy?tjddd|dtddddgƒtjd	|ƒWqŽtjk
rŠtj	ƒtj
td
ƒ|ƒWdQXqŽXndS(s*Delete a network device only if it exists.R·R×RžRsRÈiiiþsNet device removed: '%s's Failed removing net device: '%s'N(R6R
R`R#R1R?RRëRtsave_and_reraise_exceptionROR	(RÏ((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR‡@s
cCst|ƒr‹y<tjddd|ddtƒtjdd|dtƒWq‹tjk
r‡tjƒtj	t
dƒ|ƒWd	QXq‹Xnd	S(
sDelete a network bridge.R·R×R(tdownRstbrctltdelbrs#Failed removing bridge device: '%s'N(R6R
R`R#RRëRR¨R1ROR	(RÏ((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytdelete_bridge_devLs
cCststjtjƒantS(N(tinterface_driverRt
import_objectRmtlinuxnet_interface_driver(((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt_get_interface_driver_scCstƒj|||ƒS(N(R°tplug(RäR5R+((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR±gscCstƒj|ƒS(N(R°tunplug(Rä((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR²kscCstƒj|ƒS(N(R°tget_dev(Rä((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR³ostLinuxNetInterfaceDrivercBs)eZdZd„Zd„Zd„ZRS(s^Abstract class that defines generic network host API
    for all Linux interface drivers.
    cCs
tƒ‚dS(s(Create Linux device, return device name.N(tNotImplementedError(RRäR5((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR±xscCs
tƒ‚dS(s)Destroy Linux device, return device name.N(Rµ(RRä((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR²|scCs
tƒ‚dS(sGet device name.N(Rµ(RRä((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR³€s(R R!R"R±R²R³(((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR´ss		tLinuxBridgeInterfaceDrivercBsøeZed„Zed„Zd„Zedddd„ƒZed„ƒZ	ee
jddeƒdddd„ƒƒZee
jddeƒd„ƒƒZ
ee
jd	deƒdeed
„ƒƒZee
jd	deƒeed„ƒƒZRS(
cCsÊ|jdƒ}|dk	rdtjp+|d}tj||d||||jdƒƒd|}n-tjpt|d}tj|d|||ƒ|ds¤tjr¸t	||dƒnt
jƒ|dS(Ntvlantbridge_interfaceRàRsvlan%sR,Rõ(RYR¡Rmtvlan_interfaceR¶tensure_vlan_bridgetflat_interfacet
ensure_bridgeR-tisolate_dhcp_addressR±Rj(RRäR5R+R·tiface((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR±ˆs(


cCs¡|jdƒ}|dk	r<d|}tj||dƒn'tjpL|d}tj|d|ƒ|dsvtjrŠt||dƒnt	j
ƒ|j|ƒS(NR·svlan%sRàR¸R,Rõ(RYR¡R¶tremove_vlan_bridgeRmR»t
remove_bridgeR-tremove_isolate_dhcp_addressR±RjR³(RRäR+R·R¾((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR²¡s
	

cCs|dS(NRà((RRä((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR³²scCs/tj||||ƒ}tj|||ƒ|S(s3Create a vlan and bridge unless they already exist.(R¶tensure_vlanR¼(tvlan_numRàR¸t	net_attrsR5Rt	interface((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRºµs
		cCstj|ƒtj|ƒdS(sDelete a bridge and vlan.N(R¶RÀtremove_vlan(RÃRà((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR¿Às
t	lock_vlanRqcCsè|dkrd|}nt|ƒs×tjd|ƒtdddd|d|ddd	|d
tddd
dgƒ|r©tddd|d|d
tddd
dgƒntddd|dd
tddd
dgƒnt||ƒ|S(s'Create a vlan unless it already exists.svlan%ssStarting VLAN interface %sR·R×R/R-RR·RFRsRÈiiiþR(RR„N(R¡R6R1R?R_R#R€(RÃR¸R5RRÅ((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRÂÆs 

cCsd|}t|ƒdS(sDelete a vlan.svlan%sN(R‡(RÃR¹((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRÆàs
tlock_bridgecCsèt|ƒsÉtjd|ƒtdd|dtdtƒ\}}|rx|d|krxtdƒ|}tj|ƒ‚ntdd|d	dtƒtdd
|ddtƒtdd
d|ddtƒn|rgtjdi|d6|d6ƒtdd||dtdtƒ\}}|rR|d||fkrRtdƒ|}tj|ƒ‚nt	j
s¡tj|ƒ}|tj
d	d}	tdd
d|d|	dtƒntdd
d|ddtdtƒ\}}g}
tdddd|ƒ\}}x^|jdƒD]M}|jƒ}|rÿd|krÿ|
j|ƒtddddt|ŒqÿqÿWtdddd|ddƒ\}}xÃ|jdƒD]²}|jƒ}|r„|d	d kr„|d!d.krÌ|d$d!!}
n
|d$d%!}
tdtdd	d&d'gtd|
|d%ƒŒtdtdd	d&d'gtd(|
|ƒŒq„q„Wx*|
D]}tddd(dt|ŒqAWn|rätjd)}|r§x^t|ƒD]}|j|ŒqWqä|jd*d+|t	jfƒ|jd*d,|t	jfƒnd-S(/sÒCreate a bridge unless it already exists.

        :param interface: the interface to create the bridge on.
        :param net_attrs: dictionary with  attributes used to create bridge.
        :param gateway: whether or not the bridge is a gateway.
        :param filtering: whether or not to create filters on the bridge.

        If net_attrs is set, it will add the net_attrs['gateway'] to the bridge
        using net_attrs['broadcast'] and net_attrs['cidr'].  It will also add
        the ip_v6 address specified in net_attrs['cidr_v6'] if use_ipv6 is set.

        The code will attempt to move any IPs that already exist on the
        interface onto the bridge and reset the default gateway if necessary.

        sStarting Bridge %sRªtaddbrRÈRssAdevice %s already exists; can't create bridge with the same name
sFailed to add bridge: %stsetfditstptoffR·R×R(R„s3Adding interface %(interface)s to bridge %(bridge)sRÅRàtaddifsJdevice %s is already a member of a bridge; can't enslave it to bridge %s.
sFailed to add interface: %sRÎRRýRøRÏs
RþRÔRÖRùRúiþÿÿÿRûRüiiÿÿÿÿiiþR/RURXs--in-interface %s -j %ss--out-interface %s -j %sN(s	secondarysdynamic(R6R1R?R_R$R#RRt
NovaExceptionRmRrt	netifacestifaddressestAF_LINKR>R@RR±Ratget_gateway_rulesRBtiptables_drop_action(RàRÅRÄR+t	filteringRËRÌRåtinterface_addrst
interface_macR
R‡RR~tipv4_filterR((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR¼çsz
		


),

		cCsÑt|ƒsdS|rÃtjd}|rPx”t|ƒD]}|j|Œq6WqÃdg}tjdkr{|jtjƒnxE|D]:}|jdd||fƒ|jdd||fƒq‚Wnt|ƒdS(sDelete a bridge.NRUtDROPRXs--in-interface %s -j %ss--out-interface %s -j %s(	R6R±RaRÒRERmRÓR@R¬(RàR+RÔR×Rtdrop_actionstdrop_action((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRÀLs$
	
		N(R R!R#R±R²R³tstaticmethodR¡RºR¿R
R¢RÂRÆR¼RÀ(((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR¶†s(	!bcsK|jdtƒ}d}tj}d}x||krFtj|}|d7}ytddg||ŽWnÕtjk
r>‰t‡fd†|Dƒƒr||krÏ|rÏt	j
tdƒdj|ƒƒ‚q;t	j
tdƒidj|ƒd	6|d
6ƒt
j|ƒqC|r7t	j
tdƒdj|ƒƒ‚qCdSq*XdSq*WdS(NRÈsMultiple ebtables programsiic3s|]}|ˆjkVqdS(N(Rñ(t.0RO(R[(sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pys	<genexpr>‰ss%s failed. Not Retrying.R9s7%(cmd)s failed. Sleeping %(time)s seconds before retry.Rxttime(sMultiple ebtables programs(tpopR#Rmtebtables_exec_attemptstebtables_retry_intervalR_RRëtanyR1R2R
R;RÝtsleep(RxRsRÈt
retry_stringsRtRÊRâ((R[sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt_exec_ebtablesrs,	

tebtablesRUcCsdx]|D]U}ddd|dg|jƒ}tdtdt|Œd|d<tdt|ŒqWdS(	NRås--concurrents-ts-DRÈRss-Ii(R>RäR$R#(R&RhRRx((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRßs


cCsJxC|D];}ddd|dg|jƒ}tdtdt|ŒqWdS(NRås--concurrents-ts-DRÈRs(R>RäR$R#(R&RhRRx((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRç¨s
cCsdg}|jd||fƒ|jd||fƒ|jd|ƒ|jd|ƒt|ƒdS(Ns*INPUT -p ARP -i %s --arp-ip-dst %s -j DROPs+OUTPUT -p ARP -o %s --arp-ip-src %s -j DROPsKFORWARD -p IPv4 -i %s --ip-protocol udp --ip-destination-port 67:68 -j DROPsKFORWARD -p IPv4 -o %s --ip-protocol udp --ip-destination-port 67:68 -j DROP(R@RÃ(RÅRR&((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR½¯s				cCsdg}|jd||fƒ|jd||fƒ|jd|ƒ|jd|ƒt|ƒdS(Ns*INPUT -p ARP -i %s --arp-ip-dst %s -j DROPs+OUTPUT -p ARP -o %s --arp-ip-src %s -j DROPsKFORWARD -p IPv4 -i %s --ip-protocol udp --ip-destination-port 67:68 -j DROPsKFORWARD -p IPv4 -o %s --ip-protocol udp --ip-destination-port 67:68 -j DROP(R@Rç(RÅRR&((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRÁÀs				cCsñtj}d|kr3dd|fdd|fgSg}xTtjD]I}|rC|jdd||ffƒ|jdd||ffƒqCqCW|jdd||ffƒ|jdd|tjffƒ|jdd|tjffƒ|S(NtallRXs-i %s -j ACCEPTs-o %s -j ACCEPTs-i %s -o %s -j ACCEPTs-i %s -j %ss-o %s -j %s(Rmtforward_bridge_interfaceR@RÓ(Ràt
interfacesR&R¾((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRÒÑs"	
tLinuxOVSInterfaceDrivercBs&eZed„Zd„Zd„ZRS(cCs‹|j|ƒ}t|ƒs‡tj}tddd||ddd|dddd|d|ddd|dddd|d	|gƒtd
dd|d|d
tƒt||jdƒƒtd
dd|dd
tƒ|sYtdd|dd
tƒtdd|d|d
tƒt	j
djdd|tjfƒt	j
djdd|tjfƒq‡x+t
|ƒD]}t	j
dj|ŒqfWn|S(Ns--s--may-existsadd-portR(R‘s
type=internalsexternal-ids:iface-id=%ss external-ids:iface-status=activesexternal-ids:attached-mac=%sR·R×RRsRR„s	ovs-ofctlsadd-flowspriority=1,actions=drops1udp,tp_dst=67,dl_dst=%s,priority=2,actions=normalRURXs--in-interface %s -j %ss--out-interface %s -j %s(R³R6Rmtlinuxnet_ovs_integration_bridgeRR_R#R€RYR±RaRBRÓRÒ(RRäR5R+RÏRàR((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR±ès>	cCs5|j|ƒ}tj}tddd||gƒ|S(Ns--s--if-existssdel-port(R³RmRêR(RRäRÏRà((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR²s	cCsdt|ddd!ƒ}|S(Nsgw-tuuidii(RM(RRäRÏ((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR³s(R R!R#R±R²R³(((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRéæs&	t!NeutronLinuxBridgeInterfaceDrivercBs;eZdZdZed„Zd„Zd„Zd„ZRS(tbrqsgw-c
Csç|j|ƒ}|j|ƒ}|sptjdjdd|tjfƒtjdjdd|tjfƒ|Sx(t|ƒD]}tjdj|Œq}Wt||ƒt	|ƒsãt
jd|ƒtj
dd|dtƒtj
dd	|td
ƒdtƒtj
dd|ddtƒtj
d
dd|d|dtdd
ddgƒtj
d
dd|ddtdd
ddgƒt
jd|ƒd|d|djdƒdf}tj
d
dd|d|dtdd
ddgƒn|S(NRURXs--in-interface %s -j %ss--out-interface %s -j %ssStarting bridge %s RªRÉRsRÊiRËRÌR·R×R(RRÈiiþR„sDone starting bridge %ss%s/%sRõRéRôR/RÏ(R³t
get_bridgeR±RaRBRmRÓRÒR£R6R1R?R
R`R#RMR(RRäR5R+RÏRàRR((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR±s8
"
cCs1|j|ƒ}t|ƒsdSt|ƒ|SdS(N(R³R6R¡R‡(RRäRÏ((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR²Es

cCs"|jt|ddd!ƒ}|S(NRëii(tGATEWAY_INTERFACE_PREFIXRM(RRäRÏ((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyR³MscCs"|jt|ddd!ƒ}|S(NRëii(tBRIDGE_NAME_PREFIXRM(RRäRà((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRîQs(	R R!RðRïR#R±R²R³Rî(((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyRìs&		icCs·tj|dtƒ}tj|ƒ}tj|ƒ}dddg}|dkrTdnd}tjddd	|d
|d|d|d
td|ƒ
tjddd	||d
td|ƒdS(Ntpf_interfaceiiiþR„R©R·R×R(tvfR“R·RsRÈ(t	pci_utilstget_ifname_by_pci_addressR#tget_vf_num_by_pci_addressR
R`(tpci_addrtmac_addrR·t	pf_ifnamet	vf_ifnametvf_numt	exit_codet
port_state((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pytset_vf_interface_vlanYs 		(}R"RdRRRIRÝR´RÏtoslo_concurrencyRtoslo_logRtloggingtoslo_serializationRt
oslo_utilsRRRRRGt	nova.conftnovaRt	nova.i18nRR	R
tnova.networkRR˜Rtnova.pciR
Rót	getLoggerR R1R9RmRRtobjectRR%RTRªR¯R³R¸R¹R$RÁRÆRÍRÓRÕRÙRÝRæRèRâRáRìRòR¢R#RRR R"R'R(R)R*R3R8R=R?RBR;RbRRkRR!R¡R1R_R6R:R_RAR`RR€RŠRR–RšRœRRŸR£R¦R§R‡R¬R­R°R±R²R³R´R¶RäRÃRçR½RÁRÒRéRìR±Rý(((sK/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/linux_net.pyt<module>sÖ		 ‘ÿ7				!	
	
										;										
			N(	
																						ì	-			4<