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    
python3-dmapi-el9 / usr / lib / python3.9 / site-packages / dmapi / tests / __pycache__ / fixtures.cpython-39.pyc
Size: Mime:
a

[r`e/ã@s2dZddlmZddlZddlmZddlZddlZddl	Z	ddl
Z
ddlZddlm
ZddlZddlmZddlmZddlZddlmZdd	lmZdd
lmZddlmZddlm Z dd
l!m"Z"ddl#m$Z%ddl&m'Z'ddl(m)Z*ddl+m,Z,ddl-m.Z.ddl/m0Z
ddl+m1Z1ddl2m3Z4ddl+m5Z5ddl6m7Z8ddl6m9Z:ddl+m;Z<ddl+m=Z=ddl+m9Z9ddl>m?Z?ddl@mAZAddl+mBZBdZCejDZDddd œaEd!aFGd"d#„d#ejGƒZHGd$d%„d%ejIƒZJGd&d'„d'ejGƒZKGd(d)„d)ejGƒZLGd*d+„d+ejGƒZMGd,d-„d-ejGƒZNGd.d/„d/ejGƒZOGd0d1„d1e=jPƒZQGd2d3„d3ejGƒZRGd4d5„d5ejGƒZSGd6d7„d7ejGƒZTGd8d9„d9ejGƒZUGd:d;„d;ejGƒZVGd<d=„d=ejGƒZWGd>d?„d?ejGƒZXGd@dA„dAejGƒZYGdBdC„dCejGƒZZGdDdE„dEejGƒZ[GdFdG„dGejGƒZ\GdHdI„dIe]ƒZ^GdJdK„dKejGƒZ_GdLdM„dMejGƒZ`GdNdO„dOejGƒZaGdPdQ„dQejGƒZbGdRdS„dSejGƒZcGdTdU„dUejGƒZdGdVdW„dWe]ƒZeGdXdY„dYejGƒZfGdZd[„d[ejGƒZgGd\d]„d]ejGƒZhGd^d_„d_ejGƒZiGd`da„dae]ƒZjGdbdc„dcejGƒZkGddde„deejlƒZmGdfdg„dgejGƒZnGdhdi„diejGƒZodS)jzFixtures for Nova tests.é)Úabsolute_importN)Úcontextmanager)Úsession)Ú	lockutils)Úcfg)Úconffixture)Údaemon)Ú	uuidutils)Úadapters)Úinterceptor)Útenant_networks)Údeploy)Úwsgi_app)Úrpcapi©Úcontext)Ú	migration)Úapi)Ú	exception)Úmodel)Úobjects)Úbase)Úservice)Úquota)Úrpc)Úclient)Úuuidsentinel)Úwsgi)ÚTrueÚtrueÚ1ZyesÚ)ÚmainrFcs*eZdZdZddd„Z‡fdd„Z‡ZS)ÚServiceFixturez Run a service as a test fixture.NcKs2|}|p
|}| d|¡| dd|¡||_dS)NÚhostZbinaryznova-%s)Ú
setdefaultÚkwargs)ÚselfÚnamer$r&©r)ú8/usr/lib/python3.9/site-packages/dmapi/tests/fixtures.pyÚ__init__8s
zServiceFixture.__init__cs@tt|ƒ ¡tjjfi|j¤Ž|_|j ¡| |jj	¡dS©N)
Úsuperr#ÚsetUprZServiceÚcreater&ÚstartÚ
addCleanupÚkill©r'©Ú	__class__r)r*r.Bs
zServiceFixture.setUp)N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r+r.Ú
__classcell__r)r)r4r*r#5s

r#c@s(eZdZdZdd„Zdd„Zdd„ZdS)	ÚNullHandlerzÜcustom default NullHandler to attempt to format the record.

    Used in conjunction with
    log_fixture.get_logging_handle_error_fixture to detect formatting errors in
    debug level logs without saving the logs.
    cCs| |¡dSr,)Úformat©r'Úrecordr)r)r*ÚhandlePszNullHandler.handlecCsdSr,r)r>r)r)r*ÚemitSszNullHandler.emitcCs
d|_dSr,)Úlockr3r)r)r*Ú
createLockVszNullHandler.createLockN)r7r8r9r:r@rArCr)r)r)r*r<Isr<cs eZdZdZ‡fdd„Z‡ZS)ÚStandardLoggingaÅSetup Logging redirection for tests.

    There are a number of things we want to handle with logging in tests:

    * Redirect the logging to somewhere that we can test or dump it later.

    * Ensure that as many DEBUG messages as possible are actually
       executed, to ensure they are actually syntactically valid (they
       often have not been).

    * Ensure that we create useful output for tests that doesn't
      overwhelm the testing system (which means we can't capture the
      100 MB of debug logging on every run).

    To do this we create a logger fixture at the root level, which
    defaults to INFO and create a Null Logger at DEBUG which lets
    us execute log messages at DEBUG but not keep the output.

    To support local debugging OS_DEBUG=True can be set in the
    environment, which will print out the full debug logging.

    There are also a set of overrides for particularly verbose
    modules to be even less than INFO.

    csÊtt|ƒ ¡t ¡}| tj¡tj 	d¡t
vr:tj}ntj}d}| t
j|dd¡|_|jd |¡|tjkr¬tƒ}| t
j|dd¡| tj¡t d¡ tj¡dd	„}| t
 d
|¡¡dS)NZOS_DEBUGz0%(asctime)s %(levelname)s [%(name)s] %(message)s)r=ÚlevelrF)Z
nuke_handlerszmigrate.versioning.apicWsdSr,r))Úargsr)r)r*Úfake_logging_setupšsz1StandardLogging.setUp.<locals>.fake_logging_setupzoslo_log.log.setup)r-rDr.Ústd_loggingZ	getLoggerZsetLevelÚDEBUGÚosÚenvironÚgetÚ_TRUE_VALUESÚINFOÚ
useFixtureÚfixturesZ
FakeLoggerÚloggerÚhandlersr<Z
LogHandlerZWARNINGÚMonkeyPatch)r'ÚrootrEZfsZhandlerrGr4r)r*r.us0ÿ
ÿÿ
ÿzStandardLogging.setUp©r7r8r9r:r.r;r)r)r4r*rDZsrDcs8eZdZdZ‡fdd„Zedd„ƒZedd„ƒZ‡ZS)ÚOutputStreamCapturezýCapture output streams during tests.

    This fixture captures errant printing to stderr / stdout during
    the tests and lets us see those streams at the end of the test
    runs instead. Useful to see what was happening during failed
    tests.
    cs‚tt|ƒ ¡tj d¡tvrF| t 	d¡¡|_
| t d|j
j¡¡tj d¡tvr~| t 	d¡¡|_
| t d|j
j¡¡dS)NZOS_STDOUT_CAPTUREÚstdoutz
sys.stdoutZOS_STDERR_CAPTUREÚstderrz
sys.stderr)r-rVr.rJrKrLrMrOrPZStringStreamÚoutrSÚstreamÚerrr3r4r)r*r.©sÿÿzOutputStreamCapture.setUpcCs|jjd ¡S)NrX)r[Ú_detailsÚas_textr3r)r)r*rX´szOutputStreamCapture.stderrcCs|jjd ¡S)NrW)rYr\r]r3r)r)r*rW¸szOutputStreamCapture.stdout)	r7r8r9r:r.ÚpropertyrXrWr;r)r)r4r*rV¡s
rVcs.eZdZdZd‡fdd„	Z‡fdd„Z‡ZS)ÚTimeoutaZSetup per test timeouts.

    In order to avoid test deadlocks we support setting up a test
    timeout parameter read from the environment. In almost all
    cases where the timeout is reached this means a deadlock.

    A class level TIMEOUT_SCALING_FACTOR also exists, which allows
    extremely long tests to specify they need more time.
    écsZtt|ƒ ¡zt|ƒ|_Wnty4d|_Yn0|dkrN|j|9_ntdƒ‚dS)Nrr`zscaling value must be >= 1)r-r_r+ÚintÚtest_timeoutÚ
