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 / usr / lib / python3.6 / site-packages / dmapi / tests / __pycache__ / fixtures.cpython-36.pyc
Size: Mime:
3

…S
b/ã@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+mBZBdmZCejDZDd"d"d#œaEd$aFGd%d&„d&ejGƒZHGd'd(„d(ejIƒZJGd)d*„d*ejGƒZKGd+d,„d,ejGƒZLGd-d.„d.ejGƒZMGd/d0„d0ejGƒZNGd1d2„d2ejGƒZOGd3d4„d4e=jPƒZQGd5d6„d6ejGƒZRGd7d8„d8ejGƒZSGd9d:„d:ejGƒZTGd;d<„d<ejGƒZUGd=d>„d>ejGƒZVGd?d@„d@ejGƒZWGdAdB„dBejGƒZXGdCdD„dDejGƒZYGdEdF„dFejGƒZZGdGdH„dHejGƒZ[GdIdJ„dJejGƒZ\GdKdL„dLe]ƒZ^GdMdN„dNejGƒZ_GdOdP„dPejGƒZ`GdQdR„dRejGƒZaGdSdT„dTejGƒZbGdUdV„dVejGƒZcGdWdX„dXejGƒZdGdYdZ„dZe]ƒZeGd[d\„d\ejGƒZfGd]d^„d^ejGƒZgGd_d`„d`ejGƒZhGdadb„dbejGƒZiGdcdd„dde]ƒZjGdedf„dfejGƒZkGdgdh„dhejlƒZmGdidj„djejGƒZnGdkdl„dlejGƒZodS)nzFixtures 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Ú1ÚyesÚ)ÚmainrFcs*eZdZdZddd„Z‡fdd„Z‡ZS)ÚServiceFixturez Run a service as a test fixture.NcKs2|}|p
|}|jd|ƒ|jdd|ƒ||_dS)NÚhostZbinaryznova-%s)Ú
setdefaultÚkwargs)ÚselfÚnamer$r&©r)ú/usr/lib/python3.6/fixtures.pyÚ__init__8s
zServiceFixture.__init__cs<tt|ƒjƒtjjf|jŽ|_|jjƒ|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))r2r*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|j|ƒdS)N)Úformat)r'Úrecordr)r)r*ÚhandlePszNullHandler.handlecCsdS)Nr))r'r:r)r)r*ÚemitSszNullHandler.emitcCs
d|_dS)N)Úlock)r'r)r)r*Ú
createLockVszNullHandler.createLockN)r3r4r5r6r;r<r>r)r)r)r*r8Isr8cs 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|ƒjƒtjƒ}|jtjƒtjj	dƒt
kr:tj}ntj}d}|jt
j|ddƒ|_|jdj|ƒ|tjkr¬tƒ}|jt
j|ddƒ|jtjƒtjdƒjtjƒdd	„}|jt
jd
|ƒƒdS)NZOS_DEBUGz0%(asctime)s %(levelname)s [%(name)s] %(message)s)r9ÚlevelrF)Z
nuke_handlerszmigrate.versioning.apicWsdS)Nr))Úargsr)r)r*Úfake_logging_setupšsz1StandardLogging.setUp.<locals>.fake_logging_setupzoslo_log.log.setup)r,r?r-Ústd_loggingZ	getLoggerZsetLevelÚDEBUGÚosÚenvironÚgetÚ_TRUE_VALUESÚINFOÚ
useFixtureÚfixturesZ
FakeLoggerZloggerZhandlersr8Z
LogHandlerZWARNINGÚMonkeyPatch)r'Úrootr@ZfsZhandlerrB)r2r)r*r-us&
zStandardLogging.setUp)r3r4r5r6r-r7r)r))r2r*r?Zsr?cs8eZdZdZ‡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|ƒjƒtjjdƒtkrF|jtj	dƒƒ|_
|jtjd|j
jƒƒtjjdƒtkr~|jtj	dƒƒ|_
|jtjd|j
jƒƒdS)NZOS_STDOUT_CAPTUREÚstdoutz
sys.stdoutZOS_STDERR_CAPTUREÚstderrz
sys.stderr)r,rNr-rErFrGrHrJrKZStringStreamÚoutrLÚstreamÚerr)r')r2r)r*r-©szOutputStreamCapture.setUpcCs|jjdjƒS)NrP)rSÚ_detailsÚas_text)r'r)r)r*rP´szOutputStreamCapture.stderrcCs|jjdjƒS)NrO)rQrTrU)r'r)r)r*rO¸szOutputStreamCapture.stdout)	r3r4r5r6r-ÚpropertyrPrOr7r)r))r2r*rN¡srNcs.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.
    écs\tt|ƒjƒyt|ƒ|_Wntk
r6d|_YnX|dkrP|j|9_ntdƒ‚dS)NrrXzscaling value must be >= 1)r,rWr+ÚintÚtest_timeoutÚ
ValueError)r'ZtimeoutZscaling)r2r)r*r+ÈszTimeout.__init__cs2tt|ƒjƒ|jdkr.|jtj|jddƒdS)NrT)Zgentle)r,rWr-rZrJrK)r')r2r)r*r-Ôs
z
Timeout.setUp)rX)r3r4r5r6r+r-r7r)r))r2r*rW½s	rWcs$eZdZ‡fdd„Zdd„Z‡ZS)ÚDatabasePoisonFixturecs&tt|ƒjƒ|jtjd|jƒƒdS)NzCoslo_db.sqlalchemy.enginefacade._TransactionFactory._create_session)r,r\r-rJrKrLÚ_poison_configure)r')r2r)r*r-ÛszDatabasePoisonFixture.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*r]âsz'DatabasePoisonFixture._poison_configure)r3r4r5r-r]r7r)r))r2r*r\Úsr\csneZdZdZddd„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
||_dS)N)Úinstances_created)r'rbr)r)r*r+szSingleCellSimple.__init__cs´tt|ƒjƒ|jtjd|jƒƒ|jtjd|jƒƒ|jtjd|jƒƒ|jtjd|j	ƒƒ|jtjd|j
ƒƒ|jtjd|jƒƒ|jtjd|jƒƒ|jtjdd	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_dbznova.context.target_cellznova.context.set_target_cellcSsdS)Nr))ÚcÚmr)r)r*Ú<lambda>(sz(SingleCellSimple.setUp.<locals>.<lambda>)
r,rar-rJrKrLÚ_fake_cell_listÚ_fake_cell_getÚ_fake_hostmapping_getÚ_fake_instancemapping_getÚ_fake_instancemapping_get_uuidsÚ_fake_instancemapping_get_saveÚ_fake_target_cell)r')r2r)r*r-s2






