Cisco N1KV plugin doesn't process correctly SQLAlchemy exceptions

Bug #1393399 reported by Andrey Alekov
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
neutron
Fix Released
Low
Ann Taraday

Bug Description

Test tempest.api.network.test_networks.BulkNetworkOpsTestJSON.test_bulk_create_delete_port failed when used N1KV plugin. As I see from neutron log, Cisco plugin incorrectly process exceptions in method _get_policy_profile_by_name (file
"/opt/stack/neutron/neutron/plugins/cisco/db/n1kv_db_v2.py") it's leads to return code 500 by Neutron service.

Problem reproduced when creating ports and n1kv profile_id not found in database. According Neutron API, for this request allowed only next error codes:
- badRequest (400)
- unauthorized (401)
- forbidden (403)
- itemNotFound (404)
- macGenerationFailure (503)
- serviceUnavailable (503)

Test log:
2014-11-17 03:24:07,926 18176 DEBUG [tempest.common.rest_client] Request (BulkNetworkOpsTestJSON:test_bulk_create_delete_port): 201 POST http://10.20.21.2:9696/v2.0/networks 0.406s
    Request - Headers: {'Content-Type': 'application/json', 'Accept': 'application/json', 'X-Auth-Token': '<omitted>'}
        Body: {"network": {"name": "test-network--197486"}}
    Response - Headers: {'status': '201', 'content-length': '301', 'connection': 'close', 'date': 'Mon, 17 Nov 2014 03:24:07 GMT', 'content-type': 'application/json; charset=UTF-8', 'x-openstack-request-id': 'req-eca84ad6-9ba1-4f22-b668-018201e65660'}
        Body: {"network": {"status": "ACTIVE", "subnets": [], "name": "test-network--197486", "router:external": false, "tenant_id": "443d9ae88e094a5c9fa9daa36ac4d00f", "admin_state_up": true, "n1kv:profile_id": "2b8937d0-069c-461d-aedb-020ad0e2ed99", "shared": false, "id": "dc7b7044-d3ac-450d-9f73-d87b931170a1"}}
2014-11-17 03:24:08,335 18176 DEBUG [tempest.common.rest_client] Request (BulkNetworkOpsTestJSON:test_bulk_create_delete_port): 201 POST http://10.20.21.2:9696/v2.0/networks 0.408s
    Request - Headers: {'Content-Type': 'application/json', 'Accept': 'application/json', 'X-Auth-Token': '<omitted>'}
        Body: {"network": {"name": "test-network--380129587"}}
    Response - Headers: {'status': '201', 'content-length': '304', 'connection': 'close', 'date': 'Mon, 17 Nov 2014 03:24:08 GMT', 'content-type': 'application/json; charset=UTF-8', 'x-openstack-request-id': 'req-0f0ca9f6-82c0-4437-906e-005ae6b31377'}
        Body: {"network": {"status": "ACTIVE", "subnets": [], "name": "test-network--380129587", "router:external": false, "tenant_id": "443d9ae88e094a5c9fa9daa36ac4d00f", "admin_state_up": true, "n1kv:profile_id": "2b8937d0-069c-461d-aedb-020ad0e2ed99", "shared": false, "id": "381d122a-f55c-4c39-9eb9-17d5cd3ef818"}}
2014-11-17 03:24:08,390 18176 DEBUG [tempest.common.rest_client] Request (BulkNetworkOpsTestJSON:test_bulk_create_delete_port): 500 POST http://10.20.21.2:9696/v2.0/ports 0.053s
    Request - Headers: {'Content-Type': 'application/json', 'Accept': 'application/json', 'X-Auth-Token': '<omitted>'}
        Body: {"ports": [{"network_id": "dc7b7044-d3ac-450d-9f73-d87b931170a1", "name": "port--769863538", "admin_state_up": true}, {"network_id": "381d122a-f55c-4c39-9eb9-17d5cd3ef818", "admin_state_up": false}]}
    Response - Headers: {'status': '500', 'content-length': '150', 'connection': 'close', 'date': 'Mon, 17 Nov 2014 03:24:08 GMT', 'content-type': 'application/json; charset=UTF-8', 'x-openstack-request-id': 'req-7bfbe0d3-de6b-4450-b4ee-7ead1af3fa7f'}
        Body: {"NeutronError": {"message": "Request Failed: internal server error while processing your request.", "type": "HTTPInternalServerError", "detail": ""}}
}}}

Traceback (most recent call last):
  File "tempest/api/network/test_networks.py", line 463, in test_bulk_create_delete_port
    _, body = self.client.create_bulk_port(port_list)
  File "tempest/services/network/network_client_base.py", line 207, in create_bulk_port
    resp, body = self.post(uri, body)
  File "tempest/services/network/network_client_base.py", line 74, in post
    return self.rest_client.post(uri, body, headers)
  File "tempest/common/rest_client.py", line 234, in post
    return self.request('POST', url, extra_headers, headers, body)
  File "tempest/common/rest_client.py", line 454, in request
    resp, resp_body)
  File "tempest/common/rest_client.py", line 550, in _error_checker
    raise exceptions.ServerFault(message)
ServerFault: Got server fault
Details: Request Failed: internal server error while processing your request.
Traceback (most recent call last):
_StringException: Empty attachments:
  stderr
  stdout

