)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":10,"context_line":"and health_monitor to add \"router_id\" attribute."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I12f053e0b0e6cf0813ea88dd568aae49b09b8215"},{"line_number":13,"context_line":"Implements: blueprint routed-service-insertion"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAM3%2F%2FJIM%3D","line":13,"updated":"2013-02-05 19:32:02.000000000","message":"nit: this line should be L11","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":10,"context_line":"and health_monitor to add \"router_id\" attribute."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I12f053e0b0e6cf0813ea88dd568aae49b09b8215"},{"line_number":13,"context_line":"Implements: blueprint routed-service-insertion"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAM3%2F%2FG%2FA%3D","line":13,"in_reply_to":"AAAAM3%2F%2FJIM%3D","updated":"2013-02-13 19:26:43.000000000","message":"Done","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":9,"context_line":"Extend L3 router to add \"service_type_id\" attribute, and LB vip, pool,"},{"line_number":10,"context_line":"and health_monitor to add \"router_id\" attribute."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Addressing comments"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Implements: blueprint routed-service-insertion"},{"line_number":15,"context_line":"Change-Id: I12f053e0b0e6cf0813ea88dd568aae49b09b8215"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"AAAAM3%2F%2B8nU%3D","line":12,"updated":"2013-02-13 17:07:52.000000000","message":"The commit message should not state what you\u0027ve done in the last patchset.\n\nIt will permanently be stored in the repo, whereas all the other patch sets will be lost forever!","commit_id":"799dd32369a30312e29c7c6262060957c3aa5c18"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Extend L3 router to add \"service_type_id\" attribute, and LB vip, pool,"},{"line_number":10,"context_line":"and health_monitor to add \"router_id\" attribute."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Addressing comments"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Implements: blueprint routed-service-insertion"},{"line_number":15,"context_line":"Change-Id: I12f053e0b0e6cf0813ea88dd568aae49b09b8215"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"AAAAM3%2F%2B8R8%3D","line":12,"in_reply_to":"AAAAM3%2F%2B8nU%3D","updated":"2013-02-13 19:41:24.000000000","message":"Done","commit_id":"799dd32369a30312e29c7c6262060957c3aa5c18"},{"author":{"_account_id":447,"name":"dan wendlandt","email":"dan@nicira.com","username":"danwent"},"unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add routed-service-insertion"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Rename ServiceRouterBinding.name to ServiceRouterBinding.resource_type"},{"line_number":10,"context_line":"Addressed comments"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Implements: API and DB model for blueprint routed-service-insertion"},{"line_number":13,"context_line":"Change-Id: I12f053e0b0e6cf0813ea88dd568aae49b09b8215"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"AAAAM3%2F%2B1i0%3D","line":10,"updated":"2013-02-18 02:55:33.000000000","message":"note: commit message should describe the commit as a whole, as would make sense to someone reading it after the final merge.  Comments to reviewers about what changed between patch-sets is best done in gerrit comments.  thanks.","commit_id":"72c7d21257c695b77acf0a14ecae3071a5e408de"}],"quantum/api/extensions.py":[{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":32,"context_line":"from quantum.openstack.common import importutils"},{"line_number":33,"context_line":"from quantum.openstack.common import log as logging"},{"line_number":34,"context_line":"from quantum import wsgi"},{"line_number":35,"context_line":"from quantum.api.v2 import attributes"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"LOG \u003d logging.getLogger(\u0027quantum.api.extensions\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJG8%3D","line":35,"updated":"2013-02-05 19:32:02.000000000","message":"This line should be on L27","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from quantum.openstack.common import importutils"},{"line_number":33,"context_line":"from quantum.openstack.common import log as logging"},{"line_number":34,"context_line":"from quantum import wsgi"},{"line_number":35,"context_line":"from quantum.api.v2 import attributes"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"LOG \u003d logging.getLogger(\u0027quantum.api.extensions\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJFo%3D","line":35,"in_reply_to":"AAAAM3%2F%2FJG8%3D","updated":"2013-02-05 19:59:11.000000000","message":"Done","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"84d7c1a12083d48616b6113c72a495dd10a9a5ff","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                                           ExtensionController(self)))"},{"line_number":388,"context_line":"        for ext in self.extensions.itervalues():"},{"line_number":389,"context_line":"            try:"},{"line_number":390,"context_line":"                attr_maps \u003d ext.get_attribute_map()"},{"line_number":391,"context_line":"                for collection_name, attr_map in attr_maps.iteritems():"},{"line_number":392,"context_line":"                    if collection_name in attributes.RESOURCE_ATTRIBUTE_MAP:"},{"line_number":393,"context_line":"                        attr_map.update("}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJUk%3D","line":390,"updated":"2013-02-05 18:06:57.000000000","message":"So you\u0027re copying the collections map from the main v2 attributes into the extension version.  Why not just do this explicitly in your code?  The attributes map exists at a well know location.","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":387,"context_line":"                                           ExtensionController(self)))"},{"line_number":388,"context_line":"        for ext in self.extensions.itervalues():"},{"line_number":389,"context_line":"            try:"},{"line_number":390,"context_line":"                attr_maps \u003d ext.get_attribute_map()"},{"line_number":391,"context_line":"                for collection_name, attr_map in attr_maps.iteritems():"},{"line_number":392,"context_line":"                    if collection_name in attributes.RESOURCE_ATTRIBUTE_MAP:"},{"line_number":393,"context_line":"                        attr_map.update("}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FIGA%3D","line":390,"in_reply_to":"AAAAM3%2F%2FI7E%3D","updated":"2013-02-06 11:12:44.000000000","message":"Also, you might want to rebase this patch on top of the one you pushed for it.","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                                           ExtensionController(self)))"},{"line_number":388,"context_line":"        for ext in self.extensions.itervalues():"},{"line_number":389,"context_line":"            try:"},{"line_number":390,"context_line":"                attr_maps \u003d ext.get_attribute_map()"},{"line_number":391,"context_line":"                for collection_name, attr_map in attr_maps.iteritems():"},{"line_number":392,"context_line":"                    if collection_name in attributes.RESOURCE_ATTRIBUTE_MAP:"},{"line_number":393,"context_line":"                        attr_map.update("}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FI7E%3D","line":390,"in_reply_to":"AAAAM3%2F%2FJBg%3D","updated":"2013-02-05 21:15:57.000000000","message":"Filed https://bugs.launchpad.net/quantum/+bug/1116664 for this.","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":5201,"name":"Sachin Thakkar","email":"sthakkar@vmware.com","username":"sthakkar"},"unresolved":false,"context_lines":[{"line_number":387,"context_line":"                                           ExtensionController(self)))"},{"line_number":388,"context_line":"        for ext in self.extensions.itervalues():"},{"line_number":389,"context_line":"            try:"},{"line_number":390,"context_line":"                attr_maps \u003d ext.get_attribute_map()"},{"line_number":391,"context_line":"                for collection_name, attr_map in attr_maps.iteritems():"},{"line_number":392,"context_line":"                    if collection_name in attributes.RESOURCE_ATTRIBUTE_MAP:"},{"line_number":393,"context_line":"                        attr_map.update("}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJBg%3D","line":390,"in_reply_to":"AAAAM3%2F%2FJEk%3D","updated":"2013-02-05 20:15:39.000000000","message":"Agree, we should file a bug to track","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                                           ExtensionController(self)))"},{"line_number":388,"context_line":"        for ext in self.extensions.itervalues():"},{"line_number":389,"context_line":"            try:"},{"line_number":390,"context_line":"                attr_maps \u003d ext.get_attribute_map()"},{"line_number":391,"context_line":"                for collection_name, attr_map in attr_maps.iteritems():"},{"line_number":392,"context_line":"                    if collection_name in attributes.RESOURCE_ATTRIBUTE_MAP:"},{"line_number":393,"context_line":"                        attr_map.update("}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJEk%3D","line":390,"in_reply_to":"AAAAM3%2F%2FJHI%3D","updated":"2013-02-05 19:59:11.000000000","message":"should I file another blueprint or a bug for this?","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":387,"context_line":"                                           ExtensionController(self)))"},{"line_number":388,"context_line":"        for ext in self.extensions.itervalues():"},{"line_number":389,"context_line":"            try:"},{"line_number":390,"context_line":"                attr_maps \u003d ext.get_attribute_map()"},{"line_number":391,"context_line":"                for collection_name, attr_map in attr_maps.iteritems():"},{"line_number":392,"context_line":"                    if collection_name in attributes.RESOURCE_ATTRIBUTE_MAP:"},{"line_number":393,"context_line":"                        attr_map.update("}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJHI%3D","line":390,"in_reply_to":"AAAAM3%2F%2FJQU%3D","updated":"2013-02-05 19:32:02.000000000","message":"I agree with Kaiwei. We should support extend extension functionality. However this should be separate patch.","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                                           ExtensionController(self)))"},{"line_number":388,"context_line":"        for ext in self.extensions.itervalues():"},{"line_number":389,"context_line":"            try:"},{"line_number":390,"context_line":"                attr_maps \u003d ext.get_attribute_map()"},{"line_number":391,"context_line":"                for collection_name, attr_map in attr_maps.iteritems():"},{"line_number":392,"context_line":"                    if collection_name in attributes.RESOURCE_ATTRIBUTE_MAP:"},{"line_number":393,"context_line":"                        attr_map.update("}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJQU%3D","line":390,"in_reply_to":"AAAAM3%2F%2FJUk%3D","updated":"2013-02-05 19:17:58.000000000","message":"Here it tries to extend attributes of existing extensions (router/vip/pool/health_monitor) for other extensions (routersvctype and routedsvcinsertion). It can be done in routersvctype to extend router and in routedsvcinsertion to extend vip/pool/health_monitor, but I feel that this should be handled by the infrastructure, just like extending core resources for extensions is handled by the infrastructure, so this can be applied to new extensions should they need to extend other extensions. If you still think we should do this within the extension I\u0027ll make the change.","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"}],"quantum/db/routedserviceinsertion_db.py":[{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":17,"context_line":"# @author: Kaiwei Fan, VMware, Inc"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import sqlalchemy as sa"},{"line_number":20,"context_line":"from sqlalchemy import orm"},{"line_number":21,"context_line":"from sqlalchemy.orm import exc"},{"line_number":22,"context_line":"from sqlalchemy import event"},{"line_number":23,"context_line":"from quantum.db import model_base"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGmQ%3D","line":20,"updated":"2013-02-07 02:40:20.000000000","message":"unused","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":17,"context_line":"# @author: Kaiwei Fan, VMware, Inc"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import sqlalchemy as sa"},{"line_number":20,"context_line":"from sqlalchemy import orm"},{"line_number":21,"context_line":"from sqlalchemy.orm import exc"},{"line_number":22,"context_line":"from sqlalchemy import event"},{"line_number":23,"context_line":"from quantum.db import model_base"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGcI%3D","line":20,"in_reply_to":"AAAAM3%2F%2FGmQ%3D","updated":"2013-02-07 04:09:57.000000000","message":"Done","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":21,"context_line":"from sqlalchemy.orm import exc"},{"line_number":22,"context_line":"from sqlalchemy import event"},{"line_number":23,"context_line":"from quantum.db import model_base"},{"line_number":24,"context_line":"from quantum.db import l3_db"},{"line_number":25,"context_line":"from quantum.db.loadbalancer import loadbalancer_db as lb_db"},{"line_number":26,"context_line":"from quantum.extensions import routedserviceinsertion as rsi"},{"line_number":27,"context_line":"from quantum.common import exceptions as qexception"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGmM%3D","line":24,"updated":"2013-02-07 02:40:20.000000000","message":"unused","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from sqlalchemy.orm import exc"},{"line_number":22,"context_line":"from sqlalchemy import event"},{"line_number":23,"context_line":"from quantum.db import model_base"},{"line_number":24,"context_line":"from quantum.db import l3_db"},{"line_number":25,"context_line":"from quantum.db.loadbalancer import loadbalancer_db as lb_db"},{"line_number":26,"context_line":"from quantum.extensions import routedserviceinsertion as rsi"},{"line_number":27,"context_line":"from quantum.common import exceptions as qexception"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGcE%3D","line":24,"in_reply_to":"AAAAM3%2F%2FGmM%3D","updated":"2013-02-07 04:09:57.000000000","message":"Done","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":22,"context_line":"from sqlalchemy import event"},{"line_number":23,"context_line":"from quantum.db import model_base"},{"line_number":24,"context_line":"from quantum.db import l3_db"},{"line_number":25,"context_line":"from quantum.db.loadbalancer import loadbalancer_db as lb_db"},{"line_number":26,"context_line":"from quantum.extensions import routedserviceinsertion as rsi"},{"line_number":27,"context_line":"from quantum.common import exceptions as qexception"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGmI%3D","line":25,"updated":"2013-02-07 02:40:20.000000000","message":"unused","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from sqlalchemy import event"},{"line_number":23,"context_line":"from quantum.db import model_base"},{"line_number":24,"context_line":"from quantum.db import l3_db"},{"line_number":25,"context_line":"from quantum.db.loadbalancer import loadbalancer_db as lb_db"},{"line_number":26,"context_line":"from quantum.extensions import routedserviceinsertion as rsi"},{"line_number":27,"context_line":"from quantum.common import exceptions as qexception"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGb8%3D","line":25,"in_reply_to":"AAAAM3%2F%2FGmI%3D","updated":"2013-02-07 04:09:57.000000000","message":"Done","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":27,"context_line":"from quantum.common import exceptions as qexception"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class ServiceRouterBinding(model_base.BASEV2):"},{"line_number":31,"context_line":"    id \u003d sa.Column(sa.String(36),"},{"line_number":32,"context_line":"                   primary_key\u003dTrue)"},{"line_number":33,"context_line":"    name \u003d sa.Column(sa.String(36),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGm8%3D","line":30,"updated":"2013-02-07 02:40:20.000000000","message":"If you inherit from models_v2.HasId you can get rid of line 31. \n\nfrom quantum.db import models_v2\n\nclass ServiceRouterBinding(model_base.BASEV2, models_v2.HasId):","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from quantum.common import exceptions as qexception"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class ServiceRouterBinding(model_base.BASEV2):"},{"line_number":31,"context_line":"    id \u003d sa.Column(sa.String(36),"},{"line_number":32,"context_line":"                   primary_key\u003dTrue)"},{"line_number":33,"context_line":"    name \u003d sa.Column(sa.String(36),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGaY%3D","line":30,"in_reply_to":"AAAAM3%2F%2FGm8%3D","updated":"2013-02-07 04:09:57.000000000","message":"I think this id is a little different than the id in HasId (although from function\u0027s perspective there is probably no difference). The id here is copied from some resource, while the id from HasId is more like self-generated Id. That\u0027s why I didn\u0027t inherit from HasId.","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":56,"context_line":"class RoutedServiceInsertionDbMixin(object):"},{"line_number":57,"context_line":"    \"\"\"Mixin class to add router service insertion.\"\"\""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def _process_create_resource_router_id(self, context, obj, model):"},{"line_number":60,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":61,"context_line":"            db \u003d ServiceRouterBinding("},{"line_number":62,"context_line":"                id\u003dobj[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGmY%3D","line":59,"updated":"2013-02-07 02:40:20.000000000","message":"nit: can you change obj to something more descriptive?","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":56,"context_line":"class RoutedServiceInsertionDbMixin(object):"},{"line_number":57,"context_line":"    \"\"\"Mixin class to add router service insertion.\"\"\""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def _process_create_resource_router_id(self, context, obj, model):"},{"line_number":60,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":61,"context_line":"            db \u003d ServiceRouterBinding("},{"line_number":62,"context_line":"                id\u003dobj[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGZ4%3D","line":59,"in_reply_to":"AAAAM3%2F%2FGmY%3D","updated":"2013-02-07 04:09:57.000000000","message":"use \u0027resource\u0027 instead.","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":65,"context_line":"            context.session.add(db)"},{"line_number":66,"context_line":"        return self._make_resource_router_id_dict(db, model)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def _extend_resource_router_id_dict(self, context, obj, model):"},{"line_number":69,"context_line":"        obj[rsi.ROUTER_ID] \u003d self._get_resource_router_id_binding("},{"line_number":70,"context_line":"            context, obj[\u0027id\u0027], model)"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGlQ%3D","line":68,"updated":"2013-02-07 02:40:20.000000000","message":"ditto","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            context.session.add(db)"},{"line_number":66,"context_line":"        return self._make_resource_router_id_dict(db, model)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def _extend_resource_router_id_dict(self, context, obj, model):"},{"line_number":69,"context_line":"        obj[rsi.ROUTER_ID] \u003d self._get_resource_router_id_binding("},{"line_number":70,"context_line":"            context, obj[\u0027id\u0027], model)"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGZ0%3D","line":68,"in_reply_to":"AAAAM3%2F%2FGlQ%3D","updated":"2013-02-07 04:09:57.000000000","message":"Done","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":704,"name":"Edgar Magana","email":"emagana@gmail.com","username":"emagana"},"unresolved":false,"context_lines":[{"line_number":19,"context_line":"import sqlalchemy as sa"},{"line_number":20,"context_line":"from sqlalchemy.orm import exc"},{"line_number":21,"context_line":"from sqlalchemy import event"},{"line_number":22,"context_line":"from quantum.db import model_base"},{"line_number":23,"context_line":"from quantum.extensions import routedserviceinsertion as rsi"},{"line_number":24,"context_line":"from quantum.common import exceptions as qexception"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FGL0%3D","line":22,"updated":"2013-02-07 07:51:07.000000000","message":"There should be a space between these imports","commit_id":"27bc1285f8625b850d3d850afb9e399c9404b61e"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import sqlalchemy as sa"},{"line_number":20,"context_line":"from sqlalchemy.orm import exc"},{"line_number":21,"context_line":"from sqlalchemy import event"},{"line_number":22,"context_line":"from quantum.db import model_base"},{"line_number":23,"context_line":"from quantum.extensions import routedserviceinsertion as rsi"},{"line_number":24,"context_line":"from quantum.common import exceptions as qexception"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FFlM%3D","line":22,"in_reply_to":"AAAAM3%2F%2FGL0%3D","updated":"2013-02-07 15:16:21.000000000","message":"Done","commit_id":"27bc1285f8625b850d3d850afb9e399c9404b61e"},{"author":{"_account_id":704,"name":"Edgar Magana","email":"emagana@gmail.com","username":"emagana"},"unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"@event.listens_for(ServiceRouterBinding.name, \u0027set\u0027, retval\u003dTrue)"},{"line_number":43,"context_line":"def validate_name(target, value, oldvalue, initiator):"},{"line_number":44,"context_line":"    \"\"\""},{"line_number":45,"context_line":"    Make sure the resources name fit the name column"},{"line_number":46,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FGLs%3D","line":43,"updated":"2013-02-07 07:51:07.000000000","message":"I dont see target, oldvalue and initiator being used here","commit_id":"27bc1285f8625b850d3d850afb9e399c9404b61e"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"@event.listens_for(ServiceRouterBinding.name, \u0027set\u0027, retval\u003dTrue)"},{"line_number":43,"context_line":"def validate_name(target, value, oldvalue, initiator):"},{"line_number":44,"context_line":"    \"\"\""},{"line_number":45,"context_line":"    Make sure the resources name fit the name column"},{"line_number":46,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FFkg%3D","line":43,"in_reply_to":"AAAAM3%2F%2FGLs%3D","updated":"2013-02-07 15:16:21.000000000","message":"This is the format defined by sqlalchemy.","commit_id":"27bc1285f8625b850d3d850afb9e399c9404b61e"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":44,"context_line":"def validate_name(target, value, oldvalue, initiator):"},{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":"    Make sure the resources name fit the name column"},{"line_number":47,"context_line":"    \"\"\""},{"line_number":48,"context_line":"    maxlen \u003d ServiceRouterBinding.name.property.columns[0].type.length"},{"line_number":49,"context_line":"    if len(value) \u003e maxlen:"},{"line_number":50,"context_line":"        raise AttributeException(name\u003dvalue, maxlen\u003dmaxlen)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAM3%2F%2FC2g%3D","line":47,"updated":"2013-02-09 06:50:13.000000000","message":"Nit: suggest changing the comment style to the HACKING convention.","commit_id":"0d761f4e5c6cd22d6d435ca426482a8c15ff774d"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":44,"context_line":"def validate_name(target, value, oldvalue, initiator):"},{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":"    Make sure the resources name fit the name column"},{"line_number":47,"context_line":"    \"\"\""},{"line_number":48,"context_line":"    maxlen \u003d ServiceRouterBinding.name.property.columns[0].type.length"},{"line_number":49,"context_line":"    if len(value) \u003e maxlen:"},{"line_number":50,"context_line":"        raise AttributeException(name\u003dvalue, maxlen\u003dmaxlen)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAM3%2F%2FAz8%3D","line":47,"in_reply_to":"AAAAM3%2F%2FC2g%3D","updated":"2013-02-11 17:34:40.000000000","message":"Done","commit_id":"0d761f4e5c6cd22d6d435ca426482a8c15ff774d"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 Nicira Networks, Inc.  All rights reserved."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2B55s%3D","line":3,"updated":"2013-02-14 22:17:07.000000000","message":"VMWare?","commit_id":"a751ec2b588907433446081fed62aa1d9aa21899"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 Nicira Networks, Inc.  All rights reserved."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2B54I%3D","line":3,"in_reply_to":"AAAAM3%2F%2B55s%3D","updated":"2013-02-14 22:36:31.000000000","message":"Done","commit_id":"a751ec2b588907433446081fed62aa1d9aa21899"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from sqlalchemy import event"},{"line_number":20,"context_line":"from sqlalchemy.orm import exc"},{"line_number":21,"context_line":"import sqlalchemy as sa"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from quantum.common import exceptions as qexception"},{"line_number":24,"context_line":"from quantum.db import model_base"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B3CU%3D","line":21,"updated":"2013-02-16 10:26:10.000000000","message":"I have a suspect this might have to go before line 19, but I\u0027m not sure whether HACKING rules state the alias is part of the string to be ordered.\n\nIf unsure, leave the code as it is.","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from sqlalchemy import event"},{"line_number":20,"context_line":"from sqlalchemy.orm import exc"},{"line_number":21,"context_line":"import sqlalchemy as sa"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from quantum.common import exceptions as qexception"},{"line_number":24,"context_line":"from quantum.db import model_base"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B23s%3D","line":21,"in_reply_to":"AAAAM3%2F%2B3CU%3D","updated":"2013-02-16 17:52:44.000000000","message":"Yeah. It says \"Order your imports by the full module path\" so I think it should move to LN 19.","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":25,"context_line":"from quantum.extensions import routedserviceinsertion as rsi"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class ServiceRouterBinding(model_base.BASEV2):"},{"line_number":29,"context_line":"    id \u003d sa.Column(sa.String(36),"},{"line_number":30,"context_line":"                   primary_key\u003dTrue)"},{"line_number":31,"context_line":"    name \u003d sa.Column(sa.String(36),"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B3CA%3D","line":28,"updated":"2013-02-16 10:26:10.000000000","message":"There\u0027s something I need to be clarified here (sorry if I ask a dumb question).\n\nThe id here look like to be for an advanced service. It could lbaas now, but a lot of things in the future.\n\nSo you can\u0027t know which table this is in. For this reason, is it safe to make this id a primary_key?","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from quantum.extensions import routedserviceinsertion as rsi"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class ServiceRouterBinding(model_base.BASEV2):"},{"line_number":29,"context_line":"    id \u003d sa.Column(sa.String(36),"},{"line_number":30,"context_line":"                   primary_key\u003dTrue)"},{"line_number":31,"context_line":"    name \u003d sa.Column(sa.String(36),"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B220%3D","line":28,"in_reply_to":"AAAAM3%2F%2B3CA%3D","updated":"2013-02-16 17:52:44.000000000","message":"This is id of resources that need to be attached to a router, such as VIP, Pool, HealthMonitor, and any other resources in the future. I use their (id, model_name) as the primary key. I\u0027ll rename them to (resource_id, resource_name).","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class ServiceRouterBinding(model_base.BASEV2):"},{"line_number":29,"context_line":"    id \u003d sa.Column(sa.String(36),"},{"line_number":30,"context_line":"                   primary_key\u003dTrue)"},{"line_number":31,"context_line":"    name \u003d sa.Column(sa.String(36),"},{"line_number":32,"context_line":"                     primary_key\u003dTrue)"},{"line_number":33,"context_line":"    router_id \u003d sa.Column(sa.String(36),"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B3CI%3D","line":30,"updated":"2013-02-16 10:26:10.000000000","message":"Optional comment: If you want a primary key field called \u0027id\u0027, just inherit from HasId","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class ServiceRouterBinding(model_base.BASEV2):"},{"line_number":29,"context_line":"    id \u003d sa.Column(sa.String(36),"},{"line_number":30,"context_line":"                   primary_key\u003dTrue)"},{"line_number":31,"context_line":"    name \u003d sa.Column(sa.String(36),"},{"line_number":32,"context_line":"                     primary_key\u003dTrue)"},{"line_number":33,"context_line":"    router_id \u003d sa.Column(sa.String(36),"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B22w%3D","line":30,"in_reply_to":"AAAAM3%2F%2B3CI%3D","updated":"2013-02-16 17:52:44.000000000","message":"Renamed to resource_id.","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":29,"context_line":"    id \u003d sa.Column(sa.String(36),"},{"line_number":30,"context_line":"                   primary_key\u003dTrue)"},{"line_number":31,"context_line":"    name \u003d sa.Column(sa.String(36),"},{"line_number":32,"context_line":"                     primary_key\u003dTrue)"},{"line_number":33,"context_line":"    router_id \u003d sa.Column(sa.String(36),"},{"line_number":34,"context_line":"                          sa.ForeignKey(\u0027routers.id\u0027),"},{"line_number":35,"context_line":"                          nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B3CE%3D","line":32,"updated":"2013-02-16 10:26:10.000000000","message":"What is the name here?\nAlso - quantum convention is to not have unique names.\n\nOf course, this unless your intention is to have a primary key made by the couple (service_name, service_id) which is totally right, and in that case you should consider renaming the attributes here.","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":29,"context_line":"    id \u003d sa.Column(sa.String(36),"},{"line_number":30,"context_line":"                   primary_key\u003dTrue)"},{"line_number":31,"context_line":"    name \u003d sa.Column(sa.String(36),"},{"line_number":32,"context_line":"                     primary_key\u003dTrue)"},{"line_number":33,"context_line":"    router_id \u003d sa.Column(sa.String(36),"},{"line_number":34,"context_line":"                          sa.ForeignKey(\u0027routers.id\u0027),"},{"line_number":35,"context_line":"                          nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B2xY%3D","line":32,"in_reply_to":"AAAAM3%2F%2B22o%3D","updated":"2013-02-16 19:34:18.000000000","message":"Yes, that\u0027s fine I think","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    id \u003d sa.Column(sa.String(36),"},{"line_number":30,"context_line":"                   primary_key\u003dTrue)"},{"line_number":31,"context_line":"    name \u003d sa.Column(sa.String(36),"},{"line_number":32,"context_line":"                     primary_key\u003dTrue)"},{"line_number":33,"context_line":"    router_id \u003d sa.Column(sa.String(36),"},{"line_number":34,"context_line":"                          sa.ForeignKey(\u0027routers.id\u0027),"},{"line_number":35,"context_line":"                          nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B22o%3D","line":32,"in_reply_to":"AAAAM3%2F%2B3CE%3D","updated":"2013-02-16 17:52:44.000000000","message":"Yes, we want to use (id, name) as the primary key. Will rename them to (resource_id, resource_name).","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":35,"context_line":"                          nullable\u003dFalse)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class AttributeException(qexception.QuantumException):"},{"line_number":39,"context_line":"    message \u003d _(\"Resource name \u0027%(name)s\u0027 is longer \""},{"line_number":40,"context_line":"                \"than %(maxlen)d characters\")"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B3CQ%3D","line":38,"updated":"2013-02-16 10:26:10.000000000","message":"Has this been added to the faultmap?\n\nWhen this is raised, you probably want to return a 400, not 500, to the user. This can be achieve either by adding your new exception to the faultmap, or by inheriting from an exc class which is already mapped to a 400 in the faultmap.","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":35,"context_line":"                          nullable\u003dFalse)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class AttributeException(qexception.QuantumException):"},{"line_number":39,"context_line":"    message \u003d _(\"Resource name \u0027%(name)s\u0027 is longer \""},{"line_number":40,"context_line":"                \"than %(maxlen)d characters\")"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B2xU%3D","line":38,"in_reply_to":"AAAAM3%2F%2B22M%3D","updated":"2013-02-16 19:34:18.000000000","message":"\u0027Educate\u0027 is a big word :)\nI have even been unable to educate myself so far....\n\nFAULT_MAP is defined in quantum.api.v2.base\nIt\u0027s just a dict that maps a quantum exception to a webob exception.\nYou can either update it in your extension module, or simply inherit your exceptions from one which is already mapped to webob.exc.HttpBadRequest.\n\nFor instance, quantum.common.exceptions.InvalidInput","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                          nullable\u003dFalse)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class AttributeException(qexception.QuantumException):"},{"line_number":39,"context_line":"    message \u003d _(\"Resource name \u0027%(name)s\u0027 is longer \""},{"line_number":40,"context_line":"                \"than %(maxlen)d characters\")"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B2pk%3D","line":38,"in_reply_to":"AAAAM3%2F%2B2xU%3D","updated":"2013-02-16 23:00:49.000000000","message":"Looks at those exceptions defined in FAULT_MAP I\u0027m wondering maybe we should just return 500 here.\n\nThe exception is mostly internal and has nothing to do with user input/state. As long as new added modules has done and passed their unit-tests, this exception should never happen anymore.","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                          nullable\u003dFalse)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class AttributeException(qexception.QuantumException):"},{"line_number":39,"context_line":"    message \u003d _(\"Resource name \u0027%(name)s\u0027 is longer \""},{"line_number":40,"context_line":"                \"than %(maxlen)d characters\")"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B22M%3D","line":38,"in_reply_to":"AAAAM3%2F%2B3CQ%3D","updated":"2013-02-16 17:52:44.000000000","message":"Can you educate me how to add this to faultmap?","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":40,"context_line":"                \"than %(maxlen)d characters\")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"@event.listens_for(ServiceRouterBinding.name, \u0027set\u0027, retval\u003dTrue)"},{"line_number":44,"context_line":"def validate_name(target, value, oldvalue, initiator):"},{"line_number":45,"context_line":"    \"\"\"Make sure the resources name fit the name column.\"\"\""},{"line_number":46,"context_line":"    maxlen \u003d ServiceRouterBinding.name.property.columns[0].type.length"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B3CM%3D","line":43,"updated":"2013-02-16 10:26:10.000000000","message":"I have nothing against this way of validating data, but why did you choose against an API layer validator as the other extensions do?","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":40,"context_line":"                \"than %(maxlen)d characters\")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"@event.listens_for(ServiceRouterBinding.name, \u0027set\u0027, retval\u003dTrue)"},{"line_number":44,"context_line":"def validate_name(target, value, oldvalue, initiator):"},{"line_number":45,"context_line":"    \"\"\"Make sure the resources name fit the name column.\"\"\""},{"line_number":46,"context_line":"    maxlen \u003d ServiceRouterBinding.name.property.columns[0].type.length"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B2xQ%3D","line":43,"in_reply_to":"AAAAM3%2F%2B22Q%3D","updated":"2013-02-16 19:34:18.000000000","message":"I meant using the validators that are processed in the controller before the call if even dispatched to the plugin.\n\nBasically, it\u0027s a simple mechanism that allows you to call a specific function for validating a given attribute. If this function does not return anything then the validation is passed.\nOtherwise it returns an error message.\n\nIf you deem this could be done, but don\u0027t feel like doing it, please add a #TODO(your-lp-name) here - and filing a LP bug after this patch is merged would help too.","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                \"than %(maxlen)d characters\")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"@event.listens_for(ServiceRouterBinding.name, \u0027set\u0027, retval\u003dTrue)"},{"line_number":44,"context_line":"def validate_name(target, value, oldvalue, initiator):"},{"line_number":45,"context_line":"    \"\"\"Make sure the resources name fit the name column.\"\"\""},{"line_number":46,"context_line":"    maxlen \u003d ServiceRouterBinding.name.property.columns[0].type.length"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B2pY%3D","line":43,"in_reply_to":"AAAAM3%2F%2B2xQ%3D","updated":"2013-02-16 23:00:49.000000000","message":"Oh, this name (renamed to resource_name) is not one of the attributed passed from API so API validator does not apply here. This name is the table name used by sqlalchemy, such as vips, pools, health_monitors.","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                \"than %(maxlen)d characters\")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"@event.listens_for(ServiceRouterBinding.name, \u0027set\u0027, retval\u003dTrue)"},{"line_number":44,"context_line":"def validate_name(target, value, oldvalue, initiator):"},{"line_number":45,"context_line":"    \"\"\"Make sure the resources name fit the name column.\"\"\""},{"line_number":46,"context_line":"    maxlen \u003d ServiceRouterBinding.name.property.columns[0].type.length"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B22Q%3D","line":43,"in_reply_to":"AAAAM3%2F%2B3CM%3D","updated":"2013-02-16 17:52:44.000000000","message":"Do you mean using a setter and validate it inside the setter? I remember I encountered some error when using a setter but cannot remember what the error is now.","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":56,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":57,"context_line":"            db \u003d ServiceRouterBinding("},{"line_number":58,"context_line":"                id\u003dresource[\u0027id\u0027],"},{"line_number":59,"context_line":"                name\u003dmodel.__tablename__,"},{"line_number":60,"context_line":"                router_id\u003dresource[rsi.ROUTER_ID])"},{"line_number":61,"context_line":"            context.session.add(db)"},{"line_number":62,"context_line":"        return self._make_resource_router_id_dict(db, model)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B2po%3D","line":59,"updated":"2013-02-16 22:59:24.000000000","message":"The name value here is going to be awkward because it will always be plural.  Not sure we should tie the names to tablenames.","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":57,"context_line":"            db \u003d ServiceRouterBinding("},{"line_number":58,"context_line":"                id\u003dresource[\u0027id\u0027],"},{"line_number":59,"context_line":"                name\u003dmodel.__tablename__,"},{"line_number":60,"context_line":"                router_id\u003dresource[rsi.ROUTER_ID])"},{"line_number":61,"context_line":"            context.session.add(db)"},{"line_number":62,"context_line":"        return self._make_resource_router_id_dict(db, model)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B2oQ%3D","line":59,"in_reply_to":"AAAAM3%2F%2B2po%3D","updated":"2013-02-16 23:14:15.000000000","message":"We just need a name to uniquely identify the type of a resource_id, and tablename looks most suitable to me. I renamed this to resource_name, or you think \"collection_name\" is better? Or any other suggestion?\n\nTheoretically we don\u0027t need a name here if we assume uuids never collides. But adding a name to uniquely identify the type of resources may be useful in the future.","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":70,"context_line":"        query \u003d self._model_query(context, ServiceRouterBinding)"},{"line_number":71,"context_line":"        query \u003d query.filter(ServiceRouterBinding.id \u003d\u003d resource_id,"},{"line_number":72,"context_line":"                             ServiceRouterBinding.name \u003d\u003d model.__tablename__)"},{"line_number":73,"context_line":"        try:"},{"line_number":74,"context_line":"            return query.one()"},{"line_number":75,"context_line":"        except exc.NoResultFound:"},{"line_number":76,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B2ps%3D","line":73,"updated":"2013-02-16 22:59:24.000000000","message":"Replace lines 73-76:\n\nreturn query.first()","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        query \u003d self._model_query(context, ServiceRouterBinding)"},{"line_number":71,"context_line":"        query \u003d query.filter(ServiceRouterBinding.id \u003d\u003d resource_id,"},{"line_number":72,"context_line":"                             ServiceRouterBinding.name \u003d\u003d model.__tablename__)"},{"line_number":73,"context_line":"        try:"},{"line_number":74,"context_line":"            return query.one()"},{"line_number":75,"context_line":"        except exc.NoResultFound:"},{"line_number":76,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B2og%3D","line":73,"in_reply_to":"AAAAM3%2F%2B2ps%3D","updated":"2013-02-16 23:14:15.000000000","message":"Yes, that\u0027s what I was looking for. I remember there is such a function but cannot find it (I\u0027m a python newbie).","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"@event.listens_for(ServiceRouterBinding.resource_type, \u0027set\u0027, retval\u003dTrue)"},{"line_number":44,"context_line":"def validate_name(target, value, oldvalue, initiator):"},{"line_number":45,"context_line":"    \"\"\"Make sure the resources name fit the name column.\"\"\""},{"line_number":46,"context_line":"    maxlen \u003d ServiceRouterBinding.resource_type.property.columns[0].type.length"},{"line_number":47,"context_line":"    if len(value) \u003e maxlen:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAM3%2F%2B1H0%3D","line":44,"updated":"2013-02-18 09:55:14.000000000","message":"name is a bit confusing - the resource_type is validated.","commit_id":"9ba6b879e15ffb4397785d00dc4a4563e0abe0de"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"@event.listens_for(ServiceRouterBinding.resource_type, \u0027set\u0027, retval\u003dTrue)"},{"line_number":44,"context_line":"def validate_name(target, value, oldvalue, initiator):"},{"line_number":45,"context_line":"    \"\"\"Make sure the resources name fit the name column.\"\"\""},{"line_number":46,"context_line":"    maxlen \u003d ServiceRouterBinding.resource_type.property.columns[0].type.length"},{"line_number":47,"context_line":"    if len(value) \u003e maxlen:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAM3%2F%2B0hs%3D","line":44,"in_reply_to":"AAAAM3%2F%2B0nE%3D","updated":"2013-02-18 16:21:55.000000000","message":"Great.","commit_id":"9ba6b879e15ffb4397785d00dc4a4563e0abe0de"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"@event.listens_for(ServiceRouterBinding.resource_type, \u0027set\u0027, retval\u003dTrue)"},{"line_number":44,"context_line":"def validate_name(target, value, oldvalue, initiator):"},{"line_number":45,"context_line":"    \"\"\"Make sure the resources name fit the name column.\"\"\""},{"line_number":46,"context_line":"    maxlen \u003d ServiceRouterBinding.resource_type.property.columns[0].type.length"},{"line_number":47,"context_line":"    if len(value) \u003e maxlen:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAM3%2F%2B0nE%3D","line":44,"in_reply_to":"AAAAM3%2F%2B1H0%3D","updated":"2013-02-18 15:43:31.000000000","message":"Will rename it to validate_resource_type and change the exception message as well.","commit_id":"9ba6b879e15ffb4397785d00dc4a4563e0abe0de"}],"quantum/db/routedsvcinsertion_db.py":[{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"84d7c1a12083d48616b6113c72a495dd10a9a5ff","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from quantum.extensions import routedsvcinsertion as rsi"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class VipRouterBinding(model_base.BASEV2):"},{"line_number":30,"context_line":"    res_id \u003d sa.Column(sa.String(36),"},{"line_number":31,"context_line":"                       sa.ForeignKey(\u0027vips.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":32,"context_line":"                       primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJT0%3D","line":29,"updated":"2013-02-05 18:06:57.000000000","message":"Do we really need 3 models with the same fields?  Can\u0027t we inheritance or some type of binding_type field?","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from quantum.extensions import routedsvcinsertion as rsi"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class VipRouterBinding(model_base.BASEV2):"},{"line_number":30,"context_line":"    res_id \u003d sa.Column(sa.String(36),"},{"line_number":31,"context_line":"                       sa.ForeignKey(\u0027vips.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":32,"context_line":"                       primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FGws%3D","line":29,"in_reply_to":"AAAAM3%2F%2FJJo%3D","updated":"2013-02-13 19:26:43.000000000","message":"OK, I decided to just use one table and added \"name\" column to the table that represent the resource name (ex. vips, pools...etc)","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from quantum.extensions import routedsvcinsertion as rsi"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class VipRouterBinding(model_base.BASEV2):"},{"line_number":30,"context_line":"    res_id \u003d sa.Column(sa.String(36),"},{"line_number":31,"context_line":"                       sa.ForeignKey(\u0027vips.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":32,"context_line":"                       primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJJo%3D","line":29,"in_reply_to":"AAAAM3%2F%2FJT0%3D","updated":"2013-02-05 19:17:58.000000000","message":"I have same debate myself as well. I want to have foreign key relationship to keep the database consistent so I need 3 models. On the other hand, this makes all future services that want to implement routed service insertion to have a separate model for their resources. Either way has pros and cons and I\u0027m not particular favor of anyone. Please advice which one is preferred in openstack/quantum model.","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"84d7c1a12083d48616b6113c72a495dd10a9a5ff","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class VipRouterBinding(model_base.BASEV2):"},{"line_number":30,"context_line":"    res_id \u003d sa.Column(sa.String(36),"},{"line_number":31,"context_line":"                       sa.ForeignKey(\u0027vips.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":32,"context_line":"                       primary_key\u003dTrue)"},{"line_number":33,"context_line":"    router_id \u003d sa.Column(sa.String(36),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJTw%3D","line":30,"updated":"2013-02-05 18:06:57.000000000","message":"res_id.. Consider a more descriptive name: resource_id?","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class VipRouterBinding(model_base.BASEV2):"},{"line_number":30,"context_line":"    res_id \u003d sa.Column(sa.String(36),"},{"line_number":31,"context_line":"                       sa.ForeignKey(\u0027vips.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":32,"context_line":"                       primary_key\u003dTrue)"},{"line_number":33,"context_line":"    router_id \u003d sa.Column(sa.String(36),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJLo%3D","line":30,"in_reply_to":"AAAAM3%2F%2FJTw%3D","updated":"2013-02-05 19:17:58.000000000","message":"Done","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":53,"context_line":"                          nullable\u003dFalse)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class RoutedSvcInsertionDbMixin(object):"},{"line_number":57,"context_line":"    \"\"\"Mixin class to add router service insertion.\"\"\""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def _process_create_res_router_id(self, context, obj, model):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJGw%3D","line":56,"updated":"2013-02-05 19:32:02.000000000","message":"I prefer service than SVC. IMO, we should avoid to use abbr.","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                          nullable\u003dFalse)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class RoutedSvcInsertionDbMixin(object):"},{"line_number":57,"context_line":"    \"\"\"Mixin class to add router service insertion.\"\"\""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def _process_create_res_router_id(self, context, obj, model):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJD0%3D","line":56,"in_reply_to":"AAAAM3%2F%2FJGw%3D","updated":"2013-02-05 19:59:11.000000000","message":"Done","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"84d7c1a12083d48616b6113c72a495dd10a9a5ff","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    def _get_res_router_id_binding(self, context, res_id, model):"},{"line_number":72,"context_line":"        query \u003d self._model_query(context, model)"},{"line_number":73,"context_line":"        query \u003d query.filter(model.res_id \u003d\u003d res_id)"},{"line_number":74,"context_line":"        if query.count() \u003d\u003d 0:"},{"line_number":75,"context_line":"            return None"},{"line_number":76,"context_line":"        binding \u003d query.one()"},{"line_number":77,"context_line":"        return binding[rsi.ROUTER_ID]"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJUc%3D","line":74,"updated":"2013-02-05 18:06:57.000000000","message":"You\u0027re issuing two queries to the db.  Replace lines 74-77\n\ntry: \n    return query.one()[rsi.ROUTER_ID]\nexcept exc.NoResultFound:\n    return None","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    def _get_res_router_id_binding(self, context, res_id, model):"},{"line_number":72,"context_line":"        query \u003d self._model_query(context, model)"},{"line_number":73,"context_line":"        query \u003d query.filter(model.res_id \u003d\u003d res_id)"},{"line_number":74,"context_line":"        if query.count() \u003d\u003d 0:"},{"line_number":75,"context_line":"            return None"},{"line_number":76,"context_line":"        binding \u003d query.one()"},{"line_number":77,"context_line":"        return binding[rsi.ROUTER_ID]"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJLc%3D","line":74,"in_reply_to":"AAAAM3%2F%2FJUc%3D","updated":"2013-02-05 19:17:58.000000000","message":"Done","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"}],"quantum/db/routerservicetype_db.py":[{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":17,"context_line":"# @author: Kaiwei Fan, VMware, Inc"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import sqlalchemy as sa"},{"line_number":20,"context_line":"from sqlalchemy import orm"},{"line_number":21,"context_line":"from sqlalchemy.orm import exc"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from quantum.db import model_base"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGmE%3D","line":20,"updated":"2013-02-07 02:40:20.000000000","message":"nit: unsed","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":17,"context_line":"# @author: Kaiwei Fan, VMware, Inc"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import sqlalchemy as sa"},{"line_number":20,"context_line":"from sqlalchemy import orm"},{"line_number":21,"context_line":"from sqlalchemy.orm import exc"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from quantum.db import model_base"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGZg%3D","line":20,"in_reply_to":"AAAAM3%2F%2FGmE%3D","updated":"2013-02-07 04:09:57.000000000","message":"Done","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":21,"context_line":"from sqlalchemy.orm import exc"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from quantum.db import model_base"},{"line_number":24,"context_line":"from quantum.db import l3_db"},{"line_number":25,"context_line":"from quantum.db import servicetype_db"},{"line_number":26,"context_line":"from quantum.extensions import routerservicetype as rst"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGl8%3D","line":24,"updated":"2013-02-07 02:40:20.000000000","message":"nit: unsed","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from sqlalchemy.orm import exc"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from quantum.db import model_base"},{"line_number":24,"context_line":"from quantum.db import l3_db"},{"line_number":25,"context_line":"from quantum.db import servicetype_db"},{"line_number":26,"context_line":"from quantum.extensions import routerservicetype as rst"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGZc%3D","line":24,"in_reply_to":"AAAAM3%2F%2FGl8%3D","updated":"2013-02-07 04:09:57.000000000","message":"Done","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from quantum.db import model_base"},{"line_number":24,"context_line":"from quantum.db import l3_db"},{"line_number":25,"context_line":"from quantum.db import servicetype_db"},{"line_number":26,"context_line":"from quantum.extensions import routerservicetype as rst"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGl4%3D","line":25,"updated":"2013-02-07 02:40:20.000000000","message":"nit: unsed","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from quantum.db import model_base"},{"line_number":24,"context_line":"from quantum.db import l3_db"},{"line_number":25,"context_line":"from quantum.db import servicetype_db"},{"line_number":26,"context_line":"from quantum.extensions import routerservicetype as rst"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGZU%3D","line":25,"in_reply_to":"AAAAM3%2F%2FGl4%3D","updated":"2013-02-07 04:09:57.000000000","message":"Done","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":59,"context_line":"            return None"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _make_router_service_type_id_dict(self, router_service_type,"},{"line_number":62,"context_line":"                                          fields\u003dNone):"},{"line_number":63,"context_line":"        res \u003d {\u0027router_id\u0027: router_service_type[\u0027router_id\u0027],"},{"line_number":64,"context_line":"               \u0027service_type_id\u0027: router_service_type[rst.SERVICE_TYPE_ID]}"},{"line_number":65,"context_line":"        return self._fields(res, fields)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2B8mc%3D","line":62,"updated":"2013-02-13 17:07:52.000000000","message":"The fields parameter seems unnecessary in this case.","commit_id":"799dd32369a30312e29c7c6262060957c3aa5c18"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            return None"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _make_router_service_type_id_dict(self, router_service_type,"},{"line_number":62,"context_line":"                                          fields\u003dNone):"},{"line_number":63,"context_line":"        res \u003d {\u0027router_id\u0027: router_service_type[\u0027router_id\u0027],"},{"line_number":64,"context_line":"               \u0027service_type_id\u0027: router_service_type[rst.SERVICE_TYPE_ID]}"},{"line_number":65,"context_line":"        return self._fields(res, fields)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2B8Tc%3D","line":62,"in_reply_to":"AAAAM3%2F%2B8mc%3D","updated":"2013-02-13 19:41:24.000000000","message":"Done","commit_id":"799dd32369a30312e29c7c6262060957c3aa5c18"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 Nicira Networks, Inc.  All rights reserved."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":7,"context_line":"#    a copy of the License at"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2B55k%3D","line":4,"updated":"2013-02-14 22:17:07.000000000","message":"VMWare?","commit_id":"a751ec2b588907433446081fed62aa1d9aa21899"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 Nicira Networks, Inc.  All rights reserved."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":7,"context_line":"#    a copy of the License at"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2B54A%3D","line":4,"in_reply_to":"AAAAM3%2F%2B55k%3D","updated":"2013-02-14 22:36:31.000000000","message":"Done","commit_id":"a751ec2b588907433446081fed62aa1d9aa21899"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":28,"context_line":"                          sa.ForeignKey(\u0027routers.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":29,"context_line":"                          primary_key\u003dTrue)"},{"line_number":30,"context_line":"    service_type_id \u003d sa.Column(sa.String(36),"},{"line_number":31,"context_line":"                                sa.ForeignKey(\u0027servicetypes.id\u0027),"},{"line_number":32,"context_line":"                                nullable\u003dFalse)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B2pQ%3D","line":31,"updated":"2013-02-16 22:59:24.000000000","message":"Shouldn\u0027t there be an on delete cascade here too?  Or do you want a service deletion to fail it is still attached to a router?","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":28,"context_line":"                          sa.ForeignKey(\u0027routers.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":29,"context_line":"                          primary_key\u003dTrue)"},{"line_number":30,"context_line":"    service_type_id \u003d sa.Column(sa.String(36),"},{"line_number":31,"context_line":"                                sa.ForeignKey(\u0027servicetypes.id\u0027),"},{"line_number":32,"context_line":"                                nullable\u003dFalse)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B2os%3D","line":31,"in_reply_to":"AAAAM3%2F%2B2pQ%3D","updated":"2013-02-16 23:14:15.000000000","message":"Yes, I don\u0027t want service_type to be deleted if it is still used. It will be unexpected that a router is deleted when a service_type is deleted, and it is not easy to just delete a service from a router when we delete a service_type.","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":53,"context_line":"        query \u003d self._model_query(context, RouterServiceTypeBinding)"},{"line_number":54,"context_line":"        query \u003d query.filter("},{"line_number":55,"context_line":"            RouterServiceTypeBinding.router_id \u003d\u003d router_id)"},{"line_number":56,"context_line":"        try:"},{"line_number":57,"context_line":"            return query.one()"},{"line_number":58,"context_line":"        except exc.NoResultFound:"},{"line_number":59,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B2pg%3D","line":56,"updated":"2013-02-16 22:59:24.000000000","message":"Can be simplified:\n\nreturn query.first()","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        query \u003d self._model_query(context, RouterServiceTypeBinding)"},{"line_number":54,"context_line":"        query \u003d query.filter("},{"line_number":55,"context_line":"            RouterServiceTypeBinding.router_id \u003d\u003d router_id)"},{"line_number":56,"context_line":"        try:"},{"line_number":57,"context_line":"            return query.one()"},{"line_number":58,"context_line":"        except exc.NoResultFound:"},{"line_number":59,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B2o8%3D","line":56,"in_reply_to":"AAAAM3%2F%2B2pg%3D","updated":"2013-02-16 23:14:15.000000000","message":"Done","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"}],"quantum/db/routersvctype_db.py":[{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":26,"context_line":"from quantum.extensions import routersvctype as rst"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class RouterSvcTypeBinding(model_base.BASEV2):"},{"line_number":30,"context_line":"    router_id \u003d sa.Column(sa.String(36),"},{"line_number":31,"context_line":"                          sa.ForeignKey(\u0027routers.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":32,"context_line":"                          primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJGc%3D","line":29,"updated":"2013-02-05 19:32:02.000000000","message":"Svc -\u003e service","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from quantum.extensions import routersvctype as rst"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class RouterSvcTypeBinding(model_base.BASEV2):"},{"line_number":30,"context_line":"    router_id \u003d sa.Column(sa.String(36),"},{"line_number":31,"context_line":"                          sa.ForeignKey(\u0027routers.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":32,"context_line":"                          primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJDw%3D","line":29,"in_reply_to":"AAAAM3%2F%2FJGc%3D","updated":"2013-02-05 19:59:11.000000000","message":"Done","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":35,"context_line":"                                nullable\u003dFalse)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class RouterSvcTypeDbMixin(object):"},{"line_number":39,"context_line":"    \"\"\"Mixin class to add router service type.\"\"\""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def _process_create_router_service_type_id(self, context, router):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJGg%3D","line":38,"updated":"2013-02-05 19:32:02.000000000","message":"Svc -\u003e service","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                                nullable\u003dFalse)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class RouterSvcTypeDbMixin(object):"},{"line_number":39,"context_line":"    \"\"\"Mixin class to add router service type.\"\"\""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def _process_create_router_service_type_id(self, context, router):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJDs%3D","line":38,"in_reply_to":"AAAAM3%2F%2FJGg%3D","updated":"2013-02-05 19:59:11.000000000","message":"Done","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def _process_create_router_service_type_id(self, context, router):"},{"line_number":42,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":43,"context_line":"            db \u003d RouterSvcTypeBinding("},{"line_number":44,"context_line":"                router_id\u003drouter[\u0027id\u0027],"},{"line_number":45,"context_line":"                service_type_id\u003drouter[rst.SERVICE_TYPE_ID])"},{"line_number":46,"context_line":"            context.session.add(db)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJGU%3D","line":43,"updated":"2013-02-05 19:32:02.000000000","message":"Svc -\u003e service","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def _process_create_router_service_type_id(self, context, router):"},{"line_number":42,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":43,"context_line":"            db \u003d RouterSvcTypeBinding("},{"line_number":44,"context_line":"                router_id\u003drouter[\u0027id\u0027],"},{"line_number":45,"context_line":"                service_type_id\u003drouter[rst.SERVICE_TYPE_ID])"},{"line_number":46,"context_line":"            context.session.add(db)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJDo%3D","line":43,"in_reply_to":"AAAAM3%2F%2FJGU%3D","updated":"2013-02-05 19:59:11.000000000","message":"Done","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"84d7c1a12083d48616b6113c72a495dd10a9a5ff","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        query \u003d self._model_query(context, RouterSvcTypeBinding)"},{"line_number":55,"context_line":"        query \u003d query.filter("},{"line_number":56,"context_line":"            RouterSvcTypeBinding.router_id \u003d\u003d router_id)"},{"line_number":57,"context_line":"        if query.count() \u003d\u003d 0:"},{"line_number":58,"context_line":"            return None"},{"line_number":59,"context_line":"        binding \u003d query.one()"},{"line_number":60,"context_line":"        return binding[rst.SERVICE_TYPE_ID]"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJTM%3D","line":57,"updated":"2013-02-05 18:06:57.000000000","message":"You\u0027re issuing two queries to the db.  Replace lines 57-60:\n\ntry: \n    return query.one()[rst.SERVICE_TYPE_ID]\nexcept exc.NoResultFound:\n    return None","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        query \u003d self._model_query(context, RouterSvcTypeBinding)"},{"line_number":55,"context_line":"        query \u003d query.filter("},{"line_number":56,"context_line":"            RouterSvcTypeBinding.router_id \u003d\u003d router_id)"},{"line_number":57,"context_line":"        if query.count() \u003d\u003d 0:"},{"line_number":58,"context_line":"            return None"},{"line_number":59,"context_line":"        binding \u003d query.one()"},{"line_number":60,"context_line":"        return binding[rst.SERVICE_TYPE_ID]"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FJJU%3D","line":57,"in_reply_to":"AAAAM3%2F%2FJTM%3D","updated":"2013-02-05 19:17:58.000000000","message":"Done","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"}],"quantum/extensions/l3.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    @classmethod"},{"line_number":186,"context_line":"    def get_attributes_map(cls):"},{"line_number":187,"context_line":"        return RESOURCE_ATTRIBUTE_MAP"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    @classmethod"},{"line_number":190,"context_line":"    def get_resources(cls):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2B8nI%3D","line":187,"updated":"2013-02-13 17:07:52.000000000","message":"See my comments on the dependent patch regarding changes to the extension, and please let me know what you think of them!","commit_id":"799dd32369a30312e29c7c6262060957c3aa5c18"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    @classmethod"},{"line_number":186,"context_line":"    def get_attributes_map(cls):"},{"line_number":187,"context_line":"        return RESOURCE_ATTRIBUTE_MAP"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    @classmethod"},{"line_number":190,"context_line":"    def get_resources(cls):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2B8TY%3D","line":187,"in_reply_to":"AAAAM3%2F%2B8nI%3D","updated":"2013-02-13 19:41:24.000000000","message":"Done","commit_id":"799dd32369a30312e29c7c6262060957c3aa5c18"}],"quantum/extensions/loadbalancer.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    @classmethod"},{"line_number":259,"context_line":"    def get_attributes_map(cls):"},{"line_number":260,"context_line":"        return RESOURCE_ATTRIBUTE_MAP"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    @classmethod"},{"line_number":263,"context_line":"    def get_resources(cls):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2B8mQ%3D","line":260,"updated":"2013-02-13 17:07:52.000000000","message":"See my comment on the dependent patch regarding changes to extension modules.","commit_id":"799dd32369a30312e29c7c6262060957c3aa5c18"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    @classmethod"},{"line_number":259,"context_line":"    def get_attributes_map(cls):"},{"line_number":260,"context_line":"        return RESOURCE_ATTRIBUTE_MAP"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    @classmethod"},{"line_number":263,"context_line":"    def get_resources(cls):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2B8TU%3D","line":260,"in_reply_to":"AAAAM3%2F%2B8mQ%3D","updated":"2013-02-13 19:41:24.000000000","message":"Done","commit_id":"799dd32369a30312e29c7c6262060957c3aa5c18"}],"quantum/extensions/routedserviceinsertion.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":24,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid_or_none\u0027: None},"},{"line_number":25,"context_line":"                    \u0027default\u0027: None, \u0027is_visible\u0027: True},"},{"line_number":26,"context_line":"    },"},{"line_number":27,"context_line":"    \u0027pools\u0027: {"},{"line_number":28,"context_line":"        ROUTER_ID: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":29,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid_or_none\u0027: None},"},{"line_number":30,"context_line":"                    \u0027default\u0027: None, \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2B8l8%3D","line":27,"updated":"2013-02-13 17:07:52.000000000","message":"I had a comment on pset 2 concerning whether pools and health monitors should be linked to a service type too.\n\nIn the comment I wrote that you could ignore it if it was irrelevant to you. I guess it is irrelevant?","commit_id":"799dd32369a30312e29c7c6262060957c3aa5c18"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":24,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid_or_none\u0027: None},"},{"line_number":25,"context_line":"                    \u0027default\u0027: None, \u0027is_visible\u0027: True},"},{"line_number":26,"context_line":"    },"},{"line_number":27,"context_line":"    \u0027pools\u0027: {"},{"line_number":28,"context_line":"        ROUTER_ID: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":29,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid_or_none\u0027: None},"},{"line_number":30,"context_line":"                    \u0027default\u0027: None, \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2B76E%3D","line":27,"in_reply_to":"AAAAM3%2F%2B78o%3D","updated":"2013-02-13 21:56:16.000000000","message":"The work flow is to create Pool first, then create VIP. HealthMonitor can be created before or after both resources.\n\nOne complication if we do not associate router_id with pool/health_monitor is, when a plugin gets a create/update/delete request, it needs to know if the resource has been created on a real LB appliance or not. If not, the plugin only needs to update DB, otherwise it needs to update LB appliance as well.\n\nIt doesn\u0027t make sense to use one VIP on one router but use a Pool on another router. Probably all LB appliances will require all resources are on same appliance. However this is not forced so I do not check if router_id matches. Therefore if a plugin has its reasons to do that, they can put them on different routers.","commit_id":"799dd32369a30312e29c7c6262060957c3aa5c18"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":24,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid_or_none\u0027: None},"},{"line_number":25,"context_line":"                    \u0027default\u0027: None, \u0027is_visible\u0027: True},"},{"line_number":26,"context_line":"    },"},{"line_number":27,"context_line":"    \u0027pools\u0027: {"},{"line_number":28,"context_line":"        ROUTER_ID: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":29,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid_or_none\u0027: None},"},{"line_number":30,"context_line":"                    \u0027default\u0027: None, \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2B78o%3D","line":27,"in_reply_to":"AAAAM3%2F%2B8SI%3D","updated":"2013-02-13 21:40:20.000000000","message":"I see - what\u0027s the complication here more in detail?\n\nIs there also a use case for a VIP mapped to a router id and a pool mapped to another? In that case it\u0027s perfectly fine to have router_id everywhere,","commit_id":"799dd32369a30312e29c7c6262060957c3aa5c18"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":24,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid_or_none\u0027: None},"},{"line_number":25,"context_line":"                    \u0027default\u0027: None, \u0027is_visible\u0027: True},"},{"line_number":26,"context_line":"    },"},{"line_number":27,"context_line":"    \u0027pools\u0027: {"},{"line_number":28,"context_line":"        ROUTER_ID: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":29,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid_or_none\u0027: None},"},{"line_number":30,"context_line":"                    \u0027default\u0027: None, \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2B8SI%3D","line":27,"in_reply_to":"AAAAM3%2F%2B8l8%3D","updated":"2013-02-13 19:41:24.000000000","message":"I replied that in patch set 2 but I forgot the submit the review.\n\nBasically current lbaas work flow requires pool/health_monitor to associate with router_id so the plugins do not need to handle complicated logic.","commit_id":"799dd32369a30312e29c7c6262060957c3aa5c18"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":37,"context_line":"}"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class Routedserviceinsertion(object):"},{"line_number":41,"context_line":"    \"\"\"Extension class supporting routed service type.\"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2B8l4%3D","line":40,"updated":"2013-02-13 17:07:52.000000000","message":"Are you planning to use this extension in future for all services, or is it just for load balancing?\n\nIn the latter case, I would consider a rename.","commit_id":"799dd32369a30312e29c7c6262060957c3aa5c18"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":37,"context_line":"}"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class Routedserviceinsertion(object):"},{"line_number":41,"context_line":"    \"\"\"Extension class supporting routed service type.\"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2B8SE%3D","line":40,"in_reply_to":"AAAAM3%2F%2B8l4%3D","updated":"2013-02-13 19:41:24.000000000","message":"Intended for all routed insertion service.","commit_id":"799dd32369a30312e29c7c6262060957c3aa5c18"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 Nicira Networks, Inc.  All rights reserved."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":7,"context_line":"#    a copy of the License at"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2B55g%3D","line":4,"updated":"2013-02-14 22:17:07.000000000","message":"VMWare?","commit_id":"a751ec2b588907433446081fed62aa1d9aa21899"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 Nicira Networks, Inc.  All rights reserved."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":7,"context_line":"#    a copy of the License at"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2B538%3D","line":4,"in_reply_to":"AAAAM3%2F%2B55g%3D","updated":"2013-02-14 22:36:31.000000000","message":"Done","commit_id":"a751ec2b588907433446081fed62aa1d9aa21899"}],"quantum/extensions/routedsvcinsertion.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":30,"context_line":"    \u0027pools\u0027: {"},{"line_number":31,"context_line":"        ROUTER_ID: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":32,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid_or_none\u0027: None},"},{"line_number":33,"context_line":"                    \u0027default\u0027: None, \u0027is_visible\u0027: True},"},{"line_number":34,"context_line":"    },"},{"line_number":35,"context_line":"    \u0027health_monitors\u0027: {"},{"line_number":36,"context_line":"        ROUTER_ID: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FIE4%3D","line":33,"updated":"2013-02-06 11:12:44.000000000","message":"At this stage I would consider the routed insertion of the VIP only, as I have some questions on what a router on pools and health monitors would mean...\n- Should I be able to configure a VIP on a router, and then connect it to a pool on another router. If yes, what does it mean in terms of topology?\n- How can a health monitor on router X monitor a pool on router Y?\n- I was expecting a model where you create a VIP on a router, and then all the associated resources, like pools and health monitors, should be on the same router. Is that a valid one? Can we avoid specific router_id for pools and health monitors in this case?\n\nOf course if you already have answers for the above question disregards my comment!","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    \u0027pools\u0027: {"},{"line_number":31,"context_line":"        ROUTER_ID: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":32,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid_or_none\u0027: None},"},{"line_number":33,"context_line":"                    \u0027default\u0027: None, \u0027is_visible\u0027: True},"},{"line_number":34,"context_line":"    },"},{"line_number":35,"context_line":"    \u0027health_monitors\u0027: {"},{"line_number":36,"context_line":"        ROUTER_ID: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FHYA%3D","line":33,"in_reply_to":"AAAAM3%2F%2FIE4%3D","updated":"2013-02-13 19:26:43.000000000","message":"The work flow for LBaaS model is:\n1. create pool\n2. add member to pool\n3. create VIP using a pool that\u0027s already being created\n\nI agree that puting router_id only to VIP is cleaner, but it depends on how much we want the plugin to handle itself. If we only add router_id to VIP, the plugin needs to handle extra logics when creating/updatiung pool/health_monitor:\n1. if no VIP is using the pool/health_monitor, we only handle DB changes.\n2. If the pool/health_monitor is already being used by a VIP, the plugin needs to do actual configuration on LB appliances.\n3. When creating a VIP, the plugin needs to query database, gets all pool/member/health_monitor and configures the LB appliance accordingly.","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class Routedsvcinsertion(object):"},{"line_number":44,"context_line":"    \"\"\"Extension class supporting routed service type"},{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @classmethod"},{"line_number":48,"context_line":"    def get_name(cls):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FIEw%3D","line":45,"updated":"2013-02-06 11:12:44.000000000","message":"Is this extension specific to LB? In that case a better alias and class name would LBaaSRouterSvcInsertion","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class Routedsvcinsertion(object):"},{"line_number":44,"context_line":"    \"\"\"Extension class supporting routed service type"},{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @classmethod"},{"line_number":48,"context_line":"    def get_name(cls):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FG8E%3D","line":45,"in_reply_to":"AAAAM3%2F%2FIEw%3D","updated":"2013-02-13 19:26:43.000000000","message":"It\u0027s not just for LB, its for all services. New services need to update the EXTENDED_ATTRIBUTES_2_0 to include models they want to extend.","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"}],"quantum/extensions/routerservicetype.py":[{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 Nicira Networks, Inc.  All rights reserved."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2B55c%3D","line":3,"updated":"2013-02-14 22:17:07.000000000","message":"VMWare?","commit_id":"a751ec2b588907433446081fed62aa1d9aa21899"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 Nicira Networks, Inc.  All rights reserved."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2B530%3D","line":3,"in_reply_to":"AAAAM3%2F%2B55c%3D","updated":"2013-02-14 22:36:31.000000000","message":"Done","commit_id":"a751ec2b588907433446081fed62aa1d9aa21899"}],"quantum/tests/unit/test_routerserviceinsertion.py":[{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":30,"context_line":"from quantum.api.extensions import ExtensionMiddleware"},{"line_number":31,"context_line":"from quantum.api.extensions import PluginAwareExtensionManager"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"from quantum.extensions import servicetype"},{"line_number":34,"context_line":"from quantum.extensions import routerservicetype as rst"},{"line_number":35,"context_line":"from quantum.extensions import routedserviceinsertion as rsi"},{"line_number":36,"context_line":"from quantum.db.loadbalancer import loadbalancer_db as lb_db"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGl0%3D","line":33,"updated":"2013-02-07 02:40:20.000000000","message":"nit: unused","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from quantum.api.extensions import ExtensionMiddleware"},{"line_number":31,"context_line":"from quantum.api.extensions import PluginAwareExtensionManager"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"from quantum.extensions import servicetype"},{"line_number":34,"context_line":"from quantum.extensions import routerservicetype as rst"},{"line_number":35,"context_line":"from quantum.extensions import routedserviceinsertion as rsi"},{"line_number":36,"context_line":"from quantum.db.loadbalancer import loadbalancer_db as lb_db"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGU4%3D","line":33,"in_reply_to":"AAAAM3%2F%2FGl0%3D","updated":"2013-02-07 04:14:18.000000000","message":"Done","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":68,"context_line":"                context, router)"},{"line_number":69,"context_line":"            if router[\u0027router\u0027].get(rst.SERVICE_TYPE_ID) is not None:"},{"line_number":70,"context_line":"                r[rst.SERVICE_TYPE_ID] \u003d router[\u0027router\u0027][rst.SERVICE_TYPE_ID]"},{"line_number":71,"context_line":"                rsbind \u003d self._process_create_router_service_type_id("},{"line_number":72,"context_line":"                    context, r)"},{"line_number":73,"context_line":"        return r"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGlw%3D","line":71,"updated":"2013-02-07 02:40:20.000000000","message":"nit: rsbinding unsed","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                context, router)"},{"line_number":69,"context_line":"            if router[\u0027router\u0027].get(rst.SERVICE_TYPE_ID) is not None:"},{"line_number":70,"context_line":"                r[rst.SERVICE_TYPE_ID] \u003d router[\u0027router\u0027][rst.SERVICE_TYPE_ID]"},{"line_number":71,"context_line":"                rsbind \u003d self._process_create_router_service_type_id("},{"line_number":72,"context_line":"                    context, r)"},{"line_number":73,"context_line":"        return r"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGXk%3D","line":71,"in_reply_to":"AAAAM3%2F%2FGlw%3D","updated":"2013-02-07 04:09:57.000000000","message":"Done","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":73,"context_line":"        return r"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def get_router(self, context, id, fields\u003dNone):"},{"line_number":76,"context_line":"        r \u003d super(RouterServiceInsertionTestPlugin, self).get_router("},{"line_number":77,"context_line":"            context, id, fields)"},{"line_number":78,"context_line":"        sid \u003d self._get_router_service_type_id_binding(context, id)"},{"line_number":79,"context_line":"        if sid:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGk8%3D","line":76,"updated":"2013-02-07 02:40:20.000000000","message":"76-77 should be within: with context.session.begin(subtransactions\u003dTrue):","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        return r"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def get_router(self, context, id, fields\u003dNone):"},{"line_number":76,"context_line":"        r \u003d super(RouterServiceInsertionTestPlugin, self).get_router("},{"line_number":77,"context_line":"            context, id, fields)"},{"line_number":78,"context_line":"        sid \u003d self._get_router_service_type_id_binding(context, id)"},{"line_number":79,"context_line":"        if sid:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGXg%3D","line":76,"in_reply_to":"AAAAM3%2F%2FGk8%3D","updated":"2013-02-07 04:09:57.000000000","message":"Done","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":80,"context_line":"            r[rst.SERVICE_TYPE_ID] \u003d sid"},{"line_number":81,"context_line":"        return r"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def create_resource(self, res, context, obj, model):"},{"line_number":84,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":85,"context_line":"            o \u003d getattr(super(RouterServiceInsertionTestPlugin, self),"},{"line_number":86,"context_line":"                        \"create_{0}\".format(res))(context, obj)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGk4%3D","line":83,"updated":"2013-02-07 02:40:20.000000000","message":"nit: obj -\u003e more descriptive","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            r[rst.SERVICE_TYPE_ID] \u003d sid"},{"line_number":81,"context_line":"        return r"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def create_resource(self, res, context, obj, model):"},{"line_number":84,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":85,"context_line":"            o \u003d getattr(super(RouterServiceInsertionTestPlugin, self),"},{"line_number":86,"context_line":"                        \"create_{0}\".format(res))(context, obj)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGXc%3D","line":83,"in_reply_to":"AAAAM3%2F%2FGk4%3D","updated":"2013-02-07 04:09:57.000000000","message":"Done","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def create_resource(self, res, context, obj, model):"},{"line_number":84,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":85,"context_line":"            o \u003d getattr(super(RouterServiceInsertionTestPlugin, self),"},{"line_number":86,"context_line":"                        \"create_{0}\".format(res))(context, obj)"},{"line_number":87,"context_line":"            if obj[res].get(rsi.ROUTER_ID) is not None:"},{"line_number":88,"context_line":"                o[rsi.ROUTER_ID] \u003d obj[res][rsi.ROUTER_ID]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGh4%3D","line":85,"updated":"2013-02-07 02:40:20.000000000","message":"why do we need to call getattr() here? Looks like just doing super here would do it. \nnit: can we change o to something more descriptive","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def create_resource(self, res, context, obj, model):"},{"line_number":84,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":85,"context_line":"            o \u003d getattr(super(RouterServiceInsertionTestPlugin, self),"},{"line_number":86,"context_line":"                        \"create_{0}\".format(res))(context, obj)"},{"line_number":87,"context_line":"            if obj[res].get(rsi.ROUTER_ID) is not None:"},{"line_number":88,"context_line":"                o[rsi.ROUTER_ID] \u003d obj[res][rsi.ROUTER_ID]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGXM%3D","line":85,"in_reply_to":"AAAAM3%2F%2FGh4%3D","updated":"2013-02-07 04:09:57.000000000","message":"because we need to get the function name from res first, and then use getattr to get the callable function. I changed this to:\n        func_name \u003d \"get_{0}\".format(res)\n        o \u003d getattr(super(RouterServiceInsertionTestPlugin, self),\n                    func_name)(context, id, fields)","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":86,"context_line":"                        \"create_{0}\".format(res))(context, obj)"},{"line_number":87,"context_line":"            if obj[res].get(rsi.ROUTER_ID) is not None:"},{"line_number":88,"context_line":"                o[rsi.ROUTER_ID] \u003d obj[res][rsi.ROUTER_ID]"},{"line_number":89,"context_line":"                orbind \u003d self._process_create_resource_router_id("},{"line_number":90,"context_line":"                    context, o, model)"},{"line_number":91,"context_line":"        return o"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGls%3D","line":89,"updated":"2013-02-07 02:40:20.000000000","message":"nit: orbind unsed","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                        \"create_{0}\".format(res))(context, obj)"},{"line_number":87,"context_line":"            if obj[res].get(rsi.ROUTER_ID) is not None:"},{"line_number":88,"context_line":"                o[rsi.ROUTER_ID] \u003d obj[res][rsi.ROUTER_ID]"},{"line_number":89,"context_line":"                orbind \u003d self._process_create_resource_router_id("},{"line_number":90,"context_line":"                    context, o, model)"},{"line_number":91,"context_line":"        return o"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGU0%3D","line":89,"in_reply_to":"AAAAM3%2F%2FGls%3D","updated":"2013-02-07 04:14:18.000000000","message":"Done","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":150,"context_line":"            {constants.LOADBALANCER: RouterServiceInsertionTestPlugin()}"},{"line_number":151,"context_line":"        )"},{"line_number":152,"context_line":"        PluginAwareExtensionManager._instance \u003d ext_mgr"},{"line_number":153,"context_line":"        api \u003d APIRouter()"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        app \u003d config.load_paste_app(\u0027extensions_test_app\u0027)"},{"line_number":156,"context_line":"        self.ext_api \u003d ExtensionMiddleware(app, ext_mgr\u003dext_mgr)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGlo%3D","line":153,"updated":"2013-02-07 02:40:20.000000000","message":"nit unused","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":150,"context_line":"            {constants.LOADBALANCER: RouterServiceInsertionTestPlugin()}"},{"line_number":151,"context_line":"        )"},{"line_number":152,"context_line":"        PluginAwareExtensionManager._instance \u003d ext_mgr"},{"line_number":153,"context_line":"        api \u003d APIRouter()"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        app \u003d config.load_paste_app(\u0027extensions_test_app\u0027)"},{"line_number":156,"context_line":"        self.ext_api \u003d ExtensionMiddleware(app, ext_mgr\u003dext_mgr)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGXE%3D","line":153,"in_reply_to":"AAAAM3%2F%2FGlo%3D","updated":"2013-02-07 04:09:57.000000000","message":"Done","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":209,"context_line":"        self.assertEqual(res[\u0027router\u0027][\u0027service_type_id\u0027],"},{"line_number":210,"context_line":"                         self._service_type_id)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    def test_router_update(self):"},{"line_number":213,"context_line":"        router \u003d self._router_create(self._service_type_id)"},{"line_number":214,"context_line":"        router_id \u003d router[\u0027id\u0027]"},{"line_number":215,"context_line":"        del router[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGkU%3D","line":212,"updated":"2013-02-07 02:40:20.000000000","message":"Looks like this method should probably have some asserts?","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        self.assertEqual(res[\u0027router\u0027][\u0027service_type_id\u0027],"},{"line_number":210,"context_line":"                         self._service_type_id)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    def test_router_update(self):"},{"line_number":213,"context_line":"        router \u003d self._router_create(self._service_type_id)"},{"line_number":214,"context_line":"        router_id \u003d router[\u0027id\u0027]"},{"line_number":215,"context_line":"        del router[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGWk%3D","line":212,"in_reply_to":"AAAAM3%2F%2FGkU%3D","updated":"2013-02-07 04:09:57.000000000","message":"This function is to test service_type_id cannot be updated. If it can, an exception will be raised to indicate error.","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":215,"context_line":"        del router[\u0027id\u0027]"},{"line_number":216,"context_line":"        del router[\u0027tenant_id\u0027]"},{"line_number":217,"context_line":"        del router[\u0027status\u0027]"},{"line_number":218,"context_line":"        data \u003d {\"router\": router}"},{"line_number":219,"context_line":"        error \u003d False"},{"line_number":220,"context_line":"        try:"},{"line_number":221,"context_line":"            res \u003d self._do_request("}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGkk%3D","line":218,"updated":"2013-02-07 02:40:20.000000000","message":"It looks like you create a router then remove id, tenent_id, status from the result and pass it back in to update. Could you write this as : \n\ndata \u003d {\u0027router\u0027: { fields you are passing in so that the reader doesn\u0027t have to know exactly what _router_create is returning?","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        del router[\u0027id\u0027]"},{"line_number":216,"context_line":"        del router[\u0027tenant_id\u0027]"},{"line_number":217,"context_line":"        del router[\u0027status\u0027]"},{"line_number":218,"context_line":"        data \u003d {\"router\": router}"},{"line_number":219,"context_line":"        error \u003d False"},{"line_number":220,"context_line":"        try:"},{"line_number":221,"context_line":"            res \u003d self._do_request("}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGXA%3D","line":218,"in_reply_to":"AAAAM3%2F%2FGkk%3D","updated":"2013-02-07 04:09:57.000000000","message":"Done","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":220,"context_line":"        try:"},{"line_number":221,"context_line":"            res \u003d self._do_request("},{"line_number":222,"context_line":"                \u0027PUT\u0027, _get_path(\u0027routers/{0}\u0027.format(router_id)), data)"},{"line_number":223,"context_line":"        except Exception as e:"},{"line_number":224,"context_line":"            error \u003d True"},{"line_number":225,"context_line":"        if not error:"},{"line_number":226,"context_line":"            raise Exception(\"service_type_id should not be updatable\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGlk%3D","line":223,"updated":"2013-02-07 02:40:20.000000000","message":"nit: except Execption:","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        try:"},{"line_number":221,"context_line":"            res \u003d self._do_request("},{"line_number":222,"context_line":"                \u0027PUT\u0027, _get_path(\u0027routers/{0}\u0027.format(router_id)), data)"},{"line_number":223,"context_line":"        except Exception as e:"},{"line_number":224,"context_line":"            error \u003d True"},{"line_number":225,"context_line":"        if not error:"},{"line_number":226,"context_line":"            raise Exception(\"service_type_id should not be updatable\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGW8%3D","line":223,"in_reply_to":"AAAAM3%2F%2FGlk%3D","updated":"2013-02-07 04:09:57.000000000","message":"Done","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":222,"context_line":"                \u0027PUT\u0027, _get_path(\u0027routers/{0}\u0027.format(router_id)), data)"},{"line_number":223,"context_line":"        except Exception as e:"},{"line_number":224,"context_line":"            error \u003d True"},{"line_number":225,"context_line":"        if not error:"},{"line_number":226,"context_line":"            raise Exception(\"service_type_id should not be updatable\")"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        del router[\u0027service_type_id\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGkc%3D","line":225,"updated":"2013-02-07 02:40:20.000000000","message":"why not raise in the exception rather than setting error \u003d True and then later checking for that?","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":222,"context_line":"                \u0027PUT\u0027, _get_path(\u0027routers/{0}\u0027.format(router_id)), data)"},{"line_number":223,"context_line":"        except Exception as e:"},{"line_number":224,"context_line":"            error \u003d True"},{"line_number":225,"context_line":"        if not error:"},{"line_number":226,"context_line":"            raise Exception(\"service_type_id should not be updatable\")"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        del router[\u0027service_type_id\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGW4%3D","line":225,"in_reply_to":"AAAAM3%2F%2FGkc%3D","updated":"2013-02-07 04:09:57.000000000","message":"because an exception should happen here, if an exception is not raised, it means the service_type_id is updated and an exception should be raised to indicate error.","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":223,"context_line":"        except Exception as e:"},{"line_number":224,"context_line":"            error \u003d True"},{"line_number":225,"context_line":"        if not error:"},{"line_number":226,"context_line":"            raise Exception(\"service_type_id should not be updatable\")"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        del router[\u0027service_type_id\u0027]"},{"line_number":229,"context_line":"        res \u003d self._do_request("}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGkY%3D","line":226,"updated":"2013-02-07 02:40:20.000000000","message":"Shouldn\u0027t the API layer prevent this from happening all together?","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        except Exception as e:"},{"line_number":224,"context_line":"            error \u003d True"},{"line_number":225,"context_line":"        if not error:"},{"line_number":226,"context_line":"            raise Exception(\"service_type_id should not be updatable\")"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        del router[\u0027service_type_id\u0027]"},{"line_number":229,"context_line":"        res \u003d self._do_request("}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGW0%3D","line":226,"in_reply_to":"AAAAM3%2F%2FGkY%3D","updated":"2013-02-07 04:09:57.000000000","message":"Yes, and this is the unit-test to confirm the API handles it correctly.","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":226,"context_line":"            raise Exception(\"service_type_id should not be updatable\")"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        del router[\u0027service_type_id\u0027]"},{"line_number":229,"context_line":"        res \u003d self._do_request("},{"line_number":230,"context_line":"            \u0027PUT\u0027, _get_path(\u0027routers/{0}\u0027.format(router_id)), data)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def test_router_delete(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGlc%3D","line":229,"updated":"2013-02-07 02:40:20.000000000","message":"nit: res unused","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":226,"context_line":"            raise Exception(\"service_type_id should not be updatable\")"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        del router[\u0027service_type_id\u0027]"},{"line_number":229,"context_line":"        res \u003d self._do_request("},{"line_number":230,"context_line":"            \u0027PUT\u0027, _get_path(\u0027routers/{0}\u0027.format(router_id)), data)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def test_router_delete(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGWw%3D","line":229,"in_reply_to":"AAAAM3%2F%2FGlc%3D","updated":"2013-02-07 04:09:57.000000000","message":"Done","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":232,"context_line":"    def test_router_delete(self):"},{"line_number":233,"context_line":"        router \u003d self._router_create(self._service_type_id)"},{"line_number":234,"context_line":"        self._do_request("},{"line_number":235,"context_line":"            \u0027DELETE\u0027, _get_path(\u0027routers/{0}\u0027.format(router[\u0027id\u0027])))"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def _test_lb_setup(self):"},{"line_number":238,"context_line":"        self._subnet_id \u003d _uuid()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGkQ%3D","line":235,"updated":"2013-02-07 02:40:20.000000000","message":"Should assert and check the status","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":232,"context_line":"    def test_router_delete(self):"},{"line_number":233,"context_line":"        router \u003d self._router_create(self._service_type_id)"},{"line_number":234,"context_line":"        self._do_request("},{"line_number":235,"context_line":"            \u0027DELETE\u0027, _get_path(\u0027routers/{0}\u0027.format(router[\u0027id\u0027])))"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def _test_lb_setup(self):"},{"line_number":238,"context_line":"        self._subnet_id \u003d _uuid()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGWg%3D","line":235,"in_reply_to":"AAAAM3%2F%2FGkQ%3D","updated":"2013-02-07 04:09:57.000000000","message":"This test is not unit-test for L3 functionality, but for deleting router-service-type binding so didn\u0027t check it. The plugin code has been updated to verify the router-service-type is actually deleted and if not it will raise exception to indicate error.","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        return self._create_resource(\u0027pool\u0027, data)"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def _pool_update_attrs(self, pool):"},{"line_number":272,"context_line":"        uattrs \u003d {}"},{"line_number":273,"context_line":"        uattrs[\u0027name\u0027] \u003d pool[\u0027name\u0027]"},{"line_number":274,"context_line":"        uattrs[\u0027description\u0027] \u003d pool[\u0027description\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGkA%3D","line":271,"updated":"2013-02-07 02:40:20.000000000","message":"This looks unused. also it seems like you are just returning pool? If not consider: \n\nfields \u003d [\u0027name\u0027, \u0027description\u0027, \u0027etc\u0027]\nfor field in fields:\n   uattr[field] \u003d pool[field]\nreturn uattr","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        return self._create_resource(\u0027pool\u0027, data)"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def _pool_update_attrs(self, pool):"},{"line_number":272,"context_line":"        uattrs \u003d {}"},{"line_number":273,"context_line":"        uattrs[\u0027name\u0027] \u003d pool[\u0027name\u0027]"},{"line_number":274,"context_line":"        uattrs[\u0027description\u0027] \u003d pool[\u0027description\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGV0%3D","line":271,"in_reply_to":"AAAAM3%2F%2FGkA%3D","updated":"2013-02-07 04:09:57.000000000","message":"This function is used in _test_resource_update via getattr()","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":317,"context_line":"        return self._create_resource(\u0027vip\u0027, data)"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    def _vip_update_attrs(self, vip):"},{"line_number":320,"context_line":"        uattrs \u003d {}"},{"line_number":321,"context_line":"        uattrs[\u0027name\u0027] \u003d vip[\u0027name\u0027]"},{"line_number":322,"context_line":"        uattrs[\u0027description\u0027] \u003d vip[\u0027description\u0027]"},{"line_number":323,"context_line":"        uattrs[\u0027pool_id\u0027] \u003d vip[\u0027pool_id\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGj8%3D","line":320,"updated":"2013-02-07 02:40:20.000000000","message":"Same as comment on 271","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        return self._create_resource(\u0027vip\u0027, data)"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    def _vip_update_attrs(self, vip):"},{"line_number":320,"context_line":"        uattrs \u003d {}"},{"line_number":321,"context_line":"        uattrs[\u0027name\u0027] \u003d vip[\u0027name\u0027]"},{"line_number":322,"context_line":"        uattrs[\u0027description\u0027] \u003d vip[\u0027description\u0027]"},{"line_number":323,"context_line":"        uattrs[\u0027pool_id\u0027] \u003d vip[\u0027pool_id\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGVo%3D","line":320,"in_reply_to":"AAAAM3%2F%2FGj8%3D","updated":"2013-02-07 04:09:57.000000000","message":"Done","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":344,"context_line":"                _get_path(\u0027lb/{0}s/{1}\u0027.format(res, obj[\u0027id\u0027])), data)"},{"line_number":345,"context_line":"        except:"},{"line_number":346,"context_line":"            error \u003d True"},{"line_number":347,"context_line":"        if not error:"},{"line_number":348,"context_line":"            raise Exception(\"router_id should not be updatable\")"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        del uattrs[\u0027router_id\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGj4%3D","line":347,"updated":"2013-02-07 02:40:20.000000000","message":"why not raise the error when the exception was caught?","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":344,"context_line":"                _get_path(\u0027lb/{0}s/{1}\u0027.format(res, obj[\u0027id\u0027])), data)"},{"line_number":345,"context_line":"        except:"},{"line_number":346,"context_line":"            error \u003d True"},{"line_number":347,"context_line":"        if not error:"},{"line_number":348,"context_line":"            raise Exception(\"router_id should not be updatable\")"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        del uattrs[\u0027router_id\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGVY%3D","line":347,"in_reply_to":"AAAAM3%2F%2FGj4%3D","updated":"2013-02-07 04:09:57.000000000","message":"we want to raise exception if no exception was caught.","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":358,"context_line":"        self._do_request("},{"line_number":359,"context_line":"            \u0027DELETE\u0027, _get_path(\u0027lb/{0}s/{1}\u0027.format(res, obj[\u0027id\u0027])))"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"    def test_pool_create(self):"},{"line_number":362,"context_line":"        self._test_resource_create(\u0027pool\u0027)"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def test_pool_update(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGhE%3D","line":361,"updated":"2013-02-07 02:40:20.000000000","message":"The tests below don\u0027t seem to actually test for the correct values just that no exception was raised.","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        self._do_request("},{"line_number":359,"context_line":"            \u0027DELETE\u0027, _get_path(\u0027lb/{0}s/{1}\u0027.format(res, obj[\u0027id\u0027])))"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"    def test_pool_create(self):"},{"line_number":362,"context_line":"        self._test_resource_create(\u0027pool\u0027)"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def test_pool_update(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FGVQ%3D","line":361,"in_reply_to":"AAAAM3%2F%2FGhE%3D","updated":"2013-02-07 04:09:57.000000000","message":"in _test_resource_create() we do assert if the router_id in returned object is different from the router_id we used to create the resource.","commit_id":"080aba2711643837628d43de8d8a1bc2629bde29"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 Cloudbase Solutions SRL"},{"line_number":4,"context_line":"# Copyright 2013 Pedro Navarro Perez"},{"line_number":5,"context_line":"# All Rights Reserved."},{"line_number":6,"context_line":"#"},{"line_number":7,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FGLE%3D","line":4,"updated":"2013-02-07 07:53:06.000000000","message":"nit: copy right","commit_id":"27bc1285f8625b850d3d850afb9e399c9404b61e"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 Cloudbase Solutions SRL"},{"line_number":4,"context_line":"# Copyright 2013 Pedro Navarro Perez"},{"line_number":5,"context_line":"# All Rights Reserved."},{"line_number":6,"context_line":"#"},{"line_number":7,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FFlI%3D","line":4,"in_reply_to":"AAAAM3%2F%2FGLE%3D","updated":"2013-02-07 15:16:21.000000000","message":"Done","commit_id":"27bc1285f8625b850d3d850afb9e399c9404b61e"},{"author":{"_account_id":704,"name":"Edgar Magana","email":"emagana@gmail.com","username":"emagana"},"unresolved":false,"context_lines":[{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"import quantum"},{"line_number":24,"context_line":"import webob.exc as webexc"},{"line_number":25,"context_line":"import unittest2 as unittest"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from quantum.common import config"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FGLc%3D","line":24,"updated":"2013-02-07 07:51:07.000000000","message":"import quantum should be two lines below","commit_id":"27bc1285f8625b850d3d850afb9e399c9404b61e"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"import quantum"},{"line_number":24,"context_line":"import webob.exc as webexc"},{"line_number":25,"context_line":"import unittest2 as unittest"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from quantum.common import config"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FFlE%3D","line":24,"in_reply_to":"AAAAM3%2F%2FGLc%3D","updated":"2013-02-07 15:16:21.000000000","message":"Done","commit_id":"27bc1285f8625b850d3d850afb9e399c9404b61e"},{"author":{"_account_id":704,"name":"Edgar Magana","email":"emagana@gmail.com","username":"emagana"},"unresolved":false,"context_lines":[{"line_number":29,"context_line":"from quantum.plugins.common import constants"},{"line_number":30,"context_line":"from quantum.api.extensions import ExtensionMiddleware"},{"line_number":31,"context_line":"from quantum.api.extensions import PluginAwareExtensionManager"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"from quantum.extensions import routerservicetype as rst"},{"line_number":34,"context_line":"from quantum.extensions import routedserviceinsertion as rsi"},{"line_number":35,"context_line":"from quantum.db.loadbalancer import loadbalancer_db as lb_db"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FGLQ%3D","line":32,"updated":"2013-02-07 07:51:07.000000000","message":"Please, organize imports in human alphabetical order","commit_id":"27bc1285f8625b850d3d850afb9e399c9404b61e"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":29,"context_line":"from quantum.plugins.common import constants"},{"line_number":30,"context_line":"from quantum.api.extensions import ExtensionMiddleware"},{"line_number":31,"context_line":"from quantum.api.extensions import PluginAwareExtensionManager"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"from quantum.extensions import routerservicetype as rst"},{"line_number":34,"context_line":"from quantum.extensions import routedserviceinsertion as rsi"},{"line_number":35,"context_line":"from quantum.db.loadbalancer import loadbalancer_db as lb_db"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FFlA%3D","line":32,"in_reply_to":"AAAAM3%2F%2FGLQ%3D","updated":"2013-02-07 15:16:21.000000000","message":"Done","commit_id":"27bc1285f8625b850d3d850afb9e399c9404b61e"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":57,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":58,"context_line":"            r \u003d super(RouterServiceInsertionTestPlugin, self).create_router("},{"line_number":59,"context_line":"                context, router)"},{"line_number":60,"context_line":"            if router[\u0027router\u0027].get(rst.SERVICE_TYPE_ID) is not None:"},{"line_number":61,"context_line":"                r[rst.SERVICE_TYPE_ID] \u003d router[\u0027router\u0027][rst.SERVICE_TYPE_ID]"},{"line_number":62,"context_line":"                self._process_create_router_service_type_id("},{"line_number":63,"context_line":"                    context, r)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B3DA%3D","line":60,"updated":"2013-02-16 10:26:10.000000000","message":"optional comment: if you do not have a specific reason for \u0027is not None\u0027 (e.g.: distinguishing from 0 or empty string) then you can just have:\n\nif router[\u0027router\u0027].get(rst.SERVICE_TYPE_ID)\n\nAlso, as you access this field further in the if block, you might consider storing it in a local variable before the if block.","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":57,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":58,"context_line":"            r \u003d super(RouterServiceInsertionTestPlugin, self).create_router("},{"line_number":59,"context_line":"                context, router)"},{"line_number":60,"context_line":"            if router[\u0027router\u0027].get(rst.SERVICE_TYPE_ID) is not None:"},{"line_number":61,"context_line":"                r[rst.SERVICE_TYPE_ID] \u003d router[\u0027router\u0027][rst.SERVICE_TYPE_ID]"},{"line_number":62,"context_line":"                self._process_create_router_service_type_id("},{"line_number":63,"context_line":"                    context, r)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B2xA%3D","line":60,"in_reply_to":"AAAAM3%2F%2B218%3D","updated":"2013-02-16 19:34:18.000000000","message":"Ok I see. As this is a test plugin does not make sense to do full validation for service type id.","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":58,"context_line":"            r \u003d super(RouterServiceInsertionTestPlugin, self).create_router("},{"line_number":59,"context_line":"                context, router)"},{"line_number":60,"context_line":"            if router[\u0027router\u0027].get(rst.SERVICE_TYPE_ID) is not None:"},{"line_number":61,"context_line":"                r[rst.SERVICE_TYPE_ID] \u003d router[\u0027router\u0027][rst.SERVICE_TYPE_ID]"},{"line_number":62,"context_line":"                self._process_create_router_service_type_id("},{"line_number":63,"context_line":"                    context, r)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B218%3D","line":60,"in_reply_to":"AAAAM3%2F%2B3DA%3D","updated":"2013-02-16 17:52:44.000000000","message":"Yes, I want to distinguish it from empty string. I want to raise exception if service_type_id is given but is empty.","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":78,"context_line":"                context, id)"},{"line_number":79,"context_line":"        rsbind \u003d self._get_router_service_type_id_binding(context, id)"},{"line_number":80,"context_line":"        if rsbind:"},{"line_number":81,"context_line":"            raise Exception(\u0027Router srevice-type binding is not deleted\u0027)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def create_resource(self, res, context, resource, model):"},{"line_number":84,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B3C8%3D","line":81,"updated":"2013-02-16 10:26:10.000000000","message":"Optional nit: \u0027srevice -\u003e service\u0027","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                context, id)"},{"line_number":79,"context_line":"        rsbind \u003d self._get_router_service_type_id_binding(context, id)"},{"line_number":80,"context_line":"        if rsbind:"},{"line_number":81,"context_line":"            raise Exception(\u0027Router srevice-type binding is not deleted\u0027)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def create_resource(self, res, context, resource, model):"},{"line_number":84,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B214%3D","line":81,"in_reply_to":"AAAAM3%2F%2B3C8%3D","updated":"2013-02-16 17:52:44.000000000","message":"Done","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def create_resource(self, res, context, resource, model):"},{"line_number":84,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":85,"context_line":"            method_name \u003d \"create_{0}\".format(res)"},{"line_number":86,"context_line":"            method \u003d getattr(super(RouterServiceInsertionTestPlugin, self),"},{"line_number":87,"context_line":"                             method_name)"},{"line_number":88,"context_line":"            o \u003d method(context, resource)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B3C4%3D","line":85,"updated":"2013-02-16 10:26:10.000000000","message":"optional advice: The \u0027unofficial\u0027 convention is to avoid format and just use \"create_%s\" % res","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def create_resource(self, res, context, resource, model):"},{"line_number":84,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":85,"context_line":"            method_name \u003d \"create_{0}\".format(res)"},{"line_number":86,"context_line":"            method \u003d getattr(super(RouterServiceInsertionTestPlugin, self),"},{"line_number":87,"context_line":"                             method_name)"},{"line_number":88,"context_line":"            o \u003d method(context, resource)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B2w0%3D","line":85,"in_reply_to":"AAAAM3%2F%2B21o%3D","updated":"2013-02-16 19:34:18.000000000","message":"That\u0027s fine. The way I suggested is openstack\u0027s \u0027unwritten rule\u0027. I\u0027m fine either way tough, that\u0027s why I said \u0027optional\u0027!","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def create_resource(self, res, context, resource, model):"},{"line_number":84,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":85,"context_line":"            method_name \u003d \"create_{0}\".format(res)"},{"line_number":86,"context_line":"            method \u003d getattr(super(RouterServiceInsertionTestPlugin, self),"},{"line_number":87,"context_line":"                             method_name)"},{"line_number":88,"context_line":"            o \u003d method(context, resource)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B21o%3D","line":85,"in_reply_to":"AAAAM3%2F%2B3C4%3D","updated":"2013-02-16 17:52:44.000000000","message":"I remember seeing from some python tutorial/convention that using str.format() is a preferred way now, and I use it across my entire code change. I think I\u0027ll leave them as is for now.","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":93,"context_line":"        return o"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def get_resource(self, res, context, id, fields, model):"},{"line_number":96,"context_line":"        method_name \u003d \"get_{0}\".format(res)"},{"line_number":97,"context_line":"        method \u003d getattr(super(RouterServiceInsertionTestPlugin, self),"},{"line_number":98,"context_line":"                         method_name)"},{"line_number":99,"context_line":"        o \u003d method(context, id, fields)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B3C0%3D","line":96,"updated":"2013-02-16 10:26:10.000000000","message":"same as line 85","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        return o"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def get_resource(self, res, context, id, fields, model):"},{"line_number":96,"context_line":"        method_name \u003d \"get_{0}\".format(res)"},{"line_number":97,"context_line":"        method \u003d getattr(super(RouterServiceInsertionTestPlugin, self),"},{"line_number":98,"context_line":"                         method_name)"},{"line_number":99,"context_line":"        o \u003d method(context, id, fields)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B21k%3D","line":96,"in_reply_to":"AAAAM3%2F%2B3C0%3D","updated":"2013-02-16 17:52:44.000000000","message":"Done","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":105,"context_line":"        return o"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def delete_resource(self, res, context, id, model):"},{"line_number":108,"context_line":"        method_name \u003d \"delete_{0}\".format(res)"},{"line_number":109,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":110,"context_line":"            method \u003d getattr(super(RouterServiceInsertionTestPlugin, self),"},{"line_number":111,"context_line":"                             method_name)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B3Cw%3D","line":108,"updated":"2013-02-16 10:26:10.000000000","message":"same as line 85","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        return o"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def delete_resource(self, res, context, id, model):"},{"line_number":108,"context_line":"        method_name \u003d \"delete_{0}\".format(res)"},{"line_number":109,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":110,"context_line":"            method \u003d getattr(super(RouterServiceInsertionTestPlugin, self),"},{"line_number":111,"context_line":"                             method_name)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B21g%3D","line":108,"in_reply_to":"AAAAM3%2F%2B3Cw%3D","updated":"2013-02-16 17:52:44.000000000","message":"Done","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":217,"context_line":"        return res[\u0027router\u0027]"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def test_router_create(self):"},{"line_number":220,"context_line":"        router \u003d self._router_create()"},{"line_number":221,"context_line":"        router \u003d self._router_create(self._service_type_id)"},{"line_number":222,"context_line":"        self.assertEqual(router[\u0027service_type_id\u0027], self._service_type_id)"},{"line_number":223,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B3Cs%3D","line":220,"updated":"2013-02-16 10:26:10.000000000","message":"Looks like the above line can be removed","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":217,"context_line":"        return res[\u0027router\u0027]"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def test_router_create(self):"},{"line_number":220,"context_line":"        router \u003d self._router_create()"},{"line_number":221,"context_line":"        router \u003d self._router_create(self._service_type_id)"},{"line_number":222,"context_line":"        self.assertEqual(router[\u0027service_type_id\u0027], self._service_type_id)"},{"line_number":223,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B2ww%3D","line":220,"in_reply_to":"AAAAM3%2F%2B210%3D","updated":"2013-02-16 19:34:18.000000000","message":"I see.\nIn that case I think the fact that it\u0027s returning without  error probably does not necessarily it\u0027s working correctly.\n\nPerhaps you could add an assert to verify that router has no service_type_id associated. Does that sound good to you?","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        return res[\u0027router\u0027]"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def test_router_create(self):"},{"line_number":220,"context_line":"        router \u003d self._router_create()"},{"line_number":221,"context_line":"        router \u003d self._router_create(self._service_type_id)"},{"line_number":222,"context_line":"        self.assertEqual(router[\u0027service_type_id\u0027], self._service_type_id)"},{"line_number":223,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B2pI%3D","line":220,"in_reply_to":"AAAAM3%2F%2B2ww%3D","updated":"2013-02-16 23:00:49.000000000","message":"Done","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        return res[\u0027router\u0027]"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def test_router_create(self):"},{"line_number":220,"context_line":"        router \u003d self._router_create()"},{"line_number":221,"context_line":"        router \u003d self._router_create(self._service_type_id)"},{"line_number":222,"context_line":"        self.assertEqual(router[\u0027service_type_id\u0027], self._service_type_id)"},{"line_number":223,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B210%3D","line":220,"in_reply_to":"AAAAM3%2F%2B3Cs%3D","updated":"2013-02-16 17:52:44.000000000","message":"This is for regression test to make sure creating router without service_type_id is working correctly.","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":245,"context_line":"        except Exception:"},{"line_number":246,"context_line":"            error \u003d True"},{"line_number":247,"context_line":"        if not error:"},{"line_number":248,"context_line":"            raise Exception(\"service_type_id should not be updatable\")"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"        data \u003d {"},{"line_number":251,"context_line":"            \"router\": {"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B3Co%3D","line":248,"updated":"2013-02-16 10:26:10.000000000","message":"assertRaises used with a context manager might simplify the logic here (note: I have not tested the following code)\n\nwith self.assertRaises(webob.exc.HTTPClientError) as ctx_manager:\n       router \u003d self._router_create(self._service_type_id)\nself.assertEqual(ctx_manager.exception.code, 400)","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":245,"context_line":"        except Exception:"},{"line_number":246,"context_line":"            error \u003d True"},{"line_number":247,"context_line":"        if not error:"},{"line_number":248,"context_line":"            raise Exception(\"service_type_id should not be updatable\")"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"        data \u003d {"},{"line_number":251,"context_line":"            \"router\": {"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B21Y%3D","line":248,"in_reply_to":"AAAAM3%2F%2B3Co%3D","updated":"2013-02-16 17:52:44.000000000","message":"Done","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":254,"context_line":"            }"},{"line_number":255,"context_line":"        }"},{"line_number":256,"context_line":"        self._do_request("},{"line_number":257,"context_line":"            \u0027PUT\u0027, _get_path(\u0027routers/{0}\u0027.format(router_id)), data)"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def test_router_delete(self):"},{"line_number":260,"context_line":"        router \u003d self._router_create(self._service_type_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B3Ck%3D","line":257,"updated":"2013-02-16 10:26:10.000000000","message":"If the aim of 250-257 is to verify a router can be successfully updated, probably you should add a _do_request(\u0027GET\u0027, ...) and assertEqual statements.\n\nAlso (and probably this is the only important bit) these look like two distinct unit tests. The latter is a \u0027normal\u0027 update test, the former instead is an negative update test.","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":254,"context_line":"            }"},{"line_number":255,"context_line":"        }"},{"line_number":256,"context_line":"        self._do_request("},{"line_number":257,"context_line":"            \u0027PUT\u0027, _get_path(\u0027routers/{0}\u0027.format(router_id)), data)"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def test_router_delete(self):"},{"line_number":260,"context_line":"        router \u003d self._router_create(self._service_type_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B20c%3D","line":257,"in_reply_to":"AAAAM3%2F%2B3Ck%3D","updated":"2013-02-16 17:52:44.000000000","message":"Done","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":259,"context_line":"    def test_router_delete(self):"},{"line_number":260,"context_line":"        router \u003d self._router_create(self._service_type_id)"},{"line_number":261,"context_line":"        self._do_request("},{"line_number":262,"context_line":"            \u0027DELETE\u0027, _get_path(\u0027routers/{0}\u0027.format(router[\u0027id\u0027])))"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def _test_lb_setup(self):"},{"line_number":265,"context_line":"        self._subnet_id \u003d _uuid()"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B3Cg%3D","line":262,"updated":"2013-02-16 10:26:10.000000000","message":"Usual comment about usage of format","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":259,"context_line":"    def test_router_delete(self):"},{"line_number":260,"context_line":"        router \u003d self._router_create(self._service_type_id)"},{"line_number":261,"context_line":"        self._do_request("},{"line_number":262,"context_line":"            \u0027DELETE\u0027, _get_path(\u0027routers/{0}\u0027.format(router[\u0027id\u0027])))"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def _test_lb_setup(self):"},{"line_number":265,"context_line":"        self._subnet_id \u003d _uuid()"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B21c%3D","line":262,"in_reply_to":"AAAAM3%2F%2B3Cg%3D","updated":"2013-02-16 17:52:44.000000000","message":"Done","commit_id":"12f54faf3d215f4b5a474fdcc57dfe4b49ed5b4a"}],"quantum/tests/unit/test_routersvcinsertion.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":58,"context_line":"    rsi_db.RoutedSvcInsertionDbMixin,"},{"line_number":59,"context_line":"    st_db.ServiceTypeManager,"},{"line_number":60,"context_line":"    lbplugin.LoadBalancerPlugin,"},{"line_number":61,"context_line":"    ovs_quantum_plugin.OVSQuantumPluginV2):"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    supported_extension_aliases \u003d ["},{"line_number":64,"context_line":"        \"provider\", \"router\", \"binding\", \"quotas\","}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FIEI%3D","line":61,"updated":"2013-02-06 11:12:44.000000000","message":"Why inherit from OVS quantum plugin V2? Isn\u0027t db base plugin enough?","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    rsi_db.RoutedSvcInsertionDbMixin,"},{"line_number":59,"context_line":"    st_db.ServiceTypeManager,"},{"line_number":60,"context_line":"    lbplugin.LoadBalancerPlugin,"},{"line_number":61,"context_line":"    ovs_quantum_plugin.OVSQuantumPluginV2):"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    supported_extension_aliases \u003d ["},{"line_number":64,"context_line":"        \"provider\", \"router\", \"binding\", \"quotas\","}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FG8c%3D","line":61,"in_reply_to":"AAAAM3%2F%2FIEI%3D","updated":"2013-02-13 19:26:43.000000000","message":"Done","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":63,"context_line":"    supported_extension_aliases \u003d ["},{"line_number":64,"context_line":"        \"provider\", \"router\", \"binding\", \"quotas\","},{"line_number":65,"context_line":"        \"router-service-type\", \"routed-service-insertion\","},{"line_number":66,"context_line":"        \"service-type\", \"lbaas\""},{"line_number":67,"context_line":"    ]"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def create_router(self, context, router):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FIEM%3D","line":66,"updated":"2013-02-06 11:12:44.000000000","message":"provider, binding and quotas are probably not necessary here","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"},{"author":{"_account_id":6461,"name":"Kaiwei Fan","email":"fank@vmware.com","username":"kaiwei-fan"},"change_message_id":"c09b2ae8caeedef7bf714d32c3b8e45c5c74c6bf","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    supported_extension_aliases \u003d ["},{"line_number":64,"context_line":"        \"provider\", \"router\", \"binding\", \"quotas\","},{"line_number":65,"context_line":"        \"router-service-type\", \"routed-service-insertion\","},{"line_number":66,"context_line":"        \"service-type\", \"lbaas\""},{"line_number":67,"context_line":"    ]"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def create_router(self, context, router):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FG%2Bk%3D","line":66,"in_reply_to":"AAAAM3%2F%2FIEM%3D","updated":"2013-02-13 19:26:43.000000000","message":"Done","commit_id":"7c68e9385690effe7332fd6148a106746b2db565"}]}
