Skip to content

Commit 9971d72

Browse files
Ritvik Vinodkumarstephenfin
authored andcommitted
Switch add fixed IP to SDK
Switch the add fixed IP command from novaclient to SDK. Change-Id: I4752ea7b4bfc17e04b8f46dbe9a68d938501a89e
1 parent c10a4cd commit 9971d72

File tree

3 files changed

+211
-60
lines changed

3 files changed

+211
-60
lines changed

openstackclient/compute/v2/server.py

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -237,30 +237,44 @@ def get_parser(self, prog_name):
237237
return parser
238238

239239
def take_action(self, parsed_args):
240-
compute_client = self.app.client_manager.compute
241-
242-
server = utils.find_resource(
243-
compute_client.servers, parsed_args.server)
244-
245-
network = compute_client.api.network_find(parsed_args.network)
246-
247-
kwargs = {
248-
'port_id': None,
249-
'net_id': network['id'],
250-
'fixed_ip': parsed_args.fixed_ip_address,
251-
}
240+
compute_client = self.app.client_manager.sdk_connection.compute
241+
server = compute_client.find_server(
242+
parsed_args.server,
243+
ignore_missing=False
244+
)
252245

253246
if parsed_args.tag:
254-
if compute_client.api_version < api_versions.APIVersion('2.49'):
247+
if not sdk_utils.supports_microversion(compute_client, '2.49'):
255248
msg = _(
256249
'--os-compute-api-version 2.49 or greater is required to '
257250
'support the --tag option'
258251
)
259252
raise exceptions.CommandError(msg)
260253

261-
kwargs['tag'] = parsed_args.tag
254+
if self.app.client_manager.is_network_endpoint_enabled():
255+
network_client = self.app.client_manager.network
256+
net_id = network_client.find_network(
257+
parsed_args.network,
258+
ignore_missing=False
259+
).id
260+
else:
261+
net_id = parsed_args.network
262+
263+
if not sdk_utils.supports_microversion(compute_client, '2.44'):
264+
compute_client.add_fixed_ip_to_server(
265+
server.id,
266+
net_id
267+
)
268+
return
269+
270+
kwargs = {
271+
'net_id': net_id,
272+
'fixed_ip': parsed_args.fixed_ip_address,
273+
}
262274

263-
server.interface_attach(**kwargs)
275+
if parsed_args.tag:
276+
kwargs['tag'] = parsed_args.tag
277+
compute_client.create_server_interface(server.id, **kwargs)
264278

265279

266280
class AddFloatingIP(network_common.NetworkAndComputeCommand):

openstackclient/tests/unit/compute/v2/test_server.py

Lines changed: 179 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -217,104 +217,104 @@ def setUp(self):
217217
# Get the command object to test
218218
self.cmd = server.AddFixedIP(self.app, None)
219219

220+
# Mock network methods
221+
self.find_network = mock.Mock()
222+
self.app.client_manager.network.find_network = self.find_network
223+
220224
# Set add_fixed_ip method to be tested.
221225
self.methods = {
222226
'interface_attach': None,
223227
}
224228

225-
def _test_server_add_fixed_ip(self, extralist, fixed_ip_address):
226-
servers = self.setup_servers_mock(count=1)
229+
@mock.patch.object(sdk_utils, 'supports_microversion')
230+
def test_server_add_fixed_ip_pre_2_44(self, sm_mock):
231+
sm_mock.return_value = False
232+
233+
servers = self.setup_sdk_servers_mock(count=1)
227234
network = compute_fakes.FakeNetwork.create_one_network()
228-
with mock.patch(
229-
'openstackclient.api.compute_v2.APIv2.network_find'
230-
) as net_mock:
231-
net_mock.return_value = network
232235

236+
with mock.patch.object(
237+
self.app.client_manager,
238+
'is_network_endpoint_enabled',
239+
return_value=False
240+
):
233241
arglist = [
234242
servers[0].id,
235243
network['id'],
236-
] + extralist
244+
]
237245
verifylist = [
238246
('server', servers[0].id),
239247
('network', network['id']),
240-
('fixed_ip_address', fixed_ip_address),
248+
('fixed_ip_address', None),
241249
]
242250
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
243251

244252
result = self.cmd.take_action(parsed_args)
245253

