Skip to content

Commit eb139f6

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "compute: Return information about fixed IP"
2 parents 9b49363 + 0cde82d commit eb139f6

3 files changed

Lines changed: 145 additions & 33 deletions

File tree

openstackclient/compute/v2/server.py

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ def boolenv(*vars, default=False):
204204
return default
205205

206206

207-
class AddFixedIP(command.Command):
207+
class AddFixedIP(command.ShowOne):
208208
_description = _("Add fixed IP address to server")
209209

210210
def get_parser(self, prog_name):
@@ -231,7 +231,7 @@ def get_parser(self, prog_name):
231231
metavar='<tag>',
232232
help=_(
233233
'Tag for the attached interface. '
234-
'(supported by --os-compute-api-version 2.52 or above)'
234+
'(supported by --os-compute-api-version 2.49 or above)'
235235
)
236236
)
237237
return parser
@@ -265,16 +265,39 @@ def take_action(self, parsed_args):
265265
server.id,
266266
net_id
267267
)
268-
return
268+
return ((), ())
269269

270270
kwargs = {
271271
'net_id': net_id,
272272
'fixed_ip': parsed_args.fixed_ip_address,
273273
}
274-
275274
if parsed_args.tag:
276275
kwargs['tag'] = parsed_args.tag
277-
compute_client.create_server_interface(server.id, **kwargs)
276+
277+
interface = compute_client.create_server_interface(server.id, **kwargs)
278+
279+
columns = (
280+
'port_id', 'server_id', 'net_id', 'mac_addr', 'port_state',
281+
'fixed_ips',
282+
)
283+
column_headers = (
284+
'Port ID', 'Server ID', 'Network ID', 'MAC Address', 'Port State',
285+
'Fixed IPs',
286+
)
287+
if sdk_utils.supports_microversion(compute_client, '2.49'):
288+
columns += ('tag',)
289+
column_headers += ('Tag',)
290+
291+
return (
292+
column_headers,
293+
utils.get_item_properties(
294+
interface,
295+
columns,
296+
formatters={
297+
'fixed_ips': format_columns.ListDictColumn,
298+
},
299+
),
300+
)
278301

279302

280303
class AddFloatingIP(network_common.NetworkAndComputeCommand):

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from novaclient import api_versions
2222
from openstack.compute.v2 import flavor as _flavor
2323
from openstack.compute.v2 import server
24+
from openstack.compute.v2 import server_interface as _server_interface
2425
from openstack.compute.v2 import volume_attachment
2526

2627
from openstackclient.api import compute_v2
@@ -1859,3 +1860,30 @@ def create_sdk_volume_attachments(attrs=None, methods=None, count=2):
18591860
attrs, methods))
18601861

18611862
return volume_attachments
1863+
1864+
1865+
def create_one_server_interface(attrs=None):
1866+
"""Create a fake SDK ServerInterface.
1867+
1868+
:param dict attrs: A dictionary with all attributes
1869+
:param dict methods: A dictionary with all methods
1870+
:return: A fake ServerInterface object with various attributes set
1871+
"""
1872+
attrs = attrs or {}
1873+
1874+
# Set default attributes.
1875+
server_interface_info = {
1876+
"fixed_ips": uuid.uuid4().hex,
1877+
"mac_addr": "aa:aa:aa:aa:aa:aa",
1878+
"net_id": uuid.uuid4().hex,
1879+
"port_id": uuid.uuid4().hex,
1880+
"port_state": "ACTIVE",
1881+
"server_id": uuid.uuid4().hex,
1882+
# introduced in API microversion 2.70
1883+
"tag": "foo",
1884+
}
1885+
1886+
# Overwrite default attributes.
1887+
server_interface_info.update(attrs)
1888+
1889+
return _server_interface.ServerInterface(**server_interface_info)

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

Lines changed: 89 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ def run_method_with_sdk_servers(self, method_name, server_count):
212212
class TestServerAddFixedIP(TestServer):
213213

214214
def setUp(self):
215-
super(TestServerAddFixedIP, self).setUp()
215+
super().setUp()
216216

217217
# Get the command object to test
218218
self.cmd = server.AddFixedIP(self.app, None)
@@ -221,13 +221,8 @@ def setUp(self):
221221
self.find_network = mock.Mock()
222222
self.app.client_manager.network.find_network = self.find_network
223223

224-
# Set add_fixed_ip method to be tested.
225-
self.methods = {
226-
'interface_attach': None,
227-
}
228-
229224
@mock.patch.object(sdk_utils, 'supports_microversion')
230-
def test_server_add_fixed_ip_pre_2_44(self, sm_mock):
225+
def test_server_add_fixed_ip_pre_v244(self, sm_mock):
231226
sm_mock.return_value = False
232227

