From 46690df48392c8967fc4f0ea05b5dba152fa400a Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Tue, 5 Jul 2011 13:24:31 -0700 Subject: copy paste --- nova/compute/api.py | 10 ++++++++-- nova/compute/manager.py | 14 ++++++++++++++ nova/network/api.py | 8 ++++++++ nova/network/manager.py | 7 +++++++ 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/nova/compute/api.py b/nova/compute/api.py index 28459dc75..a17ab2e1c 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -889,8 +889,14 @@ class API(base.Base): def add_fixed_ip(self, context, instance_id, network_id): """Add fixed_ip from specified network to given instance.""" self._cast_compute_message('add_fixed_ip_to_instance', context, - instance_id, - network_id) + instance_id, network_id) + + @scheduler_api.reroute_compute("remove_fixed_ip") + def remove_fixed_ip(self, context, instance_id, network_id): + """Remove fixed_ip from specified network to given instance.""" + self._cast_compute_message('remove_fixed_ip_from_instance', context, + instance_id, network_id) + #TODO(tr3buchet): how to run this in the correct zone? def add_network_to_project(self, context, project_id): diff --git a/nova/compute/manager.py b/nova/compute/manager.py index bbbddde0a..0f761c939 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -840,6 +840,20 @@ class ComputeManager(manager.SchedulerDependentManager): self.inject_network_info(context, instance_id) self.reset_network(context, instance_id) + @exception.wrap_exception + @checks_instance_lock + def remove_fixed_ip_from_instance(self, context, instance_id, network_id): + """Calls network_api to remove existing fixed_ip from instance + by injecting the altered network info and resetting + instance networking. + + """ + self.network_api.remove_fixed_ip_from_instance(context, instance_id, + network_id) + self.inject_network_info(context, instance_id) + self.reset_network(context, instance_id) + + @exception.wrap_exception @checks_instance_lock def pause_instance(self, context, instance_id): diff --git a/nova/network/api.py b/nova/network/api.py index b2b96082b..0a70ff73e 100644 --- a/nova/network/api.py +++ b/nova/network/api.py @@ -156,6 +156,14 @@ class API(base.Base): {'method': 'add_fixed_ip_to_instance', 'args': args}) + def remove_fixed_ip_from_instance(self, context, instance_id, network_id): + """Removes a fixed ip from instance from specified network.""" + args = {'instance_id': instance_id, + 'network_id': network_id} + rpc.cast(context, FLAGS.network_topic, + {'method': 'remove_fixed_ip_from_instance', + 'args': args}) + def add_network_to_project(self, context, project_id): """Force adds another network to a project.""" rpc.cast(context, FLAGS.network_topic, diff --git a/nova/network/manager.py b/nova/network/manager.py index d42bc8c4e..675101b5a 100644 --- a/nova/network/manager.py +++ b/nova/network/manager.py @@ -480,6 +480,13 @@ class NetworkManager(manager.SchedulerDependentManager): networks = [self.db.network_get(context, network_id)] self._allocate_fixed_ips(context, instance_id, networks) + def remove_fixed_ip_from_instance(self, context, instance_id, network_id): + """Removes a fixed ip from an instance from specified network.""" + networks = [self.db.network_get(context, network_id)] + # TODO(sandy): Do the right thing here ... + x = 1+1 # pep8 to catch this. + self._allocate_fixed_ips(context, instance_id, networks) + def allocate_fixed_ip(self, context, instance_id, network, **kwargs): """Gets a fixed ip from the pool.""" # TODO(vish): when this is called by compute, we can associate compute -- cgit From f34952f27aa7acdb8bb617346aba281a86e918ae Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Wed, 6 Jul 2011 08:14:58 -0700 Subject: slightly more fleshed out call path --- nova/compute/api.py | 4 ++-- nova/compute/manager.py | 7 +++++-- nova/network/api.py | 9 +++++++-- nova/network/manager.py | 31 +++++++++++++++++++++++-------- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/nova/compute/api.py b/nova/compute/api.py index a17ab2e1c..a07ab4435 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -892,10 +892,10 @@ class API(base.Base): instance_id, network_id) @scheduler_api.reroute_compute("remove_fixed_ip") - def remove_fixed_ip(self, context, instance_id, network_id): + def remove_fixed_ip(self, context, instance_id, network_id, ip): """Remove fixed_ip from specified network to given instance.""" self._cast_compute_message('remove_fixed_ip_from_instance', context, - instance_id, network_id) + instance_id, network_id, ip) #TODO(tr3buchet): how to run this in the correct zone? diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 0f761c939..ab5499209 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -840,16 +840,19 @@ class ComputeManager(manager.SchedulerDependentManager): self.inject_network_info(context, instance_id) self.reset_network(context, instance_id) + + # TODO(sandy) pep8 until checked ... @exception.wrap_exception @checks_instance_lock - def remove_fixed_ip_from_instance(self, context, instance_id, network_id): + def remove_fixed_ip_from_instance(self, context, instance_id, network_id, + ip): """Calls network_api to remove existing fixed_ip from instance by injecting the altered network info and resetting instance networking. """ self.network_api.remove_fixed_ip_from_instance(context, instance_id, - network_id) + network_id, ip) self.inject_network_info(context, instance_id) self.reset_network(context, instance_id) diff --git a/nova/network/api.py b/nova/network/api.py index 0a70ff73e..54514f482 100644 --- a/nova/network/api.py +++ b/nova/network/api.py @@ -156,14 +156,19 @@ class API(base.Base): {'method': 'add_fixed_ip_to_instance', 'args': args}) - def remove_fixed_ip_from_instance(self, context, instance_id, network_id): + + # TODO(sandy) pep8 until checked + def remove_fixed_ip_from_instance(self, context, instance_id, network_id, + ip): """Removes a fixed ip from instance from specified network.""" args = {'instance_id': instance_id, - 'network_id': network_id} + 'network_id': network_id, + 'ip': ip} rpc.cast(context, FLAGS.network_topic, {'method': 'remove_fixed_ip_from_instance', 'args': args}) + def add_network_to_project(self, context, project_id): """Force adds another network to a project.""" rpc.cast(context, FLAGS.network_topic, diff --git a/nova/network/manager.py b/nova/network/manager.py index 675101b5a..2ae050b14 100644 --- a/nova/network/manager.py +++ b/nova/network/manager.py @@ -480,12 +480,23 @@ class NetworkManager(manager.SchedulerDependentManager): networks = [self.db.network_get(context, network_id)] self._allocate_fixed_ips(context, instance_id, networks) - def remove_fixed_ip_from_instance(self, context, instance_id, network_id): + + #TODO(sandy) - PEP8 until this is checked ... + def remove_fixed_ip_from_instance(self, context, instance_id, network_id, + ip): """Removes a fixed ip from an instance from specified network.""" networks = [self.db.network_get(context, network_id)] - # TODO(sandy): Do the right thing here ... - x = 1+1 # pep8 to catch this. - self._allocate_fixed_ips(context, instance_id, networks) + # Find the network that contains this IP ... + network = None + for n in networks: + if ip in n: + network = n + break + if not network: + raise exception.InvalidIP(ip=ip) + + self.deallocate_fixed_ips(context, ip) + def allocate_fixed_ip(self, context, instance_id, network, **kwargs): """Gets a fixed ip from the pool.""" @@ -696,10 +707,14 @@ class FlatManager(NetworkManager): for network in networks: self.allocate_fixed_ip(context, instance_id, network) - def deallocate_fixed_ip(self, context, address, **kwargs): - """Returns a fixed ip to the pool.""" - super(FlatManager, self).deallocate_fixed_ip(context, address, - **kwargs) + + # TODO(sandy): Switched to multi-IP support + def deallocate_fixed_ip(self, context, networks, **kwargs): + """Returns a list of fixed ips to the pool.""" + for network in networks: + address = network['address'] + super(FlatManager, self).deallocate_fixed_ip(context, address, + **kwargs) self.db.fixed_ip_disassociate(context, address) def setup_compute_network(self, context, instance_id): -- cgit From bd297ae3bc779853cf82f05d0d4da60305416a99 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Wed, 6 Jul 2011 13:43:48 -0700 Subject: changed calling signature to be (instance_id, address) --- nova/compute/api.py | 4 ++-- nova/compute/manager.py | 6 ++---- nova/network/api.py | 6 ++---- nova/network/manager.py | 32 +++++++++++--------------------- 4 files changed, 17 insertions(+), 31 deletions(-) diff --git a/nova/compute/api.py b/nova/compute/api.py index a07ab4435..e4992bbfa 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -892,10 +892,10 @@ class API(base.Base): instance_id, network_id) @scheduler_api.reroute_compute("remove_fixed_ip") - def remove_fixed_ip(self, context, instance_id, network_id, ip): + def remove_fixed_ip(self, context, instance_id, address): """Remove fixed_ip from specified network to given instance.""" self._cast_compute_message('remove_fixed_ip_from_instance', context, - instance_id, network_id, ip) + instance_id, address) #TODO(tr3buchet): how to run this in the correct zone? diff --git a/nova/compute/manager.py b/nova/compute/manager.py index ab5499209..b9a3d1a5e 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -844,15 +844,13 @@ class ComputeManager(manager.SchedulerDependentManager): # TODO(sandy) pep8 until checked ... @exception.wrap_exception @checks_instance_lock - def remove_fixed_ip_from_instance(self, context, instance_id, network_id, - ip): + def remove_fixed_ip_from_instance(self, context, instance_id, address): """Calls network_api to remove existing fixed_ip from instance by injecting the altered network info and resetting instance networking. - """ self.network_api.remove_fixed_ip_from_instance(context, instance_id, - network_id, ip) + address) self.inject_network_info(context, instance_id) self.reset_network(context, instance_id) diff --git a/nova/network/api.py b/nova/network/api.py index 54514f482..bcd69d52b 100644 --- a/nova/network/api.py +++ b/nova/network/api.py @@ -158,12 +158,10 @@ class API(base.Base): # TODO(sandy) pep8 until checked - def remove_fixed_ip_from_instance(self, context, instance_id, network_id, - ip): + def remove_fixed_ip_from_instance(self, context, instance_id, address): """Removes a fixed ip from instance from specified network.""" args = {'instance_id': instance_id, - 'network_id': network_id, - 'ip': ip} + 'address': address} rpc.cast(context, FLAGS.network_topic, {'method': 'remove_fixed_ip_from_instance', 'args': args}) diff --git a/nova/network/manager.py b/nova/network/manager.py index 2ae050b14..4b9fb98f4 100644 --- a/nova/network/manager.py +++ b/nova/network/manager.py @@ -482,20 +482,14 @@ class NetworkManager(manager.SchedulerDependentManager): #TODO(sandy) - PEP8 until this is checked ... - def remove_fixed_ip_from_instance(self, context, instance_id, network_id, - ip): + def remove_fixed_ip_from_instance(self, context, instance_id, address): """Removes a fixed ip from an instance from specified network.""" - networks = [self.db.network_get(context, network_id)] - # Find the network that contains this IP ... - network = None - for n in networks: - if ip in n: - network = n - break - if not network: - raise exception.InvalidIP(ip=ip) - - self.deallocate_fixed_ips(context, ip) + addresses = self.db.fixed_ip_get_by_instance(context, instance_id) + for addr in addresses: + if addr == address: + self.deallocate_fixed_ip(context, address) + return + raise exception.NoSuchAddress(address=address) def allocate_fixed_ip(self, context, instance_id, network, **kwargs): @@ -707,14 +701,10 @@ class FlatManager(NetworkManager): for network in networks: self.allocate_fixed_ip(context, instance_id, network) - - # TODO(sandy): Switched to multi-IP support - def deallocate_fixed_ip(self, context, networks, **kwargs): - """Returns a list of fixed ips to the pool.""" - for network in networks: - address = network['address'] - super(FlatManager, self).deallocate_fixed_ip(context, address, - **kwargs) + def deallocate_fixed_ip(self, context, address, **kwargs): + """Returns a fixed ip to the pool.""" + super(FlatManager, self).deallocate_fixed_ip(context, address, + **kwargs) self.db.fixed_ip_disassociate(context, address) def setup_compute_network(self, context, instance_id): -- cgit From d24a8689dceaae1145d0cc0aa12e60bfdabbe2b2 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Thu, 7 Jul 2011 06:25:03 -0700 Subject: unit tests --- nova/compute/api.py | 3 ++- nova/network/manager.py | 4 ++-- nova/tests/test_network.py | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/nova/compute/api.py b/nova/compute/api.py index e4992bbfa..8507c5871 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -890,7 +890,8 @@ class API(base.Base): """Add fixed_ip from specified network to given instance.""" self._cast_compute_message('add_fixed_ip_to_instance', context, instance_id, network_id) - + + @scheduler_api.reroute_compute("remove_fixed_ip") def remove_fixed_ip(self, context, instance_id, address): """Remove fixed_ip from specified network to given instance.""" diff --git a/nova/network/manager.py b/nova/network/manager.py index 4b9fb98f4..ea946a1f4 100644 --- a/nova/network/manager.py +++ b/nova/network/manager.py @@ -486,10 +486,10 @@ class NetworkManager(manager.SchedulerDependentManager): """Removes a fixed ip from an instance from specified network.""" addresses = self.db.fixed_ip_get_by_instance(context, instance_id) for addr in addresses: - if addr == address: + if addr['address'] == address: self.deallocate_fixed_ip(context, address) return - raise exception.NoSuchAddress(address=address) + raise exception.FixedIpNotFound(id=address) def allocate_fixed_ip(self, context, instance_id, network, **kwargs): diff --git a/nova/tests/test_network.py b/nova/tests/test_network.py index 6d5166019..d5cab47cf 100644 --- a/nova/tests/test_network.py +++ b/nova/tests/test_network.py @@ -16,6 +16,7 @@ # under the License. from nova import db +from nova import exception from nova import flags from nova import log as logging from nova import test @@ -238,3 +239,35 @@ class VlanNetworkTestCase(test.TestCase): self.assertRaises(ValueError, self.network.create_networks, None, num_networks=100, vlan_start=1, cidr='192.168.0.1/24', network_size=100) + + +class CommonNetworkTestCase(test.TestCase): + + class FakeNetworkManager(network_manager.NetworkManager): + """This NetworkManager doesn't call the base class so we can bypass all + inherited service cruft and just perform unit tests. + """ + + class FakeDB: + def fixed_ip_get_by_instance(self, context, instance_id): + return [dict(address='10.0.0.0'), dict(address='10.0.0.1'), + dict(address='10.0.0.2')] + + def __init__(self): + self.db = self.FakeDB() + self.deallocate_called = None + + def deallocate_fixed_ip(self, context, address): + self.deallocate_called = address + + def test_remove_fixed_ip_from_instance(self): + manager = self.FakeNetworkManager() + manager.remove_fixed_ip_from_instance(None, 99, '10.0.0.1') + + self.assertEquals(manager.deallocate_called, '10.0.0.1') + + def test_remove_fixed_ip_from_instance_bad_input(self): + manager = self.FakeNetworkManager() + self.assertRaises(exception.FixedIpNotFound, + manager.remove_fixed_ip_from_instance, + None, 99, 'bad input') -- cgit From f2b107981c9b37043fe6c68e92cb170b2b701a18 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Thu, 7 Jul 2011 09:45:00 -0700 Subject: cleanup --- nova/compute/api.py | 2 -- nova/compute/manager.py | 3 --- nova/network/api.py | 3 --- nova/network/manager.py | 3 --- 4 files changed, 11 deletions(-) diff --git a/nova/compute/api.py b/nova/compute/api.py index 8507c5871..3e5188ef0 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -891,14 +891,12 @@ class API(base.Base): self._cast_compute_message('add_fixed_ip_to_instance', context, instance_id, network_id) - @scheduler_api.reroute_compute("remove_fixed_ip") def remove_fixed_ip(self, context, instance_id, address): """Remove fixed_ip from specified network to given instance.""" self._cast_compute_message('remove_fixed_ip_from_instance', context, instance_id, address) - #TODO(tr3buchet): how to run this in the correct zone? def add_network_to_project(self, context, project_id): """Force adds a network to the project.""" diff --git a/nova/compute/manager.py b/nova/compute/manager.py index b9a3d1a5e..bec2d6568 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -840,8 +840,6 @@ class ComputeManager(manager.SchedulerDependentManager): self.inject_network_info(context, instance_id) self.reset_network(context, instance_id) - - # TODO(sandy) pep8 until checked ... @exception.wrap_exception @checks_instance_lock def remove_fixed_ip_from_instance(self, context, instance_id, address): @@ -854,7 +852,6 @@ class ComputeManager(manager.SchedulerDependentManager): self.inject_network_info(context, instance_id) self.reset_network(context, instance_id) - @exception.wrap_exception @checks_instance_lock def pause_instance(self, context, instance_id): diff --git a/nova/network/api.py b/nova/network/api.py index bcd69d52b..70b1099f0 100644 --- a/nova/network/api.py +++ b/nova/network/api.py @@ -156,8 +156,6 @@ class API(base.Base): {'method': 'add_fixed_ip_to_instance', 'args': args}) - - # TODO(sandy) pep8 until checked def remove_fixed_ip_from_instance(self, context, instance_id, address): """Removes a fixed ip from instance from specified network.""" args = {'instance_id': instance_id, @@ -166,7 +164,6 @@ class API(base.Base): {'method': 'remove_fixed_ip_from_instance', 'args': args}) - def add_network_to_project(self, context, project_id): """Force adds another network to a project.""" rpc.cast(context, FLAGS.network_topic, diff --git a/nova/network/manager.py b/nova/network/manager.py index ea946a1f4..0432179dd 100644 --- a/nova/network/manager.py +++ b/nova/network/manager.py @@ -480,8 +480,6 @@ class NetworkManager(manager.SchedulerDependentManager): networks = [self.db.network_get(context, network_id)] self._allocate_fixed_ips(context, instance_id, networks) - - #TODO(sandy) - PEP8 until this is checked ... def remove_fixed_ip_from_instance(self, context, instance_id, address): """Removes a fixed ip from an instance from specified network.""" addresses = self.db.fixed_ip_get_by_instance(context, instance_id) @@ -491,7 +489,6 @@ class NetworkManager(manager.SchedulerDependentManager): return raise exception.FixedIpNotFound(id=address) - def allocate_fixed_ip(self, context, instance_id, network, **kwargs): """Gets a fixed ip from the pool.""" # TODO(vish): when this is called by compute, we can associate compute -- cgit From e6ebcbd911467ed1a9a468a350c5488ac83811bd Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Mon, 11 Jul 2011 07:49:34 -0700 Subject: pre trunk merge --- nova/exception.py | 4 ++++ nova/network/manager.py | 9 +++++---- nova/tests/test_network.py | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/nova/exception.py b/nova/exception.py index a6776b64f..988940d6a 100644 --- a/nova/exception.py +++ b/nova/exception.py @@ -377,6 +377,10 @@ class FixedIpNotFoundForInstance(FixedIpNotFound): message = _("Instance %(instance_id)s has zero fixed ips.") +class FixedIpNotFoundForSpecificInstance(FixedIpNotFound): + message = _("Instance %(instance_id)s doesn't have fixed ip '%(ip)s'.") + + class FixedIpNotFoundForVirtualInterface(FixedIpNotFound): message = _("Virtual interface %(vif_id)s has zero associated fixed ips.") diff --git a/nova/network/manager.py b/nova/network/manager.py index 0432179dd..f4078b022 100644 --- a/nova/network/manager.py +++ b/nova/network/manager.py @@ -482,12 +482,13 @@ class NetworkManager(manager.SchedulerDependentManager): def remove_fixed_ip_from_instance(self, context, instance_id, address): """Removes a fixed ip from an instance from specified network.""" - addresses = self.db.fixed_ip_get_by_instance(context, instance_id) - for addr in addresses: - if addr['address'] == address: + fixed_ips = self.db.fixed_ip_get_by_instance(context, instance_id) + for fixed_ip in fixed_ips: + if fixed_ip['address'] == address: self.deallocate_fixed_ip(context, address) return - raise exception.FixedIpNotFound(id=address) + raise exception.FixedIpNotFoundForSpecificInstance( + instance_id=instance_id, ip=address) def allocate_fixed_ip(self, context, instance_id, network, **kwargs): """Gets a fixed ip from the pool.""" diff --git a/nova/tests/test_network.py b/nova/tests/test_network.py index d5cab47cf..b09021e13 100644 --- a/nova/tests/test_network.py +++ b/nova/tests/test_network.py @@ -268,6 +268,6 @@ class CommonNetworkTestCase(test.TestCase): def test_remove_fixed_ip_from_instance_bad_input(self): manager = self.FakeNetworkManager() - self.assertRaises(exception.FixedIpNotFound, + self.assertRaises(exception.FixedIpNotFoundForSpecificInstance, manager.remove_fixed_ip_from_instance, None, 99, 'bad input') -- cgit From 46c59d20fd86f8ce6a57e7c663d893f6f5411d88 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Mon, 11 Jul 2011 18:49:46 -0700 Subject: pep8 --- nova/compute/api.py | 2 +- nova/compute/manager.py | 2 +- nova/virt/driver.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nova/compute/api.py b/nova/compute/api.py index edc96d5ea..432658bbb 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -903,7 +903,7 @@ class API(base.Base): self._cast_compute_message('add_fixed_ip_to_instance', context, instance_id, params=dict(network_id=network_id)) - + @scheduler_api.reroute_compute("remove_fixed_ip") def remove_fixed_ip(self, context, instance_id, address): """Remove fixed_ip from specified network to given instance.""" diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 3f8fc809e..c627d2985 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -1361,7 +1361,7 @@ class ComputeManager(manager.SchedulerDependentManager): error_list.append(ex) try: - pass #self._poll_instance_states(context) + self._poll_instance_states(context) except Exception as ex: LOG.warning(_("Error during instance poll: %s"), unicode(ex)) diff --git a/nova/virt/driver.py b/nova/virt/driver.py index b5476fcb0..178279d31 100644 --- a/nova/virt/driver.py +++ b/nova/virt/driver.py @@ -244,7 +244,7 @@ class ComputeDriver(object): def inject_network_info(self, instance, nw_info): """inject network info for specified instance""" - pass # raise NotImplementedError() + pass def poll_rescued_instances(self, timeout): """Poll for rescued instances""" -- cgit From 10a3b6c4e2ad1722ae4566f6ace997fe54769a36 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Mon, 11 Jul 2011 18:59:01 -0700 Subject: stray debug --- nova/api/openstack/contrib/multinic.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nova/api/openstack/contrib/multinic.py b/nova/api/openstack/contrib/multinic.py index 2dd1d484e..841061721 100644 --- a/nova/api/openstack/contrib/multinic.py +++ b/nova/api/openstack/contrib/multinic.py @@ -96,7 +96,6 @@ class Multinic(extensions.ExtensionDescriptor): LOG.exception(_("Missing 'networkId' argument for addFixedIp")) return faults.Fault(exc.HTTPUnprocessableEntity()) - LOG.exception("ADD FIXED IP") # Add the fixed IP network_id = input_dict['addFixedIp']['networkId'] self.compute_api.add_fixed_ip(req.environ['nova.context'], id, -- cgit