ValueError)r'ÚtimeoutZscalingr4r)r*r+ÈszTimeout.__init__cs2tt|ƒ ¡|jdkr.| tj|jdd¡dS)NrT)Zgentle)r-r_r.rbrOrPr3r4r)r*r.Ôs
z
Timeout.setUp)r`r6r)r)r4r*r_½s
r_cs$eZdZ‡fdd„Zdd„Z‡ZS)ÚDatabasePoisonFixturecs&tt|ƒ ¡| t d|j¡¡dS)NzCoslo_db.sqlalchemy.enginefacade._TransactionFactory._create_session)r-rer.rOrPrSÚ_poison_configurer3r4r)r*r.Ûs
ýzDatabasePoisonFixture.setUpcOstdƒ‚dS)NzÀThis test uses methods that set internal oslo_db state, but it does not claim to use the database. This will conflict with the setup of tests that do use the database and cause failures later.©Ú	Exception)r'ÚaÚkr)r)r*rfâsz'DatabasePoisonFixture._poison_configure)r7r8r9r.rfr;r)r)r4r*reÚsrecsneZdZdZddd„Z‡fdd„Zdd„Zd	d
„Zdd„Zd
d„Z	dd„Z
dd„Zdd„Ze
dd„ƒZ‡ZS)ÚSingleCellSimplea
Setup the simplest cells environment possible

    This should be used when you do not care about multiple cells,
    or having a "real" environment for tests that should not care.
    This will give you a single cell, and map any and all accesses
    to that cell (even things that would go to cell0).

    If you need to distinguish between cell0 and cellN, then you
    should use the CellDatabases fixture.

    If instances should appear to still be in scheduling state, pass
    instances_created=False to init.
    TcCs
||_dSr,)Úinstances_created)r'rlr)r)r*r+szSingleCellSimple.__init__cs´tt|ƒ ¡| t d|j¡¡| t d|j¡¡| t d|j¡¡| t d|j	¡¡| t d|j
¡¡| t d|j¡¡| t d|j¡¡| t dd	d
„¡¡dS)Nz-nova.objects.CellMappingList._get_all_from_dbz-nova.objects.CellMapping._get_by_uuid_from_dbz-nova.objects.HostMapping._get_by_host_from_dbz:nova.objects.InstanceMapping._get_by_instance_uuid_from_dbz?nova.objects.InstanceMappingList._get_by_instance_uuids_from_dbz(nova.objects.InstanceMapping._save_in_dbúnova.context.target_cellznova.context.set_target_cellcSsdSr,r))ÚcÚmr)r)r*Ú<lambda>(óz(SingleCellSimple.setUp.<locals>.<lambda>)
r-rkr.rOrPrSÚ_fake_cell_listÚ_fake_cell_getÚ_fake_hostmapping_getÚ_fake_instancemapping_getÚ_fake_instancemapping_get_uuidsÚ_fake_instancemapping_get_saveÚ_fake_target_cellr3r4r)r*r.sBþþþþþþþþzSingleCellSimple.setUpcGsdddd| ¡ddœS)Nr`Zhost1r)ÚidÚ
updated_atÚ
created_atr$Úcell_mapping©rr©r'rFr)r)r*rt*s
üz&SingleCellSimple._fake_hostmapping_getcCs,ddd||jrdpdd|jr$| ¡p&ddœS)Nr`Zproject)ryrzr{Ú
instance_uuidZcell_idÚ
project_idr|)rlrs)r'rr)r)r*Ú _fake_instancemapping_get_common1søz1SingleCellSimple._fake_instancemapping_get_commoncGs| |d¡S)Néþÿÿÿ©rr~r)r)r*rw=sz/SingleCellSimple._fake_instancemapping_get_savecGs| |d¡S)Néÿÿÿÿrƒr~r)r)r*ru@sz*SingleCellSimple._fake_instancemapping_getcs‡fdd„|dDƒS)Ncsg|]}ˆ |¡‘qSr))ru)Ú.0Úuuidr3r)r*Ú
<listcomp>DsÿzDSingleCellSimple._fake_instancemapping_get_uuids.<locals>.<listcomp>r„r)r~r)r3r*rvCs
ÿz0SingleCellSimple._fake_instancemapping_get_uuidscGs| ¡dS)Nrr}r~r)r)r*rsGszSingleCellSimple._fake_cell_getcGsdddtjddddœgS)Nr`Zonlycellzfake://nowhere/z
sqlite:///)ryrzr{r†r(Z
transport_urlÚdatabase_connection)rZcell1r~r)r)r*rrJsúz SingleCellSimple._fake_cell_listccs
|VdSr,r))r'rÚtarget_cellr)r)r*rxSsz"SingleCellSimple._fake_target_cell)T)r7r8r9r:r+r.rtrrwrurvrsrrrrxr;r)r)r4r*rkýs
	rkcs,eZdZdZ‡fdd„Z‡fdd„Z‡ZS)ÚCheatingSerializeraA messaging.RequestContextSerializer that helps with cells.

    Our normal serializer does not pass in the context like db_connection
    and mq_connection, for good reason. We don't really want/need to
    force a remote RPC server to use our values for this. However,
    during unit and functional tests, since we're all in the same
    process, we want cell-targeted RPC calls to preserve these values.
    Unless we had per-service config and database layer state for
    the fake services we start, this is a reasonable cheat.
    cs(tt|ƒ |¡}|j|d<|j|d<|S)z0Serialize context with the db_connection inside.Ú
db_connectionÚ
mq_connection)r-rŠÚserialize_contextr‹rŒ)r'rÚvaluesr4r)r*res

z$CheatingSerializer.serialize_contextcs0tt|ƒ |¡}| dd¡|_| dd¡|_|S)z7Deserialize context and honor db_connection if present.r‹NrŒ)r-rŠÚdeserialize_contextÚpopr‹rŒ)r'rŽÚctxtr4r)r*rlsz&CheatingSerializer.deserialize_context)r7r8r9r:rrr;r)r)r4r*rŠZs
rŠcsteZdZdZdd„Zdd„Zedd„ƒZdd	d
„Zdd„Z	dd
d„Z
ddd„Zddd„Z‡fdd„Z
dd„Z‡ZS)Ú
CellDatabasesaUCreate per-cell databases for testing.

    How to use::

      fix = CellDatabases()
      fix.add_cell_database('connection1')
      fix.add_cell_database('connection2', default=True)
      self.useFixture(fix)

    Passing default=True tells the fixture which database should
    be given to code that doesn't target a specific cell.
    cCs i|_d|_d|_t ¡|_dSr,)Ú
_ctxt_mgrsÚ_last_ctxt_mgrÚ_default_ctxt_mgrrZReaderWriterLockÚ
_cell_lockr3r)r)r*r+szCellDatabases.__init__cCs\tdsX|j|}| ¡ ¡}| ¡}tjddd dd„|j 	¡Dƒ¡td<| 
¡dS)Nr"©Údatabaser!css|]
}|VqdSr,r)©r…Úliner)r)r*Ú	<genexpr>–rqz.CellDatabases._cache_schema.<locals>.<genexpr>)Ú	DB_SCHEMAr“Úget_legacy_facadeÚ
get_engineÚconnectrÚdb_syncÚjoinÚ
connectionÚiterdumpÚdispose)r'Úconnection_strÚctxt_mgrÚengineÚconnr)r)r*Ú
_cache_schemas