233228
servers = self.setup_sdk_servers_mock(count=1)
@@ -255,10 +250,11 @@ def test_server_add_fixed_ip_pre_2_44(self, sm_mock):
255250
servers[0].id,
256251
network['id']
257252
)
258-
self.assertIsNone(result)
253+
# the legacy API operates asynchronously
254+
self.assertEqual(((), ()), result)
259255

260256
@mock.patch.object(sdk_utils, 'supports_microversion')
261-
def test_server_add_fixed_ip_pre_2_44_with_fixed_ip(self, sm_mock):
257+
def test_server_add_fixed_ip_pre_v244_with_fixed_ip(self, sm_mock):
262258
sm_mock.return_value = False
263259

264260
servers = self.setup_sdk_servers_mock(count=1)
@@ -287,10 +283,11 @@ def test_server_add_fixed_ip_pre_2_44_with_fixed_ip(self, sm_mock):
287283
servers[0].id,
288284
network['id']
289285
)
290-
self.assertIsNone(result)
286+
# the legacy API operates asynchronously
287+
self.assertEqual(((), ()), result)
291288

292289
@mock.patch.object(sdk_utils, 'supports_microversion')
293-
def test_server_add_fixed_ip_pre_2_44_with_tag(self, sm_mock):
290+
def test_server_add_fixed_ip_pre_v244_with_tag(self, sm_mock):
294291
sm_mock.return_value = False
295292

296293
servers = self.setup_sdk_servers_mock(count=1)
@@ -324,7 +321,7 @@ def test_server_add_fixed_ip_pre_2_44_with_tag(self, sm_mock):
324321
str(ex))
325322

326323
@mock.patch.object(sdk_utils, 'supports_microversion')
327-
def test_server_add_fixed_ip_pre_2_49_with_tag(self, sm_mock):
324+
def test_server_add_fixed_ip_pre_v249_with_tag(self, sm_mock):
328325
sm_mock.side_effect = [False, True]
329326

330327
servers = self.setup_sdk_servers_mock(count=1)
@@ -358,11 +355,13 @@ def test_server_add_fixed_ip_pre_2_49_with_tag(self, sm_mock):
358355
str(ex))
359356

360357
@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]
358+
def test_server_add_fixed_ip(self, sm_mock):
359+
sm_mock.side_effect = [True, False]
363360

364361
servers = self.setup_sdk_servers_mock(count=1)
365362
network = compute_fakes.FakeNetwork.create_one_network()
363+
interface = compute_fakes.create_one_server_interface()
364+
self.sdk_client.create_server_interface.return_value = interface
366365

367366
with mock.patch.object(
368367
self.app.client_manager,
@@ -379,21 +378,41 @@ def test_server_add_fixed_ip_post_2_49(self, sm_mock):
379378
]
380379
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
381380

382-
result = self.cmd.take_action(parsed_args)
381+
expected_columns = (
382+
'Port ID',
383+
'Server ID',
384+
'Network ID',
385+
'MAC Address',
386+
'Port State',
387+
'Fixed IPs',
388+
)
389+
expected_data = (
390+
interface.port_id,
391+
interface.server_id,
392+
interface.net_id,
393+
interface.mac_addr,
394+
interface.port_state,
395+
format_columns.ListDictColumn(interface.fixed_ips),
396+
)
397+
398+
columns, data = self.cmd.take_action(parsed_args)
383399

400+
self.assertEqual(expected_columns, columns)
401+
self.assertEqual(expected_data, tuple(data))
384402
self.sdk_client.create_server_interface.assert_called_once_with(
385403
servers[0].id,
386404
net_id=network['id'],
387405
fixed_ip=None
388406
)
389-
self.assertIsNone(result)
390407

391408
@mock.patch.object(sdk_utils, 'supports_microversion')
392-
def test_server_add_fixed_ip_post_2_49_with_fixedip(self, sm_mock):
409+
def test_server_add_fixed_ip_with_fixed_ip(self, sm_mock):
393410
sm_mock.side_effect = [True, True]
394411

395412
servers = self.setup_sdk_servers_mock(count=1)
396413
network = compute_fakes.FakeNetwork.create_one_network()
414+
interface = compute_fakes.create_one_server_interface()
415+
self.sdk_client.create_server_interface.return_value = interface
397416

398417
with mock.patch.object(
399418
self.app.client_manager,
@@ -412,21 +431,43 @@ def test_server_add_fixed_ip_post_2_49_with_fixedip(self, sm_mock):
412431
]
413432
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
414433

