)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"9320345fe978a925389b0a73b31aca469780834e","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Yi Sun \u003cbeyounn@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-01-20 08:25:04 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"This code change adds serivce group and service object extension"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"A service object is used to define a type of traffic, multple service objects"},{"line_number":10,"context_line":"can be grouped together to form a service group object."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAAUH%2F%2BxLQ%3D","line":7,"updated":"2014-01-22 11:18:38.000000000","message":"typo; service","commit_id":"d0fa0a46e5ab45c5c6f22440d21a7c90718264cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"9320345fe978a925389b0a73b31aca469780834e","unresolved":false,"context_lines":[{"line_number":11,"context_line":"A service object can have following attributes:"},{"line_number":12,"context_line":"Name, protocol, source and destination ports (ranges), ICMP type and code, timeout"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"For simplicity, I don\u0027t allow user to use serivce object directly. User should"},{"line_number":15,"context_line":"use service group and add service object into a service group."},{"line_number":16,"context_line":"In current design the service object is not share-able among different service groups"},{"line_number":17,"context_line":"Implements: blueprint fwaas-customized-service"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAAUH%2F%2BxK8%3D","line":14,"updated":"2014-01-22 11:18:38.000000000","message":"same","commit_id":"d0fa0a46e5ab45c5c6f22440d21a7c90718264cc"}],"neutron/db/migration/alembic_migrations/versions/36d39056875f_service_grp_ext.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"6c28eda72aa337f737a958f7f5c1c2e5b96da489","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    op.create_table(u\u0027serviceobjects\u0027,"},{"line_number":48,"context_line":"                    sa.Column(u\u0027name\u0027,"},{"line_number":49,"context_line":"                              mysql.VARCHAR(length\u003d255),"},{"line_number":50,"context_line":"                              nullable\u003dTrue),"},{"line_number":51,"context_line":"                    sa.Column(u\u0027tenant_id\u0027,"},{"line_number":52,"context_line":"                              mysql.VARCHAR(length\u003d255),"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9pf8%3D","line":49,"updated":"2014-02-05 11:16:17.000000000","message":"please use sqlalchemy types, not mysql","commit_id":"035c8e402becce9fe8ba00702d62741d5307e42d"},{"author":{"_account_id":10041,"name":"Yi Sun","email":"beyounn@gmail.com","username":"yisun"},"change_message_id":"d377f7d17615e316beebfbd23436a1a241ec5281","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    op.create_table(u\u0027serviceobjects\u0027,"},{"line_number":48,"context_line":"                    sa.Column(u\u0027name\u0027,"},{"line_number":49,"context_line":"                              mysql.VARCHAR(length\u003d255),"},{"line_number":50,"context_line":"                              nullable\u003dTrue),"},{"line_number":51,"context_line":"                    sa.Column(u\u0027tenant_id\u0027,"},{"line_number":52,"context_line":"                              mysql.VARCHAR(length\u003d255),"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9joo%3D","line":49,"in_reply_to":"AAAAUH%2F9pf8%3D","updated":"2014-02-06 03:34:55.000000000","message":"fixed","commit_id":"035c8e402becce9fe8ba00702d62741d5307e42d"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"6c28eda72aa337f737a958f7f5c1c2e5b96da489","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                              nullable\u003dTrue),"},{"line_number":54,"context_line":"                    sa.Column(u\u0027id\u0027, mysql.VARCHAR(length\u003d36),"},{"line_number":55,"context_line":"                              nullable\u003dFalse),"},{"line_number":56,"context_line":"                    sa.Column(u\u0027service_group_id\u0027,"},{"line_number":57,"context_line":"                              mysql.VARCHAR(length\u003d36),"},{"line_number":58,"context_line":"                              nullable\u003dTrue),"},{"line_number":59,"context_line":"                    sa.Column(u\u0027protocol\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9pfs%3D","line":56,"updated":"2014-02-05 11:16:17.000000000","message":"is it a foreign key to servicegroups table?","commit_id":"035c8e402becce9fe8ba00702d62741d5307e42d"},{"author":{"_account_id":10041,"name":"Yi Sun","email":"beyounn@gmail.com","username":"yisun"},"change_message_id":"d377f7d17615e316beebfbd23436a1a241ec5281","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                              nullable\u003dTrue),"},{"line_number":54,"context_line":"                    sa.Column(u\u0027id\u0027, mysql.VARCHAR(length\u003d36),"},{"line_number":55,"context_line":"                              nullable\u003dFalse),"},{"line_number":56,"context_line":"                    sa.Column(u\u0027service_group_id\u0027,"},{"line_number":57,"context_line":"                              mysql.VARCHAR(length\u003d36),"},{"line_number":58,"context_line":"                              nullable\u003dTrue),"},{"line_number":59,"context_line":"                    sa.Column(u\u0027protocol\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9jzw%3D","line":56,"in_reply_to":"AAAAUH%2F9pfs%3D","updated":"2014-02-06 03:34:55.000000000","message":"Fixed, it somehow missed when I copy contents","commit_id":"035c8e402becce9fe8ba00702d62741d5307e42d"}],"neutron/db/migration/alembic_migrations/versions/4c6e7b9834fe_add_service_object_and_service_group_.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"9320345fe978a925389b0a73b31aca469780834e","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    if not migration.should_run(active_plugins, migration_for_plugins):"},{"line_number":45,"context_line":"        return"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    ### commands auto generated by Alembic - please adjust! ###"},{"line_number":48,"context_line":"    op.drop_table(u\u0027routes\u0027)"},{"line_number":49,"context_line":"    op.drop_table(u\u0027arista_provisioned_vms\u0027)"},{"line_number":50,"context_line":"    op.drop_table(u\u0027arista_provisioned_tenants\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2Bw%2B0%3D","line":47,"updated":"2014-01-22 11:18:38.000000000","message":"the upgrade/downgrade code is clearly incorrect","commit_id":"d0fa0a46e5ab45c5c6f22440d21a7c90718264cc"}],"neutron/db/servicegroup_db.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"9320345fe978a925389b0a73b31aca469780834e","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class ServiceGroup(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":40,"context_line":"    LOG.debug(_(\"ServiceGroup class is created\"))"},{"line_number":41,"context_line":"    name \u003d sa.Column(sa.String(255), unique\u003dTrue)"},{"line_number":42,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BxKg%3D","line":40,"updated":"2014-01-22 11:18:38.000000000","message":"i don\u0027t think import-time logs are helpful","commit_id":"d0fa0a46e5ab45c5c6f22440d21a7c90718264cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"9320345fe978a925389b0a73b31aca469780834e","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class ServiceObject(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":46,"context_line":"    \"\"\"Represents a v2 neutron service object.\"\"\""},{"line_number":47,"context_line":"    LOG.debug(_(\"ServiceObject class is created\"))"},{"line_number":48,"context_line":"    name \u003d sa.Column(sa.String(255), unique\u003dTrue)"},{"line_number":49,"context_line":"    service_group_id \u003d sa.Column(sa.String(36),"},{"line_number":50,"context_line":"                                 sa.ForeignKey(\"servicegroups.id\","}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BxKQ%3D","line":47,"updated":"2014-01-22 11:18:38.000000000","message":"same","commit_id":"d0fa0a46e5ab45c5c6f22440d21a7c90718264cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"9320345fe978a925389b0a73b31aca469780834e","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                                               ondelete\u003d\"CASCADE\"),"},{"line_number":52,"context_line":"                                 nullable\u003dFalse)"},{"line_number":53,"context_line":"    protocol \u003d sa.Column(sa.String(40))"},{"line_number":54,"context_line":"    source_port_range_min \u003d sa.Column(sa.Integer)"},{"line_number":55,"context_line":"    source_port_range_max \u003d sa.Column(sa.Integer)"},{"line_number":56,"context_line":"    destination_port_range_min \u003d sa.Column(sa.Integer)"},{"line_number":57,"context_line":"    destination_port_range_max \u003d sa.Column(sa.Integer)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BxJs%3D","line":54,"updated":"2014-01-22 11:18:38.000000000","message":"src/dest might be a well-known abbreviation, so it might be better to use them for shortness.\n\nalso, why \u0027range\u0027 in the name? min and max imply that you define a rage.","commit_id":"d0fa0a46e5ab45c5c6f22440d21a7c90718264cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"9320345fe978a925389b0a73b31aca469780834e","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":110,"context_line":"                ret \u003d self._make_service_group_dict("},{"line_number":111,"context_line":"                    self._get_service_group(context, sgid), fields)"},{"line_number":112,"context_line":"                ret[\u0027service_objects\u0027] \u003d self.get_service_objects("},{"line_number":113,"context_line":"                    context, {\u0027service_group_id\u0027: [sgid]})"},{"line_number":114,"context_line":"        finally:"},{"line_number":115,"context_line":"            if tenant_id:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BxH8%3D","line":112,"updated":"2014-01-22 11:18:38.000000000","message":"it\u0027s better to fetch service_objects setting up the relationship, rather than using separate query.\n\nthen _make_service_group_dict could be extended to fill objects in the dict","commit_id":"d0fa0a46e5ab45c5c6f22440d21a7c90718264cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"9320345fe978a925389b0a73b31aca469780834e","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    def _get_service_group(self, context, sgid):"},{"line_number":120,"context_line":"        try:"},{"line_number":121,"context_line":"            query \u003d self._model_query(context, ServiceGroup)"},{"line_number":122,"context_line":"            sg \u003d query.filter(ServiceGroup.id \u003d\u003d sgid).one()"},{"line_number":123,"context_line":"        except exc.NoResultFound:"},{"line_number":124,"context_line":"            raise servg.ServiceGroupNotFound(id\u003dsgid)"},{"line_number":125,"context_line":"        return sg"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BxJI%3D","line":122,"updated":"2014-01-22 11:18:38.000000000","message":"return query.filter(ServiceGroup.id \u003d\u003d sgid).one()","commit_id":"d0fa0a46e5ab45c5c6f22440d21a7c90718264cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"9320345fe978a925389b0a73b31aca469780834e","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            sg \u003d query.filter(ServiceGroup.id \u003d\u003d sgid).one()"},{"line_number":123,"context_line":"        except exc.NoResultFound:"},{"line_number":124,"context_line":"            raise servg.ServiceGroupNotFound(id\u003dsgid)"},{"line_number":125,"context_line":"        return sg"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def delete_service_group(self, context, sgid):"},{"line_number":128,"context_line":"        sg \u003d self._get_service_group(context, sgid)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BxJE%3D","line":125,"updated":"2014-01-22 11:18:38.000000000","message":"remove this per comment above","commit_id":"d0fa0a46e5ab45c5c6f22440d21a7c90718264cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"9320345fe978a925389b0a73b31aca469780834e","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def delete_service_group(self, context, sgid):"},{"line_number":128,"context_line":"        sg \u003d self._get_service_group(context, sgid)"},{"line_number":129,"context_line":"        if sg is None:"},{"line_number":130,"context_line":"            raise servg.ServiceGroupNotFound(id\u003dsgid)"},{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BxJY%3D","line":129,"updated":"2014-01-22 11:18:38.000000000","message":"remove 129-130, it\u0027s handled in _get_service_group","commit_id":"d0fa0a46e5ab45c5c6f22440d21a7c90718264cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"9320345fe978a925389b0a73b31aca469780834e","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        s \u003d service_group[\u0027service_group\u0027]"},{"line_number":139,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":140,"context_line":"            sg \u003d self._get_service_group(context, sgid)"},{"line_number":141,"context_line":"            if sg is None:"},{"line_number":142,"context_line":"                raise servg.ServiceGroupNotFound(id\u003dsgid)"},{"line_number":143,"context_line":"            sg.update(s)"},{"line_number":144,"context_line":"        return self._make_service_group_dict(sg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BxI4%3D","line":141,"updated":"2014-01-22 11:18:38.000000000","message":"same comment as above","commit_id":"d0fa0a46e5ab45c5c6f22440d21a7c90718264cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"9320345fe978a925389b0a73b31aca469780834e","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        service_group_id \u003d self._validate_service_objects(context,"},{"line_number":161,"context_line":"                                                          service_object)"},{"line_number":162,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":163,"context_line":"            if not self.get_service_group(context, service_group_id):"},{"line_number":164,"context_line":"                raise servg.ServiceGroupNotFound(id\u003dservice_group_id)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"            self._check_for_duplicate_objects(context, r)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BxHI%3D","line":163,"updated":"2014-01-22 11:18:38.000000000","message":"it\u0027s better to use _get_service_group() here","commit_id":"d0fa0a46e5ab45c5c6f22440d21a7c90718264cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"9320345fe978a925389b0a73b31aca469780834e","unresolved":false,"context_lines":[{"line_number":167,"context_line":"            ret \u003d []"},{"line_number":168,"context_line":"            for so in r:"},{"line_number":169,"context_line":"                sobj \u003d so[\u0027service_object\u0027]"},{"line_number":170,"context_line":"                tenant_id \u003d self._get_tenant_id_for_create(context, sobj)"},{"line_number":171,"context_line":"                sp_min \u003d 0"},{"line_number":172,"context_line":"                sp_max \u003d 0"},{"line_number":173,"context_line":"                dp_min \u003d 0"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BxC0%3D","line":170,"updated":"2014-01-22 11:18:38.000000000","message":"why do it in the loop, can it be moved outside?","commit_id":"d0fa0a46e5ab45c5c6f22440d21a7c90718264cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"9320345fe978a925389b0a73b31aca469780834e","unresolved":false,"context_lines":[{"line_number":259,"context_line":"                res[key] \u003d [value]"},{"line_number":260,"context_line":"        return res"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    def _check_for_duplicate_objects(self, context, service_objects):"},{"line_number":263,"context_line":"        for i in service_objects:"},{"line_number":264,"context_line":"            self_found \u003d False"},{"line_number":265,"context_line":"            for j in service_objects:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2Bw%2FU%3D","line":262,"updated":"2014-01-22 11:18:38.000000000","message":"Why this method is needed at all? should not the uniqueness guaranteed by db constraints?","commit_id":"d0fa0a46e5ab45c5c6f22440d21a7c90718264cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"6c28eda72aa337f737a958f7f5c1c2e5b96da489","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class ServiceObject(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":40,"context_line":"    \"\"\"Represents a v2 neutron service object.\"\"\""},{"line_number":41,"context_line":"    name \u003d sa.Column(sa.String(255), unique\u003dTrue)"},{"line_number":42,"context_line":"    protocol \u003d sa.Column(sa.String(40))"},{"line_number":43,"context_line":"    src_port_min \u003d sa.Column(sa.Integer)"},{"line_number":44,"context_line":"    src_port_max \u003d sa.Column(sa.Integer)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9pfg%3D","line":41,"updated":"2014-02-05 11:16:17.000000000","message":"why is it unique?","commit_id":"035c8e402becce9fe8ba00702d62741d5307e42d"},{"author":{"_account_id":10041,"name":"Yi Sun","email":"beyounn@gmail.com","username":"yisun"},"change_message_id":"d377f7d17615e316beebfbd23436a1a241ec5281","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class ServiceObject(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":40,"context_line":"    \"\"\"Represents a v2 neutron service object.\"\"\""},{"line_number":41,"context_line":"    name \u003d sa.Column(sa.String(255), unique\u003dTrue)"},{"line_number":42,"context_line":"    protocol \u003d sa.Column(sa.String(40))"},{"line_number":43,"context_line":"    src_port_min \u003d sa.Column(sa.Integer)"},{"line_number":44,"context_line":"    src_port_max \u003d sa.Column(sa.Integer)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9jvk%3D","line":41,"in_reply_to":"AAAAUH%2F9pfg%3D","updated":"2014-02-06 03:34:55.000000000","message":"removed","commit_id":"035c8e402becce9fe8ba00702d62741d5307e42d"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"6c28eda72aa337f737a958f7f5c1c2e5b96da489","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        return self._get_collection_count(context, ServiceGroup,"},{"line_number":101,"context_line":"                                          filters\u003dfilters)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def get_service_group(self, context, sgid, fields\u003dNone, tenant_id\u003dNone):"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if tenant_id:"},{"line_number":106,"context_line":"            tmp_context_tenant_id \u003d context.tenant_id"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9pfE%3D","line":103,"updated":"2014-02-05 11:16:17.000000000","message":"please explain why tenant_id and logic in 105-107 and try/finally are needed.","commit_id":"035c8e402becce9fe8ba00702d62741d5307e42d"},{"author":{"_account_id":10041,"name":"Yi Sun","email":"beyounn@gmail.com","username":"yisun"},"change_message_id":"d377f7d17615e316beebfbd23436a1a241ec5281","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        return self._get_collection_count(context, ServiceGroup,"},{"line_number":101,"context_line":"                                          filters\u003dfilters)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def get_service_group(self, context, sgid, fields\u003dNone, tenant_id\u003dNone):"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if tenant_id:"},{"line_number":106,"context_line":"            tmp_context_tenant_id \u003d context.tenant_id"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9jvo%3D","line":103,"in_reply_to":"AAAAUH%2F9pfE%3D","updated":"2014-02-06 03:34:55.000000000","message":"removed, It was copied from securitygroup_db when I first started","commit_id":"035c8e402becce9fe8ba00702d62741d5307e42d"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"6c28eda72aa337f737a958f7f5c1c2e5b96da489","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _get_service_group(self, context, sgid):"},{"line_number":119,"context_line":"        query \u003d self._model_query(context, ServiceGroup)"},{"line_number":120,"context_line":"        return query.filter(ServiceGroup.id \u003d\u003d sgid).one()"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def delete_service_group(self, context, sgid):"},{"line_number":123,"context_line":"        sg \u003d self._get_service_group(context, sgid)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9pew%3D","line":120,"updated":"2014-02-05 11:16:17.000000000","message":"nit: filter_by(id\u003dsgid).one()","commit_id":"035c8e402becce9fe8ba00702d62741d5307e42d"},{"author":{"_account_id":10041,"name":"Yi Sun","email":"beyounn@gmail.com","username":"yisun"},"change_message_id":"d377f7d17615e316beebfbd23436a1a241ec5281","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _get_service_group(self, context, sgid):"},{"line_number":119,"context_line":"        query \u003d self._model_query(context, ServiceGroup)"},{"line_number":120,"context_line":"        return query.filter(ServiceGroup.id \u003d\u003d sgid).one()"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def delete_service_group(self, context, sgid):"},{"line_number":123,"context_line":"        sg \u003d self._get_service_group(context, sgid)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9jv4%3D","line":120,"in_reply_to":"AAAAUH%2F9pew%3D","updated":"2014-02-06 03:34:55.000000000","message":"fixed, also fixed _get_service_object","commit_id":"035c8e402becce9fe8ba00702d62741d5307e42d"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"6c28eda72aa337f737a958f7f5c1c2e5b96da489","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        return query.filter(ServiceGroup.id \u003d\u003d sgid).one()"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def delete_service_group(self, context, sgid):"},{"line_number":123,"context_line":"        sg \u003d self._get_service_group(context, sgid)"},{"line_number":124,"context_line":"        try:"},{"line_number":125,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":126,"context_line":"                context.session.delete(sg)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9pec%3D","line":123,"updated":"2014-02-05 11:16:17.000000000","message":"that line needs to be under \u0027with\u0027 block","commit_id":"035c8e402becce9fe8ba00702d62741d5307e42d"},{"author":{"_account_id":10041,"name":"Yi Sun","email":"beyounn@gmail.com","username":"yisun"},"change_message_id":"d377f7d17615e316beebfbd23436a1a241ec5281","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        return query.filter(ServiceGroup.id \u003d\u003d sgid).one()"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def delete_service_group(self, context, sgid):"},{"line_number":123,"context_line":"        sg \u003d self._get_service_group(context, sgid)"},{"line_number":124,"context_line":"        try:"},{"line_number":125,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":126,"context_line":"                context.session.delete(sg)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9jpM%3D","line":123,"in_reply_to":"AAAAUH%2F9pec%3D","updated":"2014-02-06 03:34:55.000000000","message":"fixed","commit_id":"035c8e402becce9fe8ba00702d62741d5307e42d"}]}