zSingleCellSimple.setUpcGsdddd|jƒddœS)NrXZhost1r)ÚidÚ
updated_atÚ
created_atr$Úcell_mapping)rf)r'rAr)r)r*rh*s
z&SingleCellSimple._fake_hostmapping_getcCs,ddd||jrdpdd|jr$|jƒp&ddœS)NrXZproject)rmrnroÚ
instance_uuidZcell_idÚ
project_idrp)rbrg)r'rqr)r)r*Ú _fake_instancemapping_get_common1sz1SingleCellSimple._fake_instancemapping_get_commoncGs|j|dƒS)Nééþÿÿÿ)rs)r'rAr)r)r*rk=sz/SingleCellSimple._fake_instancemapping_get_savecGs|j|dƒS)NrXéÿÿÿÿ)rs)r'rAr)r)r*ri@sz*SingleCellSimple._fake_instancemapping_getcs‡fdd„|dDƒS)Ncsg|]}ˆj|ƒ‘qSr))ri)Ú.0Úuuid)r'r)r*ú
<listcomp>DszDSingleCellSimple._fake_instancemapping_get_uuids.<locals>.<listcomp>rXrvr))r'rAr))r'r*rjCs
z0SingleCellSimple._fake_instancemapping_get_uuidscGs|jƒdS)Nr)rf)r'rAr)r)r*rgGszSingleCellSimple._fake_cell_getcGsdddtjddddœgS)NrXZonlycellzfake://nowhere/z
sqlite:///)rmrnrorxr(Z
transport_urlÚdatabase_connection)rZcell1)r'rAr)r)r*rfJsz SingleCellSimple._fake_cell_listccs
|VdS)Nr))r'rÚtarget_cellr)r)r*rlSsz"SingleCellSimple._fake_target_cell)T)r3r4r5r6r+r-rhrsrkrirjrgrfrrlr7r)r))r2r*raýs

	racs,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|ƒ}|j|d<|j|d<|S)z0Serialize context with the db_connection inside.Ú
db_connectionÚ
mq_connection)r,r|Úserialize_contextr}r~)r'rÚvalues)r2r)r*res

z$CheatingSerializer.serialize_contextcs0tt|ƒj|ƒ}|jddƒ|_|jddƒ|_|S)z7Deserialize context and honor db_connection if present.r}Nr~)r,r|Údeserialize_contextÚpopr}r~)r'r€Úctxt)r2r)r*rlsz&CheatingSerializer.deserialize_context)r3r4r5r6rrr7r)r))r2r*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|_tjƒ|_dS)N)Ú
_ctxt_mgrsÚ_last_ctxt_mgrÚ_default_ctxt_mgrrZReaderWriterLockÚ
_cell_lock)r'r)r)r*r+szCellDatabases.__init__cCs\tdsX|j|}|jƒjƒ}|jƒ}tjdddjdd„|jj	ƒDƒƒtd<|j
ƒdS)Nr")Údatabaser!css|]
}|VqdS)Nr))rwÚliner)r)r*ú	<genexpr>–sz.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_schemaccs„|jjƒp|dkr6|j||ƒ}|VWdQRXdS|j|j}||_z"|j||ƒ}|VWdQRXWd|j|_XWdQRXdS)N)rˆZ
write_lockÚ_real_target_cellr…rzr†r‡)r'rrprcr–Zccontextr)r)r*Ú_wrap_target_cellšszCellDatabases._wrap_target_cellNcCs|j|}|S)N)r…)r'r’r–r)r)r*Ú_wrap_create_context_manager²s
z*CellDatabases._wrap_create_context_managercCsBy|jr|jSWntk
r$YnX|jjƒ|jSQRXdS)N)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_clientFc
sŠtjƒ‰ˆ|j|<ˆ|_|jdks&|r,ˆ|_‡fdd„}tjd|ƒ<|j|ƒˆjƒj	ƒ}|j
ƒ|jƒ}|jj
tdƒWdQRXdS)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ˆS)Nr))r)r–r)r*Úget_context_managerôsz<CellDatabases.add_cell_database.<locals>.get_context_managerz*nova.db.sqlalchemy.api.get_context_managerr")rÚcreate_context_managerr…r†r‡rKrLr™rrŽr”rr’Ú
executescriptrŒ)r'r•Údefaultr§r—r˜r))r–r*Úadd_cell_databaseÙs

zCellDatabases.add_cell_databasecsŠtt|ƒjƒ|j|jƒtj|_|jt	j
d|jƒƒ|jt	j
d|jƒƒ|jt	j
d|j
ƒƒ|jt	j
d|jƒƒ|jt	j
d|jƒƒdS)Nz-nova.db.sqlalchemy.api.create_context_managerz*nova.db.sqlalchemy.api.get_context_managerznova.context.target_cellznova.rpc.get_serverznova.rpc.get_client)r,r„r-r0Úcleanuprr{ršrJrKrLrœržr›r¤r¦)r')r2r)r*r-s$



zCellDatabases.setUpcCs0x*t|jjƒƒD]}|jƒjƒ}|jƒqWdS)N)Úlistr…r€rrŽr”)r'r–r—r)r)r*r¬szCellDatabases.cleanup)N)N)NN)F)r3r4r5r6r+r™rr›rœržr¤r¦r«r-r¬r7r)r))r2r*r„ts


	