ÿzCellDatabases._cache_schemac	csÔ|j ¡¶|durV| ||¡}|VWdƒn1s<0YWdƒdS|j|j}||_z>| ||¡}|VWdƒn1s’0YW|j|_n
|j|_0Wdƒn1sÆ0YdSr,)r–Z
write_lockÚ_real_target_cellr“rˆr”r•)r'rr|rnr¦Zccontextr)r)r*Ú_wrap_target_cellšs$&zCellDatabases._wrap_target_cellNcCs|j|}|Sr,)r“)r'r¢r¦r)r)r*Ú_wrap_create_context_manager²s
z*CellDatabases._wrap_create_context_managercCsZz|jr|jWSWnty$Yn0|j ¡|jWdƒS1sL0YdSr,)r‹ÚAttributeErrorr–Z	read_lockr”©r'rr)r)r*Ú_wrap_get_context_manager¶sz'CellDatabases._wrap_get_context_managercCst|ƒ}tjtj||d|dS)z3Mirror rpc.get_server() but with our special sauce.Zeventlet)ÚexecutorÚ
serializer)rŠÚ	messagingZget_rpc_serverrÚ	TRANSPORT)r'ÚtargetZ	endpointsr±r)r)r*Ú_wrap_get_serverÈsüzCellDatabases._wrap_get_servercCst|ƒ}tjtj|||dS)z3Mirror rpc.get_client() but with our special sauce.)Úversion_capr±)rŠr²Z	RPCClientrr³)r'r´r¶r±r)r)r*Ú_wrap_get_clientÑsýzCellDatabases._wrap_get_clientFcsžt ¡‰ˆ|j|<ˆ|_|jdus&|r,ˆ|_‡fdd„}t d|¡F| |¡ˆ ¡ 	¡}| 
¡| ¡}|j 
td¡Wdƒn1s0YdS)zõAdd a cell database to the fixture.

        :param connection_str: An identifier used to represent the connection
        string for this database. It should match the database_connection field
        in the corresponding CellMapping.
        NcsˆSr,r)r©r¦r)r*Úget_context_managerôsz<CellDatabases.add_cell_database.<locals>.get_context_managerú*nova.db.sqlalchemy.api.get_context_managerr")rÚcreate_context_managerr“r”r•rPrSr©rržr¤rŸr¢Ú
executescriptrœ)r'r¥Údefaultr¹r§r¨r)r¸r*Úadd_cell_databaseÙs
þ
zCellDatabases.add_cell_databasecsŠtt|ƒ ¡| |j¡tj|_| t	 
d|j¡¡| t	 
d|j¡¡| t	 
d|j
¡¡| t	 
d|j¡¡| t	 
d|j¡¡dS)Nz-nova.db.sqlalchemy.api.create_context_managerrºrmznova.rpc.get_serverznova.rpc.get_client)r-r’r.r1Úcleanuprr‰rªrOrPrSr¬r¯r«rµr·r3r4r)r*r.s.þþþþþzCellDatabases.setUpcCs,t|j ¡ƒD]}| ¡ ¡}| ¡qdSr,)Úlistr“rŽrržr¤)r'r¦r§r)r)r*r¿szCellDatabases.cleanup)N)N)NN)F)r7r8r9r:r+r©rr«r¬r¯rµr·r¾r.r¿r;r)r)r4r*r’ts



	

*r’csBeZdZd
‡fdd„	Zdd„Zdd„Zd	d
„Z‡fdd„Z‡ZS)ÚDatabaser"Ncsrtt|ƒ ¡ts t t¡da||_|dkr^|durTtj|d}| 	¡}|j
|_
qntj
|_
n|dkrntj|_
dS)z›Create a database fixture.

        :param database: The type of database, 'main' or 'api'
        :param connection: The connection string to use
        Tr"N)r¢r)r-rÁr+ÚSESSION_CONFIGUREDrZ	configureÚCONFr˜r»rržÚget_api_engine)r'r˜r¢r¦Zfacader4r)r*r+#s
ÿ

zDatabase.__init__cCsTt|jsP| ¡}| ¡}tj|jdd dd„|j ¡Dƒ¡t|j<| 	¡dS)Nr—r!css|]
}|VqdSr,r)r™r)r)r*r›Brqz)Database._cache_schema.<locals>.<genexpr>)
rœr˜ržrŸrr r¡r¢r£r¤©r'r§r¨r)r)r*r©<s

ÿzDatabase._cache_schemacCs| ¡}| ¡dSr,©ržr¤©r'r§r)r)r*r¿FszDatabase.cleanupcCs6| ¡| ¡}| ¡| ¡}|j t|j¡dSr,)r©ržr¤rŸr¢r¼rœr˜rÅr)r)r*ÚresetJs
zDatabase.resetcs&tt|ƒ ¡| ¡| |j¡dSr,)r-rÁr.rÈr1r¿r3r4r)r*r.QszDatabase.setUp)r"N)	r7r8r9r+r©r¿rÈr.r;r)r)r4r*rÁ"s

rÁcs:eZdZd
‡fdd„	Zdd„Zdd„Z‡fdd	„Z‡ZS)ÚDatabaseAtVersionr"cs@tt|ƒ ¡||_||_|dkr,tj|_n|dkr<tj|_dS)z¨Create a database fixture.

        :param version: Max version to sync to (or None for current)
        :param database: The type of database, 'main' or 'api'
        r"rN)r-rÉr+r˜ÚversionrržrÄ)r'rÊr˜r4r)r*r+Xs
