Skip to content

Commit 520b2f1

Browse files
luckyvegaSteve Martinelli
authored andcommitted
Add 'find by name' to --nic for creating server
Add 'find by name' feature to --nic option for creating server. Closes-Bug: #1353040 Change-Id: Idd0a30415d8360a57e33efedf2467593652683d4
1 parent 703a25d commit 520b2f1

3 files changed

Lines changed: 117 additions & 1 deletion

File tree

‎openstackclient/compute/v2/server.py‎

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
from openstackclient.common import parseractions
3333
from openstackclient.common import utils
3434
from openstackclient.i18n import _ # noqa
35+
from openstackclient.network import common
3536

3637

3738
def _format_servers_list_networks(networks):
@@ -187,6 +188,10 @@ class CreateServer(show.ShowOne):
187188

188189
log = logging.getLogger(__name__ + '.CreateServer')
189190

191+
def _is_neutron_enabled(self):
192+
service_catalog = self.app.client_manager.auth_ref.service_catalog
193+
return 'network' in service_catalog.get_endpoints()
194+
190195
def get_parser(self, prog_name):
191196
parser = super(CreateServer, self).get_parser(prog_name)
192197
parser.add_argument(
@@ -372,10 +377,39 @@ def take_action(self, parsed_args):
372377
block_device_mapping.update({dev_key: block_volume})
373378

374379
nics = []
380+
if parsed_args.nic:
381+
neutron_enabled = self._is_neutron_enabled()
375382
for nic_str in parsed_args.nic:
376-
nic_info = {"net-id": "", "v4-fixed-ip": ""}
383+
nic_info = {"net-id": "", "v4-fixed-ip": "",
384+
"v6-fixed-ip": "", "port-id": ""}
377385
nic_info.update(dict(kv_str.split("=", 1)
378386
for kv_str in nic_str.split(",")))
387+
if bool(nic_info["net-id"]) == bool(nic_info["port-id"]):
388+
msg = _("either net-id or port-id should be specified "
389+
"but not both")
390+
raise exceptions.CommandError(msg)
391+
if neutron_enabled:
392+
network_client = self.app.client_manager.network
393+
if nic_info["net-id"]:
394+
nic_info["net-id"] = common.find(network_client,
395+
'network',
396+
'networks',
397+
nic_info["net-id"])
398+
if nic_info["port-id"]:
399+
nic_info["port-id"] = common.find(network_client,
400+
'port',
401+
'ports',
402+
nic_info["port-id"])
403+
else:
404+
if nic_info["net-id"]:
405+
nic_info["net-id"] = utils.find_resource(
406+
compute_client.networks,
407+
nic_info["net-id"]
408+
).id
409+
if nic_info["port-id"]:
410+
msg = _("can't create server with port specified "
411+
"since neutron not enabled")
412+
raise exceptions.CommandError(msg)
379413
nics.append(nic_info)
380414

381415
hints = {}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
from openstackclient.tests import fakes
1919
from openstackclient.tests.image.v2 import fakes as image_fakes
20+
from openstackclient.tests.network.v2 import fakes as network_fakes
2021
from openstackclient.tests import utils
2122

2223

@@ -88,3 +89,8 @@ def setUp(self):
8889
endpoint=fakes.AUTH_URL,
8990
token=fakes.AUTH_TOKEN,
9091
)
92+
93+
self.app.client_manager.network = network_fakes.FakeNetworkV2Client(
94+
endpoint=fakes.AUTH_URL,
95+
token=fakes.AUTH_TOKEN,
96+
)

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

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,82 @@ def test_server_create_minimal(self):
145145
)
146146
self.assertEqual(datalist, data)
147147

148+
def test_server_create_with_network(self):
149+
arglist = [
150+
'--image', 'image1',
151+
'--flavor', 'flavor1',
152+
'--nic', 'net-id=net1',
153+
'--nic', 'port-id=port1',
154+
compute_fakes.server_id,
155+
]
156+
verifylist = [
157+
('image', 'image1'),
158+
('flavor', 'flavor1'),
159+
('nic', ['net-id=net1', 'port-id=port1']),
160+
('config_drive', False),
161+
('server_name', compute_fakes.server_id),
162+
]
163+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
164+
165+
get_endpoints = mock.Mock()
166+
get_endpoints.return_value = {'network': []}
167+
self.app.client_manager.auth_ref = mock.Mock()
168+
self.app.client_manager.auth_ref.service_catalog = mock.Mock()
169+
self.app.client_manager.auth_ref.service_catalog.get_endpoints = (
170+
get_endpoints)
171+
172+
list_networks = mock.Mock()
173+
list_ports = mock.Mock()
174+
self.app.client_manager.network.list_networks = list_networks
175+
self.app.client_manager.network.list_ports = list_ports
176+
list_networks.return_value = {'networks': [{'id': 'net1_uuid'}]}
177+
list_ports.return_value = {'ports': [{'id': 'port1_uuid'}]}
178+
179+
# DisplayCommandBase.take_action() returns two tuples
180+
columns, data = self.cmd.take_action(parsed_args)
181+
182+
# Set expected values
183+
kwargs = dict(
184+
meta=None,
185+
files={},
186+
reservation_id=None,
187+
min_count=1,
188+
max_count=1,
189+
security_groups=[],
190+
userdata=None,
191+
key_name=None,
192+
availability_zone=None,
193+
block_device_mapping={},
194+
nics=[{'net-id': 'net1_uuid',
195+
'v4-fixed-ip': '',
196+
'v6-fixed-ip': '',
197+
'port-id': ''},
198+
{'net-id': '',
199+
'v4-fixed-ip': '',
200+
'v6-fixed-ip': '',
201+
'port-id': 'port1_uuid'}],
202+
scheduler_hints={},
203+
config_drive=None,
204+
)
205+
# ServerManager.create(name, image, flavor, **kwargs)
206+
self.servers_mock.create.assert_called_with(
207+
compute_fakes.server_id,
208+
self.image,
209+
self.flavor,
210+
**kwargs
211+
)
212+
213+
collist = ('addresses', 'flavor', 'id', 'name', 'properties')
214+
self.assertEqual(collist, columns)
215+
datalist = (
216+
'',
217+
'Large ()',
218+
compute_fakes.server_id,
219+
compute_fakes.server_name,
220+
'',
221+
)
222+
self.assertEqual(datalist, data)
223+
148224
@mock.patch('openstackclient.compute.v2.server.io.open')
149225
def test_server_create_userdata(self, mock_open):
150226
mock_file = mock.MagicMock(name='File')

0 commit comments

Comments
 (0)