*r„csBeZdZd
‡fdd„	Zdd„Zdd„Zd	d
„Z‡fdd„Z‡ZS)ÚDatabaser"Ncsrtt|ƒjƒts tjtƒda||_|dkr^|dk	rTtj|d}|j	ƒ}|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–Zfacade)r2r)r*r+#s


zDatabase.__init__cCsTt|jsP|jƒ}|jƒ}tj|jddjdd„|jjƒDƒƒt|j<|j	ƒdS)N)r‰r!css|]
}|VqdS)Nr))rwrŠr)r)r*r‹Bsz)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|jƒ}|jƒdS)N)rŽr”)r'r—r)r)r*r¬FszDatabase.cleanupcCs6|jƒ|jƒ}|jƒ|jƒ}|jjt|jƒdS)N)r™rŽr”rr’r©rŒr‰)r'r—r˜r)r)r*ÚresetJs
zDatabase.resetcs&tt|ƒjƒ|jƒ|j|jƒdS)N)r,r®r-r²r0r¬)r')r2r)r*r-QszDatabase.setUp)r"N)	r3r4r5r+r™r¬r²r-r7r)r))r2r*r®"s

r®cs:eZdZd
‡fdd„	Zdd„Zdd„Z‡fdd	„Z‡ZS)ÚDatabaseAtVersionr"cs@tt|ƒjƒ||_||_|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‰)r2r)r*r+Xs
zDatabaseAtVersion.__init__cCs|jƒ}|jƒdS)N)rŽr”)r'r—r)r)r*r¬fszDatabaseAtVersion.cleanupcCs.|jƒ}|jƒ|jƒtj|j|jddS)N)r´r‰)rŽr”rrrr´r‰)r'r—r)r)r*r²jszDatabaseAtVersion.resetcs&tt|ƒjƒ|jƒ|j|jƒdS)N)r,r³r-r²r0r¬)r')r2r)r*r-pszDatabaseAtVersion.setUp)r")r3r4r5r+r¬r²r-r7r)r))r2r*r³Wsr³cseZdZ‡fdd„Z‡ZS)ÚDefaultFlavorsFixturecsútt|ƒjƒtjƒ}ddddddœ}dddd	œ}tjf|d
dddd
dœ|—Žtjf|ddddddœ|—Žtjf|ddddddœ|—Žtjf|ddddddœ|—Žtjf|dddd d!dœ|—Žtjf|d
ddd"d#|d$œ|—Žg}x|D]}|jƒqæWdS)%Ngð?FTr)Zrxtx_factorZdisabledZ	is_publicZephemeral_gbZswapZSandyBridgeZ2048Z	dedicated)zhw:cpu_modelzhw:mem_page_sizez
hw:cpu_policyirXrzm1.tiny)rÚ	memory_mbÚvcpusÚroot_gbÚflavoridr(iéÚ2zm1.smallirté(Ú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ƒZdefaultsrÅZdefault_flavorsZflavor)r2r)r*r-ws6






zDefaultFlavorsFixture.setUp)r3r4r5r-r7r)r))r2r*rµvsrµcs0eZdZ‡fdd„Zdd„Z‡fdd„Z‡ZS)Ú
RPCFixturecs*tt|ƒjƒg|_|jj|ƒi|_dS)N)r,rÆr+ÚexmodsÚextendÚ_buses)r'rÇ)r2r)r*r+šszRPCFixture.__init__cCs6d}||jkr,tjƒ}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_transportc	stt|ƒjƒ|jtjƒtj|jŽ|jtjƒt	j
tƒ|_d|j_
|j|jƒ|jtjd|jƒƒtjdƒ}d|_tjtƒWdQRXdS)NÚfakeznova.rpc.create_transportznova.rpc.get_transport_url)r,rÆr-r0rr¬Zadd_extra_exmodsrÇZclear_extra_exmodsÚmessaging_conffixtureZConfFixturer°Zmessaging_confZtransport_driverrJrKrLrËÚmockZpatchZreturn_valueZinit)r'Zmock_gtu)r2r)r*r-³szRPCFixture.setUp)r3r4r5r+rËr-r7r)r))r2r*rƙsrÆcs eZdZdZ‡fdd„Z‡ZS)ÚWarningsFixturez&Filters out warnings during test runs.csbtt|ƒjƒtjdtƒtjdddtjdddtjdddtjddd|jtjƒ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Úfilterwarningsr0Ú
resetwarnings)r')r2r)r*r-ÉszWarningsFixture.setUp)r3r4r5r6r-r7r)r))r2r*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|ƒjƒ|jddƒ|_||_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ÚrA)r'r&)r2r)r*r+ís	zConfPatcher.__init__csPtt|ƒjƒx<t|jjƒƒD]*\}}|jtj||j	ƒtj
|||j	ƒqWdS)N)r,rÙr-r­rAÚitemsr0r°Úclear_overriderÚÚset_override)r'r`Úv)r2r)r*r-úszConfPatcher.setUp)r3r4r5r6r+r-r7r)r))r2r*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|ƒjƒ||_||_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_versionrr)r'rârr)r2r)r*r+s
zOSAPIFixture.__init__csîtt|ƒjƒtj}d}d}d||f}||ddœ}|jtf|Žƒ|jtjdt	j
jƒƒtj
ƒj|ƒ‰‡fdd„}tjtj|ƒtj||d	}|jƒ|j|jƒd
|||jdœ|_tjdd|j|jƒ|_tjd
d
|j|jƒ|_||_dS)Nr¿Z
osapi_computez
http://%s:%s/T)Zosapi_compute_listenZosapi_compute_listen_portÚdebugz:keystoneauth1.session.TCPKeepAliveAdapter.init_poolmanagercsˆS)Nr)r))Úloaderr)r*re?sz$OSAPIFixture.setUp.<locals>.<lambda>)rÊz(http://%(host)s:%(port)s/%(api_version)s)r$ÚportrârÌÚadmin) r,rßr-rZ
osapi_hostrJrÙrKrLr
ÚHTTPAdapterÚinit_poolmanagerrÚLoaderZload_apprZ_setup_servicer°r$rÚRequestsInterceptorÚinstall_interceptr0Úuninstall_interceptrâZauth_urlrZTestOpenStackClientrrrZ	admin_apiÚapp)r'ZhostnameråZservice_nameÚendpointÚconf_overridesríÚ	intercept)r2)rär*r-)s2
zOSAPIFixture.setUp)ràrá)r3r4r5r6r+r-r7r)r))r2r*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|ƒjƒddddœ}|jtf|Žƒ|jtjddd„ƒƒtjdƒ|_	|j	j
ƒ|j|j	jƒd	|d
|j	j
f|_dS)Nz	127.0.0.1rT)Úmetadata_listenZmetadata_listen_portrãz-nova.network.linux_net.IptablesManager._applycSsdS)Nr))Ú_r)r)r*remsz(OSMetadataServer.setUp.<locals>.<lambda>Úmetadataz
http://%s:%s/rò)r,rñr-rJrÙrKrLrZWSGIServicerôr/r0ÚstopråZmd_url)r'rï)r2r)r*r-^s
zOSMetadataServer.setUp)r3r4r5r6r-r7r)r))r2r*rñSs
rñcs 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|ƒjƒddl}dd„}|jtjd|ƒƒdS)Nrc_s ddl}tjdƒ|jdƒdS)Nrz&Forgot to disable libvirt event threadrX)ÚsysrÔÚwarnÚexit)rAr&r÷r)r)r*Úevloops
z%PoisonFunctions.setUp.<locals>.evloopz(nova.virt.libvirt.host.Host._init_events)r,rör-Znova.virt.libvirt.hostrJrKrL)r'Únovarú)r2r)r*r-s	zPoisonFunctions.setUp)r3r4r5r6r-r7r)r))r2r*röwsröcs4eZdZdZ‡fdd„Zdd„Z‡fdd„Z‡ZS)ÚIndirectionAPIFixturez8Patch and restore the global NovaObject indirection api.cstt|ƒjƒ||_dS)z`Constructor

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

        N)r,rür+Úindirection_api)r'rý)r2r)r*r+šszIndirectionAPIFixture.__init__cCs|jtj_dS)N)Úorig_indirection_apiÚobj_baseÚ
