Public bug reported:

If user was capable to create broken network configuration, instance
become undeletable.  Reason why user can create broken networking is
under investigation (current hypothesis: if network (neutron) created in
one tennant and instance in other, and user is admin in both tenants, it
cause broken configuration).

But such instance deletetion cause trace on nova-compute:

Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/nova/openstack/common/rpc/amqp.py", 
line 461, in _process_data
    **args)
  File 
"/usr/lib/python2.7/dist-packages/nova/openstack/common/rpc/dispatcher.py", 
line 172, in dispatch
    result = getattr(proxyobj, method)(ctxt, **kwargs)
  File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 353, in 
decorated_function
    return function(self, context, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/nova/exception.py", line 90, in wrapped
    payload)
  File "/usr/lib/python2.7/dist-packages/nova/exception.py", line 73, in wrapped
    return f(self, context, *args, **kw)
  File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 243, in 
decorated_function
    pass
  File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 229, in 
decorated_function
    return function(self, context, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 294, in 
decorated_function
    function(self, context, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 271, in 
decorated_function
    e, sys.exc_info())
  File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 258, in 
decorated_function
    return function(self, context, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1792, 
in terminate_instance
    do_terminate_instance(instance, bdms)
  File "/usr/lib/python2.7/dist-packages/nova/openstack/common/lockutils.py", 
line 246, in inner
    return f(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1784, 
in do_terminate_instance
    reservations=reservations)
  File "/usr/lib/python2.7/dist-packages/nova/hooks.py", line 105, in inner
    rv = f(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1757, 
in _delete_instance
    user_id=user_id)
  File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1729, 
in _delete_instance
    self._shutdown_instance(context, db_inst, bdms)
  File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1639, 
in _shutdown_instance
    network_info = self._get_instance_nw_info(context, instance)
  File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 876, in 
_get_instance_nw_info
    instance)
  File "/usr/lib/python2.7/dist-packages/nova/network/neutronv2/api.py", line 
455, in get_instance_nw_info
    result = self._get_instance_nw_info(context, instance, networks)  
  File "/usr/lib/python2.7/dist-packages/nova/network/neutronv2/api.py", line 
463, in _get_instance_nw_info
    nw_info = self._build_network_info_model(context, instance, networks)
  File "/usr/lib/python2.7/dist-packages/nova/network/neutronv2/api.py", line 
1009, in _build_network_info_model
    subnets)
  File "/usr/lib/python2.7/dist-packages/nova/network/neutronv2/api.py", line 
962, in _nw_info_build_network
    label=network_name,
UnboundLocalError: local variable 'network_name' referenced before assignment


The reason is following code :

    def _nw_info_build_network(self, port, networks, subnets):
        # NOTE(danms): This loop can't fail to find a network since we
        # filtered ports to only the ones matching networks in our parent
        for net in networks:
            if port['network_id'] == net['id']:
                network_name = net['name']
                break

(if no net found network_name become undefined).

Following patch should allow instance deletion in case of networking
problems:

diff --git a/nova/network/neutronv2/api.py b/nova/network/neutronv2/api.py
index a41924d..8a44f99 100644
--- a/nova/network/neutronv2/api.py
+++ b/nova/network/neutronv2/api.py
@@ -939,6 +939,8 @@ class API(base.Base):
             if port['network_id'] == net['id']:
                 network_name = net['name']
                 break
+        else:
+            network_name = ""

         bridge = None
         ovs_interfaceid = None

** Affects: nova
     Importance: Undecided
         Status: New

** Attachment added: "Fix deletion of instances with broken networking"
   
https://bugs.launchpad.net/bugs/1271958/+attachment/3955123/+files/nova-compute-fix-broken-net-instance-deletion.patch

