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 / dist-packages / dmapi / tests / __pycache__ / fixtures.cpython-35.pyc
Size: Mime:


Ú]/ã@sÌdZddlmZddlZddlmZddlZddlZddl	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+mBZBdnZCejDZDd"d#d$d#iaEd%aFGd&d'„d'ejGƒZHGd(d)„d)ejIƒZJGd*d+„d+ejGƒZKGd,d-„d-ejGƒZLGd.d/„d/ejGƒZMGd0d1„d1ejGƒZNGd2d3„d3ejGƒZOGd4d5„d5e=jPƒZQGd6d7„d7ejGƒZRGd8d9„d9ejGƒZSGd:d;„d;ejGƒZTGd<d=„d=ejGƒZUGd>d?„d?ejGƒZVGd@dA„dAejGƒZWGdBdC„dCejGƒZXGdDdE„dEejGƒZYGdFdG„dGejGƒZZGdHdI„dIejGƒZ[GdJdK„dKejGƒZ\GdLdM„dMe]ƒZ^GdNdO„dOejGƒZ_GdPdQ„dQejGƒZ`GdRdS„dSejGƒZaGdTdU„dUejGƒZbGdVdW„dWejGƒZcGdXdY„dYejGƒZdGdZd[„d[e]ƒZeGd\d]„d]ejGƒZfGd^d_„d_ejGƒZgGd`da„daejGƒZhGdbdc„dcejGƒZiGddde„dee]ƒZjGdfdg„dgejGƒZkGdhdi„diejlƒZmGdjdk„dkejGƒZnGdldm„dmejGƒZodS)ozFixtures 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ÚmainÚrFcs7eZdZdZddd„Z‡fdd†Z‡S)ÚServiceFixturez Run a service as a test fixture.NcKsC|}|p|}|jd|ƒ|jdd|ƒ||_dS)NÚhostÚbinaryznova-%s)Ú
setdefaultÚkwargs)ÚselfÚnamer$r'©r*ú6/usr/lib/python3/dist-packages/dmapi/tests/fixtures.pyÚ__init__8s
zServiceFixture.__init__csOtt|ƒjƒtjj|j|_|jjƒ|j|jj	ƒdS)N)
Úsuperr#ÚsetUprZServiceÚcreater'ÚstartÚ
addCleanupÚkill)r()Ú	__class__r*r+r.Bs
zServiceFixture.setUp)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r,r.r*r*)r3r+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)r4r5r6r7r;r<r>r*r*r*r+r8Isr8cs(eZdZdZ‡fdd†Z‡S)Ú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
krStj}n	tj}d}|jt
jd|ddƒƒ|_|jdj|ƒ|tjkr÷tƒ}|jt
j|ddƒƒ|jtjƒtjdƒjtjƒd	d
„}|jt
jd|ƒƒdS)NZOS_DEBUGz0%(asctime)s %(levelname)s [%(name)s] %(message)sr9ÚlevelrZ
nuke_handlersFzmigrate.versioning.apicWsdS)Nr*)Úargsr*r*r+Úfake_logging_setupšsz1StandardLogging.setUp.<locals>.fake_logging_setupzoslo_log.log.setup)r-r?r.Ústd_loggingÚ	getLoggerÚsetLevelÚDEBUGÚosÚenvironÚgetÚ_TRUE_VALUESÚINFOÚ
useFixtureÚfixturesZ
FakeLoggerÚloggerÚhandlersr8Z
LogHandlerÚWARNINGÚMonkeyPatch)r(Úrootr@ÚfsÚhandlerrB)r3r*r+r.us&		zStandardLogging.setUp)r4r5r6r7r.r*r*)r3r+r?Zsr?csLeZdZdZ‡fdd†Zedd„ƒZedd„ƒZ‡S)Ú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ƒtkre|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-rUr.rGrHrIrJrLrMZStringStreamÚoutrQÚstreamÚerr)r()r3r*r+r.©szOutputStreamCapture.setUpcCs|jjdjƒS)NrW)rZÚ_detailsÚas_text)r(r*r*r+rW´szOutputStreamCapture.stderrcCs|jjdjƒS)NrV)rXr[r\)r(r*r*r+rV¸szOutputStreamCapture.stdout)r4r5r6r7r.ÚpropertyrWrVr*r*)r3r+rU¡srUcs=eZdZdZd‡fdd†Z‡fdd†Z‡S)Ú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.
    écsrtt|ƒjƒyt|ƒ|_Wntk
rCd|_YnX|dkrb|j|9_ntdƒ‚dS)Nrr_zscaling value must be >= 1)r-r^r,ÚintÚtest_timeoutÚ
ValueError)r(ÚtimeoutZscaling)r3r*r+r,Ès
zTimeout.__init__csEtt|ƒjƒ|jdkrA|jtj|jddƒƒdS)NrZgentleT)r-r^r.rarLrM)r()r3r*r+r.Ôsz
Timeout.setUp)r4r5r6r7r,r.r*r*)r3r+r^½s	r^cs.eZdZ‡fdd†Zdd„Z‡S)ÚDatabasePoisonFixturecs3tt|ƒjƒ|jtjd|jƒƒdS)NzCoslo_db.sqlalchemy.enginefacade._TransactionFactory._create_session)r-rdr.rLrMrQÚ_poison_configure)r()r3r*r+r.ÛszDatabasePoisonFixture.setUpcOstdƒ‚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+reâsz'DatabasePoisonFixture._poison_configure)r4r5r6r.rer*r*)r3r+rdÚsrdcseZdZdZddd„Z‡fdd†Zdd„Zd	d
„Zdd„Zd
d„Z	dd„Z
dd„Zdd„Ze
dd„ƒZ‡S)Ú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(rjr*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-rir.rLrMrQÚ_fake_cell_listÚ_fake_cell_getÚ_fake_hostmapping_getÚ_fake_instancemapping_getÚ_fake_instancemapping_get_uuidsÚ_fake_instancemapping_get_saveÚ_fake_target_cell)r()r3r*r+r.s2