NovaObjectrý)r'r)r)r*r¬£szIndirectionAPIFixture.cleanupcs2tt|ƒjƒtjj|_|jtj_|j|jƒdS)N)	r,rür-rÿrrýrþr0r¬)r')r2r)r*r-¦s

zIndirectionAPIFixture.setUp)r3r4r5r6r+r¬r-r7r)r))r2r*rü—s	rüc@s<eZdZdd„Zdd„Zdd„Zdd„Zd	d
„Zdd„Zd
S)Ú_FakeGreenThreadcOs|||Ž|_dS)N)Ú_result)r'ÚfuncrAr&r)r)r*r+®sz_FakeGreenThread.__init__cOsdS)Nr))r'rAr&r)r)r*Úcancel±sz_FakeGreenThread.cancelcOsdS)Nr))r'rAr&r)r)r*r1¶sz_FakeGreenThread.killcOs||f|ž|ŽdS)Nr))r'rrAr&r)r)r*Úlink»sz_FakeGreenThread.linkcOsdS)Nr))r'rrAr&r)r)r*Úunlink¾sz_FakeGreenThread.unlinkcCs|jS)N)r)r'r)r)r*ÚwaitÃsz_FakeGreenThread.waitN)	r3r4r5r+rr1rrrr)r)r)r*r­srcs eZdZdZ‡fdd„Z‡ZS)ÚSpawnIsSynchronousFixturez>Patch and restore the spawn_n utility method to be synchronouscs6tt|ƒjƒ|jtjdtƒƒ|jtjdtƒƒdS)Nznova.utils.spawn_nznova.utils.spawn)r,rr-rJrKrLr)r')r2r)r*r-Ês

zSpawnIsSynchronousFixture.setUp)r3r4r5r6r-r7r)r))r2r*rÇsrcs:eZdZdZd	‡fdd„	Zedd„ƒZ‡fdd„Z‡ZS)
ÚBannedDBSchemaOperationsz"Ban some operations for migrationsNcstt|ƒjƒ|pg|_dS)N)r,r	r+Ú_banned_resources)r'Zbanned_resources)r2r)r*r+Ôsz!BannedDBSchemaOperations.__init__cCstjd||fƒ‚dS)Nz8Operation %s.%s() is not allowed in a database migration)rZDBNotAllowed)ZresourceÚopr)r)r*Ú_explodeØsz!BannedDBSchemaOperations._explodecsbttˆƒjƒxNˆjD]D‰ˆjtjdˆ‡‡fdd„ƒƒˆjtjdˆ‡‡fdd„ƒƒqWdS)Nzsqlalchemy.%s.dropcsˆjˆdƒS)NZdrop)r)r_r`)r'Úthingr)r*reãsz0BannedDBSchemaOperations.setUp.<locals>.<lambda>zsqlalchemy.%s.altercsˆjˆdƒS)NZalter)r)r_r`)r'r
r)r*reæs)r,r	r-r
rJrKrL)r')r2)r'r
r*r-ÞszBannedDBSchemaOperations.setUp)N)	r3r4r5r6r+Ústaticmethodrr-r7r)r))r2r*r	Òsr	cs4eZdZdZ‡fdd„Z‡fdd„Zdd„Z‡ZS)Ú"ForbidNewLegacyNotificationFixturez<Make sure the test fails if new legacy notification is addedcstt|ƒjƒtj|_dS)N)r,rr+rZLegacyValidatingNotifierÚnotifier)r')r2r)r*r+ësz+ForbidNewLegacyNotificationFixture.__init__cs4tt|ƒjƒd|j_|jjjdƒ|j|jƒdS)NTÚ_decorated_function)	r,rr-rÚfatalÚ'allowed_legacy_notification_event_typesÚappendr0r¬)r')r2r)r*r-ïs
z(ForbidNewLegacyNotificationFixture.setUpcCsd|j_|jjjdƒdS)NFr)rrrÚremove)r'r)r)r*r¬úsz*ForbidNewLegacyNotificationFixture.cleanup)r3r4r5r6r+r-r¬r7r)r))r2r*résrcs$eZdZ‡fdd„Zdd„Z‡ZS)ÚAllServicesCurrentcs,tt|ƒjƒ|jtjd|jƒƒdt_dS)Nz.nova.objects.Service.get_minimum_version_multi)	r,rr-rJrKrLÚ
_fake_minimumÚcompute_rpcapiZLAST_VERSION)r')r2r)r*r-s

