@@ -59,12 +59,15 @@ def setUp(self):
59
59
'hw:cpu_policy' : 'dedicated' ,
60
60
'hw:cpu_thread_policy' : 'prefer' ,
61
61
}
62
+ self .isolate_extra_spec = {
63
+ 'hw:cpu_policy' : 'dedicated' ,
64
+ 'hw:cpu_thread_policy' : 'prefer' ,
65
+ 'hw:emulator_threads_policy' : 'isolate' ,
66
+ }
62
67
self .pcpu_flavor_id = self ._create_flavor (
63
68
vcpu = 4 , extra_spec = self .extra_spec )
64
69
self .isolate_flavor_id = self ._create_flavor (
65
- vcpu = 4 , extra_spec = {'hw:cpu_policy' : 'dedicated' ,
66
- 'hw:cpu_thread_policy' : 'prefer' ,
67
- 'hw:emulator_threads_policy' : 'isolate' })
70
+ vcpu = 4 , extra_spec = self .isolate_extra_spec )
68
71
69
72
def _assert_server_cpus_state (self , server , expected = 'online' ):
70
73
inst = objects .Instance .get_by_uuid (self .ctxt , server ['id' ])
@@ -117,8 +120,8 @@ def __call__(self, i):
117
120
return self .cores [i ]
118
121
119
122
120
- class PowerManagementLiveMigrationTests (base .LibvirtMigrationMixin ,
121
- PowerManagementTestsBase ):
123
+ class PowerManagementLiveMigrationTestsBase (base .LibvirtMigrationMixin ,
124
+ PowerManagementTestsBase ):
122
125
123
126
def setUp (self ):
124
127
super ().setUp ()
@@ -129,10 +132,13 @@ def setUp(self):
129
132
self .flags (vcpu_pin_set = None )
130
133
self .flags (cpu_power_management = True , group = 'libvirt' )
131
134
132
- # NOTE(artom) Fill up all dedicated CPUs. This makes the assertions
133
- # further down easier.
135
+ # NOTE(artom) Fill up all dedicated CPUs (either with only the
136
+ # instance's CPUs, or instance CPUs + 1 emulator thread). This makes
137
+ # the assertions further down easier.
134
138
self .pcpu_flavor_id = self ._create_flavor (
135
139
vcpu = 9 , extra_spec = self .extra_spec )
140
+ self .isolate_flavor_id = self ._create_flavor (
141
+ vcpu = 8 , extra_spec = self .isolate_extra_spec )
136
142
137
143
self .start_compute (
138
144
host_info = fakelibvirt .HostInfo (cpu_nodes = 1 , cpu_sockets = 1 ,
@@ -156,14 +162,61 @@ def assert_cores(self, host, cores, online=True):
156
162
for i in cores :
157
163
self .assertEqual (online , host .driver .cpu_api .core (i ).online )
158
164
165
+
166
+ class PowerManagementLiveMigrationTests (PowerManagementLiveMigrationTestsBase ):
167
+
159
168
def test_live_migrate_server (self ):
160
169
self .server = self ._create_server (
161
170
flavor_id = self .pcpu_flavor_id ,
162
171
expected_state = 'ACTIVE' , host = 'src' )
163
172
server = self ._live_migrate (self .server )
164
173
self .assertEqual ('dest' , server ['OS-EXT-SRV-ATTR:host' ])
165
- # FIXME(artom) We've not powered up the dest cores, and left the src
166
- # cores powered on.
174
+ # We've powered down the source cores, and powered up the destination
175
+ # ones.
176
+ self .assert_cores (self .src , range (1 , 10 ), online = False )
177
+ self .assert_cores (self .dest , range (1 , 10 ), online = True )
178
+
179
+ def test_live_migrate_server_with_emulator_threads_isolate (self ):
180
+ self .server = self ._create_server (
181
+ flavor_id = self .isolate_flavor_id ,
182
+ expected_state = 'ACTIVE' , host = 'src' )
183
+ server = self ._live_migrate (self .server )
184
+ self .assertEqual ('dest' , server ['OS-EXT-SRV-ATTR:host' ])
185
+ # We're using a flavor with 8 CPUs, but with the extra dedicated CPU
186
+ # for the emulator threads, we expect all 9 cores to be powered up on
187
+ # the dest, and down on the source.
188
+ self .assert_cores (self .src , range (1 , 10 ), online = False )
189
+ self .assert_cores (self .dest , range (1 , 10 ), online = True )
190
+
191
+
192
+ class PowerManagementLiveMigrationRollbackTests (
193
+ PowerManagementLiveMigrationTestsBase ):
194
+
195
+ def _migrate_stub (self , domain , destination , params , flags ):
196
+ conn = self .src .driver ._host .get_connection ()
197
+ dom = conn .lookupByUUIDString (self .server ['id' ])
198
+ dom .fail_job ()
199
+
200
+ def test_live_migrate_server_rollback (self ):
201
+ self .server = self ._create_server (
202
+ flavor_id = self .pcpu_flavor_id ,
203
+ expected_state = 'ACTIVE' , host = 'src' )
204
+ server = self ._live_migrate (self .server ,
205
+ migration_expected_state = 'failed' )
206
+ self .assertEqual ('src' , server ['OS-EXT-SRV-ATTR:host' ])
207
+ self .assert_cores (self .src , range (1 , 10 ), online = True )
208
+ self .assert_cores (self .dest , range (1 , 10 ), online = False )
209
+
210
+ def test_live_migrate_server_with_emulator_threads_isolate_rollback (self ):
211
+ self .server = self ._create_server (
212
+ flavor_id = self .isolate_flavor_id ,
213
+ expected_state = 'ACTIVE' , host = 'src' )
214
+ server = self ._live_migrate (self .server ,
215
+ migration_expected_state = 'failed' )
216
+ self .assertEqual ('src' , server ['OS-EXT-SRV-ATTR:host' ])
217
+ # We're using a flavor with 8 CPUs, but with the extra dedicated CPU
218
+ # for the emulator threads, we expect all 9 cores to be powered back
219
+ # down on the dest, and up on the source.
167
220
self .assert_cores (self .src , range (1 , 10 ), online = True )
168
221
self .assert_cores (self .dest , range (1 , 10 ), online = False )
169
222
0 commit comments