415-
result = self.cmd.take_action(parsed_args)
434+
expected_columns = (
435+
'Port ID',
436+
'Server ID',
437+
'Network ID',
438+
'MAC Address',
439+
'Port State',
440+
'Fixed IPs',
441+
'Tag',
442+
)
443+
expected_data = (
444+
interface.port_id,
445+
interface.server_id,
446+
interface.net_id,
447+
interface.mac_addr,
448+
interface.port_state,
449+
format_columns.ListDictColumn(interface.fixed_ips),
450+
interface.tag,
451+
)
416452

453+
columns, data = self.cmd.take_action(parsed_args)
454+
455+
self.assertEqual(expected_columns, columns)
456+
self.assertEqual(expected_data, tuple(data))
417457
self.sdk_client.create_server_interface.assert_called_once_with(
418458
servers[0].id,
419459
net_id=network['id'],
420460
fixed_ip='5.6.7.8'
421461
)
422-
self.assertIsNone(result)
423462

424463
@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]
464+
def test_server_add_fixed_ip_with_tag(self, sm_mock):
465+
sm_mock.side_effect = [True, True, True]
427466

428467
servers = self.setup_sdk_servers_mock(count=1)
429468
network = compute_fakes.FakeNetwork.create_one_network()
469+
interface = compute_fakes.create_one_server_interface()
470+
self.sdk_client.create_server_interface.return_value = interface
430471

431472
with mock.patch.object(
432473
self.app.client_manager,
@@ -447,15 +488,35 @@ def test_server_add_fixed_ip_post_2_49_with_tag(self, sm_mock):
447488
]
448489
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
449490

450-
result = self.cmd.take_action(parsed_args)
491+
expected_columns = (
492+
'Port ID',
493+
'Server ID',
494+
'Network ID',
495+
'MAC Address',
496+
'Port State',
497+
'Fixed IPs',
498+
'Tag',
499+
)
500+
expected_data = (
501+
interface.port_id,
502+
interface.server_id,
503+
interface.net_id,
504+
interface.mac_addr,
505+
interface.port_state,
506+
format_columns.ListDictColumn(interface.fixed_ips),
507+
interface.tag,
508+
)
451509

510+
columns, data = self.cmd.take_action(parsed_args)
511+
512+
self.assertEqual(expected_columns, columns)
513+
self.assertEqual(expected_data, tuple(data))
452514
self.sdk_client.create_server_interface.assert_called_once_with(
453515
servers[0].id,
454516
net_id=network['id'],
455517
fixed_ip='5.6.7.8',
456-
tag='tag1'
518+
tag='tag1',
457519
)
458-
self.assertIsNone(result)
459520

460521

461522
@mock.patch(
@@ -5265,7 +5326,7 @@ def test_server_migrate_with_disk_overcommit(self):
52655326
self.assertNotCalled(self.servers_mock.live_migrate)
52665327
self.assertNotCalled(self.servers_mock.migrate)
52675328

5268-
def test_server_migrate_with_host_pre_2_56(self):
5329+
def test_server_migrate_with_host_pre_v256(self):
52695330
# Tests that --host is not allowed for a cold migration
52705331
# before microversion 2.56 (the test defaults to 2.1).
52715332
arglist = [
@@ -6682,7 +6743,7 @@ def test_rebuild_with_user_data(self, mock_open):
66826743
self.image, None,
66836744
userdata=mock_file,)
66846745

6685-
def test_rebuild_with_user_data_pre_257(self):
6746+
def test_rebuild_with_user_data_pre_v257(self):
66866747
self.app.client_manager.compute.api_version = \
66876748
api_versions.APIVersion('2.56')
66886749

@@ -6722,7 +6783,7 @@ def test_rebuild_with_no_user_data(self):
67226783
self.server.rebuild.assert_called_with(
67236784
self.image, None, userdata=None)
67246785

6725-
def test_rebuild_with_no_user_data_pre_254(self):
6786+
def test_rebuild_with_no_user_data_pre_v254(self):
67266787
self.app.client_manager.compute.api_version = \
67276788
api_versions.APIVersion('2.53')
67286789

@@ -6814,7 +6875,7 @@ def test_rebuild_with_no_trusted_image_cert(self):
68146875
self.server.rebuild.assert_called_with(
68156876
self.image, None, trusted_image_certificates=None)
68166877

6817-
def test_rebuild_with_no_trusted_image_cert_pre_257(self):
6878+
def test_rebuild_with_no_trusted_image_cert_pre_v263(self):
68186879
self.app.client_manager.compute.api_version = \
68196880
api_versions.APIVersion('2.62')
68206881

0 commit comments

Comments
 (0)