zAllServicesCurrent.setUpcOstjS)N)Úservice_objZSERVICE_VERSION)r'rAr&r)r)r*rsz AllServicesCurrent._fake_minimum)r3r4r5r-rr7r)r))r2r*rsrcs$eZdZ‡fdd„Zdd„Z‡ZS)ÚRegisterNetworkQuotacs&tt|ƒjƒtjƒ|j|jƒdS)N)r,rr-rZ_register_network_quotar0r¬)r')r2r)r*r-
szRegisterNetworkQuota.setUpcCstjjjddƒdS)NÚnetworks)Ú
nova_quotaZQUOTASZ
_resourcesr‚)r'r)r)r*r¬szRegisterNetworkQuota.cleanup)r3r4r5r-r¬r7r)r))r2r*rsrcsŠ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_idrmzprivate-subnetrmz192.168.1.1z
192.168.1.254)r/Úendr¾z192.168.1.1/24z$f8a6e8f8-c2ec-497c-9f23-da9616de54ef)r(Zenable_dhcpÚ
network_idr!Zdns_nameserversZallocation_poolsZhost_routesZ
ip_versionZ
gateway_ipÚcidrrmrz$ce531f90-199f-48c0-816c-13e38010b442zfa:16:3e:4c:2c:30z192.168.1.3)Z
ip_addressZ	subnet_id)rmr#r rZmac_addressZ	fixed_ipsr!z$88dae9fa-0dc6-49e3-8c29-3abc41e99ac9z00:0c:29:0d:11:74z192.168.1.30z$b71f1699-42be-4515-930a-f3ef01f94aa7Fzbr-intZfixedz10.0.0.4)Úmetar´ÚtypeZfloating_ipsÚaddressz10.0.0.0/26Úgatewayz10.0.0.1)r%r´r&r')Zipsr´r%ZdnsZroutesr$r(iÜ)Zinjectedr!Zmtuz$e1882e38-38c2-4239-ade7-35d644cb963aZpublic)Zbridgerr%rmZlabelztapb71f1699-42ZnormalN)Zport_filterZovs_hybrid_plugzfa:16:3e:47:94:4aZovs)ZprofileZovs_interfaceidZpreserve_on_deleteZnetworkZdevnameZ	vnic_typeZ
qbh_paramsr%Zdetailsr'Zactiver&rmZ
qbg_paramscsHtt|ƒjƒ||_tjtjƒg|_g|_tj	g|_
tjg|_g|_
dS)N)r,rr+ÚtestÚcopyÚdeepcopyÚport_1Ú_portsÚ_extensionsÚ	network_1Ú	_networksÚsubnet_1Ú_subnetsÚ_floatingips)r'r))r2r)r*r+Šs

zNeutronFixture.__init__cs¸ttˆƒjƒˆjjddd„ƒˆjjddd„ƒˆjjddd„ƒˆjjdd	d„ƒˆjjd
dd„ƒˆjjdd
d„ƒˆjjddd„ƒˆjjddd„ƒˆjjd‡fdd„ƒdS)Nz0nova.network.neutronv2.api.API.validate_networksc_sdS)NrXr))rAr&r)r)r*re™sz&NeutronFixture.setUp.<locals>.<lambda>zBnova.network.neutronv2.api.API.create_pci_requests_for_sriov_portsc_sdS)Nr))rAr&r)r)r*resz5nova.network.neutronv2.api.API.setup_networks_on_hostc_sdS)Nr))rAr&r)r)r*re sz5nova.network.neutronv2.api.API.migrate_instance_startc_sdS)Nr))rAr&r)r)r*re£sz7nova.network.neutronv2.api.API.add_fixed_ip_to_instancec_stjjtjƒS)N)Ú
network_modelÚNetworkInfoÚhydraterÚnw_info)rAr&r)r)r*re¦sz<nova.network.neutronv2.api.API.remove_fixed_ip_from_instancec_stjjtjƒS)N)r4r5r6rr7)rAr&r)r)r*reªsz6nova.network.neutronv2.api.API.migrate_instance_finishc_sdS)Nr))rAr&r)r)r*re®szbnova.network.security_group.neutron_driver.SecurityGroupAPI.get_instances_security_groups_bindingsc_siS)Nr))rAr&r)r)r*re²sz%nova.network.neutronv2.api.get_clientcsˆS)Nr))rAr&)r'r)r*reµs)r,rr-r)Ústub_out)r')r2)r'r*r-“s6







zNeutronFixture.setUpcs.‡fdd„|Dƒ}t|ƒdkr&|dSdSdS)Ncsg|]}|dˆkr|‘qS)rmr))rwÚp)rmr)r*ry¸sz6NeutronFixture._get_first_id_match.<locals>.<listcomp>r)Úlen)r'rmr­Z
filtered_listr))rmr*Ú_get_first_id_match·sz"NeutronFixture._get_first_id_matchcs:tj|jƒ}x$ˆD]‰‡‡fdd„|Dƒ}|}qWd|iS)Ncs"g|]}|jˆƒˆˆkr|‘qSr))rG)rwr9)Ú_paramsÚoptr)r*ryÁsz0NeutronFixture._filter_ports.<locals>.<listcomp>Úports)r*r+r-)r'r<r>Zfiltered_portsr))r<r=r*Ú
_filter_ports¾s