Neutron log:
2014-11-17 10:15:03.365 ERROR neutron.db.db_base_plugin_v2 [req-c8f914ec-00a8-4734-9557-dd14bc00b1d2 BulkNetworkOpsTestJSON-1775368720 77347f40bf50412eb636412a20c64aaf] An exception occurred while creating the port:{'port': {'binding:host_id': <object object at 0x7f0be269c110>, u'name': u'port--1581734127', u'admin_state_up': True, u'network_id': u'fee9d7af-edec-4d31-aa27-b94f5216ac7e', 'tenant_id': u'77347f40bf50412eb636412a20c64aaf', 'binding:vnic_type': 'normal', 'device_owner': '', 'n1kv:profile_id': <object object at 0x7f0be269c110>, 'mac_address': <object object at 0x7f0be269c110>, 'binding:profile': <object object at 0x7f0be269c110>, 'fixed_ips': <object object at 0x7f0be269c110>, 'device_id': ''}}
2014-11-17 10:15:03.366 ERROR neutron.api.v2.resource [req-c8f914ec-00a8-4734-9557-dd14bc00b1d2 BulkNetworkOpsTestJSON-1775368720 77347f40bf50412eb636412a20c64aaf] create failed
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource Traceback (most recent call last):
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource File "/opt/stack/neutron/neutron/api/v2/resource.py", line 81, in resource
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource result = method(request=request, **args)
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource File "/opt/stack/neutron/neutron/api/v2/base.py", line 431, in create
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource objs = obj_creator(request.context, body, **kwargs)
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource File "/opt/stack/neutron/neutron/db/db_base_plugin_v2.py", line 1310, in create_port_bulk
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource return self._create_bulk('port', context, ports)
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource File "/opt/stack/neutron/neutron/db/db_base_plugin_v2.py", line 896, in _create_bulk
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource {'resource': resource, 'item': item})
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource File "/opt/stack/neutron/neutron/openstack/common/excutils.py", line 82, in __exit__
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource six.reraise(self.type_, self.value, self.tb)
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource File "/opt/stack/neutron/neutron/db/db_base_plugin_v2.py", line 889, in _create_bulk
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource objects.append(obj_creator(context, item))
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource File "/opt/stack/neutron/neutron/plugins/cisco/models/virt_phy_sw_v2.py", line 235, in create_port
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource args)
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource File "/opt/stack/neutron/neutron/plugins/cisco/models/virt_phy_sw_v2.py", line 124, in _invoke_plugin_per_device
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource return func(*args, **kwargs)
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource File "/opt/stack/neutron/neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py", line 1122, in create_port
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource p_profile = self._get_policy_profile_by_name(p_profile_name)
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource File "/opt/stack/neutron/neutron/plugins/cisco/db/n1kv_db_v2.py", line 1603, in _get_policy_profile_by_name
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource filter_by(name=name).one())
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2316, in one
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource raise orm_exc.NoResultFound("No row was found for one()")
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource NoResultFound: No row was found for one()
2014-11-17 10:15:03.366 TRACE neutron.api.v2.resource

Devstack local.conf:

[[local|localrc]]
MYSQL_PASSWORD=nova
RABBIT_PASSWORD=nova
SERVICE_TOKEN=nova
SERVICE_PASSWORD=nova
ADMIN_PASSWORD=nova
ENABLED_SERVICES=g-api,g-reg,key,n-api,n-crt,n-obj,n-cpu,n-cond,cinder,c-sch,c-api,c-vol,n-sch,n-novnc,n-xvnc,n-cauth,rabbit
disable_service horizon
disable_service n-net, q-agt, q-l3
enable_service mysql, q-svc, q-dhcp, q-meta, q-lbaas, neutron, tempest
VOLUME_BACKING_FILE_SIZE=2052M
Q_PLUGIN=cisco
declare -a Q_CISCO_PLUGIN_SUBPLUGINS=(n1kv)
Q_CISCO_PLUGIN_DEVSTACK_VSM=False
Q_CISCO_PLUGIN_VSM_IP=192.168.1.10
Q_CISCO_PLUGIN_VSM_USERNAME=admin
Q_CISCO_PLUGIN_VSM_PASSWORD=Admin12345
Q_CISCO_PLUGIN_UVEM_DEB_IMAGE=nexus_1000v_vem-12.04-5.2.1.SK1.2.1.29.S0-1.deb
Q_CISCO_PLUGIN_INTEGRATION_BRIDGE=br-int
Q_CISCO_PLUGIN_HOST_MGMT_INTF=eth0
PHYSICAL_NETWORK=test-physnet1
LIBVIRT_FIREWALL_DRIVER=nova.virt.firewall.NoopFirewallDriver
API_RATE_LIMIT=False
VERBOSE=True
DEBUG=True

Tags: api cisco n1kv
Andrey Alekov (aalekov)
tags: added: cisco
tags: added: n1kv
information type: Public → Public Security
information type: Public Security → Public
Changed in neutron:
importance: Undecided → Low
status: New → Confirmed
tags: added: api
Changed in neutron:
assignee: nobody → Ann Kamyshnikova (akamyshnikova)
Changed in neutron:
status: Confirmed → In Progress
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix merged to neutron (master)

Reviewed: https://review.openstack.org/135533
Committed: https://git.openstack.org/cgit/openstack/neutron/commit/?id=aef708188554948f84be4ce3cb1b1a8778f6153e
Submitter: Jenkins
Branch: master

commit aef708188554948f84be4ce3cb1b1a8778f6153e
Author: Ann Kamyshnikova <email address hidden>
Date: Wed Nov 19 11:51:14 2014 +0300

    Catch NoResultFound in _get_policy_profile_by_name

    Add try-except in _get_policy_profile_by_name to raise
    proper PolicyProfileNameNotFound if profile not found in
    database.

    Also unittest is added.

    Closes-bug: #1393399

    Change-Id: I3ab50a6870ff77a95e0977c75255e9cbd7286fbb

Changed in neutron:
status: In Progress → Fix Committed
Thierry Carrez (ttx)
Changed in neutron:
milestone: none → kilo-1
status: Fix Committed → Fix Released
Thierry Carrez (ttx)
Changed in neutron:
milestone: kilo-1 → 2015.1.0
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.