zSingleCellSimple.setUpcGs,ddddddddd|jƒdiS)	NÚidr_Ú
updated_atÚ
created_atr$Zhost1Úcell_mappingr)rn)r(rAr*r*r+rp*s
z&SingleCellSimple._fake_hostmapping_getcCsRddddddd|d|jr*dp-dddd	|jrK|jƒpNdiS)
Nrur_rvrwÚ
instance_uuidZcell_idÚ
project_idÚprojectrx)rjro)r(ryr*r*r+Ú _fake_instancemapping_get_common1sz1SingleCellSimple._fake_instancemapping_get_commoncGs|j|dƒS)Nééþÿÿÿ)r|)r(rAr*r*r+rs=sz/SingleCellSimple._fake_instancemapping_get_savecGs|j|dƒS)Nr_éÿÿÿÿ)r|)r(rAr*r*r+rq@sz*SingleCellSimple._fake_instancemapping_getcs‡fdd†|dDƒS)Ncsg|]}ˆj|ƒ‘qSr*)rq)Ú.0Úuuid)r(r*r+ú
<listcomp>Ds	zDSingleCellSimple._fake_instancemapping_get_uuids.<locals>.<listcomp>r_rr*)r(rAr*)r(r+rrCsz0SingleCellSimple._fake_instancemapping_get_uuidscGs|jƒdS)Nr)rn)r(rAr*r*r+roGszSingleCellSimple._fake_cell_getcGs4dddddddtjdddd	d
digS)Nrur_rvrwrr)ZonlycellZ
transport_urlzfake://nowhere/Údatabase_connectionz
sqlite:///)rZcell1)r(rAr*r*r+rnJs	z SingleCellSimple._fake_cell_listccs	|VdS)Nr*)r(rÚtarget_cellr*r*r+rtSsz"SingleCellSimple._fake_target_cell)r4r5r6r7r,r.rpr|rsrqrrrornrrtr*r*)r3r+riýs
	rics:eZdZdZ‡fdd†Z‡fdd†Z‡S)Ú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.
    cs6tt|ƒ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)r3r*r+rˆes

z$CheatingSerializer.serialize_contextcsFtt|ƒj|ƒ}|jddƒ|_|jddƒ|_|S)z7Deserialize context and honor db_connection if present.r†Nr‡)r-r…Údeserialize_contextÚpopr†r‡)r(r‰Úctxt)r3r*r+rŠlsz&CheatingSerializer.deserialize_context)r4r5r6r7rˆrŠr*r*)r3r+r…Zs
r…cs©eZdZdZdd„Zdd„Zedd„ƒZdd	d
„Zdd„Z	dd
d„Z
dddd„Zddd„Z‡fdd†Z
dd„Z‡S)Ú
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,s			zCellDatabases.__init__cCs|tdsx|j|}|jƒjƒ}|jƒ}tjddƒdjdd„|jj	ƒDƒƒtd<|j
ƒdS)Nr!Údatabaser"css|]}|VqdS)Nr*)r€Ú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ƒ„|dkrA|j||ƒ}|VWdQRXdS|j|j}||_z%|j||ƒ}|VWdQRXWd|j|_XWdQRXdS)N)r‘Z
write_lockÚ_real_target_cellrŽrƒrr)r(rrxrkrŸ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_managercCsKy|jr|jSWntk
r(YnX|jjƒ|jSWdQRXdS)N)r†ÚAttributeErrorr‘Z	read_lockr)r(rr*r*r+Ú_wrap_get_context_manager¶s	
z'CellDatabases._wrap_get_context_managercCs.t|ƒ}tjtj||ddd|ƒS)z3Mirror rpc.get_server() but with our special sauce.ZexecutorZeventletÚ
serializer)r…Ú	messagingZget_rpc_serverrÚ	TRANSPORT)r(ÚtargetZ	endpointsr¨r*r*r+Ú_wrap_get_serverÈszCellDatabases._wrap_get_servercCs+t|ƒ}tjtj|d|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|<ˆ|_|jdks7|r@ˆ|_‡fdd†}tjd|ƒN|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rMrQr¢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.r1Úcleanuprr„r£rLrMrQr¥r§r¤r¬r®)r()r3r*r+r.s$



zCellDatabases.setUpcCs@x9t|jjƒƒD]"}|jƒjƒ}|jƒqWdS)N)ÚlistrŽr‰r–r—r)r(rŸr r*r*r+r´szCellDatabases.cleanup)r4r5r6r7r,r¢rr¤r¥r§r¬r®r³r.r´r*r*)r3r+rts
	*rcs^eZdZdd‡fdd†Zdd„Zdd„Zd	d
„Z‡fdd†Z‡S)
ÚDatabaser!Ncs¥tt|ƒjƒts,tjtƒda||_|dkr‰|dk	rztjd|ƒ}|j	ƒ}|j
|_
q¡tj
|_
n|dkr¡tj|_
dS)z›Create a database fixture.

        :param database: The type of database, 'main' or 'api'
        :param connection: The connection string to use
        Tr!Nr›r)r-r¶r,ÚSESSION_CONFIGUREDrZ	configureÚCONFr’r°r–r—Úget_api_engine)r(r’r›rŸZfacade)r3r*r+r,#s
			zDatabase.__init__cCsrt|jsn|jƒ}|jƒ}tjd|jƒdjdd„|jjƒDƒƒt|j<|j	ƒdS)Nr’r"css|]}|VqdS)Nr*)r€r“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´FszDatabase.cleanupcCsG|jƒ|jƒ}|jƒ|jƒ}|jjt|jƒdS)N)r¢r—rr˜r›r±r•r’)r(r r¡r*r*r+ÚresetJs


