Hi Gary, Agreed that the 3 issues you raise need to be fixed. I think they are outside the scope of the blueprint and could be reasonably filed as bugs.
I have a modest proposal: The agents should not be connect to a database. Agents should communicate with a service that allows them to receive and transmit state. If we're going to rewrite this, let's do it right. Thoughts? Maru On 2012-05-03, at 7:36 AM, Gary Kotton wrote: > > Hi, > I have taken a more thorough look at the database implementations. On the > plugin side all of the plugins make use of the common database code > (../quantum/quantum/db/*). Today I tested a number of scenarios with > connectivity to the server. This works well with the linuxbridge and the > openvswitch plugins. Taking into account that we working on the scalability > of the agents > (https://blueprints.launchpad.net/quantum/+spec/scalable-agent-comms), I am > pretty convinced that a large part of the blueprint is redundant. Nonetheless > I still think we need to address > 1. Common configuration for the database strings (similarly to those in > OpenStack) > 2. If the Quantum service starts and the database is down. Quantum service > terminates. Output: > [f17-dev@localhost ~]$ quantum list_nets default > Traceback (most recent call last): > File "/usr/lib/python2.7/site-packages/quantum/client/cli_lib.py", line > 237, in list_nets_v11 > res = client.list_networks(**filters) > File "/usr/lib/python2.7/site-packages/quantum/client/__init__.py", line > 145, in with_params > ret = self.function(instance, *args) > File "/usr/lib/python2.7/site-packages/quantum/client/__init__.py", line > 522, in list_networks > return self.get(self.networks_path, params=filters) > File "/usr/lib/python2.7/site-packages/quantum/client/__init__.py", line > 379, in get > headers=headers, params=params) > File "/usr/lib/python2.7/site-packages/quantum/client/__init__.py", line > 371, in retry_request > raise exceptions.ConnectionFailed(reason=_("Maximum attempts reached")) > ConnectionFailed: Connection to quantum failed: Maximum attempts reached > 3. Error handling - for example when using the CLI and the DB is down we get > the attached output. It would be better if the trace was looged and the user > would receive the specific error message. > [f17-dev@localhost ~]$ quantum list_nets default > Traceback (most recent call last): > File "/usr/lib/python2.7/site-packages/quantum/client/cli_lib.py", line > 237, in list_nets_v11 > res = client.list_networks(**filters) > File "/usr/lib/python2.7/site-packages/quantum/client/__init__.py", line > 145, in with_params > ret = self.function(instance, *args) > File "/usr/lib/python2.7/site-packages/quantum/client/__init__.py", line > 522, in list_networks > ... > raise exceptions.QuantumClientException(message=msg) > QuantumClientException: 500-{'message': 'Traceback (most recent call > last):\n File "/usr/lib/python2.7/site-packages/eventlet/wsgi.py", line 336, > in handle_one_response\n result = self.application(self.environ, > start_response)\n File "/usr/lib/python2.7/site-packages/paste/urlmap.py", > line 203, in __call__\n return app(environ, start_response)\n File > "/usr/lib/python2.7/site-packages/webob/dec.py", line 159, in __call__\n > return resp(environ, start_response)\n File > "/usr/lib/python2.7/site-packages/routes/middleware.py", line 131, in > __call__\n response = self.app(environ, start_response)\n File > "/usr/lib/python2.7/site-packages/webob/dec.py", line 159, in __call__\n > return resp(environ, start_response)\n File > "/usr/lib/python2.7/site-packages/webob/dec.py", line 159, in __call__\n > return resp(environ, start_response)\n File > "/usr/lib/python2.7/site-packages/routes/middleware.py", line 131, in > __call__\n response = self.app(environ, start_response)\n File > "/usr/lib/python2.7/site-packages/webob/dec.py", line 159, in __call__\n > return resp(environ, start_response)\n File > "/usr/lib/python2.7/site-packages/webob/dec.py", line 147, in __call__\n > resp = self.call_func(req, *args, **self.kwargs)\n File > "/usr/lib/python2.7/site-packages/webob/dec.py", line 210, in call_func\n > return self.func(req, *args, **kwargs)\n File > "/usr/lib/python2.7/site-packages/quantum/wsgi.py", line 748, in __call__\n > action_result = self.dispatch(request, action, args)\n File > "/usr/lib/python2.7/site-packages/quantum/wsgi.py", line 780, in dispatch\n > return controller_method(request=request, **action_args)\n File > "/usr/lib/python2.7/site-packages/quantum/api/api_common.py", line 108, in > the_func\n return func(*args, **kwargs)\n File > "/usr/lib/python2.7/site-packages/quantum/api/networks.py", line 101, in > index\n return self._items(request, tenant_id)\n File > "/usr/lib/python2.7/site-packages/quantum/api/networks.py", line 84, in > _items\n filter_opts=filter_opts)\n File > "/usr/lib/python2.7/site-packages/quantum/plugins/linuxbridge/LinuxBridgePlugin.py", > line 71, in get_all_networks\n networks_list = > db.network_list(tenant_id)\n File > "/usr/lib/python2.7/site-packages/quantum/db/api.py", line 131, in > network_list\n filter_by(tenant_id=tenant_id).\\\n File > "/usr/lib64/python2.7/site-packages/sqlalchemy/orm/query.py", line 2066, in > all\n return list(self)\n File > "/usr/lib64/python2.7/site-packages/sqlalchemy/orm/query.py", line 2176, in > __iter__\n return self._execute_and_instances(context)\n File > "/usr/lib64/python2.7/site-packages/sqlalchemy/orm/query.py", line 2189, in > _execute_and_instances\n close_with_result=True)\n File > "/usr/lib64/python2.7/site-packages/sqlalchemy/orm/query.py", line 2180, in > _connection_from_session\n **kw)\n File > "/usr/lib64/python2.7/site-packages/sqlalchemy/orm/session.py", line 729, in > connection\n close_with_result=close_with_result)\n File > "/usr/lib64/python2.7/site-packages/sqlalchemy/orm/session.py", line 735, in > _connection_for_bind\n return engine.contextual_connect(**kwargs)\n File > "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 2476, in > contextual_connect\n self.pool.connect(),\n File > "/usr/lib64/python2.7/site-packages/sqlalchemy/pool.py", line 224, in > connect\n return _ConnectionFairy(self).checkout()\n File > "/usr/lib64/python2.7/site-packages/sqlalchemy/pool.py", line 466, in > checkout\n self.connection = self._connection_record.get_connection()\n > File "/usr/lib64/python2.7/site-packages/sqlalchemy/pool.py", line 300, in > get_connection\n self.connection = self.__connect()\n File > "/usr/lib64/python2.7/site-packages/sqlalchemy/pool.py", line 330, in > __connect\n connection = self.__pool._creator()\n File > "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/strategies.py", line > 80, in connect\n return dialect.connect(*cargs, **cparams)\n File > "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/default.py", line 285, > in connect\n return self.dbapi.connect(*cargs, **cparams)\n File > "/usr/lib64/python2.7/site-packages/MySQLdb/__init__.py", line 81, in > Connect\n return Connection(*args, **kwargs)\n File > "/usr/lib64/python2.7/site-packages/MySQLdb/connections.py", line 187, in > __init__\n super(Connection, self).__init__(*args, > **kwargs2)\nOperationalError: (OperationalError) (2003, "Can\'t connect to > MySQL server on \'localhost.localdomain\' (111)") None None\n'} > > Any thought and or comments. Any objections if I update the blueprint to deal > with the the above items. > Thanks > Gary > > > -- > Mailing list: https://launchpad.net/~netstack > Post to : netstack@lists.launchpad.net > Unsubscribe : https://launchpad.net/~netstack > More help : https://help.launchpad.net/ListHelp -- Mailing list: https://launchpad.net/~netstack Post to : netstack@lists.launchpad.net Unsubscribe : https://launchpad.net/~netstack More help : https://help.launchpad.net/ListHelp