** Description changed:

  If user was capable to create broken network configuration, instance
  become undeletable.  Reason why user can create broken networking is
  under investigation (current hypothesis: if network (neutron) created in
  one tennant and instance in other, and user is admin in both tenants, it
  cause broken configuration).
  
  But such instance deletetion cause trace on nova-compute:
  
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp Traceback 
(most recent call last):
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/openstack/common/rpc/amqp.py", line 461, 
in _process_data
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     **args)
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/openstack/common/rpc/dispatcher.py", 
line 172, in dispatch
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     result 
= getattr(proxyobj, method)(ctxt, **kwargs)
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 353, in 
decorated_function
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     return 
function(self, context, *args, **kwargs)
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/exception.py", line 90, in wrapped
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     payload)
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/exception.py", line 73, in wrapped
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     return 
f(self, context, *args, **kw)
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 243, in 
decorated_function
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     pass
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 229, in 
decorated_function
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     return 
function(self, context, *args, **kwargs)
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 294, in 
decorated_function
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     
function(self, context, *args, **kwargs)
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 271, in 
decorated_function
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     e, 
sys.exc_info())
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 258, in 
decorated_function
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     return 
function(self, context, *args, **kwargs)
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1792, in 
terminate_instance
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     
do_terminate_instance(instance, bdms)
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/openstack/common/lockutils.py", line 
246, in inner
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     return 
f(*args, **kwargs)
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1784, in 
do_terminate_instance
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     
reservations=reservations)
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/hooks.py", line 105, in inner
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     rv = 
f(*args, **kwargs)
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1757, in 
_delete_instance
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     
user_id=user_id)
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1729, in 
_delete_instance
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     
self._shutdown_instance(context, db_inst, bdms)
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1639, in 
_shutdown_instance
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     
network_info = self._get_instance_nw_info(context, instance)
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 876, in 
_get_instance_nw_info
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     
instance)
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/network/neutronv2/api.py", line 455, in 
get_instance_nw_info
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     result 
= self._get_instance_nw_info(context, instance, networks)
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/network/neutronv2/api.py", line 463, in 
_get_instance_nw_info
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     nw_info 
= self._build_network_info_model(context, instance, networks)
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/network/neutronv2/api.py", line 1009, in 
_build_network_info_model
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     subnets)
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp   File 
"/usr/lib/python2.7/dist-packages/nova/network/neutronv2/api.py", line 962, in 
_nw_info_build_network
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp     
label=network_name,
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp 
UnboundLocalError: local variable 'network_name' referenced before assignment
- 2014-01-23 15:43:18.249 1411 TRACE nova.openstack.common.rpc.amqp
+ Traceback (most recent call last):
+   File "/usr/lib/python2.7/dist-packages/nova/openstack/common/rpc/amqp.py", 
line 461, in _process_data
+     **args)
+   File 
"/usr/lib/python2.7/dist-packages/nova/openstack/common/rpc/dispatcher.py", 
line 172, in dispatch
+     result = getattr(proxyobj, method)(ctxt, **kwargs)
+   File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 353, 
in decorated_function
+     return function(self, context, *args, **kwargs)
+   File "/usr/lib/python2.7/dist-packages/nova/exception.py", line 90, in 
wrapped
+     payload)
+   File "/usr/lib/python2.7/dist-packages/nova/exception.py", line 73, in 
wrapped
+     return f(self, context, *args, **kw)
+   File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 243, 
in decorated_function
+     pass
+   File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 229, 
in decorated_function
+     return function(self, context, *args, **kwargs)
+   File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 294, 
in decorated_function
+     function(self, context, *args, **kwargs)
+   File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 271, 
in decorated_function
+     e, sys.exc_info())
+   File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 258, 
in decorated_function
+     return function(self, context, *args, **kwargs)
+   File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1792, 
in terminate_instance
+     do_terminate_instance(instance, bdms)
+   File "/usr/lib/python2.7/dist-packages/nova/openstack/common/lockutils.py", 
line 246, in inner
+     return f(*args, **kwargs)
+   File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1784, 
in do_terminate_instance
+     reservations=reservations)
+   File "/usr/lib/python2.7/dist-packages/nova/hooks.py", line 105, in inner
+     rv = f(*args, **kwargs)
+   File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1757, 
in _delete_instance
+     user_id=user_id)
+   File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1729, 
in _delete_instance
+     self._shutdown_instance(context, db_inst, bdms)
+   File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1639, 
in _shutdown_instance
+     network_info = self._get_instance_nw_info(context, instance)
+   File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 876, 
in _get_instance_nw_info
+     instance)
+   File "/usr/lib/python2.7/dist-packages/nova/network/neutronv2/api.py", line 
455, in get_instance_nw_info
+     result = self._get_instance_nw_info(context, instance, networks)  
+   File "/usr/lib/python2.7/dist-packages/nova/network/neutronv2/api.py", line 
463, in _get_instance_nw_info
+     nw_info = self._build_network_info_model(context, instance, networks)
+   File "/usr/lib/python2.7/dist-packages/nova/network/neutronv2/api.py", line 
1009, in _build_network_info_model
+     subnets)
+   File "/usr/lib/python2.7/dist-packages/nova/network/neutronv2/api.py", line 
962, in _nw_info_build_network
+     label=network_name,
+ UnboundLocalError: local variable 'network_name' referenced before assignment
  
  
- The reason is following code:
+ The reason is following code :
  
-     def _nw_info_build_network(self, port, networks, subnets):
-         # NOTE(danms): This loop can't fail to find a network since we
-         # filtered ports to only the ones matching networks in our parent
-         for net in networks:
-             if port['network_id'] == net['id']:
-                 network_name = net['name']
-                 break
+     def _nw_info_build_network(self, port, networks, subnets):
+         # NOTE(danms): This loop can't fail to find a network since we
+         # filtered ports to only the ones matching networks in our parent
+         for net in networks:
+             if port['network_id'] == net['id']:
+                 network_name = net['name']
+                 break
  
  (if no net found network_name become undefined).
  
  Following patch should allow instance deletion in case of networking
  problems:
  
  diff --git a/nova/network/neutronv2/api.py b/nova/network/neutronv2/api.py
  index a41924d..8a44f99 100644
  --- a/nova/network/neutronv2/api.py
  +++ b/nova/network/neutronv2/api.py
  @@ -939,6 +939,8 @@ class API(base.Base):