zDatabase.resetcs1tt|ƒjƒ|jƒ|j|jƒdS)N)r-r¶r.rºr1r´)r()r3r*r+r.Qs
zDatabase.setUp)r4r5r6r,r¢r´rºr.r*r*)r3r+r¶"s

r¶csOeZdZd‡fdd†Zdd„Zdd„Z‡fdd	†Z‡S)
ÚDatabaseAtVersionr!cs\tt|ƒjƒ||_||_|dkr@tj|_n|dkrXtj|_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’)r3r*r+r,Xs		zDatabaseAtVersion.__init__cCs|jƒ}|jƒdS)N)r—r)r(r r*r*r+r´fszDatabaseAtVersion.cleanupcCs@|jƒ}|jƒ|jƒtjd|jd|jƒdS)Nr¼r’)r—rr˜rr™r¼r’)r(r r*r*r+rºjs

zDatabaseAtVersion.resetcs1tt|ƒjƒ|jƒ|j|jƒdS)N)r-r»r.rºr1r´)r()r3r*r+r.ps
zDatabaseAtVersion.setUp)r4r5r6r,r´rºr.r*r*)r3r+r»Wsr»cs"eZdZ‡fdd†Z‡S)ÚDefaultFlavorsFixturecs¦tt|ƒjƒtjƒ}ddddddddd	di}d
ddd
ddi}tjd|dddddddddd|tjd|dddddddddd|tjd|dddddd dd!dd"|tjd|dd#dd$dd%dd&dd'|tjd|dd(dd)dd*dd+dd,|tjd|dddddddd-dd.d/||g}x|D]}|jƒqŽWdS)0NZrxtx_factorgð?ÚdisabledFZ	is_publicTZephemeral_gbrZswapzhw:cpu_modelZSandyBridgezhw:mem_page_sizeZ2048z
hw:cpu_policyZ	dedicatedrZ	memory_mbiZvcpusr_Zroot_gbZflavoridrr)zm1.tinyiéÚ2zm1.smallir}é(Ú3z	m1.mediumi ééPÚ4zm1.largei@éé Ú5z	m1.xlargeÚ6z
m1.tiny.specsÚextra_specs)r-r½r.rZget_admin_contextrZFlavorr/)r(rŒÚdefaultsrÊZdefault_flavorsZflavor)r3r*r+r.ws6
zDefaultFlavorsFixture.setUp)r4r5r6r.r*r*)r3r+r½vsr½cs@eZdZ‡fdd†Zdd„Z‡fdd†Z‡S)Ú
RPCFixturecs9tt|ƒjƒg|_|jj|ƒi|_dS)N)r-rÌr,ÚexmodsÚextendÚ_buses)r(rÍ)r3r*r+r,šs	zRPCFixture.__init__cCsNd}||jkrCtjƒ}tjtd|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.r1rr´Zadd_extra_exmodsrÍZclear_extra_exmodsÚmessaging_conffixtureZConfFixturer¸Zmessaging_confZtransport_driverrLrMrQrÑÚmockÚpatchZreturn_valueÚinit)r(Zmock_gtu)r3r*r+r.³s	zRPCFixture.setUp)r4r5r6r,rÑr.r*r*)r3r+r̙srÌcs(eZdZdZ‡fdd†Z‡S)ÚWarningsFixturez&Filters out warnings during test runs.csƒtt|ƒjƒtjdtƒtjdddƒtjdddƒtjdddƒtjdddƒ|jtjƒdS)	NÚonceÚignoreÚmessagez>With-statements now directly support multiple context managersÚmoduleÚ
pkg_resourcesz“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Ú
resetwarnings)r()r3r*r+r.ÉszWarningsFixture.setUp)r4r5r6r7r.r*r*)r3r+rׯsr×cs:eZdZdZ‡fdd†Z‡fdd†Z‡S)ÚConfPatcherzˆFixture to patch and restore global CONF.

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

    cs5tt|ƒ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')r3r*r+r,ís	zConfPatcher.__init__csltt|ƒjƒxRt|jjƒƒD];\}}|jtj||j	ƒtj
|||j	ƒq)WdS)N)r-râr.rµrAÚitemsr1r¸Úclear_overriderãÚset_override)r(rhÚv)r3r*r+r.ús"zConfPatcher.setUp)r4r5r6r7r,r.r*r*)r3r+râås
râcs@eZdZdZdd‡fdd†Z‡fdd†Z‡S)Ú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

    Zv2Ú 6f70656e737461636b20342065766572cs)tt|ƒ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_versionrz)r(rêrz)r3r*r+r,s
	zOSAPIFixture.__init__cs\tt|ƒjƒtj}d}d}d||f}d|d|ddi}|jt|ƒ|jtjdt	j
