@@ -73,11 +73,14 @@ def generate_new_element(items, prefix, numeric=False):
73
73
74
74
75
75
class InstanceHelperMixin (object ):
76
- def _wait_for_server_parameter (self , admin_api , server , expected_params ,
77
- max_retries = 10 ):
76
+
77
+ def _wait_for_server_parameter (
78
+ self , server , expected_params , max_retries = 10 , api = None ):
79
+ api = api or getattr (self , 'admin_api' , self .api )
80
+
78
81
retry_count = 0
79
82
while True :
80
- server = admin_api .get_server (server ['id' ])
83
+ server = api .get_server (server ['id' ])
81
84
if all ([server [attr ] == expected_params [attr ]
82
85
for attr in expected_params ]):
83
86
break
@@ -90,22 +93,21 @@ def _wait_for_server_parameter(self, admin_api, server, expected_params,
90
93
91
94
return server
92
95
93
- def _wait_for_state_change (self , admin_api , server , expected_status ,
94
- max_retries = 10 ):
96
+ def _wait_for_state_change (self , server , expected_status , max_retries = 10 ):
95
97
return self ._wait_for_server_parameter (
96
- admin_api , server , {'status' : expected_status }, max_retries )
98
+ server , {'status' : expected_status }, max_retries )
99
+
100
+ def _build_minimal_create_server_request (
101
+ self , name = None , image_uuid = None , flavor_id = None , networks = None ,
102
+ az = None , host = None ):
97
103
98
- def _build_minimal_create_server_request (self , api , name = None ,
99
- image_uuid = None , flavor_id = None ,
100
- networks = None , az = None ,
101
- host = None ):
102
104
server = {}
103
105
104
106
if not image_uuid :
105
107
# NOTE(takashin): In API version 2.36, image APIs were deprecated.
106
108
# In API version 2.36 or greater, self.api.get_images() returns
107
109
# a 404 error. In that case, 'image_uuid' should be specified.
108
- image_uuid = api .get_images ()[0 ]['id' ]
110
+ image_uuid = self . api .get_images ()[0 ]['id' ]
109
111
server ['imageRef' ] = image_uuid
110
112
111
113
if not name :
@@ -115,7 +117,7 @@ def _build_minimal_create_server_request(self, api, name=None,
115
117
116
118
if not flavor_id :
117
119
# Set a valid flavorId
118
- flavor_id = api .get_flavors ()[0 ]['id' ]
120
+ flavor_id = self . api .get_flavors ()[0 ]['id' ]
119
121
server ['flavorRef' ] = 'http://fake.server/%s' % flavor_id
120
122
121
123
if networks is not None :
@@ -142,40 +144,43 @@ def _wait_until_deleted(self, server):
142
144
return
143
145
144
146
def _wait_for_action_fail_completion (
145
- self , server , expected_action , event_name , api = None ):
147
+ self , server , expected_action , event_name ):
146
148
"""Polls instance action events for the given instance, action and
147
149
action event name until it finds the action event with an error
148
150
result.
149
151
"""
150
- if api is None :
151
- api = self .api
152
152
return self ._wait_for_instance_action_event (
153
- api , server , expected_action , event_name , event_result = 'error' )
153
+ server , expected_action , event_name , event_result = 'error' )
154
154
155
155
def _wait_for_instance_action_event (
156
- self , api , server , action_name , event_name , event_result ):
156
+ self , server , action_name , event_name , event_result ):
157
157
"""Polls the instance action events for the given instance, action,
158
158
event, and event result until it finds the event.
159
159
"""
160
+ api = getattr (self , 'admin_api' , self .api )
161
+
160
162
actions = []
161
163
events = []
162
164
for attempt in range (10 ):
163
165
actions = api .get_instance_actions (server ['id' ])
164
166
# The API returns the newest event first
165
167
for action in actions :
166
- if action ['action' ] == action_name :
167
- events = (
168
- api .api_get (
169
- '/servers/%s/os-instance-actions/%s' %
170
- (server ['id' ], action ['request_id' ])
171
- ).body ['instanceAction' ]['events' ])
172
- # Look for the action event being in error state.
173
- for event in events :
174
- result = event ['result' ]
175
- if (event ['event' ] == event_name and
176
- result is not None and
177
- result .lower () == event_result .lower ()):
178
- return event
168
+ if action ['action' ] != action_name :
169
+ continue
170
+
171
+ events = api .api_get (
172
+ '/servers/%s/os-instance-actions/%s' % (
173
+ server ['id' ], action ['request_id' ])
174
+ ).body ['instanceAction' ]['events' ]
175
+
176
+ # Look for the action event being in error state.
177
+ for event in events :
178
+ result = event ['result' ]
179
+ if (event ['event' ] == event_name and
180
+ result is not None and
181
+ result .lower () == event_result .lower ()):
182
+ return event
183
+
179
184
# We didn't find the completion event yet, so wait a bit.
180
185
time .sleep (0.5 )
181
186
@@ -192,19 +197,16 @@ def _assert_resize_migrate_action_fail(self, server, action, error_in_tb):
192
197
:param action: Either "resize" or "migrate" instance action.
193
198
:param error_in_tb: Some expected part of the error event traceback.
194
199
"""
195
- api = self .admin_api if hasattr (self , 'admin_api' ) else self .api
196
200
event = self ._wait_for_action_fail_completion (
197
- server , action , 'conductor_migrate_server' , api = api )
201
+ server , action , 'conductor_migrate_server' )
198
202
self .assertIn (error_in_tb , event ['traceback' ])
199
203
200
204
def _wait_for_migration_status (self , server , expected_statuses ):
201
205
"""Waits for a migration record with the given statuses to be found
202
206
for the given server, else the test fails. The migration record, if
203
207
found, is returned.
204
208
"""
205
- api = getattr (self , 'admin_api' , None )
206
- if api is None :
207
- api = self .api
209
+ api = getattr (self , 'admin_api' , self .api )
208
210
209
211
statuses = [status .lower () for status in expected_statuses ]
210
212
for attempt in range (10 ):
@@ -297,10 +299,14 @@ def _setup_services(self):
297
299
self .api = self .api_fixture .admin_api
298
300
else :
299
301
self .api = self .api_fixture .api
302
+ self .admin_api = self .api_fixture .admin_api
300
303
301
304
if hasattr (self , 'microversion' ):
302
305
self .api .microversion = self .microversion
303
306
307
+ if not self .ADMIN_API :
308
+ self .admin_api .microversion = self .microversion
309
+
304
310
def get_unused_server_name (self ):
305
311
servers = self .api .get_servers ()
306
312
server_names = [server ['name' ] for server in servers ]
@@ -728,14 +734,13 @@ def _boot_and_check_allocations(
728
734
:return: the API representation of the booted instance
729
735
"""
730
736
server_req = self ._build_minimal_create_server_request (
731
- self . api , 'some-server' , flavor_id = flavor ['id' ],
737
+ 'some-server' , flavor_id = flavor ['id' ],
732
738
image_uuid = '155d900f-4e14-4e4c-a73d-069cbf4541e6' ,
733
739
networks = networks )
734
740
server_req ['availability_zone' ] = 'nova:%s' % source_hostname
735
741
LOG .info ('booting on %s' , source_hostname )
736
742
created_server = self .api .post_server ({'server' : server_req })
737
- server = self ._wait_for_state_change (
738
- self .admin_api , created_server , 'ACTIVE' )
743
+ server = self ._wait_for_state_change (created_server , 'ACTIVE' )
739
744
740
745
# Verify that our source host is what the server ended up on
741
746
self .assertEqual (source_hostname , server ['OS-EXT-SRV-ATTR:host' ])
@@ -849,7 +854,7 @@ class redefined this function to force a specific order.
849
854
def _move_and_check_allocations (self , server , request , old_flavor ,
850
855
new_flavor , source_rp_uuid , dest_rp_uuid ):
851
856
self .api .post_server_action (server ['id' ], request )
852
- self ._wait_for_state_change (self . api , server , 'VERIFY_RESIZE' )
857
+ self ._wait_for_state_change (server , 'VERIFY_RESIZE' )
853
858
854
859
def _check_allocation ():
855
860
self .assertFlavorMatchesUsage (source_rp_uuid , old_flavor )
@@ -911,7 +916,7 @@ def _resize_to_same_host_and_check_allocations(self, server, old_flavor,
911
916
}
912
917
}
913
918
self .api .post_server_action (server ['id' ], resize_req )
914
- self ._wait_for_state_change (self . api , server , 'VERIFY_RESIZE' )
919
+ self ._wait_for_state_change (server , 'VERIFY_RESIZE' )
915
920
916
921
self .assertFlavorMatchesUsage (rp_uuid , old_flavor , new_flavor )
917
922
@@ -981,15 +986,15 @@ def assert_hypervisor_usage(self, compute_node_uuid, flavor,
981
986
982
987
def _confirm_resize (self , server ):
983
988
self .api .post_server_action (server ['id' ], {'confirmResize' : None })
984
- server = self ._wait_for_state_change (self . api , server , 'ACTIVE' )
989
+ server = self ._wait_for_state_change (server , 'ACTIVE' )
985
990
self ._wait_for_instance_action_event (
986
- self . api , server , instance_actions .CONFIRM_RESIZE ,
991
+ server , instance_actions .CONFIRM_RESIZE ,
987
992
'compute_confirm_resize' , 'success' )
988
993
return server
989
994
990
995
def _revert_resize (self , server ):
991
996
self .api .post_server_action (server ['id' ], {'revertResize' : None })
992
- server = self ._wait_for_state_change (self . api , server , 'ACTIVE' )
997
+ server = self ._wait_for_state_change (server , 'ACTIVE' )
993
998
self ._wait_for_migration_status (server , ['reverted' ])
994
999
# Note that the migration status is changed to "reverted" in the
995
1000
# dest host revert_resize method but the allocations are cleaned up
0 commit comments