summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
authorzhiyuan_cai <luckyvega.g@gmail.com>2014-12-26 17:17:35 +0800
committerSteve Martinelli <stevemar@ca.ibm.com>2015-01-27 05:34:32 +0000
commit520b2f10cf0218509ca6cab7439214be812b425e (patch)
tree725325e886ebefc784402cdecebebabc6523f3a7 /openstackclient
parent703a25d445d7b710212633af3a12d8c168208c62 (diff)
downloadpython-openstackclient-520b2f10cf0218509ca6cab7439214be812b425e.tar.gz
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
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/compute/v2/server.py36
-rw-r--r--openstackclient/tests/compute/v2/fakes.py6
-rw-r--r--openstackclient/tests/compute/v2/test_server.py76
3 files changed, 117 insertions, 1 deletions
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py
index a5d8b0c3..7259e424 100644
--- a/openstackclient/compute/v2/server.py
+++ b/openstackclient/compute/v2/server.py
@@ -32,6 +32,7 @@ from openstackclient.common import exceptions
from openstackclient.common import parseractions
from openstackclient.common import utils
from openstackclient.i18n import _ # noqa
+from openstackclient.network import common
def _format_servers_list_networks(networks):
@@ -187,6 +188,10 @@ class CreateServer(show.ShowOne):
log = logging.getLogger(__name__ + '.CreateServer')
+ def _is_neutron_enabled(self):
+ service_catalog = self.app.client_manager.auth_ref.service_catalog
+ return 'network' in service_catalog.get_endpoints()
+
def get_parser(self, prog_name):
parser = super(CreateServer, self).get_parser(prog_name)
parser.add_argument(
@@ -372,10 +377,39 @@ class CreateServer(show.ShowOne):
block_device_mapping.update({dev_key: block_volume})
nics = []
+ if parsed_args.nic:
+ neutron_enabled = self._is_neutron_enabled()
for nic_str in parsed_args.nic:
- nic_info = {"net-id": "", "v4-fixed-ip": ""}
+ nic_info = {"net-id": "", "v4-fixed-ip": "",
+ "v6-fixed-ip": "", "port-id": ""}
nic_info.update(dict(kv_str.split("=", 1)
for kv_str in nic_str.split(",")))
+ if bool(nic_info["net-id"]) == bool(nic_info["port-id"]):
+ msg = _("either net-id or port-id should be specified "
+ "but not both")
+ raise exceptions.CommandError(msg)
+ if neutron_enabled:
+ network_client = self.app.client_manager.network
+ if nic_info["net-id"]:
+ nic_info["net-id"] = common.find(network_client,
+ 'network',
+ 'networks',
+ nic_info["net-id"])
+ if nic_info["port-id"]:
+ nic_info["port-id"] = common.find(network_client,
+ 'port',
+ 'ports',
+ nic_info["port-id"])
+ else:
+ if nic_info["net-id"]:
+ nic_info["net-id"] = utils.find_resource(
+ compute_client.networks,
+ nic_info["net-id"]
+ ).id
+ if nic_info["port-id"]:
+ msg = _("can't create server with port specified "
+ "since neutron not enabled")
+ raise exceptions.CommandError(msg)
nics.append(nic_info)
hints = {}
diff --git a/openstackclient/tests/compute/v2/fakes.py b/openstackclient/tests/compute/v2/fakes.py
index e5ed5cbd..a22c1ce0 100644
--- a/openstackclient/tests/compute/v2/fakes.py
+++ b/openstackclient/tests/compute/v2/fakes.py
@@ -17,6 +17,7 @@ import mock
from openstackclient.tests import fakes
from openstackclient.tests.image.v2 import fakes as image_fakes
+from openstackclient.tests.network.v2 import fakes as network_fakes
from openstackclient.tests import utils
@@ -88,3 +89,8 @@ class TestComputev2(utils.TestCommand):
endpoint=fakes.AUTH_URL,
token=fakes.AUTH_TOKEN,
)
+
+ self.app.client_manager.network = network_fakes.FakeNetworkV2Client(
+ endpoint=fakes.AUTH_URL,
+ token=fakes.AUTH_TOKEN,
+ )
diff --git a/openstackclient/tests/compute/v2/test_server.py b/openstackclient/tests/compute/v2/test_server.py
index d51beef3..5a126697 100644
--- a/openstackclient/tests/compute/v2/test_server.py
+++ b/openstackclient/tests/compute/v2/test_server.py
@@ -145,6 +145,82 @@ class TestServerCreate(TestServer):
)
self.assertEqual(datalist, data)
+ def test_server_create_with_network(self):
+ arglist = [
+ '--image', 'image1',
+ '--flavor', 'flavor1',
+ '--nic', 'net-id=net1',
+ '--nic', 'port-id=port1',
+ compute_fakes.server_id,
+ ]
+ verifylist = [
+ ('image', 'image1'),
+ ('flavor', 'flavor1'),
+ ('nic', ['net-id=net1', 'port-id=port1']),
+ ('config_drive', False),
+ ('server_name', compute_fakes.server_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ get_endpoints = mock.Mock()
+ get_endpoints.return_value = {'network': []}
+ self.app.client_manager.auth_ref = mock.Mock()
+ self.app.client_manager.auth_ref.service_catalog = mock.Mock()
+ self.app.client_manager.auth_ref.service_catalog.get_endpoints = (
+ get_endpoints)
+
+ list_networks = mock.Mock()
+ list_ports = mock.Mock()
+ self.app.client_manager.network.list_networks = list_networks
+ self.app.client_manager.network.list_ports = list_ports
+ list_networks.return_value = {'networks': [{'id': 'net1_uuid'}]}
+ list_ports.return_value = {'ports': [{'id': 'port1_uuid'}]}
+
+ # DisplayCommandBase.take_action() returns two tuples
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = dict(
+ meta=None,
+ files={},
+ reservation_id=None,
+ min_count=1,
+ max_count=1,
+ security_groups=[],
+ userdata=None,
+ key_name=None,
+ availability_zone=None,
+ block_device_mapping={},
+ nics=[{'net-id': 'net1_uuid',
+ 'v4-fixed-ip': '',
+ 'v6-fixed-ip': '',
+ 'port-id': ''},
+ {'net-id': '',
+ 'v4-fixed-ip': '',
+ 'v6-fixed-ip': '',
+ 'port-id': 'port1_uuid'}],
+ scheduler_hints={},
+ config_drive=None,
+ )
+ # ServerManager.create(name, image, flavor, **kwargs)
+ self.servers_mock.create.assert_called_with(
+ compute_fakes.server_id,
+ self.image,
+ self.flavor,
+ **kwargs
+ )
+
+ collist = ('addresses', 'flavor', 'id', 'name', 'properties')
+ self.assertEqual(collist, columns)
+ datalist = (
+ '',
+ 'Large ()',
+ compute_fakes.server_id,
+ compute_fakes.server_name,
+ '',
+ )
+ self.assertEqual(datalist, data)
+
@mock.patch('openstackclient.compute.v2.server.io.open')
def test_server_create_userdata(self, mock_open):
mock_file = mock.MagicMock(name='File')