jƒƒtj
ƒj|ƒ‰‡fd	d
†}tjtj|ƒtj|d|ƒ}|jƒ|j|jƒdd
|d|d|ji|_tjdd|j|jƒ|_tjdd|j|jƒ|_||_dS)NrÄZ
osapi_computez
http://%s:%s/Zosapi_compute_listenZosapi_compute_listen_portÚdebugTz:keystoneauth1.session.TCPKeepAliveAdapter.init_poolmanagercsˆS)Nr*r*)Úloaderr*r+rm?sz$OSAPIFixture.setUp.<locals>.<lambda>rÐz(http://%(host)s:%(port)s/%(api_version)sr$ÚportrêrÒÚadmin) r-rèr.rZ
osapi_hostrLrârMrQr
ÚHTTPAdapterÚinit_poolmanagerrÚLoaderZload_apprZ_setup_servicer¸r$rÚRequestsInterceptorÚinstall_interceptr1Úuninstall_interceptrêZauth_urlrZTestOpenStackClientrzrZ	admin_apiÚapp)r(ÚhostnameríZservice_nameÚendpointÚconf_overridesrõÚ	intercept)r3)rìr+r.)s2	
zOSAPIFixture.setUp)r4r5r6r7r,r.r*r*)r3r+rès
rècs(eZdZdZ‡fdd†Z‡S)Ú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ƒddddddi}|jt|ƒ|jtjddd	„ƒƒtjd
ƒ|_	|j	j
ƒ|j|j	jƒd|d|j	j
f|_dS)NZmetadata_listenz	127.0.0.1Zmetadata_listen_portrrëTz-nova.network.linux_net.IptablesManager._applycSsdS)Nr*)Ú_r*r*r+rmmsz(OSMetadataServer.setUp.<locals>.<lambda>Úmetadataz
http://%s:%s/)r-rúr.rLrârMrQrZWSGIServicerür0r1ÚstopríZmd_url)r(rø)r3r*r+r.^s
zOSMetadataServer.setUp)r4r5r6r7r.r*r*)r3r+rúSs
rúcs(eZdZdZ‡fdd†Z‡S)Ú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.

    csHtt|ƒjƒddl}dd„}|jtjd|ƒƒdS)Nrc_s*ddl}tjdƒ|jdƒdS)Nrz&Forgot to disable libvirt event threadr_)Ú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.hostrLrMrQ)r(Únovar)r3r*r+r.s	zPoisonFunctions.setUp)r4r5r6r7r.r*r*)r3r+rþwsrþcsFeZdZdZ‡fdd†Zdd„Z‡fdd†Z‡S)ÚIndirectionAPIFixturez8Patch and restore the global NovaObject indirection api.cs tt|ƒjƒ||_dS)z`Constructor

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

        N)r-rr,Úindirection_api)r(r)r3r*r+r,šszIndirectionAPIFixture.__init__cCs|jtj_dS)N)Úorig_indirection_apiÚobj_baseÚ
NovaObjectr)r(r*r*r+r´£szIndirectionAPIFixture.cleanupcsEtt|ƒjƒtjj|_|jtj_|j|jƒdS)N)	r-rr.rrrrr1r´)r()r3r*r+r.¦szIndirectionAPIFixture.setUp)r4r5r6r7r,r´r.r*r*)r3r+r—s	rc@sXeZdZdd„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+r2¶sz_FakeGreenThread.killcOs||||Ž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)	r4r5r6r,rr2r
rrr*r*r*r+r	­sr	cs(eZdZdZ‡fdd†Z‡S)ÚSpawnIsSynchronousFixturez>Patch and restore the spawn_n utility method to be synchronouscsItt|ƒjƒ|jtjdtƒƒ|jtjdtƒƒdS)Nznova.utils.spawn_nznova.utils.spawn)r-rr.rLrMrQr	)r()r3r*r+r.Ês

zSpawnIsSynchronousFixture.setUp)r4r5r6r7r.r*r*)r3r+rÇsrcsOeZdZdZd‡fdd†Zedd„ƒZ‡fdd†Z‡S)	ÚBannedDBSchemaOperationsz"Ban some operations for migrationsNcs&tt|ƒjƒ|pg|_dS)N)r-rr,Ú_banned_resources)r(Zbanned_resources)r3r*r+r,Ôsz!BannedDBSchemaOperations.__init__cCstjd||fƒ‚dS)Nz8Operation %s.%s() is not allowed in a database migration)rZDBNotAllowed)ÚresourceÚopr*r*r+Ú_explodeØsz!BannedDBSchemaOperations._explodecsƒttˆƒjƒxiˆjD]^‰ˆjtjdˆ‡‡fdd†ƒƒˆjtjdˆ‡‡fdd†ƒƒqWdS)Nzsqlalchemy.%s.dropcsˆjˆdƒS)NZdrop)r)rgrh)r(Úthingr*r+rmãsz0BannedDBSchemaOperations.setUp.<locals>.<lambda>zsqlalchemy.%s.altercsˆjˆdƒS)NZalter)r)rgrh)r(rr*r+rmæs)r-rr.rrLrMrQ)r()r3)r(rr+r.ÞszBannedDBSchemaOperations.setUp)r4r5r6r7r,Ústaticmethodrr.r*r*)r3r+rÒsrcsFeZdZdZ‡fdd†Z‡fdd†Zdd„Z‡S)Ú"ForbidNewLegacyNotificationFixturez<Make sure the test fails if new legacy notification is addedcs#tt|ƒjƒtj|_dS)N)r-rr,rZLegacyValidatingNotifierÚnotifier)r()r3r*r+r,ësz+ForbidNewLegacyNotificationFixture.__init__csFtt|ƒjƒd|j_|jjjdƒ|j|jƒdS)NTÚ_decorated_function)	r-rr.rÚfatalÚ'allowed_legacy_notification_event_typesÚappendr1r´)r()r3r*r+r.ïs
z(ForbidNewLegacyNotificationFixture.setUpcCs#d|j_|jjjdƒdS)NFr)rrrÚremove)r(r*r*r+r´úsz*ForbidNewLegacyNotificationFixture.cleanup)r4r5r6r7r,r.r´r*r*)r3r+résrcs.eZdZ‡fdd†Zdd„Z‡S)ÚAllServicesCurrentcs<tt|ƒjƒ|jtjd|jƒƒdt_dS)Nz.nova.objects.Service.get_minimum_version_multi)	r-rr.rLrMrQÚ
_fake_minimumÚcompute_rpcapiZLAST_VERSION)r()r3r*r+r.s

zAllServicesCurrent.setUpcOstjS)N)Úservice_objZSERVICE_VERSION)r(rAr'r*r*r+r sz AllServicesCurrent._fake_minimum)r4r5r6r.r r*r*)r3r+rsrcs.eZdZ‡fdd†Zdd„Z‡S)ÚRegisterNetworkQuotacs1tt|ƒjƒtjƒ|j|jƒdS)N)r-r#r.rZ_register_network_quotar1r´)r()r3r*r+r.
s
zRegisterNetworkQuota.setUpcCstjjjddƒdS)NÚnetworks)Ú
nova_quotaZQUOTASZ
_resourcesr‹)r(r*r*r+r´szRegisterNetworkQuota.cleanup)r4r5r6r.r´r*r*)r3r+r#sr#csöeZdZdZdZdddgdddd	d
eddiZdd
dd	dedd
edgdddddigdgddddddddiZedged<dddeddd	ddddd d!d"d#edigd
eiZdd$deddd	dddd%d d!d&d#edigd
eiZd'id(d)d*d+d,d-d.dd/d0id1dd2d3d4gd5d6igd1dd0id7gd8gdd9d:d0id1dd2d:d5d;iigd0d<d+d
ed=d>idd?d@dAidBdCdDdEdFdGd0idHdId	dJd	id5dKdLd	d2dMdd)dNdGigZ	‡fdOdP†Z
‡fdQdR†ZdSdT„ZdUdV„Z
dWdX„ZdYdZ„Zd[d\„Zd	d]d^„Zd	d_d`„Zd	dadb„Zd	dcdd„Zdedf„ZdGdgdh„Z‡S)iÚNeutronFixturez.A fixture to boot instances with neutron portsréÚstatusZACTIVEÚsubnetsr)zprivate-networkZadmin_state_upTÚ	tenant_idruz$3cb9bc59-5699-4588-a4b1-b87f96708bc6zprivate-subnetZenable_dhcpZ
network_idZdns_nameserversZallocation_poolsr0z192.168.1.1Úendz
192.168.1.254Zhost_routesZ
ip_versionrÃZ
gateway_ipZcidrz192.168.1.1/24z$f8a6e8f8-c2ec-497c-9f23-da9616de54efz$ce531f90-199f-48c0-816c-13e38010b442Zmac_addresszfa:16:3e:4c:2c:30Z	fixed_ipsÚ
ip_addressz192.168.1.3Z	subnet_idz$88dae9fa-0dc6-49e3-8c29-3abc41e99ac9z00:0c:29:0d:11:74z192.168.1.30ZprofileZovs_interfaceidz$b71f1699-42be-4515-930a-f3ef01f94aa7Zpreserve_on_deleteFÚnetworkZbridgezbr-intÚipsÚmetar¼ÚtypeZfixedZfloating_ipsÚaddressz10.0.0.4ZdnsZroutesz10.0.0.0/26Zgatewayz10.0.0.1ZinjectedZmtuiÜz$e1882e38-38c2-4239-ade7-35d644cb963aÚlabelÚpublicZdevnameztapb71f1699-42Z	vnic_typeZnormalZ
qbh_paramsNÚdetailsZport_filterZovs_hybrid_plugzfa:16:3e:47:94:4aÚactiveZovsZ
qbg_paramscshtt|ƒjƒ||_tjtjƒg|_g|_tj	g|_
tjg|_g|_
dS)N)r-r&r,ÚtestÚcopyÚdeepcopyÚport_1Ú_portsÚ_extensionsÚ	network_1Ú	_networksÚsubnet_1Ú_subnetsÚ_floatingips)r(r5)r3r*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)Nr_r*)rAr'r*r*r+rm™sz&NeutronFixture.setUp.<locals>.<lambda>zBnova.network.neutronv2.api.API.create_pci_requests_for_sriov_portsc_sdS)Nr*)rAr'r*r*r+rmsz5nova.network.neutronv2.api.API.setup_networks_on_hostc_sdS)Nr*)rAr'r*r*r+rm sz5nova.network.neutronv2.api.API.migrate_instance_startc_sdS)Nr*)rAr'r*r*r+rm£sz7nova.network.neutronv2.api.API.add_fixed_ip_to_instancec_stjjtjƒS)N)Ú
network_modelÚNetworkInfoÚhydrater&Únw_info)rAr'r*r*r+rm¦s	z<nova.network.neutronv2.api.API.remove_fixed_ip_from_instancec_stjjtjƒS)N)r@rArBr&rC)rAr'r*r*r+rmªs	z6nova.network.neutronv2.api.API.migrate_instance_finishc_sdS)Nr*)rAr'r*r*r+rm®szbnova.network.security_group.neutron_driver.SecurityGroupAPI.get_instances_security_groups_bindingsc_siS)Nr*)rAr'r*r*r+rm²sz%nova.network.neutronv2.api.get_clientcsˆS)Nr*)rAr')r(r*r+rmµs)r-r&r.r5Ústub_out)r()r3)r(r+r.“s6	
	
	
	
	
	
	
	