zDatabaseAtVersion.__init__cCs| ¡}| ¡dSr,rÆrÇr)r)r*r¿fszDatabaseAtVersion.cleanupcCs.| ¡}| ¡| ¡tj|j|jddS)N)rÊr˜)ržr¤rŸrr rÊr˜rÇr)r)r*rÈjszDatabaseAtVersion.resetcs&tt|ƒ ¡| ¡| |j¡dSr,)r-rÉr.rÈr1r¿r3r4r)r*r.pszDatabaseAtVersion.setUp)r")r7r8r9r+r¿rÈr.r;r)r)r4r*rÉWsrÉcseZdZ‡fdd„Z‡ZS)ÚDefaultFlavorsFixturecsött|ƒ ¡t ¡}ddddddœ}dddd	œ}tjf|d
dddd
dœ|¤Žtjf|ddddddœ|¤Žtjf|ddddddœ|¤Žtjf|ddddddœ|¤Žtjf|dddd d!dœ|¤Žtjf|d
ddd"d#|d$œ|¤Žg}|D]}| ¡qädS)%Ngð?FTr)Zrxtx_factorZdisabledZ	is_publicZephemeral_gbZswapZSandyBridgeZ2048Z	dedicated)zhw:cpu_modelzhw:mem_page_sizez
hw:cpu_policyir`r zm1.tiny)rÚ	memory_mbÚvcpusÚroot_gbÚflavoridr(iéÚ2zm1.smalliéé(Ú3z	m1.mediumi ééPÚ4zm1.largei@éé Ú5z	m1.xlargeÚ6z
m1.tiny.specs)rrÌrÍrÎrÏr(Úextra_specs)r-rËr.rZget_admin_contextrZFlavorr/)r'r‘ÚdefaultsrÜZdefault_flavorsZflavorr4r)r*r.wsVÿýÿþÿþÿþÿþÿþþþðzDefaultFlavorsFixture.setUp©r7r8r9r.r;r)r)r4r*rËvsrËcs0eZdZ‡fdd„Zdd„Z‡fdd„Z‡ZS)Ú
RPCFixturecs*tt|ƒ ¡g|_|j |¡i|_dSr,)r-rßr+ÚexmodsÚextendÚ_buses)r'ràr4r)r*r+šszRPCFixture.__init__cCs6d}||jvr,t ¡}tjt||d|j|<|j|S)N)ÚurlZallowed_remote_exmods)rârZget_allowed_exmodsr²Zget_rpc_transportrÃ)r'rãràr)r)r*Ú_fake_create_transport s
ýz!RPCFixture._fake_create_transportcs¤tt|ƒ ¡| tj¡tj|jŽ| tj¡t	 
t¡|_d|j_
| |j¡| t d|j¡¡t d¡ }d|_t t¡Wdƒn1s–0YdS)NÚfakeznova.rpc.create_transportznova.rpc.get_transport_url)r-rßr.r1rr¿Zadd_extra_exmodsràZclear_extra_exmodsÚmessaging_conffixtureZConfFixturerÃZmessaging_confZtransport_driverrOrPrSräÚmockZpatchZreturn_valueÚinit)r'Zmock_gtur4r)r*r.³sÿzRPCFixture.setUp)r7r8r9r+rär.r;r)r)r4r*rߙsrßcs eZdZdZ‡fdd„Z‡ZS)ÚWarningsFixturez&Filters out warnings during test runs.csbtt|ƒ ¡t dt¡tjdddtjdddtjdddtjddd| tj¡dS)	NÚonceÚignorez>With-statements now directly support multiple context managers)ÚmessageZ
pkg_resources)Úmodulez“Policy enforcement is depending on the value of is_admin. This key is deprecated. Please update your policy file to use the standard policy values.zmox3.mox)	r-rér.ÚwarningsÚsimplefilterÚDeprecationWarningÚfilterwarningsr1Ú
resetwarningsr3r4r)r*r.ÉsÿÿÿÿzWarningsFixture.setUprUr)r)r4r*réÆsrécs,eZdZdZ‡fdd„Z‡fdd„Z‡ZS)ÚConfPatcherzˆFixture to patch and restore global CONF.

    This also resets overrides for everything that is patched during
    it's teardown.

    cs&tt|ƒ ¡| dd¡|_||_dS)zëConstructor

        :params group: if specified all config options apply to that group.

        :params **kwargs: the rest of the kwargs are processed as a
        set of key/value pairs to be set as configuration override.

        ÚgroupN)r-rór+rrôrF)r'r&r4r)r*r+ís	zConfPatcher.__init__csLtt|ƒ ¡t|j ¡ƒD]*\}}| tj||j	¡t 
|||j	¡qdSr,)r-rór.rÀrFÚitemsr1rÃÚclear_overriderôÚset_override)r'rjÚvr4r)r*r.úszConfPatcher.setUpr6r)r)r4r*róås
rócs.eZdZdZd‡fdd„	Z‡fdd„Z‡ZS)	ÚOSAPIFixturea_Create an OS API server as a fixture.

    This spawns an OS API server as a fixture in a new greenthread in
    the current test. The fixture has a .api parameter with is a
    simple rest client that can communicate with it.

    This fixture is extremely useful for testing REST responses
    through the WSGI stack easily in functional tests.

    Usage:

        api = self.useFixture(fixtures.OSAPIFixture()).api
        resp = api.api_request('/someurl')
        self.assertEqual(200, resp.status_code)
        resp = api.api_request('/otherurl', method='POST', body='{foo}')

    The resp is a requests library response. Common attributes that
    you'll want to use are:

    - resp.status_code - integer HTTP status code returned by the request
    - resp.content - the body of the response
    - resp.headers - dictionary of HTTP headers returned

    Úv2Ú 6f70656e737461636b20342065766572cstt|ƒ ¡||_||_dS)zêConstructor

        :param api_version: the API version that we're interested in
        using. Currently this expects 'v2' or 'v2.1' as possible
        options.
        :param project_id: the project id to use on the API.

        N)r-rùr+Úapi_versionr€)r'rür€r4r)r*r+s
zOSAPIFixture.__init__csòtt|ƒ ¡tj}d}d}d||f}||ddœ}| tfi|¤Ž¡| t dt	j
j¡¡t 
¡ |¡‰‡fdd„}t tj|¡tj||d	}| ¡| |j¡d
|||jdœ|_t dd|j|j¡|_t d
d
|j|j¡|_||_dS)NrÖZ
osapi_computeú
http://%s:%s/T)Zosapi_compute_listenZosapi_compute_listen_portÚdebugú:keystoneauth1.session.TCPKeepAliveAdapter.init_poolmanagercsˆSr,r)r)©Úloaderr)r*rp?rqz$OSAPIFixture.setUp.<locals>.<lambda>©rãz(http://%(host)s:%(port)s/%(api_version)s)r$ÚportrüråÚadmin) r-rùr.rZ
osapi_hostrOrórPrSr
ÚHTTPAdapterÚinit_poolmanagerrÚLoaderZload_apprZ_setup_servicerÃr$rÚRequestsInterceptorÚinstall_interceptr1Úuninstall_interceptrüZauth_urlrZTestOpenStackClientr€rZ	admin_apiÚapp)r'ÚhostnamerZservice_nameÚendpointÚconf_overridesrÚ	interceptr4rr*r.)s<ýþÿ
ÿÿzOSAPIFixture.setUp)rúrûr6r)r)r4r*rùs
ÿrùcs eZdZdZ‡fdd„Z‡ZS)ÚOSMetadataServera9Create an OS Metadata API server as a fixture.

    This spawns an OS Metadata API server as a fixture in a new
    greenthread in the current test.

    TODO(sdague): ideally for testing we'd have something like the
    test client which acts like requests, but connects any of the
    interactions needed.

    cs‚tt|ƒ ¡ddddœ}| tfi|¤Ž¡| t ddd„¡¡t d¡|_	|j	 
¡| |j	j¡d	|d
|j	j
f|_dS)Nz	127.0.0.1rT)Úmetadata_listenZmetadata_listen_portrþz-nova.network.linux_net.IptablesManager._applycSsdSr,r))Ú_r)r)r*rpmrqz(OSMetadataServer.setUp.<locals>.<lambda>Úmetadatarýr)r-rr.rOrórPrSrZWSGIServicerr0r1ÚstoprZmd_url)r'rr4r)r*r.^s"ýþ
þzOSMetadataServer.setUprUr)r)r4r*rSs
rcs eZdZdZ‡fdd„Z‡ZS)ÚPoisonFunctionsaPoison functions so they explode if we touch them.

    When running under a non full stack test harness there are parts
    of the code that you don't want to go anywhere near. These include
    things like code that spins up extra threads, which just
    introduces races.

    cs4tt|ƒ ¡ddl}dd„}| t d|¡¡dS)Nrc_s ddl}t d¡| d¡dS)Nrz&Forgot to disable libvirt event threadr`)ÚsysrîÚwarnÚexit)rFr&rr)r)r*Úevloops