246-
servers[0].interface_attach.assert_called_once_with(
247-
port_id=None,
248-
net_id=network['id'],
249-
fixed_ip=fixed_ip_address,
254+
self.sdk_client.add_fixed_ip_to_server.assert_called_once_with(
255+
servers[0].id,
256+
network['id']
250257
)
251258
self.assertIsNone(result)
252259

253-
def test_server_add_fixed_ip(self):
254-
self._test_server_add_fixed_ip([], None)
255-
256-
def test_server_add_specific_fixed_ip(self):
257-
extralist = ['--fixed-ip-address', '5.6.7.8']
258-
self._test_server_add_fixed_ip(extralist, '5.6.7.8')
259-
260-
def test_server_add_fixed_ip_with_tag(self):
261-
self.app.client_manager.compute.api_version = api_versions.APIVersion(
262-
'2.49')
260+
@mock.patch.object(sdk_utils, 'supports_microversion')
261+
def test_server_add_fixed_ip_pre_2_44_with_fixed_ip(self, sm_mock):
262+
sm_mock.return_value = False
263263

264-
servers = self.setup_servers_mock(count=1)
264+
servers = self.setup_sdk_servers_mock(count=1)
265265
network = compute_fakes.FakeNetwork.create_one_network()
266-
with mock.patch(
267-
'openstackclient.api.compute_v2.APIv2.network_find'
268-
) as net_mock:
269-
net_mock.return_value = network
270266

267+
with mock.patch.object(
268+
self.app.client_manager,
269+
'is_network_endpoint_enabled',
270+
return_value=False
271+
):
271272
arglist = [
272273
servers[0].id,
273274
network['id'],
274-
'--fixed-ip-address', '5.6.7.8',
275-
'--tag', 'tag1',
275+
'--fixed-ip-address', '5.6.7.8'
276276
]
277277
verifylist = [
278278
('server', servers[0].id),
279279
('network', network['id']),
280280
('fixed_ip_address', '5.6.7.8'),
281-
('tag', 'tag1'),
282281
]
283282
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
283+
284284
result = self.cmd.take_action(parsed_args)
285285

286-
servers[0].interface_attach.assert_called_once_with(
287-
port_id=None,
288-
net_id=network['id'],
289-
fixed_ip='5.6.7.8',
290-
tag='tag1'
286+
self.sdk_client.add_fixed_ip_to_server.assert_called_once_with(
287+
servers[0].id,
288+
network['id']
291289
)
292290
self.assertIsNone(result)
293291

294-
def test_server_add_fixed_ip_with_tag_pre_v249(self):
295-
self.app.client_manager.compute.api_version = api_versions.APIVersion(
296-
'2.48')
292+
@mock.patch.object(sdk_utils, 'supports_microversion')
293+
def test_server_add_fixed_ip_pre_2_44_with_tag(self, sm_mock):
294+
sm_mock.return_value = False
297295

298-
servers = self.setup_servers_mock(count=1)
296+
servers = self.setup_sdk_servers_mock(count=1)
299297
network = compute_fakes.FakeNetwork.create_one_network()
300-
with mock.patch(
301-
'openstackclient.api.compute_v2.APIv2.network_find'
302-
) as net_mock:
303-
net_mock.return_value = network
304298

299+
with mock.patch.object(
300+
self.app.client_manager,
301+
'is_network_endpoint_enabled',
302+
return_value=False
303+
):
305304
arglist = [
306305
servers[0].id,
307306
network['id'],
308307
'--fixed-ip-address', '5.6.7.8',
309-
'--tag', 'tag1',
308+
'--tag', 'tag1'
310309
]
311310
verifylist = [
312311
('server', servers[0].id),
313312
('network', network['id']),
314313
('fixed_ip_address', '5.6.7.8'),
315-
('tag', 'tag1'),
314+
('tag', 'tag1')
316315
]
317316
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
317+
318318
ex = self.assertRaises(
319319
exceptions.CommandError,
320320
self.cmd.take_action,
@@ -323,6 +323,140 @@ def test_server_add_fixed_ip_with_tag_pre_v249(self):
323323
'--os-compute-api-version 2.49 or greater is required',
324324
str(ex))
325325

326+
@mock.patch.object(sdk_utils, 'supports_microversion')
327+
def test_server_add_fixed_ip_pre_2_49_with_tag(self, sm_mock):
328+
sm_mock.side_effect = [False, True]
329+
330+
servers = self.setup_sdk_servers_mock(count=1)
331+
network = compute_fakes.FakeNetwork.create_one_network()
332+
333+
with mock.patch.object(
334+
self.app.client_manager,
335+
'is_network_endpoint_enabled',
336+
return_value=False
337+
):
338+
arglist = [
339+
servers[0].id,
340+
network['id'],
341+
'--fixed-ip-address', '5.6.7.8',
342+
'--tag', 'tag1'
343+
]
344+
verifylist = [
345+
('server', servers[0].id),
346+
('network', network['id']),
347+
('fixed_ip_address', '5.6.7.8'),
348+
('tag', 'tag1')
349+
]
350+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
351+
352+
ex = self.assertRaises(
353+
exceptions.CommandError,
354+
self.cmd.take_action,
355+
parsed_args)
356+
self.assertIn(
357+
'--os-compute-api-version 2.49 or greater is required',
358+
str(ex))
359+
360+
@mock.patch.object(sdk_utils, 'supports_microversion')
361+
def test_server_add_fixed_ip_post_2_49(self, sm_mock):
362+
sm_mock.side_effect = [True, True]
363+
364+
servers = self.setup_sdk_servers_mock(count=1)
365+
network = compute_fakes.FakeNetwork.create_one_network()
366+
367+
with mock.patch.object(
368+
self.app.client_manager,
369+
'is_network_endpoint_enabled',
370+
return_value=False
371+
):
372+
arglist = [
373+
servers[0].id,
374+
network['id']
375+
]
376+
verifylist = [
377+
('server', servers[0].id),
378+
('network', network['id'])
379+
]
380+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
381+
382+
result = self.cmd.take_action(parsed_args)
383+
384+
self.sdk_client.create_server_interface.assert_called_once_with(
385+
servers[0].id,
386+
net_id=network['id'],
387+
fixed_ip=None
388+
)
389+
self.assertIsNone(result)
390+
391+
@mock.patch.object(sdk_utils, 'supports_microversion')
392+
def test_server_add_fixed_ip_post_2_49_with_fixedip(self, sm_mock):
393+
sm_mock.side_effect = [True, True]
394+
395+
servers = self.setup_sdk_servers_mock(count=1)
396+
network = compute_fakes.FakeNetwork.create_one_network()
397+
398+
with mock.patch.object(
399+
self.app.client_manager,
400+
'is_network_endpoint_enabled',
401+
return_value=False
402+
):
403+
arglist = [
404+
servers[0].id,
405+
network['id'],
406+
'--fixed-ip-address', '5.6.7.8'
407+
]
408+
verifylist = [
409+
('server', servers[0].id),
410+
('network', network['id']),
411+
('fixed_ip_address', '5.6.7.8')
412+
]
413+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
414+
415+
result = self.cmd.take_action(parsed_args)
416+
417+
self.sdk_client.create_server_interface.assert_called_once_with(
418+
servers[0].id,
419+
net_id=network['id'],
420+
fixed_ip='5.6.7.8'
421+
)
422+
self.assertIsNone(result)
423+
424+
@mock.patch.object(sdk_utils, 'supports_microversion')
425+
def test_server_add_fixed_ip_post_2_49_with_tag(self, sm_mock):
426+
sm_mock.side_effect = [True, True]
427+
428+
servers = self.setup_sdk_servers_mock(count=1)
429+
network = compute_fakes.FakeNetwork.create_one_network()
430+
431+
with mock.patch.object(
432+
self.app.client_manager,
433+
'is_network_endpoint_enabled',
434+
return_value=False
435+
):
436+
arglist = [
437+
servers[0].id,
438+
network['id'],
439+
'--fixed-ip-address', '5.6.7.8',
440+
'--tag', 'tag1'
441+
]
442+
verifylist = [
443+
('server', servers[0].id),
444+
('network', network['id']),
445+
('fixed_ip_address', '5.6.7.8'),
446+
('tag', 'tag1')
447+
]
448+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
449+
450+
result = self.cmd.take_action(parsed_args)
451+
452+
self.sdk_client.create_server_interface.assert_called_once_with(
453+
servers[0].id,
454+
net_id=network['id'],
455+
fixed_ip='5.6.7.8',
456+
tag='tag1'
457+
)
458+
self.assertIsNone(result)
459+
326460

327461
@mock.patch(
328462
'openstackclient.api.compute_v2.APIv2.floating_ip_add'
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
features:
2+
- |
3+
Switch the add fixed IP command from novaclient to SDK.

0 commit comments

Comments
 (0)