zNeutronFixture.setUpcs;‡fdd†|Dƒ}t|ƒdkr3|dSdSdS)Ncs&g|]}|dˆkr|‘qS)rur*)r€Úp)rur*r+r‚¸s	z6NeutronFixture._get_first_id_match.<locals>.<listcomp>r)Úlen)r(rurµZ
filtered_listr*)rur+Ú_get_first_id_match·sz"NeutronFixture._get_first_id_matchcsOtj|jƒ}x0ˆD](‰‡‡fdd†|Dƒ}|}qWd|iS)Ncs/g|]%}|jˆƒˆˆkr|‘qSr*)rI)r€rE)Ú_paramsÚoptr*r+r‚Ás	z0NeutronFixture._filter_ports.<locals>.<listcomp>Úports)r6r7r9)r(rHrJZfiltered_portsr*)rHrIr+Ú
_filter_ports¾s


zNeutronFixture._filter_portscOstjd|jiƒS)NÚ
extensions)r6r7r:)r(rAr'r*r*r+Úlist_extensionsÅszNeutronFixture.list_extensionscKs=|j||jƒ}|dkr3tjd|ƒ‚d|iS)NÚport_idrí)rGr9rZPortNotFound)r(rNrHrír*r*r+Ú	show_portÈszNeutronFixture.show_portcKs8x1|jD]&}|d|kr
|jj|ƒq
WdS)Nru)r9r)r(rírHZcurrent_portr*r*r+Údelete_portÎszNeutronFixture.delete_portcKstjd|jiƒS)Nr$)r6r7r<)r(Úretrieve_allrHr*r*r+Ú
list_networksÓszNeutronFixture.list_networkscKs
|j|S)N)rK)r(rQrHr*r*r+Ú
list_portsÖszNeutronFixture.list_portscKstjd|jiƒS)Nr()r6r7r>)r(rQrHr*r*r+Úlist_subnetsÙszNeutronFixture.list_subnetscKstjd|jiƒS)NZfloatingips)r6r7r?)r(rQrHr*r*r+Úlist_floatingipsÜszNeutronFixture.list_floatingipscOs2|jjtjtjƒƒtjdtjiƒS)Nrí)r9rr6r7r&Úport_2)r(rAr'r*r*r+Úcreate_portßszNeutronFixture.create_portcCs\|j||jƒ}|dk	rRx.t|djƒƒD]\}}|||<q8Wd|iS)Nrí)rGr9rµrä)r(rNÚbodyZnew_portrhrçr*r*r+Úupdate_portãs
#zNeutronFixture.update_port)r4r5r6r7r)r;r=r8rVrCr,r.rGrKrMrOrPrRrSrTrUrWrYr*r*)r3r+r&sº


				$r&c@seZdZdd„ZdS)Ú_NoopConductorcCsdd„}|S)Nc_sdS)Nr*)rAr'r*r*r+Ú	_noop_rpcïsz-_NoopConductor.__getattr__.<locals>._noop_rpcr*)r(Úkeyr[r*r*r+Ú__getattr__îsz_NoopConductor.__getattr__N)r4r5r6r]r*r*r*r+rZísrZcs(eZdZdZ‡fdd†Z‡S)ÚNoopConductorFixturez(Stub out the conductor API to do nothingcsItt|ƒjƒ|jtjdtƒƒ|jtjdtƒƒdS)Nznova.conductor.ComputeTaskAPIznova.conductor.API)r-r^r.rLrMrQrZ)r()r3r*r+r.÷s