z%PoisonFunctions.setUp.<locals>.evloopz(nova.virt.libvirt.host.Host._init_events)r-rr.Znova.virt.libvirt.hostrOrPrS)r'Únovarr4r)r*r.s	þzPoisonFunctions.setUprUr)r)r4r*rws	rcs4eZdZdZ‡fdd„Zdd„Z‡fdd„Z‡ZS)ÚIndirectionAPIFixturez8Patch and restore the global NovaObject indirection api.cstt|ƒ ¡||_dS)z`Constructor

        :param indirection_api: the indirection API to be used for tests.

        N)r-rr+Úindirection_api)r'rr4r)r*r+šszIndirectionAPIFixture.__init__cCs|jtj_dSr,)Úorig_indirection_apiÚobj_baseÚ
NovaObjectrr3r)r)r*r¿£szIndirectionAPIFixture.cleanupcs2tt|ƒ ¡tjj|_|jtj_| |j¡dSr,)	r-rr.rrrrr1r¿r3r4r)r*r.¦s

zIndirectionAPIFixture.setUp)r7r8r9r:r+r¿r.r;r)r)r4r*r—s	rc@s<eZdZdd„Zdd„Zdd„Zdd„Zd	d
„Zdd„Zd
S)Ú_FakeGreenThreadcOs||i|¤Ž|_dSr,©Z_result©r'ÚfuncrFr&r)r)r*r+®sz_FakeGreenThread.__init__cOsdSr,r)©r'rFr&r)r)r*Úcancel±sz_FakeGreenThread.cancelcOsdSr,r)r$r)r)r*r2¶sz_FakeGreenThread.killcOs||g|¢Ri|¤ŽdSr,r)r"r)r)r*Úlink»sz_FakeGreenThread.linkcOsdSr,r)r"r)r)r*Úunlink¾sz_FakeGreenThread.unlinkcCs|jSr,r!r3r)r)r*ÚwaitÃsz_FakeGreenThread.waitN)	r7r8r9r+r%r2r&r'r(r)r)r)r*r ­sr cs eZdZdZ‡fdd„Z‡ZS)ÚSpawnIsSynchronousFixturez>Patch and restore the spawn_n utility method to be synchronouscs6tt|ƒ ¡| t dt¡¡| t dt¡¡dS)Nznova.utils.spawn_nznova.utils.spawn)r-r)r.rOrPrSr r3r4r)r*r.ÊsÿÿzSpawnIsSynchronousFixture.setUprUr)r)r4r*r)Çsr)cs:eZdZdZd	‡fdd„	Zedd„ƒZ‡fdd„Z‡ZS)
ÚBannedDBSchemaOperationsz"Ban some operations for migrationsNcstt|ƒ ¡|pg|_dSr,)r-r*r+Ú_banned_resources)r'Zbanned_resourcesr4r)r*r+Ôsz!BannedDBSchemaOperations.__init__cCst d||f¡‚dS)Nz8Operation %s.%s() is not allowed in a database migration)rZDBNotAllowed)ÚresourceÚopr)r)r*Ú_explodeØs
ÿÿz!BannedDBSchemaOperations._explodec	s^ttˆƒ ¡ˆjD]D‰ˆ t dˆ‡‡fdd„¡¡ˆ t dˆ‡‡fdd„¡¡qdS)Nzsqlalchemy.%s.dropcsˆ ˆd¡S)NZdrop©r.©rirj©r'Úthingr)r*rpãrqz0BannedDBSchemaOperations.setUp.<locals>.<lambda>zsqlalchemy.%s.altercsˆ ˆd¡S)NZalterr/r0r1r)r*rpærq)r-r*r.r+rOrPrSr3r4r1r*r.Þs
þþzBannedDBSchemaOperations.setUp)N)	r7r8r9r:r+Ústaticmethodr.r.r;r)r)r4r*r*Òs

r*cs4eZdZdZ‡fdd„Z‡fdd„Zdd„Z‡ZS)Ú"ForbidNewLegacyNotificationFixturez<Make sure the test fails if new legacy notification is addedcstt|ƒ ¡tj|_dSr,)r-r4r+rZLegacyValidatingNotifierÚnotifierr3r4r)r*r+ësz+ForbidNewLegacyNotificationFixture.__init__cs4tt|ƒ ¡d|j_|jj d¡| |j¡dS)NTÚ_decorated_function)	r-r4r.r5ÚfatalÚ'allowed_legacy_notification_event_typesÚappendr1r¿r3r4r)r*r.ïsÿz(ForbidNewLegacyNotificationFixture.setUpcCsd|j_|jj d¡dS)NFr6)r5r7r8Úremover3r)r)r*r¿úsÿz*ForbidNewLegacyNotificationFixture.cleanup)r7r8r9r:r+r.r¿r;r)r)r4r*r4ésr4cs$eZdZ‡fdd„Zdd„Z‡ZS)ÚAllServicesCurrentcs,tt|ƒ ¡| t d|j¡¡dt_dS)Nz.nova.objects.Service.get_minimum_version_multi)	r-r;r.rOrPrSÚ
_fake_minimumÚcompute_rpcapiZLAST_VERSIONr3r4r)r*r.sþzAllServicesCurrent.setUpcOstjSr,)Úservice_objZSERVICE_VERSIONr$r)r)r*r<sz AllServicesCurrent._fake_minimum)r7r8r9r.r<r;r)r)r4r*r;sr;cs$eZdZ‡fdd„Zdd„Z‡ZS)ÚRegisterNetworkQuotacs&tt|ƒ ¡t ¡| |j¡dSr,)r-r?r.rZ_register_network_quotar1r¿r3r4r)r*r.
szRegisterNetworkQuota.setUpcCstjj dd¡dS©NZnetworks)Ú
nova_quotaZQUOTASZ
_resourcesrr3r)r)r*r¿szRegisterNetworkQuota.cleanup)r7r8r9r.r¿r;r)r)r4r*r?sr?csŠeZdZdZdZdgddeddœZdded	egd
ddœggd
d
dddœZed	ged<ded	dddded	dœgedœZded	dddded	dœgedœZidddid
dgddœgd
iggd id
d!d"d#œd$œgded%d&œd'd(d)œd*d+d,iddd-œd.dd/dd,d0œgZ	‡fd1d2„Z
‡fd3d4„Zd5d6„Zd7d8„Z
d9d:„Zd;d<„Zd=d>„ZdKd?d@„ZdLdAdB„ZdMdCdD„ZdNdEdF„ZdGdH„ZdOdIdJ„Z‡ZS)PÚNeutronFixturez.A fixture to boot instances with neutron portsrûZACTIVEzprivate-networkTz$3cb9bc59-5699-4588-a4b1-b87f96708bc6)ÚstatusÚsubnetsr(Úadmin_state_upÚ	tenant_idryzprivate-subnetryz192.168.1.1z
192.168.1.254)r0ÚendrÕz192.168.1.1/24z$f8a6e8f8-c2ec-497c-9f23-da9616de54ef)r(Zenable_dhcpÚ
network_idrFZdns_nameserversZallocation_poolsZhost_routesZ
ip_versionZ
gateway_ipÚcidrryrDz$ce531f90-199f-48c0-816c-13e38010b442zfa:16:3e:4c:2c:30z192.168.1.3)Z
ip_addressZ	subnet_id)ryrHrErCZmac_addressZ	fixed_ipsrFz$88dae9fa-0dc6-49e3-8c29-3abc41e99ac9z00:0c:29:0d:11:74z192.168.1.30z$b71f1699-42be-4515-930a-f3ef01f94aa7Fzbr-intÚfixedz10.0.0.4)ÚmetarÊÚtypeZfloating_ipsÚaddressz10.0.0.0/26Úgatewayz10.0.0.1)rKrÊrLrM)ZipsrÊrKZdnsZroutesrIrNiÜ)ZinjectedrFZmtuz$e1882e38-38c2-4239-ade7-35d644cb963aZpublic)ZbridgerDrKryZlabelztapb71f1699-42ZnormalN)Zport_filterZovs_hybrid_plugzfa:16:3e:47:94:4aZovs)ZprofileZovs_interfaceidZpreserve_on_deleteZnetworkZdevnameZ	vnic_typeZ
qbh_paramsrKZdetailsrMZactiverLryZ
qbg_paramscsHtt|ƒ ¡||_t tj¡g|_g|_tj	g|_
tjg|_g|_
dSr,)r-rBr+ÚtestÚcopyÚdeepcopyÚport_1Ú_portsÚ_extensionsÚ	network_1Ú	_networksÚsubnet_1Ú_subnetsÚ_floatingips©r'rOr4r)r*r+Šs

