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@s2ddlZddlZddlmZddlmZddlm	Z
ddlmZ
ddlmZddlmZddlZddlmZddlZdd	lmZdd
lmZmZmZmZddlmZddlmZ dd
l!m"Z"ddlm#Z#ddl$m%Z&ddl'm(Z)ddl'm*Z+ddl'mZ,ddl'm-Z.ddl/m0Z1ej2j3Z3e
j4e5ƒZ6e7a8e7a9dZ:dZ;dZ<dZ=d„Z>d„Z?de
j@fd„ƒYZAeBd„ZCd„ZDd„ZEd„ZFd „ZGd!ejHfd"„ƒYZId#„ZJdS($iÿÿÿÿN(tloading(t
exceptions(tclient(tlog(texcutils(t	uuidutils(tutils(t	exception(t_t_LEt_LIt_LW(tbase_api(tmodel(t	constants(tobjects(tfields(tmanager(trequest(t	whitelist(tbasetdefaultsbinding:profilesbinding:host_idtmigrating_tocCsdadadS(N(tNonet_ADMIN_AUTHt_SESSION(((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytreset_state9scCsQtj|tjjjƒ}|r%|Stdƒ|jj}tj	d|ƒ‚dS(NsUnknown auth type: %stmessage(
t
ks_loadingtload_auth_from_conf_optionstnovatconftneutront
NEUTRON_GROUPRt	auth_typetneutron_client_exctUnauthorized(Rtauth_pluginterr_msg((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_load_auth_pluginAs	t
ClientWrappercBs)eZdZd„Zd„Zd„ZRS(s£A Neutron client wrapper class.

    Wraps the callable methods, catches Unauthorized,Forbidden from Neutron and
    convert it to a 401,403 for Nova clients.
    cCs"|j|_||_||_dS(N(t__dict__tbase_clienttadmin(tselfR*R+((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt__init__Rs	cCs=tj||ƒ}t|ƒr9tj|dƒ|ƒ}n|S(Ntproxy(tobjectt__getattribute__tcallable(R,tnametobj((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyR0Xscs‡‡fd†}|S(Ncs‰yˆ||Ž}Wnotjk
r`ˆjs>tjƒ‚ntjtdƒƒtjƒ‚n%tjk
r„}tj|ƒ‚nX|S(NsxNeutron client was not able to generate a valid admin token, please verify Neutron admin credential located in nova.conf(	R#R$R+RtLOGterrorR	t*NeutronAdminCredentialConfigurationInvalidt	Forbidden(targstkwargstrette(R3R,(sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytwrapper_s	((R,R3R<((R3R,sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyR.^s(t__name__t
__module__t__doc__R-R0R.(((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyR(Ls		c
CsÑd}ts*tjttjjjƒan|sC|j	ra|j
ratsXttƒant}n|j
ry|j
ƒ}n|sŽtjƒ‚nttjdtd|dtjjdtjjƒd|pÍ|j	ƒS(Ntsessiontauthtendpoint_overridetregion_nameR+(RRRtload_session_from_conf_optionstCONFRRR R!tis_admint
auth_tokenRR'tget_auth_pluginRR$R(t	clientv20tClientturlRC(tcontextR+R%((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt
get_clientxs$		cCsK||k}|rFtjtdƒi|d6|d6|d6d|ƒn|S(NsQ%(item)s already exists in list: %(list_name)s containing: %(items)s. ignoring ittitemt	list_nametitemstinstance(R4twarningR(RNRPtitems_list_nameRQtpresent((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_is_not_duplicate›s


cCs;|jdƒ}|tjkr7tjd|dƒ‚ndS(Nsbinding:vif_typetport_idtid(tgett
network_modeltVIF_TYPE_BINDING_FAILEDRtPortBindingFailed(tporttbinding_vif_type((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_ensure_no_port_binding_failure¬scCs|s
dSt|ƒ}|s |Sxi|jƒD][}|d}||kr{tjdi|dd6|d6|d6d|ƒq-|j|ƒq-W|S(	s¯Removes macs from set if used by existing ports

    :param requested_networks: list of NetworkRequests
    :type requested_networks: nova.objects.NetworkRequestList
    :param hypervisor_macs: None or a set of MAC addresses that the
        instance should use. hypervisor_macs are supplied by the hypervisor
        driver (contrast with requested_networks which is user supplied).
        NB: NeutronV2 currently assigns hypervisor supplied MAC addresses
        to arbitrary networks, which requires openflow switches to
        function correctly if more than one network is being used with
        the bare metal hypervisor (which is the only one known to limit
        MAC addresses).
    :type hypervisor_macs: set
    :returns a set of available MAC addresses to use if
            creating a port later; this is the set of hypervisor_macs
            after removing any MAC addresses from explicitly
            requested ports.
    tmac_addresssˆPort %(port)s mac address %(mac)s is not in the set of hypervisor macs: %(hyper_macs)s. Nova will overwrite this with a new mac address.RWR\tmact
hyper_macsRQN(RtsettvaluesR4tdebugtdiscard(RQtportsthypervisor_macstavailable_macsR\R`((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_filter_hypervisor_macs²s
	

cCsrtj|ƒ}|rPid|j|jfd6|jd6|jƒjdƒd6Stjd|j	d|jƒ‚dS(Ns%s:%stpci_vendor_infotpci_slottphysical_networktnode_idtaddress(
t
pci_whitelisttget_pci_device_devspect	vendor_idt
product_idRntget_tagsRXRtPciDeviceNotFoundtcompute_node_id(tpci_devtdev_spec((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytget_pci_device_profileäs
tAPIcBs@eZdZd„Zd„Zd„Zd„Zdced„Z	dcdced„Z
dcdcd„Zd„Ze
d	„ƒZd
„Zdcd„Zd„Zd
„Zd„Zd„Zd„Zd„Zd„Zdcd„Zedcd„Zedcd„Ze
d„ƒZe
d„ƒZdcdcdcd„Zd„Zed„Zd„Z dcdcdcd„Z!d„Z"d„Z#d„Z$dcdcd „Z%dcdcdcdcd!„Z&dcdcd"„Z'e(j)d#„ƒZ*e(j)d$„ƒZ+d%„Z,d&„Z-d'„Z.d(„Z/d)„Z0d*„Z1d+„Z2d,„Z3e(j)ed-„ƒZ4d.„Z5d/„Z6d0„Z7d1„Z8e(j9e(j9d2„Z:d3„Z;d4„Z<d5„Z=d6„Z>d7„Z?dcd8„Z@d9„ZAdcd:„ZBd;„ZCd<„ZDd=„ZEd>„ZFd?„ZGd@„ZHdA„ZIdB„ZJdcdC„ZKdD„ZLdE„ZMdF„ZNedG„ZOdH„ZPeQdI„ZRe(j)edJ„ƒZSdK„ZTdL„ZUdcdM„ZVdN„ZWdO„ZXdP„ZYdQ„ZZdcdcdcdcdR„Z[dS„Z\dT„Z]dU„Z^dV„Z_dW„Z`dX„ZadY„ZbdZ„Zcd[„Zddcd\„Zed]„Zfd^„Zgd_„Zhd`„Zidcda„Zjdb„ZkRS(ds-API for interacting with the neutron 2.x API.cCs)tt|ƒjƒd|_i|_dS(N(tsuperRyR-Rtlast_neutron_extension_synct
extensions(R,((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyR-ós	c	Csy(|j|ii|t6d6ƒ}|SWnPtk
rz}tjƒ/tjtdƒi|d6|d6d|ƒWdQXnXdS(NR\sMUnable to update binding profile for port: %(port)s due to failure: %(error)sR5RQ(tupdate_porttBINDING_PROFILEt	ExceptionRtsave_and_reraise_exceptionR4R5R	(R,RQRVtport_profiletadmin_clienttupdated_porttex((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt#_update_port_with_migration_profileøs
cCszxs|D]k}|jtƒ}|s(qnt|kr|t=tjd|dd|ƒ|j||d||ƒqqWdS(Ns"Removing port %s migration profileRWRQ(RXR~tMIGRATING_ATTRR4RdR…(R,RLRQR‚RftpR((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_clear_migration_port_profiles
c	Cs‘xŠ|D]‚}|jtƒ}||kr|jtiƒ}||t<|j||d||ƒtjdi|dd6|d6d|ƒqqWdS(NRWsMPort %(port_id)s updated with migration profile %(profile_data)s successfullyRVtprofile_dataRQ(RXtBINDING_HOST_IDR~R†R…R4Rd(	R,RLRQthostR‚RfR‡thost_idR((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_setup_migration_port_profiles

	
c
CsÔ|j|dtƒsdS|o+|j|k}|s:|rÐi|jd6|jd6|jt6}|j||}|d}t|dtƒ}	|r«|j|||	|ƒqÐ|rÐ|j	||||	|ƒqÐndS(s)Setup or teardown the network structures.t
refresh_cacheNt	device_idt	tenant_idRfR+(
t_has_port_binding_extensiontTrueR‹tuuidt
project_idRŠt
list_portsRMRˆR(
R,RLRQR‹tteardowntport_migratingtsearch_optstdataRfR‚((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytsetup_networks_on_host*s 



cCsË|st|ƒ}n|rFi|d6}|j|jdgƒ}nni|d6td6}|rmt|d<n|j|jdgƒ}itd6}||j|jdgƒ7}td„||ƒ|S(sÐReturn a network list available for the tenant.
        The list contains networks owned by the tenant and public networks.
        If net_ids specified, it searches networks with requested IDs only.
        RWtnetworksRtsharedtadmin_state_upcSs|dS(NRW((tx((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt<lambda>fs(RMt
list_networksRXtFalseR’t"_ensure_requested_network_ordering(R,RLR”tnet_idsR t
auto_allocateR˜tnets((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_get_available_networksEs 


c	CsŠiid6}yñ|r7it|ƒd6g|dd<n||dd<t|dd<|j|dd<|r{||dd<n|j|ƒ}|d}|d}	yt|ƒWn4tjk
râtjƒ|j	|	ƒWd	QXnXt
jd
|	d|ƒ|SWn…tj
k
rnt
jtdƒi|d
6|d6d|ƒtdƒi|d
6|d6}
tjd|
ƒ‚ntjk
r¿t
jtdƒ|d|ƒtdƒ|}
tjd|
ƒ‚nÇtjk
rt
jtdƒ|ddd|ƒtjƒ‚n„tjk
rCt
jtdƒ|d|ƒtjd|ƒ‚nCtjk
r…tjƒ!t
jtdƒ|d|ƒWd	QXnXd	S(sÒAttempts to create a port for the instance on the given network.

        :param port_client: The client to use to create the port.
        :param instance: Create the port for the given instance.
        :param network_id: Create the port on the given network.
        :param fixed_ip: Optional fixed IP to use from the given network.
        :param security_group_ids: Optional list of security group IDs to
            apply to the port.
        :returns: The created port.
        :raises PortLimitExceeded: If neutron fails with an OverQuota error.
        :raises NoMoreFixedIps: If neutron fails with
            IpAddressGenerationFailure error.
        :raises: PortBindingFailed: If port binding failed.
        R\t
ip_addresst	fixed_ipst
network_idRRtsecurity_groupsRWNsSuccessfully created port: %sRQsKNeutron error: %(ip)s is not a valid IP address for network %(network_id)s.tipsEFixed IP %(ip)s is not a valid ip address for network %(network_id)s.treasons-Neutron error: Fixed IP %s is already in use.sFixed IP %s is already in use.Rs0Neutron error: Port quota exceeded in tenant: %ss/Neutron error: No more fixed IPs in network: %stnets)Neutron error creating port on network %s(tstrR’R”tcreate_portR^RR[RR€tdelete_portR4RdR#tInvalidIpForNetworkClientRRRRtInvalidInputtIpAddressInUseClienttFixedIpAlreadyInUsetOverQuotaClienttPortLimitExceededt IpAddressGenerationFailureClienttNoMoreFixedIpstNeutronClientExceptionR	(R,tport_clientRQR©tfixed_iptsecurity_group_idst
port_req_bodyt
port_responseR\RVtmsg((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_create_port_minimallsZ
!


	
	

c	CsyD|j||ƒ}|d}t|ƒtjd|d|ƒ|SWnÑtjk
r¼|djdƒ}|djdƒ}tjtdƒi|d6|d6d|ƒt	j
d	|ƒ‚n\tjk
r|djdƒ}tjtd
ƒi|d6d|ƒt	jd	|ƒ‚nXdS(NR\sSuccessfully updated port: %sRQR_R©sLNeutron error: MAC address %(mac)s is already in use on network %(network)s.R`tnetworkRVsiNeutron error: Tried to bind a port with fixed_ips to a host in the wrong segment on network %(network)s.(
R}R^R4RdR#tMacAddressInUseClientRXRRRRt	PortInUset#HostNotCompatibleWithFixedIpsClienttFixedIpInvalidOnHost(	R,RºRQRVR½R¾R\R_R©((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_update_port°s&

cCsL|dk	rH|s*tjd|jƒ‚n|jƒ}||dd<|SdS(NRQR\R_(RRtPortNotFreeR“tpop(RQR½RhR_((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_populate_mac_addressÉs	cCsh|jtjdtƒsdxI|D]>}|jdƒr|jdƒrtjd|dƒ‚qqWndS(s4Check if attaching to external network is permitted.tfatalsrouter:externalRœtnetwork_uuidRWN(tcant
base_policiestNETWORK_ATTACH_EXTERNALR¡RXRtExternalNetworkAttachForbidden(R,RLR¥R­((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_check_external_network_attachÕs	
	cCs3|j|dtd|ƒ}|d
krH|s3|nt|dtƒ}nxä|D]Ü}|d
krgqOniidd6dd6d6}|r§d
|dd<i|dd	<ntj|jkrÊd|dd
<ny|j||ƒWqOtj	k
rt
jd|ƒqOtk
r*t
j
tdƒ|ƒqOXqOWd
S(sMUnbind the given ports by clearing their device_id and
        device_owner.

        :param context: The request context.
        :param ports: list of port IDs.
        :param neutron: neutron client for the current context.
        :param port_client: The client with appropriate karma for
            updating the ports.
        RŽR R+tRtdevice_ownerR\sbinding:host_idsbinding:profiletdns_names0Unable to unbind port %s as it no longer exists.s'Unable to clear device ID for port '%s'N(R‘R’RRMRtDNS_INTEGRATIONR|R}R#tPortNotFoundClientR4RdRRR	(R,RLRfR Rºtport_bindingRVR½((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt
_unbind_portsás,
	

c	
CsRi}g}|rH|jrHx)|D]}|jr(|j||jd|ƒ}|d|jkrtjd|jd|jƒ‚n|jdƒr¨tjd|jƒ‚n|jdƒr|d|j	krtj
d|jd|jd|dd|j	ƒ‚qnt|ƒ|d	|_|||j<n|jr#|j
|ƒq#q#Wn||fS(
s(Processes and validates requested networks for allocation.

        Iterates over the list of NetworkRequest objects, validating the
        request and building sets of ports, networks and MAC addresses to
        use for allocating ports for the instance.

        :param instance: allocate networks on this instance
        :type instance: nova.objects.Instance
        :param neutron: neutron client session
        :type neutron: neutronclient.v2_0.client.Client
        :returns: tuple of:
            - ports: dict mapping of port id to port dict
            - net_ids: list of requested network ids
            - ordered_networks: list of nova.objects.NetworkRequest objects
                for requested networks (either via explicit network request
                or the network for an explicit port request)
        :raises nova.exception.PortNotFound: If a requested port is not found
            in Neutron.
        :raises nova.exception.PortNotUsable: If a requested port is not owned
            by the same tenant that the instance is created under.
        :raises nova.exception.PortInUse: If a requested port is already
            attached to another instance.
        :raises nova.exception.PortNotUsableDNS: If a requested port has a
            value assigned to its dns_name attribute.
        tneutron_clientRRVRQRRÓtvaluethostnameR©(R¤RVt
_show_portR”Rt
PortNotUsableR“RXRÃRÚtPortNotUsableDNSR^R©tappend(	R,RLRQR trequested_networksRftordered_networksRR\((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_validate_requested_port_idss0
				

	cCs|tgkrg}n|S(sÊCleans security groups requested from Nova API

        Neutron already passes a 'default' security group when
        creating ports so it's not necessary to specify it to the
        request.
        (tDEFAULT_SECGROUP(R,Rª((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_clean_security_groupsQs	cCs	g}t|ƒri|jd6}|j|jdƒ}xÈ|D]½}d}d}	xj|D]b}
|
d|krŸ|r’tjtdƒ|ƒ‚n|
d}n|
d|krZ|
d}	qZqZW|rÖ|j|ƒqA|	rì|j|	ƒqAtj	d|ƒ‚qAWn|S(sÖProcesses and validates requested security groups for allocation.

        Iterates over the list of requested security groups, validating the
        request and filtering out the list of security group IDs to use for
        port allocation.

        :param instance: allocate networks on this instance
        :type instance: nova.objects.Instance
        :param neutron: neutron client session
        :type neutron: neutronclient.v2_0.client.Client
        :param security_groups: list of requested security group name or IDs
            to use when allocating new ports for the instance
        :return: list of security group IDs to use when allocating new ports
        :raises nova.exception.NoUniqueMatch: If multiple security groups
            are requested with the same name.
        :raises nova.exception.SecurityGroupNotFound: If a requested security
            group is not in the tenant-filtered list of available security
            groups in Neutron.
        RRªR2sLMultiple security groups found matching '%s'. Use an ID to be more specific.RWtsecurity_group_idN(
tlenR”tlist_security_groupsRXRRt
NoUniqueMatchRRÞtSecurityGroupNotFound(R,RQR RªR¼R˜tuser_security_groupstsecurity_groupt
name_matcht
uuid_matchtuser_security_group((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_process_security_groups\s0

	

	cCsh|o|j}g|D]}|j^q}|j||j|d|d|ƒ}	|	s¿|r¸|ry|j||ƒg}	q¼x@|D]1}|jr€|jr€tjd|jƒ‚q€q€Wq¿iSn|sØ|jsØ|jrJ|	sötj	d|jƒ‚nt
|	ƒdkr&tdƒ}
tj|
ƒ‚n|j
tjd|	ddƒƒn|j||	ƒd	„|	DƒS(
sÔCheck requested networks using the Neutron API.

        Check the user has access to the network they requested, and that
        it is a suitable network to connect to. This includes getting the
        network details for any ports that have been passed in, because the
        request will have been updated with the request_id in
        _validate_requested_port_ids.

        If the user has not requested any ports or any networks, we get back
        a full list of networks the user has access to, and if there is only
        one network, we update ordered_networks so we will connect the
        instance to that network.

        :param context: The request context.
        :param instance: nova.objects.instance.Instance object.
        :param requested_networks: value containing
            network_id, fixed_ip, and port_id
        :param ordered_networks: output from _validate_requested_port_ids
            that will be used to create and update ports
        R R¤R©R”isGMultiple possible networks found, use a Network ID to be more specific.iRWcSsi|]}||d“qS(RW((t.0R­((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pys
<dictcomp>äs	(R¤R©R¦R”t_auto_allocate_networkRVRtNetworkNotFoundtis_single_unspecifiedtInterfaceAttachFailedNoNetworkRåRtNetworkAmbiguousRÞRtNetworkRequestRÐ(R,RLRQR RßRàR¤RR£R¥R¿((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_validate_requested_network_ids–s6	
				c	Cs]g}g}xJ|D]B}	|j|	jƒ}
|
s7qnyÛ|
jdtƒ}|r‰|
jdƒs´tjd|
d|ƒtjƒ‚q´n+|r´tjd|
d|ƒtjƒ‚nd}|	jsþ|j	|||	j|	j
|ƒ}
|
d}|j|ƒn|j|	|fƒWqtk
rTt
jƒ!|rK|j|||ƒnWdQXqXqW|S(s,Create port for network_requests that don't have a port_id

        :param context: The request context.
        :param instance: nova.objects.instance.Instance object.
        :param ordered_networks: objects.NetworkRequestList in requested order
        :param nets: a dict of network_id to networks returned from neutron
        :param neutron: neutronclient using built from users request context
        :param security_group_ids: a list of security_groups to go to neutron
        :returns a list of pairs (NetworkRequest, created_port_uuid)
        tport_security_enabledtsubnetssaNetwork with port security enabled does not have subnets so security groups cannot be applied: %sRQsKNetwork has port security disabled so security groups cannot be applied: %sRWN(RXR©R’R4RdRtSecurityGroupCannotBeAppliedRRVRÀRnRÞRRR€t
_delete_ports(R,RLRQRàR¥R R¼tcreated_port_idstrequests_and_created_portsRRÁR÷tcreated_port_idtcreated_port((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_create_ports_for_instanceæsB
	
	
	


c
Ks÷tjdd|ƒ|jsDtdƒ}tjd||jƒ‚nt|ƒ}|jdƒ}|j	||||ƒ\}}|j
|||||ƒ}	|	s¾tjdd|ƒtjgƒS|j
|jdgƒƒ}
|j|||
ƒ}|j||||	||ƒ}|jdƒ}
|jd	ƒ}|jd
dƒ}t|||ƒ}t|dtƒ}|j||||||	||
|ƒ	\}}}}|j||d|d
|d|d|dtƒ}tjg|D] }|d||krÐ|^qЃS(s.Allocate network resources for the instance.

        :param context: The request context.
        :param instance: nova.objects.instance.Instance object.
        :param requested_networks: optional value containing
            network_id, fixed_ip, and port_id
        :param security_groups: security groups to allocate for instance
        :param macs: None or a set of MAC addresses that the instance
            should use. macs is supplied by the hypervisor driver (contrast
            with requested_networks which is user supplied).
            NB: NeutronV2 currently assigns hypervisor supplied MAC addresses
            to arbitrary networks, which requires openflow switches to
            function correctly if more than one network is being used with
            the bare metal hypervisor (which is the only one known to limit
            MAC addresses).
        :param dhcp_options: None or a set of key/value pairs that should
            determine the DHCP BOOTP response, eg. for PXE booting an instance
            configured with the baremetal hypervisor. It is expected that these
            are already formatted for the neutron v2 api.
            See nova/virt/driver.py:dhcp_options_for_instance for an example.
        :param bind_host_id: the host ID to attach to the ports being created.
        sallocate_for_instance()RQs empty project id for instance %sR¬RßsNo network configuredRªtdhcp_optionstbind_host_idtmacsR+R›tport_idsR‚tpreexisting_port_idstupdate_cellsRWN(R4RdR”RRR²R“RMRXRáRöRYtNetworkInfoRãRîRÿRRiR’t_update_ports_for_instancetget_instance_nw_info(R,RLRQR9R¿R RßRfRàR¥RªR¼Rüt	dhcp_optsRRgRhR‚tordered_netst
ordered_portsRRûtnw_infotvif((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytallocate_for_instance%sP		
				
c
Cs“|j|dtd|ƒs!|n|}
g}g}g}
g}g}x;|D]3\}}tj|ƒ}|j|_d|krˆ|jnd|_|j|j	ƒ}|s¯qLn|j
|ƒd|j}ii|jd6|d6d6}y-|j|||j
|d|d|d	|ƒ|j||j
|ƒ|j|||	ƒ|dk	r[||dd
<n|rw|}|j
|ƒn	|j}|
j
|ƒ|j|
|||ƒ}d|d|d
f|_||_|jƒ|j
|ƒ|sö|j
|ƒn|j||||
d|ƒWqLtk
r~tjƒI|j||||
ƒ|j|||ƒx|D]}|jƒqaWWdQXqLXqLW||
||fS(sÏCreate port for network_requests that don't have a port_id

        :param context: The request context.
        :param instance: nova.objects.instance.Instance object.
        :param neutron: client using user context
        :param admin_client: client using admin context
        :param requests_and_created_ports: [(NetworkRequest, created_port_id)]
        :param nets: a dict of network_id to networks returned from neutron
        :param bind_host_id: a string for port['binding:host_id']
        :param dhcp_opts: a list dicts that contain dhcp option name and value
            e.g. [{'opt_name': 'tftp-server', 'opt_value': '1.2.3.4'}]
        :param available_macs: a list of available mac addresses
        RŽR ttags
compute:%sRRÒR\RÁRtextra_dhcp_optss%s/%sR_RWiÿÿÿÿN(R‘R’RtVirtualInterfaceR“t
instance_uuidRRRXR©RÞtavailability_zonet"_populate_neutron_extension_valuestpci_request_idt_populate_pci_mac_addressRÉRVRÆRntcreatet_update_port_dns_nameRRR€R×Rútdestroy(R,RLRQR R‚RüR¥RR	RhRºRRûtports_in_requested_ordertnets_in_requested_ordertcreated_vifsRRýtvifobjRÁtzoneR½RVRƒR
((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyR†sr

	

	


	



	

cCsŠ|js)tjƒ|jtjjkr†|dkrDt|ƒ}n|jƒd}tjƒ|_|jj	ƒd„|Dƒ|_ndS(s4Refresh the neutron extensions cache when necessary.R|cSsi|]}||d“qS(R2((Rïtext((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pys
<dictcomp>÷s	N(
R{ttimeRER textension_sync_intervalRRMtlist_extensionsR|tclear(R,RLR textensions_list((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt!_refresh_neutron_extensions_cacheís

cCs,|r|j|d|ƒntj|jkS(NR (R%RtPORTBINDING_EXTR|(R,RLRŽR ((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyR‘ùscCs6|s|jr&|j|d|ƒntj|jkS(NR (R|R%RtAUTO_ALLOCATE_TOPO_EXT(R,RLRŽR ((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_has_auto_allocate_extensionÿscCs?|r;tj||ƒjƒ}t|ƒ}||dd<ndS(s_Populate neutron binding:profile.

        Populate it with SR-IOV related information
        R\sbinding:profileN(tpci_managertget_instance_pci_devsRÈRx(RQRR½Rvtprofile((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt!_populate_neutron_binding_profiles
cCsã|dk	rßtj||ƒ}t|ƒdkrPtjtdƒtd|ƒdS|d}|jt	j
jkrßytj
|jƒ}WnCtjk
rÊ}tjtdƒi|jd6|d6d|ƒqÜX||d	d
<qßndS(s„Add the updated MAC address value to the update_port request body.

        Currently this is done only for PF passthrough.
        is`PCI request %s does not have a unique device associated with it. Unable to determine MAC addressRQNis:Could not determine MAC address for %(addr)s, error: %(e)staddrR;R\R_(RR)R*RåR4R5R	tpci_requesttdev_typet
obj_fieldst
PciDeviceTypetSRIOV_PFt	pci_utilstget_mac_by_pci_addressRnRtPciDeviceNotFoundById(RQRR½tpci_devsRvR`R;((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyRs 

	"cCsÔ|j|d|ƒtj|jkrQ|jƒ}|jdƒ}	|	|dd<n|j|d|ƒ}
|
r||dd<|j|||ƒntj|jkrÐ|
s¹|jdƒrÐ|j	|dd<qÐndS(s‹Populate neutron extension values for the instance.

        If the extensions loaded contain QOS_QUEUE then pass the rxtx_factor.
        R trxtx_factorR\sbinding:host_idt
dns_domainRÓN(
R%Rt	QOS_QUEUER|t
get_flavorRXR‘R,RÔRÚ(R,RLRQRR½RÁR RtflavorR7thas_port_binding_extension((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyR2s	
	cCsËtj|jkrÇ|j|ƒrÇ|jdƒrÇy+ii|jd6d6}|j||ƒWqÇtjk
rÃt	j
tdƒi|jd6d|ƒtdƒi|jd6}t
jd|ƒ‚qÇXnd	S(
säUpdate an instance port dns_name attribute with instance.hostname.

        The dns_name attribute of a port on a network with a non-blank
        dns_domain attribute will be sent to the external DNS service
        (Designate) if DNS integration is enabled in Neutron. This requires the
        assignment of the dns_name to the port to be done with a Neutron client
        using the user's context. allocate_for_instance uses a port with admin
        context if the port binding extensions is enabled in Neutron. In this
        case, we assign in this method the dns_name attribute to the port with
        an additional update request. Only a very small fraction of ports will
        require this additional update request.
        R8RÓR\sENeutron error: Instance hostname %(hostname)s is not a valid DNS nameRÚRQs6Instance hostname %(hostname)s is not a valid DNS nameR¬N(RRÔR|R‘RXRÚR}R#t
BadRequestR4RRRRRR²(R,RLRQRÁRVR R½R¿((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyRSs	cCsÇg}x•|D]}y|j|ƒWq
tjk
r™}|jdkrgtjtdƒ|d|ƒqš|j|ƒtjtdƒ|d|dtƒq
Xq
Wt	|ƒdkrÃ|rÃ|d‚ndS(Ni”sPort %s does not existRQs&Failed to delete port %s for instance.texc_infoi(
R°R#R¹tstatus_codeR4RRRRÞR’Rå(R,R RQRft
raise_if_failRR\R;((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyRúos


	cKsVtjdd|ƒi|jd6}t|ƒ}|j|}g|jdgƒD]}|d^qQ}|jdƒpyg}	t|	tjƒr|	j	ƒ}	nt
g|	D]\}
}}}
|^q§ƒ}|t
|j|ƒƒO}t
|ƒ|}|j|||ƒ|j
|||dtƒtjj||jƒtj|||tjgƒƒdS(	s9Deallocate all network resources related to the instance.sdeallocate_for_instance()RQRRfRWRßR@N(R4RdR“RMR•RXt
isinstanceRtNetworkRequestListt	as_tuplesRbt_get_preexisting_port_idsR×RúR’Rtdelete_by_instance_uuidRt"update_instance_cache_with_nw_infoRYR(R,RLRQR9R˜R R™R\RfRßR¥tfipsRVRt
ports_to_skip((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytdeallocate_for_instance€s$)%	
cCsOtjdtjd|d|d|ddƒgƒ}|j||d|d|ƒS(	s!Allocate a port for the instance.RR©RnRVRRßRN(RRBRõRR(R,RLRQRVR©trequested_ipRRß((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytallocate_port_for_instance¥s	cCsªt|ƒ}|j|ƒ}||kr@|j||g|ƒn|j|||gdtƒtjj||ƒ}|r„|jƒnt	j
d|d|ƒ|j||ƒS(shRemove a specified port from the instance.

        Return network information for the instance
        R@s'VirtualInterface not found for port: %sRQ(RMRDR×RúR’RRtget_by_uuidRR4RdR(R,RLRQRVR tpreexisting_portsR
((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytdeallocate_port_for_instance²s
	
cKst|ƒj|S(s2List ports for the client based on search options.(RMR•(R,RLR˜((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyR•ÉscCstd|j||ƒƒS(sJReturn the port for the client given the port id.

        :param context: Request context.
        :param port_id: The id of port to be queried.
        :returns: A dict containing port data keyed by 'port', e.g.

        ::

            {'port': {'port_id': 'abcd',
                      'fixed_ip_address': '1.2.3.4'}}
        R\(tdictRÛ(R,RLRV((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt	show_portÍscCsä|st|ƒ}ny>|r6|j|d|ƒ}n|j|ƒ}|jdƒSWnŠtjk
r{tjd|ƒ‚netjk
rštjƒ‚nFtj	k
rß}t
dƒi|d6|d6}tjd|ƒ‚nXdS(s|Return the port for the client given the port id.

        :param context: Request context.
        :param port_id: The id of port to be queried.
        :param neutron_client: A neutron client.
        :param fields: The condition fields to query port data.
        :returns: A dict of port data.
                  e.g. {'port_id': 'abcd', 'fixed_ip_address': '1.2.3.4'}
        RR\RVs-Failed to access port %(port_id)s: %(reason)sR¬RN(RMRPRXR#RÕRtPortNotFoundR$R7R¹Rt
NovaException(R,RLRVRØRtresulttexcR¿((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyRÛÛs
	c	KsQtjdd|ƒtj||ƒ|j||||||ƒ}tjj|ƒS(Ns_get_instance_nw_info()RQ(R4Rdt
compute_utilstrefresh_info_cache_for_instancet_build_network_info_modelRYRthydrate(	R,RLRQR›RR‚RR9R((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_get_instance_nw_infoös	cCs |dkr|dk	s0|dkrQ|dk	rQtdƒ}tjd|ƒ‚ntj|ƒ}|dkr­g|D]}|d^qs}g|D]}|dd^q}n|dkrÔ|j||j|ƒ}nÂg|D]}	|	d^qÛ}
|g|D]Z}t|dd|
d|ƒrûi|ddd6|ddd6|ddd	d	6^qû}g|D])}t|d|d
|ƒrc|d^qc|}||fS(s<Return an instance's complete list of port_ids and networks.spThis method needs to be called with either networks=None and port_ids=None or port_ids and networks as not none.RRWRÁR›tlabelR2tmetaRRN(	RRRRRRUtget_nw_info_for_instanceR¦R”RU(R,RLRQR›RRtifacestifaceR£RÁtnetworks_ids((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_gather_port_ids_and_networkss4$	
G

cCs„t|ƒ}i|d6}|j|}|jdgƒ}|sXtjd|jƒ‚nd|j}i|jd6|d6|d6}|j|}|d}	xÌ|	D]Ä}
x»|D]³}|
d}|ji|d	d
6ƒii|d6d6}
y(|j	|
d	|
ƒ|j
||ƒSWq°tk
rb}d}tj
|i|
d	d
6|d	d
6|d6d|ƒq°Xq°Wq£Wtjd|jƒ‚dS(s6Add a fixed IP to the instance from specified network.R©Røtinstance_ids
compute:%sRRÒRfR¨RWt	subnet_idR\sTUnable to update port %(portid)s on subnet %(subnet_id)s with failure: %(exception)stportidRRQN(RMtlist_subnetsRXRtNetworkNotFoundForInstanceR“RR•RÞR}RYRR4Rd(R,RLRQR©R R˜R™tipam_subnetsRRfR‡tsubnetR¨R½R„R¿((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytadd_fixed_ip_to_instance:s8
	






	cCsBt|ƒ}d|j}i|jd6|d6d|d6}|j|}|d}xÌ|D]Ä}	|	d}
g}x.|
D]&}|d|krx|j|ƒqxqxWii|d6d6}
y|j|	d	|
ƒWnAtk
r}d
}tj|i|	d	d6|d6d
|ƒnX|j	||ƒSWt
jd|jd|ƒ‚dS(s$Remove a fixed IP from the instance.s
compute:%sRRÒs
ip_address=%sR¨RfR§R\RWs<Unable to update port %(portid)s with failure: %(exception)sRcRRQRR«N(RMRR“R•RÞR}RR4RdRYRt"FixedIpNotFoundForSpecificInstance(R,RLRQRnR RR˜R™RfR‡R¨t
new_fixed_ipsR»R½R„R¿((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytremove_fixed_ip_from_instance]s.





!	c	Cs’d}|j||d|dddgƒ}|jdtjƒ}|tjkrˆ|d}|j|ddƒjdƒ}|jdƒ}n||fS(sˆRetrieve port vnic info

        Invoked with a valid port_id.
        Return vnic type and the attached physical network name.
        RØRsbinding:vnic_typeR©sprovider:physical_networkRÁN(RRÛRXRYtVNIC_TYPE_NORMALtVNIC_TYPES_SRIOVtshow_network(	R,RLR RVtphynet_nameR\t	vnic_typetnet_idR­((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_get_port_vnic_infozs	
c	Cs	|s
dSt|dtƒ}xæ|D]Þ}d}tj}|jrb|j|||jƒ\}}nd}|tjkrøi|tj	6}	tj
j|ƒ}
|
r¯|
|	tj<nt
jddd|	gdttjƒƒƒ}|jj|ƒ|j}n||_q#WdS(sÓCheck requested networks for any SR-IOV port request.

        Create a PCI request object for each SR-IOV port, and add it to the
        pci_requests object that contains a list of PCI request object.
        NR+tcountitspect
request_id(RMR’RRYRlRVRrRmR.tPCI_NET_TAGtDEVICE_TYPE_FOR_VNIC_TYPERXtPCI_DEVICE_TYPE_TAGRtInstancePCIRequestR®R“tuuid4trequestsRÞRuR(R,RLtpci_requestsRßR trequest_netRoRpRRtR/R((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt#create_pci_requests_for_sriov_portsŒs,
				cCs†|j|d|ƒruy'|j|jƒtjd|jƒWn/tjk
rm}tjdtj|ƒƒq‚Xt	Sn
tjdƒt
S(sÿHelper method to determine if we can auto-allocate networks

        :param context: nova request context
        :param neutron: neutron client
        :returns: True if it's possible to auto-allocate networks, False
                  otherwise.
        R s3Network auto-allocation is available for project %ss$Unable to auto-allocate networks. %ssaUnable to auto-allocate networks. The neutron auto-allocated-topology extension is not available.(R(t-validate_auto_allocated_topology_requirementsR”R4RdR#tConflicttsixt	text_typeR’R¡(R,RLR R„((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_can_auto_allocate_network®s	
		
cCsä|j}tjd|d|ƒy|j|ƒd}Wn&tjk
r^tjd|ƒ‚nXy|j|dƒd}WnMtj	k
rÉtj
tdƒi|dd6d|ƒtjd|ƒ‚nXtjd	|d|ƒ|S(
spAutomatically allocates a network for the given project.

        :param instance: create the network for the project that owns this
            instance
        :param neutron: neutron client
        :returns: Details of the network that was created.
        :raises: nova.exception.UnableToAutoAllocateNetwork
        :raises: nova.exception.NetworkNotFound
        s2Automatically allocating a network for project %s.RQtauto_allocated_topologyR”RWRÁs=Automatically allocated network %(network_id)s was not found.R©s#Automatically allocated network: %s(R”R4Rdtget_auto_allocated_topologyR#R€RtUnableToAutoAllocateNetworkRntNetworkNotFoundClientR5R	(R,RQR R”ttopologyRÁ((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyRðÈs$
		
cCsR|r.t|dtƒr.tjj|ƒ}nd}|dks[t|ƒdks[|jr|j||j	d|ƒ}t|ƒdkr¦t
dƒ}tj|ƒ‚n|rü|rü|jrüt
jd|j	ƒ|j||ƒsütjd|j	ƒ‚qünd}nIg}x@|D]8}|jrº|j||jd|ƒ}	|	jddƒrftjd	|jƒ‚n|	jd
ƒdk}
|
rª|	jdƒrªtjd	|jƒ‚n|	d
|_q|d7}|j|jƒ|jri|jd
6d|jd6dd6}|j|d}|rJ|dd}
tjd|jd|
ƒ‚qJqqW|rN|j||j	|d|ƒ}x6|D].}|jdƒsytjd|dƒ‚qyqyWt|ƒt|ƒkrNt|ƒ}tg|D]}|d^qÙƒ}||}|rKd}x(|D] }|r)|d|p,|}qWtjd
|ƒ‚qKqNn|S(NiR isGMultiple possible networks found, use a Network ID to be more specific.seNo networks are available for project %s; checking to see if we can automatically allocate a network.R”RØRRVt
ip_allocationtdeferredR¨R©s
ip_address=%sRRfRnRRøRËRWRÑs, (RAttupleRRBtfrom_tuplesRRåR¤R¦R”RRRôR4RdRƒR†RVRÛRXRÃtPortRequiresFixedIPR©RÞRnR•R´tNetworkRequiresSubnetRbRñ(R,RLR Rßtports_needed_per_instanceR¥R¿tnet_ids_requestedRR\tdeferred_ipR˜texisting_portsti_uuidR­trequested_netid_settreturned_netid_sett
lostid_settid_strt_id((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_ports_needed_per_instanceés~				
		
			

	


			
	#

cCs$tjd|ƒt|ƒ}|j|||ƒ}|r |j|jƒd}|jddƒdkri|Std|jddgƒ}|j|d}|jdƒt	|ƒ}	|	d	krût
d
ƒit	|ƒd6|jdƒd6}
tj|
ƒ‚n||}|	|kr|S|	|Sn|S(s¾Validate that the tenant can use the requested networks.

        Return the number of instances than can be successfully allocated
        with the requested network configuration.
        svalidate_networks() for %stquotaR\iÿÿÿÿRRRWRfisCThe number of defined ports: %(ports)d is over the limit: %(quota)d(
R4RdRMR™t
show_quotaR”RXROR•RåRRR¶(R,RLRßt
num_instancesR RtquotastparamsRft
free_portsR¿tports_needed((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytvalidate_networksLs*	
cCsdid|d6}t|ƒj|}|jdgƒ}g|D]!}|dr?i|dd6^q?S(sÍRetrieve instance uuids associated with the given IP address.

        :returns: A list of dicts containing the uuids keyed by 'instance_uuid'
                  e.g. [{'instance_uuid': uuid}, ...]
        s
ip_address=%sR¨RfRR(RMR•RX(R,RLRnR˜R™RfR\((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_get_instance_uuids_by_ipss

cCs¦d|j}i|jd6|d6}|j|}|d}d	}xA|D]9}	x0|	dD]$}
|
d|kr[|	d}Pq[q[WqJW|s¢tjd|ƒ‚n|S(
s$Return port_id from a fixed address.s
compute:%sRRÒRfR¨R§RWRnN(RR“R•RRtFixedIpNotFoundForAddress(R,RRQRnRR˜R™RfRVR‡R«((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_get_port_id_by_fixed_addresss





cCsòt|ƒ}|j|||ƒ}|j||ƒ}i|d6|d6}	|j|di|	d6ƒ|drî|j||dd|ƒ}
|
d}td|d|ƒ}tjtd	ƒ|d
|ƒt	j
j||ƒ}
tj
|||
ƒndS(s(Associate a floating IP with a fixed IP.RVtfixed_ip_addressRWt
floatingipRØRRnRas?re-assign floating IP %(address)s from instance %(instance_id)sRQN(RMR¤t_get_floating_ip_by_addresstupdate_floatingipRÛROR4tinfoR
RtInstanceRLRRF(R,RLRQtfloating_addresst
fixed_addresstaffect_auto_assignedRRVtfiptparamR\torig_instance_uuidtmsg_dictt
orig_instance((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytassociate_floating_ip‘s(
	


	
		cCs…t|ƒ}|jƒjdƒ}g}xE|D]=}|jtjd|d|dd|dd|dƒƒq.Wtjd|d|ƒS(sGet all networks for client.R›RLR2RZR“RWR(RMR RXRÞRtNetworktNetworkList(R,RLRR›tnetwork_objsRÁ((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytget_all´s


c
Cs‹t|ƒ}y"|j|ƒjdƒp*i}Wn&tjk
rVtjd|ƒ‚nXtjd|d|dd|dd|dƒ}|S(s Get specific network for client.RÁR©RLR2RZR“RW(	RMRnRXR#R‡RRñRR´(R,RLRËRRÁtnet_obj((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyRXÁs"


cCs
tƒ‚dS(sDelete a network for client.N(tNotImplementedError(R,RLRË((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytdeleteÎscCs
tƒ‚dS(s"Disassociate a network for client.N(R¹(R,RLRË((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytdisassociateÒscCs
tƒ‚dS(sAssociate a network for client.N(R¹(R,RLRËR‹tproject((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt	associateÖscCs
tƒ‚dS(sGet a fixed IP from the id.N(R¹(R,RLRW((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytget_fixed_ipÛscCs]|j||ƒ}t|ƒdkr,|dS|sGtjd|ƒ‚ntjd|ƒ‚dS(s'Return instance uuids given an address.iiRnN(R¢RåRR£t&FixedIpAssociatedWithMultipleInstances(R,RLRnt	uuid_maps((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytget_fixed_ip_by_addressßs	cCs,|s
iS|j|ƒd}i||d6S(NRÁRW(Rn(R,RR©tpool((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_setup_net_dictêscCs1|s
iS|j||d|ƒ}i||d6S(NRØRW(RÛ(R,RLRRVR\((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_setup_port_dictðscCs|j|ƒ}d„|DƒS(NcSsi|]}||d“qS(RW((Rïti((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pys
<dictcomp>øs	(t_get_floating_ip_pools(R,Rtpools((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_setup_pools_dictöscCs:|ri|d6ni}|j|d}d„|DƒS(NRRfcSsi|]}||d“qS(RW((RïR‡((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pys
<dictcomp>ýs	(R•(R,RR”R˜Rf((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_setup_ports_dictúscCsÎt|ƒ}y|j|ƒd}Wnctjk
rˆ}|jdkr\tjd|ƒ‚q‰tjƒt	jt
dƒ|ƒWdQXnX|j||dƒ}|j|||dƒ}|j
||||ƒS(s3Return floating IP object given the floating IP id.R¦i”RWsUnable to access floating IP %sNtfloating_network_idRV(RMtshow_floatingipR#R¹R?RtFloatingIpNotFoundRR€R4R	RÃRÄt_make_floating_ip_obj(R,RLRWRR®R;t	pool_dictt	port_dict((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytget_floating_ipÿs
 	
cCsDittj6}|r-|ji|d6ƒn|j|}|dS(NRR›(R’RtNET_EXTERNALtupdateR (R,RR”R˜R™((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyRÆs
cCs@t|ƒ}|j|ƒ}g|D]}|dp9|d^q"S(sReturn floating IP pool names.R2RW(RMRÆ(R,RLRRÇtn((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytget_floating_ip_poolsscCsç||d}tjjd|dd|dd|dp?|dd|dd	|d
ƒ}|drtjd|dƒ|_n	d|_|d
rÚ||d
d}tjd
|d|ƒ|_|jrã||j_qãn	d|_|S(NRÊRWRntfloating_ip_addressRÂR2R”Rtfixed_ip_idRVR¥RRLR“(	Rtfloating_iptNeutronFloatingIPtFixedIPR»RRªRQR(R,RLR®RÎRÏRÂtfloatingR((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyRÍs"

		
		cCsct|ƒ}|j||ƒ}|j||dƒ}|j|||dƒ}|j||||ƒS(s&Return a floating IP given an address.RÊRV(RMR§RÃRÄRÍ(R,RLRnRR®RÎRÏ((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytget_floating_ip_by_address8s	
cCs~t|ƒ}|j}|j|d|ƒ}|s4gS|j|ƒ}|j||ƒ}g|D]}|j||||ƒ^q\S(NR(RMR”t_safe_get_floating_ipsRÈRÉRÍ(R,RLRR”RGRÎRÏR®((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytget_floating_ips_by_projectAs	cCs€t|ƒ}|j||ƒ}|ds,dSy |j||dd|ƒ}Wn)tjk
rwtjd|dƒdSX|dS(s@Return the instance id a floating IP's fixed IP is allocated to.RVRØsThe port(%s) is not foundRN(RMR§RRÛRRQR4Rd(R,RLRnRR®R\((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt#get_instance_id_by_floating_addressLs

cCs
tƒ‚dS(N(R¹(R,RLRQ((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytget_vifs_by_instancebscCs
tƒ‚dS(N(R¹(R,RLR_((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytget_vif_by_mac_addressescCsÏittj6dd6}tj|ƒr=|ji|d6ƒn|ji|d6ƒ|j|}|d}t|ƒdkrˆ|ddSt|ƒdkr©tj	ƒ‚n"t
dƒ|}tjd|ƒ‚dS(	NRWRR2R›iis6Multiple floating IP pools matches found for name '%s'R(R’RRÑRtis_uuid_likeRÒR RåRtFloatingIpPoolNotFoundRRR(R,Rt
name_or_idR˜R™R¥R¿((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt&_get_floating_ip_pool_id_by_name_or_idhs
	cCsôt|ƒ}|ptj}|j||ƒ}ii|d6d6}y|j|ƒ}Wn‘tjtjfk
r}tj	t
j|ƒƒ‚n[tjk
rº}tj
t
j|ƒƒ‚n.tjk
rç}tjt
j|ƒƒ‚nX|ddS(s+Add a floating IP to a project from a pool.RÊR¦RÕ(RMREtdefault_floating_poolRätcreate_floatingipR#R·t ExternalIpAddressExhaustedClientRtNoMoreFloatingIpsRR‚RµtFloatingIpLimitExceededR=tFloatingIpBadRequest(R,RLRÂRtpool_idR¯R®R;((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytallocate_floating_ipzscKs·y|j|dSWn›tjk
r,gStjk
r²}|jdkrQgStjƒPtjt	dƒdj
gtj|ƒD]\}}d||f^qƒƒƒWdQXnXdS(s5Get floating IP gracefully handling 404 from Neutron.tfloatingipsi”s#Unable to access floating IP for %ss, s%s %sN(
tlist_floatingipsR#tNotFoundR¹R?RR€R4RR	tjoinRt	iteritems(R,RR9R;tktv((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyR܍s
	cCs†|stjd|ƒ‚n|j|d|ƒ}t|ƒdkrWtjd|ƒ‚n't|ƒdkr~tjd|ƒ‚n|dS(s)Get floating IP from floating IP address.RnRÕii(RtFloatingIpNotFoundForAddressRÜRåt!FloatingIpMultipleFoundForAddress(R,RRnRG((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyR§ŸscCs|j|d|d|ƒS(s(Get floating IPs from fixed IP and port.R¥RV(RÜ(R,RR»R\((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt#_get_floating_ips_by_fixed_and_portªscCs|j||ƒdS(s;Remove a floating IP with the given address from a project.N(t_release_floating_ip(R,RLRnR­((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytrelease_floating_ip¯s
cCsLtjd„ƒ}|r.|||||ƒn|j||ddtƒdS(s Removes (deallocates) and deletes the floating IP.

        This api call was added to allow this to be done in one operation
        if using neutron.
        cSs|j||ddtƒdS(NRntraise_if_associated(R÷R¡(R,RLRQR×((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt&_release_floating_ip_and_refresh_cacheÆsRnRùN(RRŽR÷R¡(R,RLRQR×Rú((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt$disassociate_and_release_floating_ip¾s
cCsXt|ƒ}|j||ƒ}|rC|drCtjd|ƒ‚n|j|dƒdS(NRVRnRW(RMR§RtFloatingIpAssociatedtdelete_floatingip(R,RLRnRùRR®((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyR÷Òs
cCsDt|ƒ}|j||ƒ}|j|diidd6d6ƒdS(s-Disassociate a floating IP from the instance.RWRVR¦N(RMR§R¨R(R,RLRQRnR­RR®((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytdisassociate_floating_ipÛs	cCsdS(s,Start to migrate the network of an instance.N((R,RLRQt	migration((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytmigrate_instance_startèscCs!|j|||dd|ƒdS(s,Finish migrating the network of an instance.tdest_computeRÿN(t!_update_port_binding_for_instance(R,RLRQRÿ((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytmigrate_instance_finishîs
cCs
tƒ‚dS(s#Force add a network to the project.N(R¹(R,RLR”RË((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytadd_network_to_projectôsc	Cs™g}xŒ|dD]€}tjd|dƒ}|j||d|dƒ}x7|D]/}tjd|dddƒ}|j|ƒqQW|j|ƒqW|S(NR¨RnR§RWRÕttypeRÚ(RYRÙRötIPtadd_floating_ipRÞ(	R,RR\tnetwork_IPsR»tfixedtfloatsR«R®((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_nw_info_get_ipsøs
	cCsS|j||ƒ}x:|D]2}g|D]}|j|ƒr&|^q&|d<qW|S(Ntips(t_get_subnets_from_porttis_in_subnet(R,RLR\RRøRgR»((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_nw_info_get_subnetss


#c
CsZd}d}x{|D]A}|d|dkr|d}|d}|jdƒ}PqqW|d}tjtdƒi|dd6|d6ƒd}d}	d}
|jdƒ}|jdiƒ}|tjkrô|jtjtj	j
ƒ}|d}	n|tjkr)|jtjd	|dƒ}t}
nh|tj
krE|d}nL|tjkr‘|jtjtƒr‘|jtjtj	j
ƒ}|d}	n|dk	r¼|tj
kr¼|tj }ntjd|dd
|dtjd|d|d|ƒ}
||
d
<|jdƒ}|r7|jdƒ}|r7||
d<q7n|
dk	rP|
|
d<n|
|	fS(NR©RWR2RtmtusaNetwork %(id)s not matched with the tenants network! The ports tenant %(tenant_id)s will be used.sbinding:vif_typesbinding:vif_detailstbrqtbridgetinjectedRZRøsbinding:profileRltshould_create_bridge(RRXR4RRRRYtVIF_TYPE_OVStVIF_DETAILS_BRIDGE_NAMERER t
ovs_bridgetVIF_TYPE_BRIDGER’tVIF_TYPE_DVStVIF_TYPE_VHOSTUSERtVIF_DETAILS_VHOSTUSER_OVS_PLUGR¡tNIC_NAME_LENR´t
flat_injected(R,R\R›Røtnetwork_nametnetwork_mtuR­RRtovs_interfaceidRtvif_typetport_detailsRÁRRl((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_nw_info_build_networksd




	
	
	
		

cCsUtj|ƒ}|s+tjdd|ƒng|D]}|jdƒr2|d^q2S(s¼Retrieve the preexisting ports associated with the given instance.
        These ports were not created by nova and hence should not be
        deallocated upon instance deletion.
        s$Instance cache missing network info.RQtpreserve_on_deleteRW(RUR\R4RdRX(R,RQtnet_infoR
((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyRDMs

cCsli|jd6|jd6}|dkr;t|dtƒ}n|}|j|}	|	jdgƒ}
|dkow|dk}|j||||ƒ\}}tj	ƒ}|dkr¹g}nt
||j|ƒƒ}i}
x|
D]}||
|d<qßWxn|D]f}|
j|ƒ}|r?t}|dtks?|ddkrHt}n|j
||ƒ}|j|||ƒ}d	|d}|tj }|j|||ƒ\}}|d|k}|jtjd|dd
|dd|d
|jdtjƒd|jdƒd|jdƒd|jdƒd|d|d|d|ƒƒqþ|rþtjtdƒ|d|ƒqþqþW|S(sReturn list of ordered VIFs attached to instance.

        :param context: Request context.
        :param instance: Instance we are returning network info for.
        :param networks: List of networks being attached to an instance.
                         If value is None this value will be populated
                         from the existing cached value.
        :param port_ids: List of port_ids that are being attached to an
                         instance in order of attachment. If value is None
                         this value will be populated from the existing
                         cached value.
        :param admin_client: A neutron client for the admin context.
        :param preexisting_port_ids: List of port_ids that nova didn't
                        allocate and there shouldn't be deleted when
                        an instance is de-allocated. Supplied list will
                        be added to the cached list of preexisting port
                        IDs for this instance.
        RRR+RfRWRtstatustACTIVEttapRnR_RÁRpsbinding:vnic_typeRsbinding:vif_typeR+sbinding:profiletdetailssbinding:vif_detailsR tdevnametactiveR$ssPort %s from network info_cache is no longer associated with instance in Neutron. Removing from network info_cache.RQN(R”R“RRMR’R•RXR`RYRRbRDR¡RRRR#RÞtVIFRlR4R©R
(R,RLRQR›RR‚RR˜RR™tcurrent_neutron_portstnw_info_refreshRtcurrent_neutron_port_maptcurrent_neutron_portRVt
vif_activeRRøR*RÁR R$((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyRWYsl

	

					
		

	
cCsá|d}|sgSig|D]}|d^qd6}t|ƒj|}|jdgƒ}g}xu|D]m}	i|	dd6tjd|	ddd	ƒd	6}
i|	d
d
6dd6}t|ƒj|}|jd
gƒ}xI|D]A}x8|dD],}
|
d|	dkr÷|
d|
d<Pq÷q÷WqæWtj|
}x9|	jdgƒD]%}|jtjd|ddƒƒqMWxS|	jdgƒD]?}|jtj	d|dd	tjd|ddd	ƒƒƒq‰W|j
|ƒqlW|S(s$Return the subnets for a given port.R¨RbRWRøtcidrRnt
gateway_ipRtgatewayR©snetwork:dhcpRÒRfR§tdhcp_servertdns_nameserverstdnsthost_routestdestinationtnexthop(RMRdRXRYRR•tSubnettadd_dnst	add_routetRouteRÞ(R,RLR\R¨R«R˜R™RfRøRgtsubnet_dictt
dhcp_portsR‡tip_pairt
subnet_objectR7troute((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyR
µsB
$
	



	
cCs
tƒ‚dS(ssReturn a list of available dns domains.

        These can be used to create DNS entries for floating IPs.
        N(R¹(R,RL((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytget_dns_domainsæscCs
tƒ‚dS(s'Create specified DNS entry for address.N(R¹(R,RLRnR2tdns_typetdomain((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt
add_dns_entryíscCs
tƒ‚dS(s'Create specified DNS entry for address.N(R¹(R,RLR2RnRF((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytmodify_dns_entryñscCs
tƒ‚dS(sDelete the specified dns entry.N(R¹(R,RLR2RF((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytdelete_dns_entryõscCs
tƒ‚dS(s Delete the specified dns domain.N(R¹(R,RLRF((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytdelete_dns_domainùscCs
tƒ‚dS(s#Get entries for address and domain.N(R¹(R,RLRnRF((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytget_dns_entries_by_addressýscCs
tƒ‚dS(s Get entries for name and domain.N(R¹(R,RLR2RF((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytget_dns_entries_by_name	scCs
tƒ‚dS(s8Create a private DNS domain with nova availability zone.N(R¹(R,RLRFR((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytcreate_private_dns_domain	scCs
tƒ‚dS(s7Create a private DNS domain with optional nova project.N(R¹(R,RLRFR¼((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytcreate_public_dns_domain		scCs|j|||ƒdS(s-Setup network for specified instance on host.N(R(R,RLRQR‹((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytsetup_instance_network_on_host
	scCsdS(s/Cleanup network for specified instance on host.N((R,RLRQR‹((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt cleanup_instance_network_on_host	scCs;|r+|jdƒdkr+|j|jfS|j|jfS(NR&treverted(RXtnew_pci_devicestold_pci_devices(R,tmigration_contextRÿ((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt'_get_pci_devices_from_migration_context	s

cs”|j}|siS|j||ƒ\}‰|rˆrtjdig|D]}|^qJd6gˆD]}|^qdd6ƒ‡fd†|DƒSiS(sçGet the mapping between the old PCI devices and the new PCI
        devices that have been allocated during this migration.  The
        correlation is based on PCI request ID which is unique per PCI
        devices for SR-IOV ports.

        :param context:  The request context.
        :param instance: Get PCI mapping for this instance.
        :param migration: The migration for this instance.
        :Returns: dictionary of mapping {'<old pci address>': <New PciDevice>}
        sjDetermining PCI devices mapping using migrationcontext: old_pci_devices: %(old)s, new_pci_devices: %(new)stoldtnewcs;i|]1}ˆD]$}|j|jkr||j“qqS((RuRn(RïRVRW(RR(sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pys
<dictcomp>7	s	
(RTRUR4Rd(R,RLRQRÿRTRStdev((RRsO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt_get_pci_mapping_for_migration	s			c
CsH|j|dtƒsdSt|dtƒ}i|jd6|jd6}|j|}d}g}	|d}
x+|
D]#}i}|jtiƒ}
|jt	ƒ|krÔ||t	<|
jt
ƒrÔ|
t
=|
|t<qÔn|jdƒ}|tjkr}|s|j
|||ƒ}n|
jdƒ}|j|ƒ}|rT|
jt|ƒƒ|
|t<q}tjd|d	d
tdƒ|ƒ‚n|	j|d	|fƒqqWx©|	D]¡\}}|rŸtjtdƒi|d	d
6|d6d|ƒy|j|i|d
6ƒWq@tk
r<tjƒ!tjtdƒ|d|ƒWdQXq@XqŸqŸWdS(NRŽR+RRRfsbinding:vnic_typeRkRVRWR¬sUnable to correlate PCI slot %ss5Updating port %(port)s with attributes %(attributes)sR\t
attributesRQs,Unable to update binding details for port %s(R‘R’RMR“R”R•RRXR~RŠR†RYRmRYRÒRxRtPortUpdateFailedRRÞR4R©R
R}RRR€R	(R,RLRQR‹RÿR R˜R™tpci_mappingtport_updatesRfR‡tupdatestbinding_profileRpRktnew_devRV((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyR=	sT




	
	


c	Cs¥|j|ƒtj|jkr¡t|ƒ}ii|d6d6}y|j|d|ƒWq¡tk
rtjƒ%t	j
tdƒ|dd|ƒWdQXq¡XndS(s¦Update instance vnic index.

        When the 'VNIC index' extension is supported this method will update
        the vnic index of the instance on the port.
        t
vnic_indexR\RWs1Unable to update instance VNIC index for port %s.RQN(R%RtVNIC_INDEX_EXTR|RMR}RRR€R4RR	(R,RLRQR
tindexR R½((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pytupdate_instance_vnic_index{	s


N(lR=R>R?R-R…RˆRRR¡RšR¦RÀRÆtstaticmethodRÉRÐR×RáRãRîRöRÿRRR%R‘R(R,RRRRúRIRKRNR•RPRÛRYR`RRŽRhRkRrR~RƒRðR™R¡R¢R¤R³R·RXRºR»tSENTINELR½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þRRRRRR#RDRWR
RDRGRHRIRJRKRLRMRNRORPRURYRRd(((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyRyðsâ		
		&C		
$	K		:	P	?	a	g
"		&			3#		"		!	c	'		 	
	
																								
		A	Z	1											
	=cs)ˆr%|jd‡‡fd†ƒndS(s;Sort a list with respect to the preferred network ordering.tkeycsˆjˆ|ƒƒS(N(Rc(RÅ(taccessort	preferred(sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyRŸ‘	sN(tsort(Rht	unorderedRi((RhRisO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyR¢Ž	s(KR R“t
keystoneauth1RRtneutronclient.commonRR#tneutronclient.v2_0RRItoslo_logRtloggingt
oslo_utilsRRRtnova.computeRRUt	nova.confRRt	nova.i18nRR	R
Rtnova.networkRR
RYtnova.network.neutronv2RRtnova.objectsRR0tnova.pciRR)RR.R3RRot
nova.policiesRRÍRREt	getLoggerR=R4RRRRâR~RŠR†RR'RJR(R¡RMRUR^RiRxt
NetworkAPIRyR¢(((sO/home/tvault/.virtenv/lib/python2.7/site-packages/nova/network/neutronv2/api.pyt<module>s`"		,#			2	ÿÿÿÿÿÿÿÿ¦