@@ -166,10 +166,14 @@ def setUp(self):
166166
167167 self .key_mgr = crypto ._get_key_manager ()
168168
169- def _create_server_with_vtpm (self ):
169+ def _create_server_with_vtpm (self , secret_security = None ,
170+ expected_state = 'ACTIVE' ):
170171 extra_specs = {'hw:tpm_model' : 'tpm-tis' , 'hw:tpm_version' : '1.2' }
172+ if secret_security :
173+ extra_specs .update ({'hw:tpm_secret_security' : secret_security })
171174 flavor_id = self ._create_flavor (extra_spec = extra_specs )
172- server = self ._create_server (flavor_id = flavor_id )
175+ server = self ._create_server (flavor_id = flavor_id ,
176+ expected_state = expected_state )
173177
174178 return server
175179
@@ -185,13 +189,47 @@ def assertInstanceHasSecret(self, server):
185189 self .assertIn (
186190 instance .system_metadata ['vtpm_secret_uuid' ],
187191 self .key_mgr ._passphrases )
192+ return instance .system_metadata ['vtpm_secret_uuid' ]
188193
189194 def assertInstanceHasNoSecret (self , server ):
190195 ctx = nova_context .get_admin_context ()
191196 instance = objects .Instance .get_by_uuid (ctx , server ['id' ])
192197 self .assertNotIn ('vtpm_secret_uuid' , instance .system_metadata )
193198 self .assertEqual (0 , len (self .key_mgr ._passphrases ))
194199
200+ def _assert_libvirt_had_secret (self , compute , secret_uuid ):
201+ # This assert is for ephemeral private libvirt secrets that we
202+ # undefine immediately after guest creation. Examples include 'user'
203+ # and 'deployment' TPM secret security modes and legacy servers.
204+ # The LibvirtFixture tracks secrets that existed before they were
205+ # removed, so we can assert this.
206+ conn = compute .driver ._host .get_connection ()
207+ self .assertIn (secret_uuid , conn ._removed_secrets )
208+
209+ def test_tpm_secret_security_user (self ):
210+ self .flags (supported_tpm_secret_security = ['user' ], group = 'libvirt' )
211+ host = self .start_compute (hostname = 'tpm-host' )
212+ compute = self .computes ['tpm-host' ]
213+
214+ # ensure we are reporting the correct traits
215+ traits = self ._get_provider_traits (self .compute_rp_uuids [host ])
216+ self .assertIn ('COMPUTE_SECURITY_TPM_SECRET_SECURITY_USER' , traits )
217+
218+ server = self ._create_server_with_vtpm (secret_security = 'user' )
219+
220+ # The server should have a secret in the key manager service.
221+ secret_uuid = self .assertInstanceHasSecret (server )
222+
223+ # And it should have had a libvirt secret created and undefined.
224+ self ._assert_libvirt_had_secret (compute , secret_uuid )
225+
226+ def test_tpm_secret_security_user_negative (self ):
227+ self .flags (supported_tpm_secret_security = ['deployment' ],
228+ group = 'libvirt' )
229+ self .start_compute (hostname = 'tpm-host' )
230+ self ._create_server_with_vtpm (secret_security = 'user' ,
231+ expected_state = 'ERROR' )
232+
195233 def test_create_server (self ):
196234 compute = self .start_compute ()
197235
@@ -393,6 +431,24 @@ def test_resize_server__vtpm_to_no_vtpm(self):
393431 # there is no going back now
394432 self .assertInstanceHasNoSecret (server )
395433
434+ def test_create_server_secret_security_unsupported (self ):
435+ """Test when a not supported TPM secret security mode is requested
436+
437+ We expect the create to fail for NoValidHost.
438+ """
439+ # Start a compute host which supports no modes.
440+ self .flags (supported_tpm_secret_security = [], group = 'libvirt' )
441+ self .start_compute ('test_compute0' )
442+
443+ # Try to create an instance on that host defaulting to 'user'.
444+ server = self ._create_server_with_vtpm (expected_state = 'ERROR' )
445+
446+ # The create should have failed for NoValidHost.
447+ event = self ._wait_for_instance_action_event (
448+ server , 'create' , 'conductor_schedule_and_build_instances' ,
449+ 'Error' )
450+ self .assertIn ('NoValidHost' , event ['traceback' ])
451+
396452 def test_migrate_server (self ):
397453 """Test cold migrate as a non-admin user.
398454
0 commit comments