zNeutronFixture.__init__cs¸ttˆƒ ¡ˆj ddd„¡ˆj ddd„¡ˆj ddd„¡ˆj dd	d„¡ˆj d
dd„¡ˆj dd
d„¡ˆj ddd„¡ˆj ddd„¡ˆj d‡fdd„¡dS)Nz0nova.network.neutronv2.api.API.validate_networksc_sdS)Nr`r)©rFr&r)r)r*rp™rqz&NeutronFixture.setUp.<locals>.<lambda>zBnova.network.neutronv2.api.API.create_pci_requests_for_sriov_portsc_sdSr,r)r[r)r)r*rprqz5nova.network.neutronv2.api.API.setup_networks_on_hostc_sdSr,r)r[r)r)r*rp rqz5nova.network.neutronv2.api.API.migrate_instance_startc_sdSr,r)r[r)r)r*rp£rqz7nova.network.neutronv2.api.API.add_fixed_ip_to_instancec_stj tj¡Sr,©Ú
network_modelZNetworkInfoZhydraterBÚnw_infor[r)r)r*rp¦sÿz<nova.network.neutronv2.api.API.remove_fixed_ip_from_instancec_stj tj¡Sr,r\r[r)r)r*rpªsÿz6nova.network.neutronv2.api.API.migrate_instance_finishc_sdSr,r)r[r)r)r*rp®rqzbnova.network.security_group.neutron_driver.SecurityGroupAPI.get_instances_security_groups_bindingsc_siSr,r)r[r)r)r*rp²rqz%nova.network.neutronv2.api.get_clientcsˆSr,r)r[r3r)r*rpµrq)r-rBr.rOÚstub_outr3r4r3r*r.“sHýýþþþþþý
ÿzNeutronFixture.setUpcs.‡fdd„|Dƒ}t|ƒdkr&|dSdSdS)Ncsg|]}|dˆkr|‘qS©ryr)©r…Úpr`r)r*r‡¸rqz6NeutronFixture._get_first_id_match.<locals>.<listcomp>r)Úlen)r'ryrÀZ
filtered_listr)r`r*Ú_get_first_id_match·sz"NeutronFixture._get_first_id_matchcs6t |j¡}ˆD]‰‡‡fdd„|Dƒ}|}qd|iS)Ncs"g|]}| ˆ¡ˆˆkr|‘qSr))rLra©Ú_paramsÚoptr)r*r‡Árqz0NeutronFixture._filter_ports.<locals>.<listcomp>Úports)rPrQrS)r'rfrhZfiltered_portsr)rer*Ú
_filter_ports¾s
zNeutronFixture._filter_portscOst d|ji¡S)NÚ
extensions)rPrQrTr$r)r)r*Úlist_extensionsÅszNeutronFixture.list_extensionscKs*| ||j¡}|dur"tj|d‚d|iS)N)Úport_idr)rdrSrZPortNotFound)r'rlrfrr)r)r*Ú	show_portÈszNeutronFixture.show_portcKs(|jD]}|d|kr|j |¡qdS)Nry)rSr:)r'rrfZcurrent_portr)r)r*Údelete_portÎs
zNeutronFixture.delete_portcKst d|ji¡Sr@)rPrQrV©r'Zretrieve_allrfr)r)r*Ú
list_networksÓszNeutronFixture.list_networkscKs|jfi|¤ŽSr,)riror)r)r*Ú
list_portsÖszNeutronFixture.list_portscKst d|ji¡S)NrD)rPrQrXror)r)r*Úlist_subnetsÙszNeutronFixture.list_subnetscKst d|ji¡S)NZfloatingips)rPrQrYror)r)r*Úlist_floatingipsÜszNeutronFixture.list_floatingipscOs$|j t tj¡¡t dtji¡S©Nr)rSr9rPrQrBÚport_2r$r)r)r*Úcreate_portßszNeutronFixture.create_portcCs@| ||j¡}|dur8t|d ¡ƒD]\}}|||<q&d|iSrt)rdrSrÀrõ)r'rlÚbodyZnew_portrjrør)r)r*Úupdate_portãs

zNeutronFixture.update_port)T)T)T)T)N)r7r8r9r:rFrUrWrRrur^r+r.rdrirkrmrnrprqrrrsrvrxr;r)r)r4r*rBsÊú	þÿðüÿòþÿôûüóýäþÒ1	$



rBc@seZdZdd„ZdS)Ú_NoopConductorcCsdd„}|S)Nc_sdSr,r)r[r)r)r*Ú	_noop_rpcïsz-_NoopConductor.__getattr__.<locals>._noop_rpcr))r'Úkeyrzr)r)r*Ú__getattr__îsz_NoopConductor.__getattr__N)r7r8r9r|r)r)r)r*ryísrycs eZdZdZ‡fdd„Z‡ZS)ÚNoopConductorFixturez(Stub out the conductor API to do nothingcs6tt|ƒ ¡| t dt¡¡| t dt¡¡dS)Nznova.conductor.ComputeTaskAPIznova.conductor.API)r-r}r.rOrPrSryr3r4r)r*r.÷sÿÿzNoopConductorFixture.setUprUr)r)r4r*r}ôsr}cseZdZ‡fdd„Z‡ZS)ÚEventReporterStubcs(tt|ƒ ¡| t ddd„¡¡dS)Nz nova.compute.utils.EventReporterc_st ¡Sr,)rçZ	MagicMockr[r)r)r*rprqz)EventReporterStub.setUp.<locals>.<lambda>)r-r~r.rOrPrSr3r4r)r*r.s
þzEventReporterStub.setUprÞr)r)r4r*r~ÿsr~csDeZdZdZdZdZdZdZdZdZ	‡fdd	„Z
‡fd
d„Z‡ZS)Ú
CinderFixturezA fixture to volume operationsrûú$a07f71dc-8151-4e7d-a0cc-cd24a3f11113ú$227cc671-f30b-4488-96fd-7d0bf13648d8ú$828419fa-3efb-4533-b458-4267ca5fe9b1ú$9c6d9c2d-7a8f-4c80-938d-3bf062b8d489ú$6ca404f3-d844-4169-bb96-bc792f37de98cs>tt|ƒ ¡||_d|_d|_d|_tƒ|_t	 
t¡|_dS©NF)r-rr+rOÚ
swap_errorÚswap_volume_instance_uuidÚswap_volume_instance_error_uuidrÀÚreserved_volumesÚcollectionsÚdefaultdictÚattachmentsrZr4r)r*r+szCinderFixture.__init__csttˆƒ ¡d ‡fdd„	}dd„}dd„}‡fdd„}‡fd	d
„}d!‡fdd
„	}ˆj d|¡d"‡fdd„	}ˆj d|¡ˆj ddd„¡ˆj d|¡ˆj d|¡ˆj d|¡ˆj d|¡ˆj ddd„¡ˆj ddd„¡ˆj d|¡ˆj ddd„¡dS)#Ncs|tjtjfvrxddd|dddœ}ˆjr2|tjksBˆjrx|tjkrx|tjkrRˆjnˆj}| d|d|d	œid
dœ¡|Stˆj ¡ƒD]2\}}||vr†d|d
|dd||ddœid
œ}qÞq†|ˆj	v}|rÌdnddd|dddœ}|ˆj
krüd|d<ddi|d<|S)NÚ	availableÚTEST1ÚdetachedFr`©rCÚdisplay_nameÚ
attach_statusryÚmultiattachÚsizeúin-useú/dev/vdb©Ú
mountpointÚ
attachment_idÚattached©rCrŒr’©r™r˜©rCr‘r’ryr“r”rŒZ	attachingÚTEST2TÚbootableÚimage_idú$155d900f-4e14-4e4c-a73d-069cbf4541e6Úvolume_image_metadata)rÚSWAP_OLD_VOLÚSWAP_ERR_OLD_VOLr‡rˆÚupdaterÀrŒrõr‰ÚIMAGE_BACKED_VOL)Úself_apirÚ	volume_idÚmicroversionÚvolumerÚvolumesZreserved_volumer3r)r*Úfake_get%svÿúÿþýÿþþÿø
þÿù