-              if port['network_id'] == net['id']:
-                  network_name = net['name']
-                  break
+              if port['network_id'] == net['id']:
+                  network_name = net['name']
+                  break
  +        else:
  +            network_name = ""
-  
-          bridge = None
-          ovs_interfaceid = None
+ 
+          bridge = None
+          ovs_interfaceid = None

-- 
You received this bug notification because you are a member of Yahoo!
Engineering Team, which is subscribed to OpenStack Compute (nova).
https://bugs.launchpad.net/bugs/1271958

Title:
  nova compute fail to remove instance with port if network is broken

Status in OpenStack Compute (Nova):
  New

Bug description:
  If user was capable to create broken network configuration, instance
  become undeletable.  Reason why user can create broken networking is
  under investigation (current hypothesis: if network (neutron) created
  in one tennant and instance in other, and user is admin in both
  tenants, it cause broken configuration).

  But such instance deletetion cause trace on nova-compute:

  Traceback (most recent call last):
    File "/usr/lib/python2.7/dist-packages/nova/openstack/common/rpc/amqp.py", 
line 461, in _process_data
      **args)
    File 
"/usr/lib/python2.7/dist-packages/nova/openstack/common/rpc/dispatcher.py", 
line 172, in dispatch
      result = getattr(proxyobj, method)(ctxt, **kwargs)
    File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 353, 
in decorated_function
      return function(self, context, *args, **kwargs)
    File "/usr/lib/python2.7/dist-packages/nova/exception.py", line 90, in 
wrapped
      payload)
    File "/usr/lib/python2.7/dist-packages/nova/exception.py", line 73, in 
wrapped
      return f(self, context, *args, **kw)
    File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 243, 
in decorated_function
      pass
    File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 229, 
in decorated_function
      return function(self, context, *args, **kwargs)
    File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 294, 
in decorated_function
      function(self, context, *args, **kwargs)
    File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 271, 
in decorated_function
      e, sys.exc_info())
    File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 258, 
in decorated_function
      return function(self, context, *args, **kwargs)
    File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1792, 
in terminate_instance
      do_terminate_instance(instance, bdms)
    File "/usr/lib/python2.7/dist-packages/nova/openstack/common/lockutils.py", 
line 246, in inner
      return f(*args, **kwargs)
    File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1784, 
in do_terminate_instance
      reservations=reservations)
    File "/usr/lib/python2.7/dist-packages/nova/hooks.py", line 105, in inner
      rv = f(*args, **kwargs)
    File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1757, 
in _delete_instance
      user_id=user_id)
    File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1729, 
in _delete_instance
      self._shutdown_instance(context, db_inst, bdms)
    File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1639, 
in _shutdown_instance
      network_info = self._get_instance_nw_info(context, instance)
    File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 876, 
in _get_instance_nw_info
      instance)
    File "/usr/lib/python2.7/dist-packages/nova/network/neutronv2/api.py", line 
455, in get_instance_nw_info
      result = self._get_instance_nw_info(context, instance, networks)  
    File "/usr/lib/python2.7/dist-packages/nova/network/neutronv2/api.py", line 
463, in _get_instance_nw_info
      nw_info = self._build_network_info_model(context, instance, networks)
    File "/usr/lib/python2.7/dist-packages/nova/network/neutronv2/api.py", line 
1009, in _build_network_info_model
      subnets)
    File "/usr/lib/python2.7/dist-packages/nova/network/neutronv2/api.py", line 
962, in _nw_info_build_network
      label=network_name,
  UnboundLocalError: local variable 'network_name' referenced before assignment

  
  The reason is following code :

      def _nw_info_build_network(self, port, networks, subnets):
          # NOTE(danms): This loop can't fail to find a network since we
          # filtered ports to only the ones matching networks in our parent
          for net in networks:
              if port['network_id'] == net['id']:
                  network_name = net['name']
                  break

  (if no net found network_name become undefined).

  Following patch should allow instance deletion in case of networking
  problems:

  diff --git a/nova/network/neutronv2/api.py b/nova/network/neutronv2/api.py
  index a41924d..8a44f99 100644
  --- a/nova/network/neutronv2/api.py
  +++ b/nova/network/neutronv2/api.py
  @@ -939,6 +939,8 @@ class API(base.Base):
               if port['network_id'] == net['id']:
                   network_name = net['name']
                   break
  +        else:
  +            network_name = ""

           bridge = None
           ovs_interfaceid = None

To manage notifications about this bug go to:
https://bugs.launchpad.net/nova/+bug/1271958/+subscriptions

-- 
Mailing list: https://launchpad.net/~yahoo-eng-team
Post to     : yahoo-eng-team@lists.launchpad.net
Unsubscribe : https://launchpad.net/~yahoo-eng-team
More help   : https://help.launchpad.net/ListHelp

Reply via email to