zNoopConductorFixture.setUp)r4r5r6r7r.r*r*)r3r+r^ôsr^cs"eZdZ‡fdd†Z‡S)ÚEventReporterStubcs6tt|ƒjƒ|jtjddd„ƒƒdS)Nz nova.compute.utils.EventReporterc_s
tjƒS)N)rÔZ	MagicMock)rAr'r*r*r+rmsz)EventReporterStub.setUp.<locals>.<lambda>)r-r_r.rLrMrQ)r()r3r*r+r.szEventReporterStub.setUp)r4r5r6r.r*r*)r3r+r_ÿsr_cs^eZdZdZdZdZdZdZdZdZ	‡fdd	†Z
‡fd
d†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-bc792f37de98csYtt|ƒjƒ||_d|_d|_d|_tƒ|_t	j
tƒ|_dS)NF)r-r`r,r5Ú
swap_errorÚswap_volume_instance_uuidÚswap_volume_instance_error_uuidrµÚreserved_volumesÚcollectionsÚdefaultdictÚattachments)r(r5)r3r*r+r,s				zCinderFixture.__init__cs~ttˆƒjƒd‡fdd†}dd„}dd„}‡fdd†}‡fd	d
†}d‡fdd
†}ˆjjd|ƒdd‡fdd†}ˆjjd|ƒˆjjddd„ƒˆjjd|ƒˆjjd|ƒˆjjd|ƒˆjjd|ƒˆjjddd„ƒˆjjddd„ƒˆjjd|ƒˆjjddd„ƒdS) Ncs¯|tjtjfkrÈddddddd|dd	d
di}ˆjrZ|tjksrˆjrÈ|tjkrÈ|tjkrŠˆjnˆj}|jddd
|ddd|iiddiƒ|Sx·tˆjjƒƒD][\}}||krÞddd|ddd|dd	d
dd
|d|ddiii}PqÞW|ˆj	k}d|r[dndddddd|dd	d
di}|ˆj
kr«d|d<ddi|d<|S)Nr'Ú	availableÚdisplay_nameÚTEST1Ú
attach_statusÚdetachedruÚmultiattachFÚsizer_zin-usergÚ
mountpointz/dev/vdbÚ
attachment_idÚattachedZ	attachingÚTEST2TÚbootableÚimage_idz$155d900f-4e14-4e4c-a73d-069cbf4541e6Úvolume_image_metadata)r`ÚSWAP_OLD_VOLÚSWAP_ERR_OLD_VOLrbrcÚupdaterµrgrärdÚIMAGE_BACKED_VOL)Úself_apirÚ	volume_idÚmicroversionÚvolumeryÚvolumesZreserved_volume)r(r*r+Úfake_get%s\				
"
z%CinderFixture.setUp.<locals>.fake_getcSs|tjkrfSiS)N)r`ÚSWAP_ERR_NEW_VOL)r(rr{Ú	connectorr*r*r+Úfake_initialize_connectionpsz7CinderFixture.setUp.<locals>.fake_initialize_connectioncSs
d|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)rdr)rzrr{)r(r*r+Úfake_reserve_volumezsz0CinderFixture.setUp.<locals>.fake_reserve_volumecs,|ˆjkrˆjj|ƒdˆ_dS)NT)rdrra)rzrr{)r(r*r+Úfake_unreserve_volume}sz2CinderFixture.setUp.<locals>.fake_unreserve_volumeÚrwcsfxKtˆjjƒƒD]4\}}||krtjdd||fƒ‚qWˆj|j|ƒdS)NÚreasonz,Volume %s is already attached to instance %s)rµrgrärZInvalidInputr)Ú_selfrr{ryroÚmodeÚinstancer~)r(r*r+Úfake_attach‰s"	z(CinderFixture.setUp.<locals>.fake_attachznova.volume.cinder.API.attachcs†|ˆjkrˆjj|ƒ|dk	rBˆj|j|ƒn@x=tˆjjƒƒD]&\}}||krX|j|ƒPqXWdS)N)rdrrgrµrä)rŒrr{ryrprŽr~)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+rm­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+rm¸sz+nova.volume.cinder.API.terminate_connectionc_sdS)Nr*)rAr'r*r*r+rmºsz'nova.volume.cinder.API.unreserve_volumez%nova.volume.cinder.API.check_attachedc_sdS)Nr*)rAr'r*r*r+rm¾s)r-r`r.r5rD)r(rr‚r‡rˆr‰rr)r3)r(r+r."s>K


	

zCinderFixture.setUp)r4r5r6r7r)rvÚSWAP_NEW_VOLrwr€ryr,r.r*r*)r3r+r`sr`csjeZdZdZdZdZdZdZdZdZ	dZ
d	Z‡fd
d†Z‡fdd
†Z
‡S)Ú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-bc792f37de98csVtt|ƒjƒ||_d|_d|_d|_d|_tj	t
ƒ|_dS)NF)r-r’r,r5rarbrcÚattachment_error_idrerfrµrg)r(r5)r3r*r+r,Õs					z#CinderFixtureNewAttachFlow.__init__cslttˆƒjƒd‡fdd†}dd„}dd‡fdd†}‡fdd†}dd	d
„}dd„}ˆjjd
|ƒˆjjd|ƒˆjjd|ƒˆjjddd„ƒˆjjd|ƒˆjjddd„ƒˆjjd|ƒˆjjd|ƒˆjjddd„ƒˆjjddd„ƒˆjjddd„ƒdS)Ncs¦|tjtjfkrÈddddddd|dd	d
di}ˆjrZ|tjksrˆjrÈ|tjkrÈ|tjkrŠˆjnˆj}|jddd
|ddd|iiddiƒ|Sx®tˆjjƒƒD]d\}}||krÞddd|ddd|d|ˆj	kd
dd
|d|ddiii}PqÞWddddddd|d|ˆj	kd
di}|ˆj
kr¢d|d<ddi|d<|S)Nr'rhrirjrkrlrurmFrnr_zin-usergroz/dev/vdbrprqrrTrsrtz$155d900f-4e14-4e4c-a73d-069cbf4541e6ru)r`rvrwrbrcrxrµrgräÚMULTIATTACH_VOLry)rzrr{r|r}ryr~)r(r*r+rãsZ				
"
z2CinderFixtureNewAttachFlow.setUp.<locals>.fake_getcSs
d|iS)Nrƒr*)r(rr„r…r†r*r*r+r‡-szHCinderFixtureNewAttachFlow.setUp.<locals>.fake_migrate_volume_completioncshtjƒ}ˆjdk	r$ˆj}d|ddiii}ˆjdj|ƒˆj|j|ƒ|S)NruÚconnection_infoÚdatary)r	Z
generate_uuidr“rgr)rŒrr{ryrrorpÚ
attachment)r(r*r+Úfake_attachment_create1s	z@CinderFixtureNewAttachFlow.setUp.<locals>.fake_attachment_createcsIˆjdd}ˆj|d=ˆjdd=|tjkrEdˆ_dS)NryrT)rgr’ÚSWAP_ERR_ATTACH_IDra)rŒrrpry)r(r*r+Úfake_attachment_delete<s
z@CinderFixtureNewAttachFlow.setUp.<locals>.fake_attachment_deletec
SsIddd|dddddd	iii}|tjkrEdfi}|S)
NÚdriver_volume_typeÚ	fake_typerur•r–ÚfooÚbarÚ
target_lunr)r’r™)rŒrrprroÚattachment_refr*r*r+Úfake_attachment_updateCsz@CinderFixtureNewAttachFlow.setUp.<locals>.fake_attachment_updatec
Ss.ddd|dddddd	iii}|S)
Nr›rœrur•r–rržrŸrr*)rŒrrpr 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+rm]sz2CinderFixtureNewAttachFlow.setUp.<locals>.<lambda>z%nova.volume.cinder.API.attachment_getz&nova.volume.cinder.API.begin_detachingc_sdS)Nr*)rAr'r*r*r+rmasznova.volume.cinder.API.getz0nova.volume.cinder.API.migrate_volume_completionz%nova.volume.cinder.API.roll_detachingc_sdS)Nr*)rAr'r*r*r+rmhsz,nova.volume.cinder.is_microversion_supportedc_sdS)Nr*)rAr'r*r*r+rmjsz%nova.volume.cinder.API.check_attachedc_sdS)Nr*)rAr'r*r*r+rmls)r-r’r.r5rD)r(rr‡r˜ršr¡r¢)r3)r(r+r.às<J



	

z CinderFixtureNewAttachFlow.setUp)r4r5r6r7r)rvr‘rwr€r™r”ryr,r.r*r*)r3r+r’Äsr’c@s4eZdZdd„Zdd„Zdd„ZdS)ÚPlacementApiClientcCs
||_dS)N)Úfixture)r(Zplacement_fixturer*r*r+r,pszPlacementApiClient.__init__cKstj|jjd||ƒS)N)rÚAPIResponser¤Ú	_fake_get)r(rÐr'r*r*r+rIsszPlacementApiClient.getcKs"tj|jjd|||ƒS)N)rr¥r¤Ú	_fake_put)r(rÐrXr'r*r*r+ÚputvszPlacementApiClient.putN)r4r5r6r,rIr¨r*r*r*r+r£osr£csyeZdZdZddd„Z‡fdd†Zedd„ƒZd	d
„Zdd„Z	d
d„Z
dd„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__csOtt|ƒjƒ|jtddddƒƒtjtƒ‰‡fdd†}tj	}d||_
tj|d|j
ƒ}|j
ƒ|j|jƒ|jtjd	tjjƒƒtjd
dƒ|_|jtjd|jƒƒ|jtjd|jƒƒ|jtjd
|jƒƒ|jtjd|jƒƒt|ƒ|_dS)NrãrZ
auth_strategyZnoauth2csˆS)Nr*r*)rìr*r+rmsz(PlacementFixture.setUp.<locals>.<lambda>zhttp://%s/placementrÐz:keystoneauth1.session.TCPKeepAliveAdapter.init_poolmanagerÚauthz6nova.scheduler.client.report.SchedulerReportClient.getz7nova.scheduler.client.report.SchedulerReportClient.postz6nova.scheduler.client.report.SchedulerReportClient.putz9nova.scheduler.client.report.SchedulerReportClient.delete)r-r©r.rLrâÚplacement_deployZloadappr¸rZplacement_hostr÷rròrór1rôrMrQr
rïrðÚksZSessionÚ_clientr¦Ú
_fake_postr§Ú_fake_deleter£r)r(rõr$rù)r3)rìr+r.Šs4	