ú

þz%CinderFixture.setUp.<locals>.fake_getcSs|tjkrdSiS)Nr))rÚSWAP_ERR_NEW_VOL)r'rr¨Ú	connectorr)r)r*Úfake_initialize_connectionps
z7CinderFixture.setUp.<locals>.fake_initialize_connectioncSsd|iS©NZsave_volume_idr)©r'rZ
old_volume_idZ
new_volume_idÚerrorr)r)r*Úfake_migrate_volume_completionvsz;CinderFixture.setUp.<locals>.fake_migrate_volume_completioncsˆj |¡dSr,)r‰r9©r§rr¨r3r)r*Úfake_reserve_volumezsz0CinderFixture.setUp.<locals>.fake_reserve_volumecs |ˆjvrˆj |¡dˆ_dS)NT)r‰r:r†r´r3r)r*Úfake_unreserve_volume}s
z2CinderFixture.setUp.<locals>.fake_unreserve_volumeÚrwcsHtˆj ¡ƒD]$\}}||vrtjd||fd‚qˆj| |¡dS)Nz,Volume %s is already attached to instance %s)Úreason)rÀrŒrõrZInvalidInputr9)Ú_selfrr¨rr˜ÚmodeÚinstancer«r3r)r*Úfake_attach‰sÿÿz(CinderFixture.setUp.<locals>.fake_attachznova.volume.cinder.API.attachcsb|ˆjvrˆj |¡|dur0ˆj| |¡n.tˆj ¡ƒD]\}}||vr>| |¡q^q>dSr,)r‰r:rŒrÀrõ)r¹rr¨rr™r»r«r3r)r*Úfake_detach—s

