diff --git a/troveclient/tests/test_instances.py b/troveclient/tests/test_instances.py index 36ecedac..03efa35f 100644 --- a/troveclient/tests/test_instances.py +++ b/troveclient/tests/test_instances.py @@ -89,10 +89,12 @@ class InstancesTest(testtools.TestCase): return path, body, inst self.instances._create = mock.Mock(side_effect=side_effect_func) + nics = [{'net-id': '000'}] p, b, i = self.instances.create("test-name", 103, "test-volume", ['db1', 'db2'], ['u1', 'u2'], datastore="datastore", - datastore_version="datastore-version") + datastore_version="datastore-version", + nics=nics) self.assertEqual("/instances", p) self.assertEqual("instance", i) self.assertEqual(['db1', 'db2'], b["instance"]["databases"]) @@ -102,6 +104,7 @@ class InstancesTest(testtools.TestCase): self.assertEqual("datastore", b["instance"]["datastore"]["type"]) self.assertEqual("datastore-version", b["instance"]["datastore"]["version"]) + self.assertEqual(nics, b["instance"]["nics"]) self.assertEqual(103, b["instance"]["flavorRef"]) def test_list(self): diff --git a/troveclient/v1/instances.py b/troveclient/v1/instances.py index 4e2c4e4d..6cd09459 100644 --- a/troveclient/v1/instances.py +++ b/troveclient/v1/instances.py @@ -55,7 +55,7 @@ class Instances(base.ManagerWithFind): def create(self, name, flavor_id, volume=None, databases=None, users=None, restorePoint=None, availability_zone=None, datastore=None, - datastore_version=None): + datastore_version=None, nics=None): """ Create (boot) a new instance. """ @@ -80,6 +80,8 @@ class Instances(base.ManagerWithFind): datastore_obj["version"] = datastore_version if datastore_obj: body["instance"]["datastore"] = datastore_obj + if nics: + body["instance"]["nics"] = nics return self._create("/instances", body, "instance") diff --git a/troveclient/v1/shell.py b/troveclient/v1/shell.py index 21b82f29..6d08558d 100644 --- a/troveclient/v1/shell.py +++ b/troveclient/v1/shell.py @@ -172,6 +172,18 @@ def do_delete(cs, args): metavar='', default=None, help='A datastore version name or UUID') +@utils.arg('--nic', + metavar="", + action='append', + dest='nics', + default=[], + help="Create a NIC on the instance. " + "Specify option multiple times to create multiple NICs. " + "net-id: attach NIC to network with this UUID " + "(required if no port-id), " + "v4-fixed-ip: IPv4 fixed address for NIC (optional), " + "port-id: attach NIC to port with this UUID " + "(required if no net-id)") @utils.service_type('database') def do_create(cs, args): """Creates a new instance.""" @@ -184,6 +196,17 @@ def do_create(cs, args): databases = [{'name': value} for value in args.databases] users = [{'name': n, 'password': p} for (n, p) in [z.split(':')[:2] for z in args.users]] + nics = [] + for nic_str in args.nics: + nic_info = dict([(k, v) for (k, v) in [z.split("=", 1)[:2] for z in + nic_str.split(",")]]) + if not (nic_info.get('net-id') or nic_info.get('port-id')): + err_msg = ("Invalid nic argument '%s'. Nic arguments must be of " + "the form --nic , with at minimum net-id or port-id " + "specified." % nic_str) + raise exceptions.CommandError(err_msg) + nics.append(nic_info) instance = cs.instances.create(args.name, args.flavor_id, volume=volume, @@ -192,7 +215,8 @@ def do_create(cs, args): restorePoint=restore_point, availability_zone=args.availability_zone, datastore=args.datastore, - datastore_version=args.datastore_version) + datastore_version=args.datastore_version, + nics=nics) instance._info['flavor'] = instance.flavor['id'] if hasattr(instance, 'volume'): instance._info['volume'] = instance.volume['size']