zNeutronFixture._filter_portscOstjd|jiƒS)NÚ
extensions)r*r+r.)r'rAr&r)r)r*Úlist_extensionsÅszNeutronFixture.list_extensionscKs*|j||jƒ}|dkr"tj|d‚d|iS)N)Úport_idrå)r;r-rZPortNotFound)r'rBr<rår)r)r*Ú	show_portÈszNeutronFixture.show_portcKs,x&|jD]}|d|kr|jj|ƒqWdS)Nrm)r-r)r'rår<Zcurrent_portr)r)r*Údelete_portÎszNeutronFixture.delete_portcKstjd|jiƒS)Nr)r*r+r0)r'Úretrieve_allr<r)r)r*Ú
list_networksÓszNeutronFixture.list_networkscKs|jf|ŽS)N)r?)r'rEr<r)r)r*Ú
list_portsÖszNeutronFixture.list_portscKstjd|jiƒS)Nr)r*r+r2)r'rEr<r)r)r*Úlist_subnetsÙszNeutronFixture.list_subnetscKstjd|jiƒS)NZfloatingips)r*r+r3)r'rEr<r)r)r*Úlist_floatingipsÜszNeutronFixture.list_floatingipscOs$|jjtjtjƒƒtjdtjiƒS)Nrå)r-rr*r+rÚport_2)r'rAr&r)r)r*Úcreate_portßszNeutronFixture.create_portcCsD|j||jƒ}|dk	r<x$t|djƒƒD]\}}|||<q(Wd|iS)Nrå)r;r-r­rÛ)r'rBÚbodyZnew_portr`rÞr)r)r*Úupdate_portãs
zNeutronFixture.update_port)T)T)T)T)N)r3r4r5r6r!r/r1r,rJr7r+r-r;r?rArCrDrFrGrHrIrKrMr7r)r))r2r*rs¨
	$



rc@seZdZdd„ZdS)Ú_NoopConductorcCsdd„}|S)Nc_sdS)Nr))rAr&r)r)r*Ú	_noop_rpcïsz-_NoopConductor.__getattr__.<locals>._noop_rpcr))r'ÚkeyrOr)r)r*Ú__getattr__îsz_NoopConductor.__getattr__N)r3r4r5rQr)r)r)r*rNísrNcs eZdZdZ‡fdd„Z‡ZS)ÚNoopConductorFixturez(Stub out the conductor API to do nothingcs6tt|ƒjƒ|jtjdtƒƒ|jtjdtƒƒdS)Nznova.conductor.ComputeTaskAPIznova.conductor.API)r,rRr-rJrKrLrN)r')r2r)r*r-÷s

zNoopConductorFixture.setUp)r3r4r5r6r-r7r)r))r2r*rRôsrRcseZdZ‡fdd„Z‡ZS)ÚEventReporterStubcs(tt|ƒjƒ|jtjddd„ƒƒdS)Nz nova.compute.utils.EventReporterc_stjƒS)N)rÎZ	MagicMock)rAr&r)r)r*resz)EventReporterStub.setUp.<locals>.<lambda>)r,rSr-rJrKrL)r')r2r)r*r-szEventReporterStub.setUp)r3r4r5r-r7r)r))r2r*rSÿsrScsDeZdZdZdZdZdZdZdZdZ	‡fdd	„Z
‡fd
d„Z‡ZS)Ú
CinderFixturezA fixture to volume operationsráz$a07f71dc-8151-4e7d-a0cc-cd24a3f11113z$227cc671-f30b-4488-96fd-7d0bf13648d8z$828419fa-3efb-4533-b458-4267ca5fe9b1z$9c6d9c2d-7a8f-4c80-938d-3bf062b8d489z$6ca404f3-d844-4169-bb96-bc792f37de98cs>tt|ƒjƒ||_d|_d|_d|_tƒ|_t	j
tƒ|_dS)NF)r,rTr+r)Ú
swap_errorÚswap_volume_instance_uuidÚswap_volume_instance_error_uuidr­Úreserved_volumesÚcollectionsÚdefaultdictÚattachments)r'r))r2r)r*r+szCinderFixture.__init__csttˆƒjƒd ‡fdd„	}dd„}dd„}‡fdd„}‡fd	d
„}d!‡fdd
„	}ˆjjd|ƒd"‡fdd„	}ˆjjd|ƒˆjjddd„ƒˆjjd|ƒˆjjd|ƒˆjjd|ƒˆjjd|ƒˆjjddd„ƒˆjjddd„ƒˆjjd|ƒˆjjddd„ƒdS)#Ncs|tjtjfkrxddd|dddœ}ˆjr2|tjksBˆjrx|tjkrx|tjkrRˆjnˆj}|jd|d|d	œid
dœƒ|SxftˆjjƒƒD]0\}}||krˆd|d
|dd||ddœid
œ}PqˆW|ˆj	k}|rÎdnddd|dddœ}|ˆj
krþd|d<ddi|d<|S)NÚ	availableÚTEST1ÚdetachedFrX)rÚdisplay_nameÚ
attach_statusrmÚmultiattachÚsizezin-usez/dev/vdb)Ú
mountpointÚ
attachment_idÚattached)rr[r`)rdrc)rr_r`rmrarbr[Z	attachingÚTEST2TÚbootableÚimage_idz$155d900f-4e14-4e4c-a73d-069cbf4541e6Úvolume_image_metadata)rTÚSWAP_OLD_VOLÚSWAP_ERR_OLD_VOLrVrWÚupdater­r[rÛrXÚIMAGE_BACKED_VOL)Úself_apirÚ	volume_idÚmicroversionÚvolumerqÚvolumesZreserved_volume)r'r)r*Úfake_get%sX






z%CinderFixture.setUp.<locals>.fake_getcSs|tjkrfSiS)N)rTÚSWAP_ERR_NEW_VOL)r'rroÚ	connectorr)r)r*Úfake_initialize_connectionps
z7CinderFixture.setUp.<locals>.fake_initialize_connectioncSsd|iS)NÚsave_volume_idr))r'rÚ
old_volume_idÚ
new_volume_idÚerrorr)r)r*Úfake_migrate_volume_completionvsz;CinderFixture.setUp.<locals>.fake_migrate_volume_completioncsˆjj|ƒdS)N)rXr)rnrro)r'r)r*Úfake_reserve_volumezsz0CinderFixture.setUp.<locals>.fake_reserve_volumecs |ˆjkrˆjj|ƒdˆ_dS)NT)rXrrU)rnrro)r'r)r*Úfake_unreserve_volume}s
z2CinderFixture.setUp.<locals>.fake_unreserve_volumeÚrwcsLx6tˆjjƒƒD]$\}}||krtjd||fd‚qWˆj|j|ƒdS)Nz,Volume %s is already attached to instance %s)Úreason)r­r[rÛrZInvalidInputr)Ú_selfrrorqrcÚmodeÚinstancerr)r'r)r*Úfake_attach‰sz(CinderFixture.setUp.<locals>.fake_attachznova.volume.cinder.API.attachcsd|ˆjkrˆjj|ƒ|dk	r0ˆj|j|ƒn0x.tˆjjƒƒD]\}}||kr@|j|ƒPq@WdS)N)rXrr[r­rÛ)r€rrorqrdr‚rr)r'r)r*Úfake_detach—s

z(CinderFixture.setUp.<locals>.fake_detachznova.volume.cinder.API.detachz&nova.volume.cinder.API.begin_detachingc_sdS)Nr))rAr&r)r)r*re­sz%CinderFixture.setUp.<locals>.<lambda>znova.volume.cinder.API.getz,nova.volume.cinder.API.initialize_connectionz0nova.volume.cinder.API.migrate_volume_completionz%nova.volume.cinder.API.reserve_volumez%nova.volume.cinder.API.roll_detachingc_sdS)Nr))rAr&r)r)r*re¸sz+nova.volume.cinder.API.terminate_connectionc_sdS)Nr))rAr&r)r)r*reºsz'nova.volume.cinder.API.unreserve_volumez%nova.volume.cinder.API.check_attachedc_sdS)Nr))rAr&r)r)r*re¾s)N)r~)NN)r,rTr-r)r8)r'rsrvr{r|r}rƒr„)r2)r'r*r-"s>K




zCinderFixture.setUp)
r3r4r5r6r!rjÚSWAP_NEW_VOLrkrtrmr+r-r7r)r))r2r*rTsrTcsLeZdZdZdZdZdZdZdZdZ	dZ
d	Z‡fd
d„Z‡fdd
„Z
‡ZS)ÚCinderFixtureNewAttachFlowzDA fixture to volume operations with the new Cinder attach/detach APIráz$a07f71dc-8151-4e7d-a0cc-cd24a3f11113z$227cc671-f30b-4488-96fd-7d0bf13648d8z$828419fa-3efb-4533-b458-4267ca5fe9b1z$9c6d9c2d-7a8f-4c80-938d-3bf062b8d489z$4a3cd440-b9c2-11e1-afa6-0800200c9a66z$4757d51f-54eb-4442-8684-3399a6431f67z$6ca404f3-d844-4169-bb96-bc792f37de98cs<tt|ƒjƒ||_d|_d|_d|_d|_tj	t
ƒ|_dS)NF)r,r†r+r)rUrVrWÚattachment_error_idrYrZr­r[)r'r))r2r)r*r+Õsz#CinderFixtureNewAttachFlow.__init__csttˆƒjƒd‡fdd„	}dd„}d‡fdd„	}‡fdd„}d d	d
„}dd„}ˆjjd
|ƒˆjjd|ƒˆjjd|ƒˆjjddd„ƒˆjjd|ƒˆjjddd„ƒˆjjd|ƒˆjjd|ƒˆjjddd„ƒˆjjddd„ƒˆjjddd„ƒdS)!Ncsü|tjtjfkrxddd|dddœ}ˆjr2|tjksBˆjrx|tjkrx|tjkrRˆjnˆj}|jd|d|d	œid
dœƒ|Sx`tˆjjƒƒD]6\}}||krˆd|d
||ˆj	kd||ddœid
œ}PqˆWddd||ˆj	kddœ}|ˆj
krød|d<ddi|d<|S)Nr\r]r^FrX)rr_r`rmrarbzin-usez/dev/vdb)rcrdre)rr[r`)rdrc)rr_r`rmrarbr[rfTrgrhz$155d900f-4e14-4e4c-a73d-069cbf4541e6ri)rTrjrkrVrWrlr­r[rÛÚMULTIATTACH_VOLrm)rnrrorprqrqrr)r'r)r*rsãsV




z2CinderFixtureNewAttachFlow.setUp.<locals>.fake_getcSsd|iS)Nrwr))r'rrxryrzr)r)r*r{-szHCinderFixtureNewAttachFlow.setUp.<locals>.fake_migrate_volume_completioncsJtjƒ}ˆjdk	rˆj}|diidœ}ˆjdj|ƒˆj|j|ƒ|S)NÚdata)rmÚconnection_inforq)r	Z
generate_uuidr‡r[r)r€rrorqrurcrdZ
attachment)r'r)r*Úfake_attachment_create1s
z@CinderFixtureNewAttachFlow.setUp.<locals>.fake_attachment_createcs:ˆjdd}ˆj|d=ˆjdd=|tjkr6dˆ_dS)NrqrT)r[r†ÚSWAP_ERR_ATTACH_IDrU)r€rrdrq)r'r)r*Úfake_attachment_delete<s

z@CinderFixtureNewAttachFlow.setUp.<locals>.fake_attachment_deletecSs,d|ddddœidœ}|tjkr(dfi}|S)NÚ	fake_typer‰Úbarr)ÚfooÚ
target_lun)Údriver_volume_typermrŠrŠ)r†rŒ)r€rrdrurcÚattachment_refr)r)r*Úfake_attachment_updateCs
z@CinderFixtureNewAttachFlow.setUp.<locals>.fake_attachment_updatecSsd|ddddœidœ}|S)NrŽr‰rr)rr‘)r’rmrŠr))r€rrdr“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_sdS)Nr))rAr&r)r)r*re]sz2CinderFixtureNewAttachFlow.setUp.<locals>.<lambda>z%nova.volume.cinder.API.attachment_getz&nova.volume.cinder.API.begin_detachingc_sdS)Nr))rAr&r)r)r*reasznova.volume.cinder.API.getz0nova.volume.cinder.API.migrate_volume_completionz%nova.volume.cinder.API.roll_detachingc_sdS)Nr))rAr&r)r)r*rehsz,nova.volume.cinder.is_microversion_supportedc_sdS)Nr))rAr&r)r)r*rejsz%nova.volume.cinder.API.check_attachedc_sdS)Nr))rAr&r)r)r*rels)N)NN)N)r,r†r-r)r8)r'rsr{r‹rr”r•)r2)r'r*r-às<J






z CinderFixtureNewAttachFlow.setUp)r3r4r5r6r!rjr…rkrtrŒrˆrmr+r-r7r)r))r2r*r†Äsr†c@s$eZdZdd„Zdd„Zdd„ZdS)ÚPlacementApiClientcCs
||_dS)N)Úfixture)r'Zplacement_fixturer)r)r*r+pszPlacementApiClient.__init__cKstj|jjd|f|ŽƒS)N)rÚAPIResponser—Ú	_fake_get)r'rÊr&r)r)r*rGsszPlacementApiClient.getcKstj|jjd||f|ŽƒS)N)rr˜r—Ú	_fake_put)r'rÊrLr&r)r)r*ÚputvszPlacementApiClient.putN)r3r4r5r+rGr›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.
    ræcCs
||_dS)N)Útoken)r'rr)r)r*r+‡szPlacementFixture.__init__csìtt|ƒjƒ|jtdddƒtjtƒ‰‡fdd„}tj	}d||_
tj||j
d}|j
ƒ|j|jƒ|jtjdtjjƒƒtjdd	|_|jtjd
|jƒƒ|jtjd|jƒƒ|jtjd|jƒƒ|jtjd
|jƒƒt|ƒ|_dS)NrZnoauth2)rÚZ
auth_strategycsˆS)Nr)r))rär)r*resz(PlacementFixture.setUp.<locals>.<lambda>zhttp://%s/placement)rÊz:keystoneauth1.session.TCPKeepAliveAdapter.init_poolmanager)Zauthz6nova.scheduler.client.report.SchedulerReportClient.getz7nova.scheduler.client.report.SchedulerReportClient.postz6nova.scheduler.client.report.SchedulerReportClient.putz9nova.scheduler.client.report.SchedulerReportClient.delete)r,rœr-rJrÙÚplacement_deployZloadappr°rZplacement_hostrîrrêrër0rìrKrLr
rçrèÚksZSessionÚ_clientr™Ú
_fake_postršÚ_fake_deleter–r)r'rír$rð)r2)rär*r-Šs4





zPlacementFixture.setUpcKs(|jdƒ}|dk	r$|jdd|iƒdS)Nr´zOpenStack-API-Versionzplacement %s)rGrl)Úheadersr&r´r)r)r*Ú_update_headers_with_version°s
z-PlacementFixture._update_headers_with_versioncOs<|dd…\}d|ji}|j|f|Ž|jj||j|ddS)NrXzx-auth-tokenF)Úendpoint_overrider£Ú	raise_exc)rr¤r rGrî)r'rAr&rÊr£r)r)r*r™¹s
zPlacementFixture._fake_getcOs@|dd…\}}d|ji}|j|f|Ž|jj|||j|ddS)NrXzx-auth-tokenF)Újsonr¥r£r¦)rr¤r Zpostrî)r'rAr&rÊr‰r£r)r)r*r¡Æs
zPlacementFixture._fake_postcOs@|dd…\}}d|ji}|j|f|Ž|jj|||j|ddS)NrXzx-auth-tokenF)r§r¥r£r¦)rr¤r r›rî)r'rAr&rÊr‰r£r)r)r*rš×s
zPlacementFixture._fake_putcOs*|dd…\}|jj||jd|jiddS)NrXzx-auth-tokenF)r¥r£r¦)r Údeleterîr)r'rAr&rÊr)r)r*r¢èszPlacementFixture._fake_delete)ræ)
r3r4r5r6r+r-rr¤r™r¡ršr¢r7r)r))r2r*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.)r^)r'rr)r)r*r+õsz!UnHelperfulClientChannel.__init__N)r3r4r5r+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|ƒjƒ|jtjdtƒƒdS)Nz)oslo_privsep.daemon.RootwrapClientChannel)r,rªr-rJrKrLr©)r')r2r)r*r-szPrivsepNoHelperFixture.setUp)r3r4r5r6r-r7r)r))r2r*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|ƒjƒ|jtjdtjƒƒƒtj	dddƒ|j
tjddƒdS)Nznova.quota.QuotaEngine._driverZdriverznova.quota.NoopQuotaDriverr)r,r«r-rJrKrLrZNoopQuotaDriverr°rÝr0rÜ)r')r2r)r*r-s

zNoopQuotaDriverFixture.setUp)r3r4r5r6r-r7r)r))r2r*r«s	r«)rrrr )pr6Z
__future__rrYÚ
contextlibrr*ZloggingrCrErÔrKZ
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.computerrrûrZnova.dbrZnova.db.sqlalchemyrrZnova.networkrr4rZnova.objectsrrÿrrrrrZnova.tests.functional.apirZ
nova.testsrrrHr°rŒr¯ZFixturer#ZHandlerr8r?rNrWr\raZRequestContextSerializerr|r„r®r³rµrÆrÏrÙrßrñrörüÚobjectrrr	rrrrrNrRrSrTr†r–rœZ_ClientChannelr©rªr«r)r)r)r*Ú<module>s 
G#]/5#-R$ V	=,y