z(CinderFixture.setUp.<locals>.fake_detachznova.volume.cinder.API.detachú&nova.volume.cinder.API.begin_detachingc_sdSr,r)r[r)r)r*rp­rqz%CinderFixture.setUp.<locals>.<lambda>únova.volume.cinder.API.getz,nova.volume.cinder.API.initialize_connectionú0nova.volume.cinder.API.migrate_volume_completionz%nova.volume.cinder.API.reserve_volumeú%nova.volume.cinder.API.roll_detachingc_sdSr,r)r[r)r)r*rp¸rqz+nova.volume.cinder.API.terminate_connectionc_sdSr,r)r[r)r)r*rpºrqz'nova.volume.cinder.API.unreserve_volumeú%nova.volume.cinder.API.check_attachedc_sdSr,r)r[r)r)r*rp¾rq)N)r·)NN)r-rr.rOr_)r'r¬r¯r³rµr¶r¼r½r4r3r*r."sVK
ÿÿÿÿÿÿþÿÿÿÿÿzCinderFixture.setUp)
r7r8r9r:rFr£ÚSWAP_NEW_VOLr¤r­r¦r+r.r;r)r)r4r*rsrcsLeZdZdZdZdZdZdZdZdZ	dZ
d	Z‡fd
d„Z‡fdd
„Z
‡ZS)ÚCinderFixtureNewAttachFlowzDA fixture to volume operations with the new Cinder attach/detach APIrûr€rr‚rƒz$4a3cd440-b9c2-11e1-afa6-0800200c9a66z$4757d51f-54eb-4442-8684-3399a6431f67r„cs<tt|ƒ ¡||_d|_d|_d|_d|_t 	t
¡|_dSr…)r-rÄr+rOr†r‡rˆÚattachment_error_idrŠr‹rÀrŒrZr4r)r*r+Õsz#CinderFixtureNewAttachFlow.__init__csttˆƒ ¡d‡fdd„	}dd„}d‡fdd„	}‡fdd„}d d	d
„}dd„}ˆj d
|¡ˆj d|¡ˆj d|¡ˆj ddd„¡ˆj d|¡ˆj ddd„¡ˆj d|¡ˆj d|¡ˆj ddd„¡ˆj ddd„¡ˆj ddd„¡dS)!Ncsú|tjtjfvrxddd|dddœ}ˆjr2|tjksBˆjrx|tjkrx|tjkrRˆjnˆj}| d|d|d	œid
dœ¡|Stˆj ¡ƒD]8\}}||vr†d|d
||ˆj	kd||ddœid
œ}qØq†ddd||ˆj	kddœ}|ˆj
kröd|d<ddi|d<|S)NrrŽrFr`rr•r–r—ršr›rœrržTrŸr r¡r¢)rr£r¤r‡rˆr¥rÀrŒrõÚMULTIATTACH_VOLr¦)r§rr¨r©rªrr«r3r)r*r¬ãstÿúÿþýÿþþÿø
þÿùú

þz2CinderFixtureNewAttachFlow.setUp.<locals>.fake_getcSsd|iSr°r)r±r)r)r*r³-szHCinderFixtureNewAttachFlow.setUp.<locals>.fake_migrate_volume_completioncsJt ¡}ˆjdurˆj}|diidœ}ˆjd |¡ˆj| |¡|S)NÚdata)ryÚconnection_infor)r	Z
generate_uuidrÅrŒr9)r¹rr¨rr®r˜r™Z
attachmentr3r)r*Úfake_attachment_create1s
z@CinderFixtureNewAttachFlow.setUp.<locals>.fake_attachment_createcs:ˆjdd}ˆj|d=ˆjdd=|tjkr6dˆ_dS)NrrT)rŒrÄÚSWAP_ERR_ATTACH_IDr†)r¹rr™rr3r)r*Úfake_attachment_delete<s

z@CinderFixtureNewAttachFlow.setUp.<locals>.fake_attachment_deletecSs,d|ddddœidœ}|tjkr(ddi}|S)	NÚ	fake_typerÇÚbarr ©ZfooZ
target_lun©Zdriver_volume_typeryrÈrÈr))rÄrÊ)r¹rr™r®r˜Úattachment_refr)r)r*Úfake_attachment_updateCsÿÿþ
z@CinderFixtureNewAttachFlow.setUp.<locals>.fake_attachment_updatecSsd|ddddœidœ}|S)NrÌrÇrÍr rÎrÏr))r¹rr™rÐr)r)r*Úfake_attachment_getNsÿÿþz=CinderFixtureNewAttachFlow.setUp.<locals>.fake_attachment_getz(nova.volume.cinder.API.attachment_createz(nova.volume.cinder.API.attachment_deletez(nova.volume.cinder.API.attachment_updatez*nova.volume.cinder.API.attachment_completec_sdSr,r)r[r)r)r*rp]rqz2CinderFixtureNewAttachFlow.setUp.<locals>.<lambda>z%nova.volume.cinder.API.attachment_getr¾c_sdSr,r)r[r)r)r*rparqr¿rÀrÁc_sdSr,r)r[r)r)r*rphrqz,nova.volume.cinder.is_microversion_supportedc_sdSr,r)r[r)r)r*rpjrqrÂc_sdSr,r)r[r)r)r*rplrq)N)NN)N)r-rÄr.rOr_)r'r¬r³rÉrËrÑrÒr4r3r*r.àsVJÿÿ
ÿÿÿÿÿÿÿþÿÿÿz CinderFixtureNewAttachFlow.setUp)r7r8r9r:rFr£rÃr¤r­rÊrÆr¦r+r.r;r)r)r4r*rÄÄsrÄc@s$eZdZdd„Zdd„Zdd„ZdS)ÚPlacementApiClientcCs
||_dSr,)Úfixture)r'Zplacement_fixturer)r)r*r+pszPlacementApiClient.__init__cKst |jjd|fi|¤Ž¡Sr,)rÚAPIResponserÔÚ	_fake_get)r'rãr&r)r)r*rLsszPlacementApiClient.getcKst |jjd||fi|¤Ž¡Sr,)rrÕrÔÚ	_fake_put)r'rãrwr&r)r)r*ÚputvsÿzPlacementApiClient.putN)r7r8r9r+rLrØr)r)r)r*rÓosrÓcsVeZdZdZddd„Z‡fdd„Zedd„ƒZd	d
„Zdd„Z	d
d„Z
dd„Z‡ZS)ÚPlacementFixtureajA fixture to placement operations.

    Runs a local WSGI server bound on a free port and having the Placement
    application with NoAuth middleware.
    This fixture also prevents calling the ServiceCatalog for getting the
    endpoint.

    It's possible to ask for a specific token when running the fixtures so
    all calls would be passing this token.
    rcCs
||_dSr,)Útoken)r'rÚr)r)r*r+‡szPlacementFixture.__init__csìtt|ƒ ¡| tddd¡t t¡‰‡fdd„}tj	}d||_
tj||j
d}| 
¡| |j¡| t dtjj¡¡tjdd	|_| t d
|j¡¡| t d|j¡¡| t d|j¡¡| t d
|j¡¡t|ƒ|_dS)NrZnoauth2)rôZ
auth_strategycsˆSr,r)r)rr)r*rprqz(PlacementFixture.setUp.<locals>.<lambda>zhttp://%s/placementrrÿ)Zauthz6nova.scheduler.client.report.SchedulerReportClient.getz7nova.scheduler.client.report.SchedulerReportClient.postz6nova.scheduler.client.report.SchedulerReportClient.putz9nova.scheduler.client.report.SchedulerReportClient.delete)r-rÙr.rOróÚplacement_deployZloadapprÃrZplacement_hostr
rrr	r1r
rPrSr
rrÚksZSessionÚ_clientrÖÚ
_fake_postr×Ú_fake_deleterÓr)r'rr$rr4rr*r.Šs>

þþþþþzPlacementFixture.setUpcKs(| d¡}|dur$| dd|i¡dS)NrÊzOpenStack-API-Versionzplacement %s)rLr¥)Úheadersr&rÊr)r)r*Ú_update_headers_with_version°s

ÿz-PlacementFixture._update_headers_with_versioncOs@|dd…\}d|ji}|j|fi|¤Ž|jj||j|ddS©Nr`úx-auth-tokenF)Úendpoint_overrideràÚ	raise_exc)rÚrárÝrLr
)r'rFr&rãràr)r)r*rÖ¹s
üzPlacementFixture._fake_getcOsD|dd…\}}d|ji}|j|fi|¤Ž|jj|||j|ddS©Nr`rãF)Zjsonräràrå)rÚrárÝZpostr
©r'rFr&rãrÇràr)r)r*rÞÆs
üzPlacementFixture._fake_postcOsD|dd…\}}d|ji}|j|fi|¤Ž|jj|||j|ddSræ)rÚrárÝrØr
rçr)r)r*r××s
üzPlacementFixture._fake_putcOs*|dd…\}|jj||jd|jiddSrâ)rÝÚdeleter
rÚ)r'rFr&rãr)r)r*rßèsüzPlacementFixture._fake_delete)r)
r7r8r9r:r+r.r3rárÖrÞr×rßr;r)r)r4r*rÙ{s
&

rÙc@seZdZdd„ZdS)ÚUnHelperfulClientChannelcCstdƒ‚dS)NzYou have attempted to start a privsep helper. This is not allowed in the gate, and indicates a failure to have mocked your tests.rgr®r)r)r*r+õsz!UnHelperfulClientChannel.__init__N)r7r8r9r+r)r)r)r*réôsrécs eZdZdZ‡fdd„Z‡ZS)ÚPrivsepNoHelperFixturea¢A fixture to catch failures to mock privsep's rootwrap helper.

    If you fail to mock away a privsep'd method in a unit test, then
    you may well end up accidentally running the privsep rootwrap
    helper. This will fail in the gate, but it fails in a way which
    doesn't identify which test is missing a mock. Instead, we
    raise an exception so that you at least know where you've missed
    something.
    cs$tt|ƒ ¡| t dt¡¡dS)Nz)oslo_privsep.daemon.RootwrapClientChannel)r-rêr.rOrPrSrér3r4r)r*r.s
þzPrivsepNoHelperFixture.setUprUr)r)r4r*rêûs
rêcs eZdZdZ‡fdd„Z‡ZS)ÚNoopQuotaDriverFixtureaÎA fixture to run tests using the NoopQuotaDriver.

    We can't simply set self.flags to the NoopQuotaDriver in tests to use the
    NoopQuotaDriver because the QuotaEngine object is global. Concurrently
    running tests will fail intermittently because they might get the
    NoopQuotaDriver globally when they expected the default DbQuotaDriver
    behavior. So instead, we can patch the _driver property of the QuotaEngine
    class on a per-test basis.
    csFtt|ƒ ¡| t dt ¡¡¡t 	ddd¡| 
tjdd¡dS)Nznova.quota.QuotaEngine._driverZdriverznova.quota.NoopQuotaDriverr)r-rër.rOrPrSrAZNoopQuotaDriverrÃr÷r1rör3r4r)r*r.s
ÿzNoopQuotaDriverFixture.setUprUr)r)r4r*rës
rë)pr:Z
__future__rrŠÚ
contextlibrrPZloggingrHrJrîrPZ
keystoneauth1rrÜrçZoslo_concurrencyrZoslo_configrZoslo_messagingr²rræZoslo_privseprZprivsep_daemonZ
oslo_utilsr	Zrequestsr
Zwsgi_interceptrZnova.api.openstack.computerZnova.api.openstack.placementr
rÛZnova.api.openstackrZnova.computerr=rrZnova.dbrZnova.db.sqlalchemyrrZnova.networkrr]rZnova.objectsrrrr>rrArZnova.tests.functional.apirZ
nova.testsrrrMrÃrœrÂZFixturer#ZHandlerr<rDrVr_rerkZRequestContextSerializerrŠr’rÁrÉrËrßrérórùrrrÚobjectr r)r*r4r;r?rBryr}r~rrÄrÓrÙZ_ClientChannelrérêrër)r)r)r*Ú<module>s 
G#]/5#-R$ V	=,y