zPlacementFixture.setUpcKs6|jdƒ}|dk	r2|jdd|iƒdS)Nr¼zOpenStack-API-Versionzplacement %s)rIrx)Úheadersr'r¼r*r*r+Ú_update_headers_with_version°sz-PlacementFixture._update_headers_with_versioncOsW|dd…\}d|ji}|j|||jj|d|jd|ddƒS)Nr_zx-auth-tokenÚendpoint_overrider±Ú	raise_excF)rªr²r®rIr÷)r(rAr'rÐr±r*r*r+r¦¹s		zPlacementFixture._fake_getc
Os`|dd…\}}d|ji}|j|||jj|d|d|jd|ddƒS)Nr_zx-auth-tokenÚjsonr³r±r´F)rªr²r®Úpostr÷)r(rAr'rÐr–r±r*r*r+r¯Æs		zPlacementFixture._fake_postc
Os`|dd…\}}d|ji}|j|||jj|d|d|jd|ddƒS)Nr_zx-auth-tokenrµr³r±r´F)rªr²r®r¨r÷)r(rAr'rÐr–r±r*r*r+r§×s		zPlacementFixture._fake_putcOsA|dd…\}|jj|d|jdd|jiddƒS)Nr_r³r±zx-auth-tokenr´F)r®Údeleter÷rª)r(rAr'rÐr*r*r+r°ès		zPlacementFixture._fake_delete)r4r5r6r7r,r.rr²r¦r¯r§r°r*r*)r3r+r©{s
&	
r©c@seZdZdd„ZdS)ÚUnHelperfulClientChannelcCstdƒ‚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.)rf)r(rr*r*r+r,õsz!UnHelperfulClientChannel.__init__N)r4r5r6r,r*r*r*r+r¸ôsr¸cs(eZdZdZ‡fdd†Z‡S)Ú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.
    cs0tt|ƒjƒ|jtjdtƒƒdS)Nz)oslo_privsep.daemon.RootwrapClientChannel)r-r¹r.rLrMrQr¸)r()r3r*r+r.szPrivsepNoHelperFixture.setUp)r4r5r6r7r.r*r*)r3r+r¹ûs	r¹cs(eZdZdZ‡fdd†Z‡S)Ú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.
    cs_tt|ƒjƒ|jtjdtjƒƒƒtj	dddƒ|j
tjddƒdS)Nznova.quota.QuotaEngine._driverÚdriverznova.quota.NoopQuotaDriverr)r-rºr.rLrMrQr%ZNoopQuotaDriverr¸rær1rå)r()r3r*r+r.s
zNoopQuotaDriverFixture.setUp)r4r5r6r7r.r*r*)r3r+rºs	rº)zTrueztruerzyes)pr7Ú
__future__rreÚ
contextlibrr6ÚloggingrCrGrÝrMZ
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"rr%rZnova.tests.functional.apirZ
nova.testsrrrJr¸r•r·ZFixturer#ÚHandlerr8r?rUr^rdriZRequestContextSerializerr…rr¶r»r½rÌr×rârèrúrþrÚobjectr	rrrrr#r&rZr^r_r`r’r£r©Z_ClientChannelr¸r¹rºr*r*r*r+Ú<module>s˜	G#]®5#-R$ Õ	¼«y