@@ -161,6 +161,10 @@ def setup_sdk_volumes_mock(self, count):
161161 return volumes
162162
163163 def run_method_with_servers (self , method_name , server_count ):
164+ # Starting with v2.91, the nova api needs to be call with a sentinel
165+ # as availability_zone=None will unpin the server az.
166+ _sentinel = object ()
167+
164168 servers = self .setup_servers_mock (server_count )
165169
166170 arglist = []
@@ -183,7 +187,11 @@ def run_method_with_servers(self, method_name, server_count):
183187 method .assert_called_with (reason = None )
184188 elif method_name == 'unshelve' :
185189 version = self .app .client_manager .compute .api_version
186- if version >= api_versions .APIVersion ('2.77' ):
190+ if version >= api_versions .APIVersion ('2.91' ):
191+ method .assert_called_with (availability_zone = _sentinel ,
192+ host = None )
193+ elif (version >= api_versions .APIVersion ('2.77' ) and
194+ version < api_versions .APIVersion ('2.91' )):
187195 method .assert_called_with (availability_zone = None )
188196 else :
189197 method .assert_called_with ()
@@ -8204,7 +8212,23 @@ def test_unshelve_one_server(self):
82048212 def test_unshelve_multi_servers (self ):
82058213 self .run_method_with_servers ('unshelve' , 3 )
82068214
8207- def test_unshelve_with_specified_az (self ):
8215+ def test_unshelve_v277 (self ):
8216+ self .app .client_manager .compute .api_version = \
8217+ api_versions .APIVersion ('2.77' )
8218+
8219+ server = compute_fakes .FakeServer .create_one_server (
8220+ attrs = self .attrs , methods = self .methods )
8221+ self .servers_mock .get .return_value = server
8222+ arglist = [server .id ]
8223+ verifylist = [('server' , [server .id ])]
8224+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
8225+
8226+ self .cmd .take_action (parsed_args )
8227+
8228+ self .servers_mock .get .assert_called_with (server .id )
8229+ server .unshelve .assert_called_with ()
8230+
8231+ def test_unshelve_with_specified_az_v277 (self ):
82088232 self .app .client_manager .compute .api_version = \
82098233 api_versions .APIVersion ('2.77' )
82108234
@@ -8248,6 +8272,157 @@ def test_unshelve_with_specified_az_pre_v277(self):
82488272 self .assertIn (
82498273 '--os-compute-api-version 2.77 or greater is required' , str (ex ))
82508274
8275+ def test_unshelve_v291 (self ):
8276+ self .app .client_manager .compute .api_version = (
8277+ api_versions .APIVersion ('2.91' ))
8278+
8279+ server = compute_fakes .FakeServer .create_one_server (
8280+ attrs = self .attrs , methods = self .methods )
8281+ self .servers_mock .get .return_value = server
8282+ arglist = [server .id ]
8283+ verifylist = [('server' , [server .id ])]
8284+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
8285+
8286+ self .cmd .take_action (parsed_args )
8287+
8288+ self .servers_mock .get .assert_called_with (server .id )
8289+ server .unshelve .assert_called_with ()
8290+
8291+ def test_unshelve_with_specified_az_v291 (self ):
8292+ self .app .client_manager .compute .api_version = (
8293+ api_versions .APIVersion ('2.91' ))
8294+
8295+ server = compute_fakes .FakeServer .create_one_server (
8296+ attrs = self .attrs , methods = self .methods )
8297+ self .servers_mock .get .return_value = server
8298+ arglist = [
8299+ '--availability-zone' , "foo-az" ,
8300+ server .id ,
8301+ ]
8302+ verifylist = [
8303+ ('availability_zone' , "foo-az" ),
8304+ ('server' , [server .id ])
8305+ ]
8306+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
8307+
8308+ self .cmd .take_action (parsed_args )
8309+
8310+ self .servers_mock .get .assert_called_with (server .id )
8311+ server .unshelve .assert_called_with (availability_zone = "foo-az" )
8312+
8313+ def test_unshelve_with_specified_host_v291 (self ):
8314+ self .app .client_manager .compute .api_version = (
8315+ api_versions .APIVersion ('2.91' ))
8316+
8317+ server = compute_fakes .FakeServer .create_one_server (
8318+ attrs = self .attrs , methods = self .methods )
8319+ self .servers_mock .get .return_value = server
8320+ arglist = [
8321+ '--host' , "server1" ,
8322+ server .id ,
8323+ ]
8324+ verifylist = [
8325+ ('host' , "server1" ),
8326+ ('server' , [server .id ])
8327+ ]
8328+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
8329+
8330+ self .cmd .take_action (parsed_args )
8331+
8332+ self .servers_mock .get .assert_called_with (server .id )
8333+ server .unshelve .assert_called_with (host = "server1" )
8334+
8335+ def test_unshelve_with_unpin_az_v291 (self ):
8336+ self .app .client_manager .compute .api_version = (
8337+ api_versions .APIVersion ('2.91' ))
8338+
8339+ server = compute_fakes .FakeServer .create_one_server (
8340+ attrs = self .attrs , methods = self .methods )
8341+ self .servers_mock .get .return_value = server
8342+ arglist = ['--no-availability-zone' , server .id ]
8343+ verifylist = [
8344+ ('no_availability_zone' , True ),
8345+ ('server' , [server .id ])
8346+ ]
8347+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
8348+
8349+ self .cmd .take_action (parsed_args )
8350+
8351+ self .servers_mock .get .assert_called_with (server .id )
8352+ server .unshelve .assert_called_with (availability_zone = None )
8353+
8354+ def test_unshelve_with_specified_az_and_host_v291 (self ):
8355+ self .app .client_manager .compute .api_version = (
8356+ api_versions .APIVersion ('2.91' ))
8357+
8358+ server = compute_fakes .FakeServer .create_one_server (
8359+ attrs = self .attrs , methods = self .methods )
8360+ self .servers_mock .get .return_value = server
8361+ arglist = [
8362+ '--host' , "server1" ,
8363+ '--availability-zone' , "foo-az" ,
8364+ server .id ,
8365+ ]
8366+ verifylist = [
8367+ ('host' , "server1" ),
8368+ ('availability_zone' , "foo-az" ),
8369+ ('server' , [server .id ])
8370+ ]
8371+
8372+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
8373+
8374+ self .cmd .take_action (parsed_args )
8375+
8376+ self .servers_mock .get .assert_called_with (server .id )
8377+
8378+ def test_unshelve_with_unpin_az_and_host_v291 (self ):
8379+ self .app .client_manager .compute .api_version = (
8380+ api_versions .APIVersion ('2.91' ))
8381+
8382+ server = compute_fakes .FakeServer .create_one_server (
8383+ attrs = self .attrs , methods = self .methods )
8384+ self .servers_mock .get .return_value = server
8385+ arglist = [
8386+ '--host' , "server1" ,
8387+ '--no-availability-zone' ,
8388+ server .id ,
8389+ ]
8390+ verifylist = [
8391+ ('host' , "server1" ),
8392+ ('no_availability_zone' , True ),
8393+ ('server' , [server .id ])
8394+ ]
8395+
8396+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
8397+
8398+ self .cmd .take_action (parsed_args )
8399+
8400+ self .servers_mock .get .assert_called_with (server .id )
8401+
8402+ def test_unshelve_fails_with_unpin_az_and_az_v291 (self ):
8403+ self .app .client_manager .compute .api_version = (
8404+ api_versions .APIVersion ('2.91' ))
8405+
8406+ server = compute_fakes .FakeServer .create_one_server (
8407+ attrs = self .attrs , methods = self .methods )
8408+ self .servers_mock .get .return_value = server
8409+ arglist = [
8410+ '--availability-zone' , "foo-az" ,
8411+ '--no-availability-zone' ,
8412+ server .id ,
8413+ ]
8414+ verifylist = [
8415+ ('availability_zone' , "foo-az" ),
8416+ ('no_availability_zone' , True ),
8417+ ('server' , [server .id ])
8418+ ]
8419+
8420+ ex = self .assertRaises (utils .ParserException ,
8421+ self .check_parser ,
8422+ self .cmd , arglist , verifylist )
8423+ self .assertIn ('argument --no-availability-zone: not allowed '
8424+ 'with argument --availability-zone' , str (ex ))
8425+
82518426 @mock .patch .object (common_utils , 'wait_for_status' , return_value = True )
82528427 def test_unshelve_with_wait (self , mock_wait_for_status ):
82538428 server = compute_fakes .FakeServer .create_one_server (
0 commit comments