)]}'
{"etc/neutron.conf":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e622e9c9af3c934f1f8b3ce69960d9f3146ad60c","unresolved":false,"context_lines":[{"line_number":403,"context_line":"[servicevm]"},{"line_number":404,"context_line":"# Specify drivers for hosting device"},{"line_number":405,"context_line":"# exmpale: hosting_device_driver \u003d nova"},{"line_number":406,"context_line":"hosting_device_driver \u003d noop"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"# Specify drivers for mgmt"},{"line_number":409,"context_line":"# exmpale: mgmt_driver \u003d noop"}],"source_content_type":"text/plain","patch_set":13,"id":"AAAAUX%2F%2F9BQ%3D","line":406,"updated":"2014-02-08 17:09:44.000000000","message":"the common practice is not to add actual default parameters to the conf leaving them commented.","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"0004457de7277e18423ea7e8d8381e689bc5e504","unresolved":false,"context_lines":[{"line_number":403,"context_line":"[servicevm]"},{"line_number":404,"context_line":"# Specify drivers for hosting device"},{"line_number":405,"context_line":"# exmpale: hosting_device_driver \u003d nova"},{"line_number":406,"context_line":"hosting_device_driver \u003d noop"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"# Specify drivers for mgmt"},{"line_number":409,"context_line":"# exmpale: mgmt_driver \u003d noop"}],"source_content_type":"text/plain","patch_set":13,"id":"AAAAUX%2F%2F4iQ%3D","line":406,"in_reply_to":"AAAAUX%2F%2F9BQ%3D","updated":"2014-02-10 08:56:14.000000000","message":"Done","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"db6e42755360ea78ab1844d4400d7cf88bbc64fd","unresolved":false,"context_lines":[{"line_number":426,"context_line":""},{"line_number":427,"context_line":"[servicevm]"},{"line_number":428,"context_line":"# Specify drivers for hosting device"},{"line_number":429,"context_line":"# exmpale: device_driver \u003d noop"},{"line_number":430,"context_line":"# exmpale: device_driver \u003d nova"},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"# Specify drivers for mgmt"}],"source_content_type":"text/plain","patch_set":21,"id":"AAAAXH%2F%2Fnzc%3D","line":429,"updated":"2014-04-18 19:55:29.000000000","message":"typo here and on next lines","commit_id":"25db0a52cd80420afebb7638e74e529cd1428bdd"}],"neutron/api/extensions.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"178fdf134661c29449da242b3d50a80377d31bb2","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        self.ext_mgr \u003d (ext_mgr"},{"line_number":268,"context_line":"                        or ExtensionManager(get_extensions_path()))"},{"line_number":269,"context_line":"        mapper \u003d routes.Mapper()"},{"line_number":270,"context_line":"        mapper.debug \u003d True"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        # extended resources"},{"line_number":273,"context_line":"        for resource in self.ext_mgr.get_resources():"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9pOE%3D","line":270,"updated":"2013-12-09 13:26:28.000000000","message":"debugging?","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"4130453b0dc69e5712d53e7f201f0b0798c90c44","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        self.ext_mgr \u003d (ext_mgr"},{"line_number":268,"context_line":"                        or ExtensionManager(get_extensions_path()))"},{"line_number":269,"context_line":"        mapper \u003d routes.Mapper()"},{"line_number":270,"context_line":"        mapper.debug \u003d True"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        # extended resources"},{"line_number":273,"context_line":"        for resource in self.ext_mgr.get_resources():"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9Xq0%3D","line":270,"in_reply_to":"AAAATn%2F9pOE%3D","updated":"2013-12-12 06:44:10.000000000","message":"Oops, this is leftover for debug session.\nWill remove this.","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"}],"neutron/common/driver_manager.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"178fdf134661c29449da242b3d50a80377d31bb2","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        for ext in manager:"},{"line_number":38,"context_line":"            type_ \u003d ext.obj.get_type()"},{"line_number":39,"context_line":"            if type_ in self._drivers:"},{"line_number":40,"context_line":"                LOG.error(_(\"driver \u0027%(new_driver)s\u0027 ignored because \""},{"line_number":41,"context_line":"                            \"driver \u0027%(old_driver)s\u0027 is already \""},{"line_number":42,"context_line":"                            \"registered for driver \u0027%(type)s\u0027\"),"},{"line_number":43,"context_line":"                          {\u0027new_driver\u0027: ext.name,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9pN0%3D","line":40,"updated":"2013-12-09 13:26:28.000000000","message":"i think this kind of error should not be ignored even in case logged. This logic should raise an exception and prohibit incorrect configuration. Looks like you\u0027re doing it in register","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"4130453b0dc69e5712d53e7f201f0b0798c90c44","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        for ext in manager:"},{"line_number":38,"context_line":"            type_ \u003d ext.obj.get_type()"},{"line_number":39,"context_line":"            if type_ in self._drivers:"},{"line_number":40,"context_line":"                LOG.error(_(\"driver \u0027%(new_driver)s\u0027 ignored because \""},{"line_number":41,"context_line":"                            \"driver \u0027%(old_driver)s\u0027 is already \""},{"line_number":42,"context_line":"                            \"registered for driver \u0027%(type)s\u0027\"),"},{"line_number":43,"context_line":"                          {\u0027new_driver\u0027: ext.name,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9Xp8%3D","line":40,"in_reply_to":"AAAATn%2F9pN0%3D","updated":"2013-12-12 06:44:10.000000000","message":"Done","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e622e9c9af3c934f1f8b3ce69960d9f3146ad60c","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            type_ \u003d ext.obj.get_type()"},{"line_number":39,"context_line":"            if type_ in drivers:"},{"line_number":40,"context_line":"                raise ValueError("},{"line_number":41,"context_line":"                    _(\"driver \u0027%(new_driver)s\u0027 ignored because \""},{"line_number":42,"context_line":"                      \"driver \u0027%(old_driver)s\u0027 is already \""},{"line_number":43,"context_line":"                      \"registered for driver \u0027%(type)s\u0027\"),"},{"line_number":44,"context_line":"                    {\u0027new_driver\u0027: ext.name,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F9A8%3D","line":41,"updated":"2014-02-08 17:09:44.000000000","message":"nit: I think \u0027ignored\u0027 implies that the driver is skipped and loading continues. Raising and stopping the service is more appropriate so we only need to indicate that the service stops loading because of incorrect configuration.","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"0004457de7277e18423ea7e8d8381e689bc5e504","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            type_ \u003d ext.obj.get_type()"},{"line_number":39,"context_line":"            if type_ in drivers:"},{"line_number":40,"context_line":"                raise ValueError("},{"line_number":41,"context_line":"                    _(\"driver \u0027%(new_driver)s\u0027 ignored because \""},{"line_number":42,"context_line":"                      \"driver \u0027%(old_driver)s\u0027 is already \""},{"line_number":43,"context_line":"                      \"registered for driver \u0027%(type)s\u0027\"),"},{"line_number":44,"context_line":"                    {\u0027new_driver\u0027: ext.name,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F4bI%3D","line":41,"in_reply_to":"AAAAUX%2F%2F9A8%3D","updated":"2014-02-10 08:56:14.000000000","message":"Done\n\nChanged it to LOG.error() + raise SystemExit()","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"db6e42755360ea78ab1844d4400d7cf88bbc64fd","unresolved":false,"context_lines":[{"line_number":27,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class DriverManager(object):"},{"line_number":31,"context_line":"    def __init__(self, namespace, driver_list, **kwargs):"},{"line_number":32,"context_line":"        super(DriverManager, self).__init__()"},{"line_number":33,"context_line":"        manager \u003d stevedore.named.NamedExtensionManager("}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAXH%2F%2Fno8%3D","line":30,"updated":"2014-04-18 19:55:29.000000000","message":"I\u0027m curious, is it possible to leverage/extend what is in neutron/services/provider_configuration.py?","commit_id":"25db0a52cd80420afebb7638e74e529cd1428bdd"}],"neutron/db/migration/alembic_migrations/versions/1c6b0d82afcd_add_tables_for_servi.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e622e9c9af3c934f1f8b3ce69960d9f3146ad60c","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 Intel Corporation."},{"line_number":4,"context_line":"# Copyright 2013 Isaku Yamahata \u003cisaku.yamahata at intel com\u003e"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F8%2Bc%3D","line":1,"updated":"2014-02-08 17:09:44.000000000","message":"I\u0027d rename this file to 1c6b0d82afcd_service_vm_framework or something. Currently file name doesn\u0027t make much sense.","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"0004457de7277e18423ea7e8d8381e689bc5e504","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 Intel Corporation."},{"line_number":4,"context_line":"# Copyright 2013 Isaku Yamahata \u003cisaku.yamahata at intel com\u003e"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F4fI%3D","line":1,"in_reply_to":"AAAAUX%2F%2F8%2Bc%3D","updated":"2014-02-10 08:56:14.000000000","message":"Done","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e622e9c9af3c934f1f8b3ce69960d9f3146ad60c","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\"\"\"add tables for servicevm framework"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Revision ID: 1c6b0d82afcd"},{"line_number":25,"context_line":"Revises: havana"},{"line_number":26,"context_line":"Create Date: 2013-11-25 18:06:13.980301"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F9Ao%3D","line":25,"updated":"2014-02-08 17:09:44.000000000","message":"doesn\u0027t match down_revision below","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"0004457de7277e18423ea7e8d8381e689bc5e504","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\"\"\"add tables for servicevm framework"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Revision ID: 1c6b0d82afcd"},{"line_number":25,"context_line":"Revises: havana"},{"line_number":26,"context_line":"Create Date: 2013-11-25 18:06:13.980301"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F4dg%3D","line":25,"in_reply_to":"AAAAUX%2F%2F9Ao%3D","updated":"2014-02-10 08:56:14.000000000","message":"Done","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e622e9c9af3c934f1f8b3ce69960d9f3146ad60c","unresolved":false,"context_lines":[{"line_number":26,"context_line":"Create Date: 2013-11-25 18:06:13.980301"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"\"\"\""},{"line_number":29,"context_line":"# TODO(yamahata): update once DB tables are fixed."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"# revision identifiers, used by Alembic."},{"line_number":32,"context_line":"revision \u003d \u00271c6b0d82afcd\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F9Ak%3D","line":29,"updated":"2014-02-08 17:09:44.000000000","message":"what does that mean? migrations are rarely fixed (only if there are real problem in them), so It\u0027s better to make it correct from the start","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"0004457de7277e18423ea7e8d8381e689bc5e504","unresolved":false,"context_lines":[{"line_number":26,"context_line":"Create Date: 2013-11-25 18:06:13.980301"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"\"\"\""},{"line_number":29,"context_line":"# TODO(yamahata): update once DB tables are fixed."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"# revision identifiers, used by Alembic."},{"line_number":32,"context_line":"revision \u003d \u00271c6b0d82afcd\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F4dQ%3D","line":29,"in_reply_to":"AAAAUX%2F%2F9Ak%3D","updated":"2014-02-10 08:56:14.000000000","message":"Done","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"}],"neutron/db/vm/__init__.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e622e9c9af3c934f1f8b3ce69960d9f3146ad60c","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, 2014 Intel Corporation."},{"line_number":4,"context_line":"# Copyright 2013, 2014 Isaku Yamahata \u003cisaku.yamahata at intel com\u003e"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F8%2Fs%3D","line":1,"updated":"2014-02-08 17:09:44.000000000","message":"there is an ongoing effort to remove code from __init__.py (empty) files, so you might want to leave it empty","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"0004457de7277e18423ea7e8d8381e689bc5e504","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, 2014 Intel Corporation."},{"line_number":4,"context_line":"# Copyright 2013, 2014 Isaku Yamahata \u003cisaku.yamahata at intel com\u003e"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F4f0%3D","line":1,"in_reply_to":"AAAAUX%2F%2F8%2Fs%3D","updated":"2014-02-10 08:56:14.000000000","message":"Done","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"}],"neutron/db/vm/loadbalancer_db.py":[{"author":{"_account_id":162,"name":"Bob Melander","email":"bob.melander@gmail.com","username":"bob-melander"},"change_message_id":"66b7c69d8b426afaf8ded4765178299da8e5e330","unresolved":false,"context_lines":[{"line_number":34,"context_line":"class LogicalLoadbalancerInstance(model_base.BASEV2,"},{"line_number":35,"context_line":"                                  models_v2.HasID, models_v2.HasTenant):"},{"line_number":36,"context_line":"    logical_service_id \u003d sa.Column(sa.String(36),"},{"line_number":37,"context_line":"                                   sa.ForeignKey(\u0027logicalresource.id\u0027))"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    multi_tenant \u003d sa.Column(sa.Boolean(), default\u003dFalse)"},{"line_number":40,"context_line":"    state \u003d sa.Column(sa.Enum(\u0027DOWN\u0027, \u0027UP\u0027))    # TODO(yamahata)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Bx58%3D","line":37,"updated":"2013-11-20 10:18:12.000000000","message":"What does this id reference? Is it supposed to point to the LogicalServiceInstance?\n\nOr does LogicalServiceInstance really have any role to play? Could we skip it and just keep the bindings table?","commit_id":"2c2c29f4d3f0285d795c7a3da4c1628515996062"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"78f8801058e8f79c0d96c4f5b7ce1ce71745a4fe","unresolved":false,"context_lines":[{"line_number":34,"context_line":"class LogicalLoadbalancerInstance(model_base.BASEV2,"},{"line_number":35,"context_line":"                                  models_v2.HasID, models_v2.HasTenant):"},{"line_number":36,"context_line":"    logical_service_id \u003d sa.Column(sa.String(36),"},{"line_number":37,"context_line":"                                   sa.ForeignKey(\u0027logicalresource.id\u0027))"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    multi_tenant \u003d sa.Column(sa.Boolean(), default\u003dFalse)"},{"line_number":40,"context_line":"    state \u003d sa.Column(sa.Enum(\u0027DOWN\u0027, \u0027UP\u0027))    # TODO(yamahata)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Bxyk%3D","line":37,"in_reply_to":"AAAATn%2F%2Bx58%3D","updated":"2013-11-20 10:42:56.000000000","message":"Oops. LogicalServiceInstance.","commit_id":"2c2c29f4d3f0285d795c7a3da4c1628515996062"}],"neutron/db/vm/vm_db.py":[{"author":{"_account_id":162,"name":"Bob Melander","email":"bob.melander@gmail.com","username":"bob-melander"},"change_message_id":"f104dbb6142181b8fd6a98e3478e655c982d847b","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    image \u003d sa.Column(sa.String(36))"},{"line_number":44,"context_line":"    flavor \u003d sa.Column(sa.String(36))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    vm_mgmt_if \u003d sa.Column(sa.String(255), default\u003d\u0027eth0\u0027)"},{"line_number":47,"context_line":"    security_group \u003d sa.Column(sa.String(36))   # TODO(yamahata) check"},{"line_number":48,"context_line":"    multi_tenant \u003d sa.Column(sa.Boolean(), default\u003dFalse)"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2B6zk%3D","line":46,"updated":"2013-11-18 16:31:58.000000000","message":"Is this the name of the interface inside the VM?\nI think the port uuid will also be needed but wait, ok, that uuid would probably go into the VMInstance table, right?","commit_id":"33450eccfeb2da557c191c4db682ef0f0bc9447a"},{"author":{"_account_id":162,"name":"Bob Melander","email":"bob.melander@gmail.com","username":"bob-melander"},"change_message_id":"f104dbb6142181b8fd6a98e3478e655c982d847b","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    access_cred_passwd \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class LogicalServiceInstance(model_base.BASEV2,"},{"line_number":62,"context_line":"                             models_v2.HasID, models_v2.HasTenant):"},{"line_number":63,"context_line":"    name \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":64,"context_line":"    service_vm_id \u003d sa.Column(sa.String(36),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2B62I%3D","line":61,"updated":"2013-11-18 16:31:58.000000000","message":"There will for sure be logical service instances but does it really make sense to model them like this here? What I mean is that each service will typically create their own tables for the \"container\" logical resources they provide. \u0027Router\u0027 is one example for routing service. My understanding is that the LBaaS folks work on defining something analogous for LBaaS.\n\nTherefore I\u0027d suggest that instead of the LocalServiceInstance table we introduce something like a binding table that links logical service instances (defined by each service instead of this framework) to service VM instances (or actually, why not just call them HostingDevices, where ServiceVM/VMInstance is one example). The binding table would then essentially contain the UUIDs of the logical resource, and the UUID of the hosting device. Additional columns to specify type of logical resource and type of hosting device will also be needed in such a binding table to make lookups in correct tables during db operations.","commit_id":"33450eccfeb2da557c191c4db682ef0f0bc9447a"},{"author":{"_account_id":162,"name":"Bob Melander","email":"bob.melander@gmail.com","username":"bob-melander"},"change_message_id":"f104dbb6142181b8fd6a98e3478e655c982d847b","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    service_vm_id \u003d sa.Column(sa.String(36),"},{"line_number":65,"context_line":"                              sa.ForeginKey(\u0027servicevms.id\u0027),"},{"line_number":66,"context_line":"                              nullable\u003dTrue)"},{"line_number":67,"context_line":"    multi_tenant \u003d sa.Column(sa.Boolean(), default\u003dFalse)"},{"line_number":68,"context_line":"    state \u003d sa.Column(sa.Enum(\u0027DOWN\u0027, \u0027UP\u0027))    # TODO(yamahata)"},{"line_number":69,"context_line":"    mgmt_if \u003d orm.relationship(\u0027LogicalServiceInstanceMgmtIf\u0027,"},{"line_number":70,"context_line":"                               backref\u003d\u0027LogicalServiceInstance\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2B61U%3D","line":67,"updated":"2013-11-18 16:31:58.000000000","message":"is multi_tenant field needed in the logical service instance?\nShould it not be in the VMInstance table? Or there too?","commit_id":"33450eccfeb2da557c191c4db682ef0f0bc9447a"},{"author":{"_account_id":162,"name":"Bob Melander","email":"bob.melander@gmail.com","username":"bob-melander"},"change_message_id":"f104dbb6142181b8fd6a98e3478e655c982d847b","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    state \u003d sa.Column(sa.Enum(\u0027DOWN\u0027, \u0027UP\u0027))    # TODO(yamahata)"},{"line_number":69,"context_line":"    mgmt_if \u003d orm.relationship(\u0027LogicalServiceInstanceMgmtIf\u0027,"},{"line_number":70,"context_line":"                               backref\u003d\u0027LogicalServiceInstance\u0027)"},{"line_number":71,"context_line":"    networks \u003d orm.relationship(\u0027LogicalServiceInstanceMgmtIf\u0027,"},{"line_number":72,"context_line":"                                backref\u003d\u0027LogicalServiceInstanceNetwork\u0027)"},{"line_number":73,"context_line":"    # obj_store         # TODO(yamahata)"},{"line_number":74,"context_line":"    # cost_factor       # TODO(yamahata)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2B6xw%3D","line":71,"updated":"2013-11-18 16:31:58.000000000","message":"I guess it should be \u0027LogicalServiceInstanceNetwork\u0027","commit_id":"33450eccfeb2da557c191c4db682ef0f0bc9447a"},{"author":{"_account_id":162,"name":"Bob Melander","email":"bob.melander@gmail.com","username":"bob-melander"},"change_message_id":"f104dbb6142181b8fd6a98e3478e655c982d847b","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    # cost_factor       # TODO(yamahata)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"class LogicalServiceInstanceMgmtIf(model_base.BASEV2, models_v2.HasID):"},{"line_number":78,"context_line":"    mgmt_if \u003d sa.Column(sa.String(255))"},{"line_number":79,"context_line":"    logical_service_instance \u003d sa.Column("},{"line_number":80,"context_line":"        sa.String(36), sa.ForeignKey(\u0027logicalserviceinstances.id\u0027))"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2B6qQ%3D","line":77,"updated":"2013-11-18 16:31:58.000000000","message":"Will there be an analogous class for management interface of VMInstance?","commit_id":"33450eccfeb2da557c191c4db682ef0f0bc9447a"},{"author":{"_account_id":162,"name":"Bob Melander","email":"bob.melander@gmail.com","username":"bob-melander"},"change_message_id":"66b7c69d8b426afaf8ded4765178299da8e5e330","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    # service type that this service vm provides."},{"line_number":47,"context_line":"    # At first phase, this includes only single service"},{"line_number":48,"context_line":"    # In future, single service VM may accomodate multiple services."},{"line_number":49,"context_line":"    service_types \u003d orm.relationship(\u0027ServiceType\u0027, backref\u003d\u0027tempalte\u0027)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    # driver to create hosting device. e.g. noop, nova, heat, etc..."},{"line_number":52,"context_line":"    hosting_driver \u003d sa.Column(sa.String(255))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2ByMM%3D","line":49,"updated":"2013-11-20 10:18:12.000000000","message":"typo: tempalte -\u003e template","commit_id":"2c2c29f4d3f0285d795c7a3da4c1628515996062"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"78f8801058e8f79c0d96c4f5b7ce1ce71745a4fe","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    # service type that this service vm provides."},{"line_number":47,"context_line":"    # At first phase, this includes only single service"},{"line_number":48,"context_line":"    # In future, single service VM may accomodate multiple services."},{"line_number":49,"context_line":"    service_types \u003d orm.relationship(\u0027ServiceType\u0027, backref\u003d\u0027tempalte\u0027)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    # driver to create hosting device. e.g. noop, nova, heat, etc..."},{"line_number":52,"context_line":"    hosting_driver \u003d sa.Column(sa.String(255))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Bxyc%3D","line":49,"in_reply_to":"AAAATn%2F%2ByMM%3D","updated":"2013-11-20 10:42:56.000000000","message":"Done","commit_id":"2c2c29f4d3f0285d795c7a3da4c1628515996062"},{"author":{"_account_id":162,"name":"Bob Melander","email":"bob.melander@gmail.com","username":"bob-melander"},"change_message_id":"66b7c69d8b426afaf8ded4765178299da8e5e330","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    value \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"class LogicalServiceInstance(model_base.BASEV2,"},{"line_number":105,"context_line":"                             models_v2.HasID, models_v2.HasTenant):"},{"line_number":106,"context_line":"    \"\"\"Represents logical service instance"},{"line_number":107,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2ByAM%3D","line":104,"updated":"2013-11-20 10:18:12.000000000","message":"If a LogicalServiceInstance is introduced here then I think it will need to include a UUID reference to the … well, the \"thing\" that contains service specific information for the logical service instance. For the router case it would be a record in the \"Routers\" table. I would think same for LBaaS \"container\", FW \"container\". One could argue that Routers table, the LBaaS \"container\" table etc are actually the logical service instance tables.","commit_id":"2c2c29f4d3f0285d795c7a3da4c1628515996062"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"78f8801058e8f79c0d96c4f5b7ce1ce71745a4fe","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    value \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"class LogicalServiceInstance(model_base.BASEV2,"},{"line_number":105,"context_line":"                             models_v2.HasID, models_v2.HasTenant):"},{"line_number":106,"context_line":"    \"\"\"Represents logical service instance"},{"line_number":107,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Bxto%3D","line":104,"in_reply_to":"AAAATn%2F%2ByAM%3D","updated":"2013-11-20 10:42:56.000000000","message":"Agreed. Done.","commit_id":"2c2c29f4d3f0285d795c7a3da4c1628515996062"},{"author":{"_account_id":162,"name":"Bob Melander","email":"bob.melander@gmail.com","username":"bob-melander"},"change_message_id":"66b7c69d8b426afaf8ded4765178299da8e5e330","unresolved":false,"context_lines":[{"line_number":106,"context_line":"    \"\"\"Represents logical service instance"},{"line_number":107,"context_line":"    \"\"\""},{"line_number":108,"context_line":"    name \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":109,"context_line":"    template_id \u003d sa.Column(sa.String(36),"},{"line_number":110,"context_line":"                            sa.ForeignKey(\u0027hostingdevicetemplates.id\u0027))"},{"line_number":111,"context_line":"    service_type_id \u003d sa.Column(sa.String(36),"},{"line_number":112,"context_line":"                                sa.ForeignKey(\u0027servicetypes.id\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2ByKE%3D","line":109,"updated":"2013-11-20 10:18:12.000000000","message":"Not sure template_id is needed here since the hosting device has it. Or do you foresee use of some kind of template also for the logical instances?","commit_id":"2c2c29f4d3f0285d795c7a3da4c1628515996062"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"78f8801058e8f79c0d96c4f5b7ce1ce71745a4fe","unresolved":false,"context_lines":[{"line_number":106,"context_line":"    \"\"\"Represents logical service instance"},{"line_number":107,"context_line":"    \"\"\""},{"line_number":108,"context_line":"    name \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":109,"context_line":"    template_id \u003d sa.Column(sa.String(36),"},{"line_number":110,"context_line":"                            sa.ForeignKey(\u0027hostingdevicetemplates.id\u0027))"},{"line_number":111,"context_line":"    service_type_id \u003d sa.Column(sa.String(36),"},{"line_number":112,"context_line":"                                sa.ForeignKey(\u0027servicetypes.id\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2BxyA%3D","line":109,"in_reply_to":"AAAATn%2F%2ByKE%3D","updated":"2013-11-20 10:42:56.000000000","message":"Agreed. dropped this.","commit_id":"2c2c29f4d3f0285d795c7a3da4c1628515996062"},{"author":{"_account_id":162,"name":"Bob Melander","email":"bob.melander@gmail.com","username":"bob-melander"},"change_message_id":"66b7c69d8b426afaf8ded4765178299da8e5e330","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    Here the term, \u0027VM\u0027, is intentionally avoided because it can be"},{"line_number":118,"context_line":"    VM or other container."},{"line_number":119,"context_line":"    \"\"\""},{"line_number":120,"context_line":"    instance_id \u003d sa.Column(sa.String(255))"},{"line_number":121,"context_line":"    tenant_id \u003d sa.Column(sa.String(36))"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    template_id \u003d sa.Column(sa.String(36),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2ByOc%3D","line":120,"updated":"2013-11-20 10:18:12.000000000","message":"So for the case of service vm then instance_id would be the UUID of the VM, right?","commit_id":"2c2c29f4d3f0285d795c7a3da4c1628515996062"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"78f8801058e8f79c0d96c4f5b7ce1ce71745a4fe","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    Here the term, \u0027VM\u0027, is intentionally avoided because it can be"},{"line_number":118,"context_line":"    VM or other container."},{"line_number":119,"context_line":"    \"\"\""},{"line_number":120,"context_line":"    instance_id \u003d sa.Column(sa.String(255))"},{"line_number":121,"context_line":"    tenant_id \u003d sa.Column(sa.String(36))"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    template_id \u003d sa.Column(sa.String(36),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Bxxs%3D","line":120,"in_reply_to":"AAAATn%2F%2ByOc%3D","updated":"2013-11-20 10:42:56.000000000","message":"That\u0027s right. Added comment.","commit_id":"2c2c29f4d3f0285d795c7a3da4c1628515996062"},{"author":{"_account_id":162,"name":"Bob Melander","email":"bob.melander@gmail.com","username":"bob-melander"},"change_message_id":"66b7c69d8b426afaf8ded4765178299da8e5e330","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    Since Device can accomodate multiple services, it\u0027s many-to-one"},{"line_number":132,"context_line":"    relationship."},{"line_number":133,"context_line":"    \"\"\""},{"line_number":134,"context_line":"    logical_service_instance \u003d \\"},{"line_number":135,"context_line":"        sa.Column(sa.String(36), sa.ForeignKey(\u0027logicalserviceinstances.id\u0027))"},{"line_number":136,"context_line":"    hosting_device_id \u003d sa.Column(sa.String(36),"},{"line_number":137,"context_line":"                                  sa.ForeignKey(\u0027hostingdevices.id\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2ByMs%3D","line":134,"updated":"2013-11-20 10:18:12.000000000","message":"Suggest adding \u0027_id\u0027 suffix since it is an id","commit_id":"2c2c29f4d3f0285d795c7a3da4c1628515996062"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"78f8801058e8f79c0d96c4f5b7ce1ce71745a4fe","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    Since Device can accomodate multiple services, it\u0027s many-to-one"},{"line_number":132,"context_line":"    relationship."},{"line_number":133,"context_line":"    \"\"\""},{"line_number":134,"context_line":"    logical_service_instance \u003d \\"},{"line_number":135,"context_line":"        sa.Column(sa.String(36), sa.ForeignKey(\u0027logicalserviceinstances.id\u0027))"},{"line_number":136,"context_line":"    hosting_device_id \u003d sa.Column(sa.String(36),"},{"line_number":137,"context_line":"                                  sa.ForeignKey(\u0027hostingdevices.id\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Bxxk%3D","line":134,"in_reply_to":"AAAATn%2F%2ByMs%3D","updated":"2013-11-20 10:42:56.000000000","message":"Done","commit_id":"2c2c29f4d3f0285d795c7a3da4c1628515996062"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"178fdf134661c29449da242b3d50a80377d31bb2","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"# this table corresponds to Service_Type in ServiceVM of BP"},{"line_number":87,"context_line":"class ServiceType(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":88,"context_line":"    \"\"\"Represents service type which hosting device provides."},{"line_number":89,"context_line":"    Since a device may provide many services, This is one-to-many"},{"line_number":90,"context_line":"    relationship."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9pNI%3D","line":87,"updated":"2013-12-09 13:26:28.000000000","message":"I\u0027m strongly against this name to be a name of a class. Please use another name which doesn\u0027t overlap with generic terminology.","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"4130453b0dc69e5712d53e7f201f0b0798c90c44","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"# this table corresponds to Service_Type in ServiceVM of BP"},{"line_number":87,"context_line":"class ServiceType(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":88,"context_line":"    \"\"\"Represents service type which hosting device provides."},{"line_number":89,"context_line":"    Since a device may provide many services, This is one-to-many"},{"line_number":90,"context_line":"    relationship."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9XpU%3D","line":87,"in_reply_to":"AAAATn%2F9pNI%3D","updated":"2013-12-12 06:44:10.000000000","message":"The expected value here is firewall, l3_router, loadbalancer, vpn and so on. So \u0027service\u0027 is very natural, I thought.\n\nI\u0027ll postpone this issue by adding TODO until hearing the opinion from others.","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"178fdf134661c29449da242b3d50a80377d31bb2","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        template \u003d hosting_device_template[\u0027hosting_device_template\u0027]"},{"line_number":224,"context_line":"        LOG.debug(\u0027template %s\u0027 % template)"},{"line_number":225,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, template)"},{"line_number":226,"context_line":"        if (\u0027hosting_device_driver\u0027 not in template or"},{"line_number":227,"context_line":"            \u0027service_types\u0027 not in template):"},{"line_number":228,"context_line":"            raise template      # TODO(yamahata): define exception"},{"line_number":229,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9pKw%3D","line":226,"updated":"2013-12-09 13:26:28.000000000","message":"i guess it also could be present but equal to attributes.ATTR_NOT_SPECIFIED","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"4130453b0dc69e5712d53e7f201f0b0798c90c44","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        template \u003d hosting_device_template[\u0027hosting_device_template\u0027]"},{"line_number":224,"context_line":"        LOG.debug(\u0027template %s\u0027 % template)"},{"line_number":225,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, template)"},{"line_number":226,"context_line":"        if (\u0027hosting_device_driver\u0027 not in template or"},{"line_number":227,"context_line":"            \u0027service_types\u0027 not in template):"},{"line_number":228,"context_line":"            raise template      # TODO(yamahata): define exception"},{"line_number":229,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9Xoc%3D","line":226,"in_reply_to":"AAAATn%2F9pKw%3D","updated":"2013-12-12 06:44:10.000000000","message":"Done.\nWill use is_attr_set()","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"178fdf134661c29449da242b3d50a80377d31bb2","unresolved":false,"context_lines":[{"line_number":274,"context_line":""},{"line_number":275,"context_line":"    def get_hosting_device_template(self, context, hosting_device_template_id,"},{"line_number":276,"context_line":"                                    fields\u003dNone):"},{"line_number":277,"context_line":"        template_db \u003d self._get_by_id(context, HostingDeviceTemplate,"},{"line_number":278,"context_line":"                                      hosting_device_template_id)"},{"line_number":279,"context_line":"        return self._make_template_dict(template_db)"},{"line_number":280,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9pFA%3D","line":277,"updated":"2013-12-09 13:26:28.000000000","message":"it\u0027s better to except NoResultFound and raise specific exception","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"178fdf134661c29449da242b3d50a80377d31bb2","unresolved":false,"context_lines":[{"line_number":300,"context_line":"                service_table_id\u003dservice_table_id)"},{"line_number":301,"context_line":"            context.session.add(instance_db)"},{"line_number":302,"context_line":"            binding_db \u003d LogicalServiceHostingDeviceBinding("},{"line_number":303,"context_line":"                id\u003duuidutils.generate_uuid(),"},{"line_number":304,"context_line":"                logical_service_instance_id\u003dlogical_service_instance_id,"},{"line_number":305,"context_line":"                hosting_device_id\u003dhosting_device_id)"},{"line_number":306,"context_line":"            context.session.add(binding_db)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9pEs%3D","line":303,"updated":"2013-12-09 13:26:28.000000000","message":"there is an effort to get rid of uuidutils.generate_uuid. use str(uuid.uuid4)","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"4130453b0dc69e5712d53e7f201f0b0798c90c44","unresolved":false,"context_lines":[{"line_number":300,"context_line":"                service_table_id\u003dservice_table_id)"},{"line_number":301,"context_line":"            context.session.add(instance_db)"},{"line_number":302,"context_line":"            binding_db \u003d LogicalServiceHostingDeviceBinding("},{"line_number":303,"context_line":"                id\u003duuidutils.generate_uuid(),"},{"line_number":304,"context_line":"                logical_service_instance_id\u003dlogical_service_instance_id,"},{"line_number":305,"context_line":"                hosting_device_id\u003dhosting_device_id)"},{"line_number":306,"context_line":"            context.session.add(binding_db)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9Xnk%3D","line":303,"in_reply_to":"AAAATn%2F9pEs%3D","updated":"2013-12-12 06:44:10.000000000","message":"Done","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"178fdf134661c29449da242b3d50a80377d31bb2","unresolved":false,"context_lines":[{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def get_logical_service_instance(self, context,"},{"line_number":326,"context_line":"                                     logical_service_instance_id, fields\u003dNone):"},{"line_number":327,"context_line":"        instance_db \u003d self._get_by_id(context, LogicalServiceInstance,"},{"line_number":328,"context_line":"                                      logical_service_instance_id)"},{"line_number":329,"context_line":"        return self._make_logical_service_instance_dict(instance_db, fields)"},{"line_number":330,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9o80%3D","line":327,"updated":"2013-12-09 13:26:28.000000000","message":"it makes sense to handle NoResultFound thrown by _get_by_id and raise specific exception","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"178fdf134661c29449da242b3d50a80377d31bb2","unresolved":false,"context_lines":[{"line_number":365,"context_line":"        else:"},{"line_number":366,"context_line":"            new_status \u003d constants.ACTIVE"},{"line_number":367,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":368,"context_line":"            hosting_device_db \u003d self._model_query(HostingDevice).\\"},{"line_number":369,"context_line":"                filter(HostingDevice.id \u003d\u003d hosting_device_id).\\"},{"line_number":370,"context_line":"                filter(HostingDevice.status \u003d\u003d constants.PENDING_CREATE).\\"},{"line_number":371,"context_line":"                with_lockmode(\u0027update\u0027).one()"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9o8k%3D","line":368,"updated":"2013-12-09 13:26:28.000000000","message":"nit: use parens () instead of back slashes to make line continuations","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"4130453b0dc69e5712d53e7f201f0b0798c90c44","unresolved":false,"context_lines":[{"line_number":365,"context_line":"        else:"},{"line_number":366,"context_line":"            new_status \u003d constants.ACTIVE"},{"line_number":367,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":368,"context_line":"            hosting_device_db \u003d self._model_query(HostingDevice).\\"},{"line_number":369,"context_line":"                filter(HostingDevice.id \u003d\u003d hosting_device_id).\\"},{"line_number":370,"context_line":"                filter(HostingDevice.status \u003d\u003d constants.PENDING_CREATE).\\"},{"line_number":371,"context_line":"                with_lockmode(\u0027update\u0027).one()"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9Xm0%3D","line":368,"in_reply_to":"AAAATn%2F9o8k%3D","updated":"2013-12-12 06:44:10.000000000","message":"Done","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"178fdf134661c29449da242b3d50a80377d31bb2","unresolved":false,"context_lines":[{"line_number":389,"context_line":"                with_lockmode(\u0027update\u0027).one()"},{"line_number":390,"context_line":"            hosting_device_db.status \u003d constants.PENDING_DELETE"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"        return self._make_hosting_device_dict(hosting_device_db)"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"    # called internally, not by REST API"},{"line_number":395,"context_line":"    def delete_hosting_device_post(self, context, hosting_device_id, error):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9o8U%3D","line":392,"updated":"2013-12-09 13:26:28.000000000","message":"usually delete operations do not return anything.\nWhy is it needed?","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"4130453b0dc69e5712d53e7f201f0b0798c90c44","unresolved":false,"context_lines":[{"line_number":389,"context_line":"                with_lockmode(\u0027update\u0027).one()"},{"line_number":390,"context_line":"            hosting_device_db.status \u003d constants.PENDING_DELETE"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"        return self._make_hosting_device_dict(hosting_device_db)"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"    # called internally, not by REST API"},{"line_number":395,"context_line":"    def delete_hosting_device_post(self, context, hosting_device_id, error):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9XnQ%3D","line":392,"in_reply_to":"AAAATn%2F9o8U%3D","updated":"2013-12-12 06:44:10.000000000","message":"Please notify \u0027_pre\u0027.\nThese value will be used by actual hosting device deletion.","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"178fdf134661c29449da242b3d50a80377d31bb2","unresolved":false,"context_lines":[{"line_number":398,"context_line":"            if error:"},{"line_number":399,"context_line":"                query.update().\\"},{"line_number":400,"context_line":"                    filter(HostingDevice.id \u003d\u003d hosting_device_id).\\"},{"line_number":401,"context_line":"                    filter(HostingDevice.status \u003d\u003d constants.PENDING_DELETE).\\"},{"line_number":402,"context_line":"                    values({\u0027status\u0027: constants.ERROR})"},{"line_number":403,"context_line":"            else:"},{"line_number":404,"context_line":"                query.filter(HostingDevice.id \u003d\u003d hosting_device_id).\\"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9oz8%3D","line":401,"updated":"2013-12-09 13:26:28.000000000","message":"this seems to be unnecessary filter to a query. Is it really needed?","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"4130453b0dc69e5712d53e7f201f0b0798c90c44","unresolved":false,"context_lines":[{"line_number":398,"context_line":"            if error:"},{"line_number":399,"context_line":"                query.update().\\"},{"line_number":400,"context_line":"                    filter(HostingDevice.id \u003d\u003d hosting_device_id).\\"},{"line_number":401,"context_line":"                    filter(HostingDevice.status \u003d\u003d constants.PENDING_DELETE).\\"},{"line_number":402,"context_line":"                    values({\u0027status\u0027: constants.ERROR})"},{"line_number":403,"context_line":"            else:"},{"line_number":404,"context_line":"                query.filter(HostingDevice.id \u003d\u003d hosting_device_id).\\"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9Xmg%3D","line":401,"in_reply_to":"AAAATn%2F9oz8%3D","updated":"2013-12-12 06:44:10.000000000","message":"In order to show state transition explicitly in code.\nYes, without the line, correctness remains.","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"178fdf134661c29449da242b3d50a80377d31bb2","unresolved":false,"context_lines":[{"line_number":402,"context_line":"                    values({\u0027status\u0027: constants.ERROR})"},{"line_number":403,"context_line":"            else:"},{"line_number":404,"context_line":"                query.filter(HostingDevice.id \u003d\u003d hosting_device_id).\\"},{"line_number":405,"context_line":"                    filter(HostingDevice.status \u003d\u003d constants.PENDING_DELETE).\\"},{"line_number":406,"context_line":"                    delete()"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"    # reference implementation"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9oz0%3D","line":405,"updated":"2013-12-09 13:26:28.000000000","message":"same as above.","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"178fdf134661c29449da242b3d50a80377d31bb2","unresolved":false,"context_lines":[{"line_number":422,"context_line":"    # TODO(yamahata): update_hosting_device() and update_hosting_device_done()?"},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"    def get_hosting_device(self, context, hosting_device_id, fields\u003dNone):"},{"line_number":425,"context_line":"        hosting_device_db \u003d self._get_by_id(context,"},{"line_number":426,"context_line":"                                            HostingDevice, hosting_device_id)"},{"line_number":427,"context_line":"        return self._make_hosting_device_dict(hosting_device_db, fields)"},{"line_number":428,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9ozc%3D","line":425,"updated":"2013-12-09 13:26:28.000000000","message":"the same on catching NoResultFound and raising specific exception","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e622e9c9af3c934f1f8b3ce69960d9f3146ad60c","unresolved":false,"context_lines":[{"line_number":44,"context_line":"###########################################################################"},{"line_number":45,"context_line":"# db tables"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"# This table corresponds to SeviceVM of BP"},{"line_number":48,"context_line":"class HostingDeviceTemplate(model_base.BASEV2,"},{"line_number":49,"context_line":"                            models_v2.HasId, models_v2.HasTenant):"},{"line_number":50,"context_line":"    \"\"\"Represents template to create hosting device"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F8%2FY%3D","line":47,"updated":"2014-02-08 17:09:44.000000000","message":"what is \u0027BP\u0027?","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"0004457de7277e18423ea7e8d8381e689bc5e504","unresolved":false,"context_lines":[{"line_number":44,"context_line":"###########################################################################"},{"line_number":45,"context_line":"# db tables"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"# This table corresponds to SeviceVM of BP"},{"line_number":48,"context_line":"class HostingDeviceTemplate(model_base.BASEV2,"},{"line_number":49,"context_line":"                            models_v2.HasId, models_v2.HasTenant):"},{"line_number":50,"context_line":"    \"\"\"Represents template to create hosting device"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F4JE%3D","line":47,"in_reply_to":"AAAAUX%2F%2F8%2FY%3D","updated":"2014-02-10 08:56:14.000000000","message":"Done","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e622e9c9af3c934f1f8b3ce69960d9f3146ad60c","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    # Descriptive name"},{"line_number":53,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":54,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":55,"context_line":"    provider_name \u003d sa.Column(sa.String(255))"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    # service type that this service vm provides."},{"line_number":58,"context_line":"    # At first phase, this includes only single service"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F9Ac%3D","line":55,"updated":"2014-02-08 17:09:44.000000000","message":"what is \u0027provider_name\u0027 here? why not just \u0027provider\u0027?\nIs it related to \u0027provider\u0027 notion that is currently used for advanced services?","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"0004457de7277e18423ea7e8d8381e689bc5e504","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    # Descriptive name"},{"line_number":53,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":54,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":55,"context_line":"    provider_name \u003d sa.Column(sa.String(255))"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    # service type that this service vm provides."},{"line_number":58,"context_line":"    # At first phase, this includes only single service"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F4Hg%3D","line":55,"in_reply_to":"AAAAUX%2F%2F9Ac%3D","updated":"2014-02-10 08:56:14.000000000","message":"It represents who provided guest VM image for this device. not for \u0027provider\u0027.\nHmm, looks like this kind of information is combined into description.\nSo I\u0027ll delete this column.","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e622e9c9af3c934f1f8b3ce69960d9f3146ad60c","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    # service type that this service vm provides."},{"line_number":58,"context_line":"    # At first phase, this includes only single service"},{"line_number":59,"context_line":"    # In future, single service VM may accomodate multiple services."},{"line_number":60,"context_line":"    service_types \u003d orm.relationship(\u0027ServiceType\u0027, backref\u003d\u0027template\u0027)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    # driver to create hosting device. e.g. noop, nova, heat, etc..."},{"line_number":63,"context_line":"    hosting_device_driver \u003d sa.Column(sa.String(255))"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F8%2Fk%3D","line":60,"updated":"2014-02-08 17:09:44.000000000","message":"i think it could be just a string having comma-separated list of built-in identifiers. See comment below","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"0004457de7277e18423ea7e8d8381e689bc5e504","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    # service type that this service vm provides."},{"line_number":58,"context_line":"    # At first phase, this includes only single service"},{"line_number":59,"context_line":"    # In future, single service VM may accomodate multiple services."},{"line_number":60,"context_line":"    service_types \u003d orm.relationship(\u0027ServiceType\u0027, backref\u003d\u0027template\u0027)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    # driver to create hosting device. e.g. noop, nova, heat, etc..."},{"line_number":63,"context_line":"    hosting_device_driver \u003d sa.Column(sa.String(255))"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F34s%3D","line":60,"in_reply_to":"AAAAUX%2F%2F8%2Fk%3D","updated":"2014-02-10 08:56:14.000000000","message":"There is two points here.\nREST API and internal representation.\n\nRegarding to REST API.\nAre you claiming that it should be a single string?\nJSON list instead of comma separated list seems natural for me.\n\n\nRegarding to internal representation, I\u0027m against it.\nThese values are used for scheduling. If comma separated list is used, regex in sql(\u0027LIKE\u0027 clause) is needed. which isn\u0027t portable between db(mysql, postgress, sqlite)\nSo I\u0027d like to keep those in separated table.","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e622e9c9af3c934f1f8b3ce69960d9f3146ad60c","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    service_types \u003d orm.relationship(\u0027ServiceType\u0027, backref\u003d\u0027template\u0027)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    # driver to create hosting device. e.g. noop, nova, heat, etc..."},{"line_number":63,"context_line":"    hosting_device_driver \u003d sa.Column(sa.String(255))"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    # mgmt driver to communicate with hosting device."},{"line_number":66,"context_line":"    # e.g. noop, OpenStack MGMT, OpenStack notification, netconf, snmp,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F8%2Fg%3D","line":63,"updated":"2014-02-08 17:09:44.000000000","message":"nit: i think since it is HostingDeviceTemplate this attribute doesn\u0027t need hosting_ prefix","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e622e9c9af3c934f1f8b3ce69960d9f3146ad60c","unresolved":false,"context_lines":[{"line_number":98,"context_line":"# this table corresponds to Service_Type in ServiceVM of BP"},{"line_number":99,"context_line":"# TODO(yamahata): reach consensus for naming."},{"line_number":100,"context_line":"#                 \u0027service\u0027 might be too generic terminology."},{"line_number":101,"context_line":"class ServiceType(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":102,"context_line":"    \"\"\"Represents service type which hosting device provides."},{"line_number":103,"context_line":"    Since a device may provide many services, This is one-to-many"},{"line_number":104,"context_line":"    relationship."}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F8%2F8%3D","line":101,"updated":"2014-02-08 17:09:44.000000000","message":"We already have ServiceType notion (not a model!) in our code.\nI don\u0027t think this is something that cloud admin or user needs to create. Device that supports several service types may have them as comma-separated string list, it\u0027s no big deal.","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e622e9c9af3c934f1f8b3ce69960d9f3146ad60c","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    template_id \u003d sa.Column(sa.String(36),"},{"line_number":121,"context_line":"                            sa.ForeignKey(\u0027hostingdevicetemplates.id\u0027),"},{"line_number":122,"context_line":"                            nullable\u003dFalse)"},{"line_number":123,"context_line":"    key \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":124,"context_line":"    value \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F8%2B4%3D","line":123,"updated":"2014-02-08 17:09:44.000000000","message":"looks like there should be unique constraint for template_id+key. So models_v2.HasId might be unnecessary.","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"0004457de7277e18423ea7e8d8381e689bc5e504","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    template_id \u003d sa.Column(sa.String(36),"},{"line_number":121,"context_line":"                            sa.ForeignKey(\u0027hostingdevicetemplates.id\u0027),"},{"line_number":122,"context_line":"                            nullable\u003dFalse)"},{"line_number":123,"context_line":"    key \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":124,"context_line":"    value \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F4Zk%3D","line":123,"in_reply_to":"AAAAUX%2F%2F8%2B4%3D","updated":"2014-02-10 08:56:14.000000000","message":"Unfortunately no.\nFor example some keywards are allowed multiple times when booting instance VM.\n\nnova boot --block-device \u003c...\u003e --block-device \u003c...\u003e","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e622e9c9af3c934f1f8b3ce69960d9f3146ad60c","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    status \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"class HostingDeviceArg(model_base.BASEV2, models_v2.HasId):"},{"line_number":153,"context_line":"    \"\"\"Represents kwargs necessary for spinning up VM in (key, value) pair"},{"line_number":154,"context_line":"    key value pair is adopted for being agnostic to actuall manager of VMs"},{"line_number":155,"context_line":"    like nova, heat or others. e.g. image-id, flavor-id for Nova."}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F8%2B8%3D","line":152,"updated":"2014-02-08 17:09:44.000000000","message":"Why is it necessary for hosting device itself? Aren\u0027t template attributes sufficient for that?","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"0004457de7277e18423ea7e8d8381e689bc5e504","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    status \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"class HostingDeviceArg(model_base.BASEV2, models_v2.HasId):"},{"line_number":153,"context_line":"    \"\"\"Represents kwargs necessary for spinning up VM in (key, value) pair"},{"line_number":154,"context_line":"    key value pair is adopted for being agnostic to actuall manager of VMs"},{"line_number":155,"context_line":"    like nova, heat or others. e.g. image-id, flavor-id for Nova."}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F4ZI%3D","line":152,"in_reply_to":"AAAAUX%2F%2F8%2B8%3D","updated":"2014-02-10 08:56:14.000000000","message":"No.\n\nUser wants to define template as base and slightly modify the configuration when boot it per instance.\n\nWith nova example,  disk setting are defined in the metadata of vm-image as base template and tweak it with nova command line like --ephemeral or --block-device.","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e622e9c9af3c934f1f8b3ce69960d9f3146ad60c","unresolved":false,"context_lines":[{"line_number":178,"context_line":"    \"\"\""},{"line_number":179,"context_line":"    hosting_device_id \u003d sa.Column(sa.String(36),"},{"line_number":180,"context_line":"                                  sa.ForeignKey(\u0027hostingdevices.id\u0027))"},{"line_number":181,"context_line":"    network_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":182,"context_line":"    subnet_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":183,"context_line":"    port_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":184,"context_line":"    router_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F8%2BY%3D","line":181,"updated":"2014-02-08 17:09:44.000000000","message":"do these attributes need to be FKs?","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"0004457de7277e18423ea7e8d8381e689bc5e504","unresolved":false,"context_lines":[{"line_number":178,"context_line":"    \"\"\""},{"line_number":179,"context_line":"    hosting_device_id \u003d sa.Column(sa.String(36),"},{"line_number":180,"context_line":"                                  sa.ForeignKey(\u0027hostingdevices.id\u0027))"},{"line_number":181,"context_line":"    network_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":182,"context_line":"    subnet_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":183,"context_line":"    port_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":184,"context_line":"    router_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F4OY%3D","line":181,"in_reply_to":"AAAAUX%2F%2F8%2BY%3D","updated":"2014-02-10 08:56:14.000000000","message":"No. It\u0027s not needed.\n\nActually those values are used only as indentifier\nand they aren\u0027t referenced. Please refer to neutron/vm/hosting_device_scheduler.py\n\nSo FK isn\u0027t needed.","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e622e9c9af3c934f1f8b3ce69960d9f3146ad60c","unresolved":false,"context_lines":[{"line_number":183,"context_line":"    port_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":184,"context_line":"    router_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    role \u003d sa.Column(sa.String(256), nullable\u003dTrue)"},{"line_number":187,"context_line":"    # disambiguation between same roles"},{"line_number":188,"context_line":"    index \u003d sa.Column(sa.Integer, nullable\u003dTrue)"},{"line_number":189,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F8%2BU%3D","line":186,"updated":"2014-02-08 17:09:44.000000000","message":"nit: sa.String(255)\n Is there a list of possible roles?","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"0004457de7277e18423ea7e8d8381e689bc5e504","unresolved":false,"context_lines":[{"line_number":183,"context_line":"    port_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":184,"context_line":"    router_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    role \u003d sa.Column(sa.String(256), nullable\u003dTrue)"},{"line_number":187,"context_line":"    # disambiguation between same roles"},{"line_number":188,"context_line":"    index \u003d sa.Column(sa.Integer, nullable\u003dTrue)"},{"line_number":189,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F4XM%3D","line":186,"in_reply_to":"AAAAUX%2F%2F8%2BU%3D","updated":"2014-02-10 08:56:14.000000000","message":"Oops. fixed to 255.\n\nThere is no list.\n\nFrom the point of servicevm extension, this is just string.\n\nAs the comment above, this represents be service chaining mode + which vif.\nIt would be something like\none-arm, two-leg,...\nThe possible insertion mode are described in\nhttps://docs.google.com/document/d/1fmCWpCxAN4g5txmCJVmBDt02GYew2kvyRsh0Wl3YF2U/edit?pli\u003d1","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e622e9c9af3c934f1f8b3ce69960d9f3146ad60c","unresolved":false,"context_lines":[{"line_number":189,"context_line":""},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"# this table corresponds to LogicalServiceInstance of BP"},{"line_number":192,"context_line":"class LogicalServiceInstance(model_base.BASEV2,"},{"line_number":193,"context_line":"                             models_v2.HasId, models_v2.HasTenant):"},{"line_number":194,"context_line":"    \"\"\"Represents logical service instance"},{"line_number":195,"context_line":"    This table is only to tell what logical service instances exists."}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F89U%3D","line":192,"updated":"2014-02-08 17:09:44.000000000","message":"Do we need \u0027Logical\u0027 as a prefix? I\u0027m concerned about attribute name lengths what might not add much to the readability and clarity.","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e622e9c9af3c934f1f8b3ce69960d9f3146ad60c","unresolved":false,"context_lines":[{"line_number":199,"context_line":"    is implicitly determined by service_type_id."},{"line_number":200,"context_line":"    \"\"\""},{"line_number":201,"context_line":"    name \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":202,"context_line":"    service_type_id \u003d sa.Column(sa.String(36),"},{"line_number":203,"context_line":"                                sa.ForeignKey(\u0027servicetypes.id\u0027))"},{"line_number":204,"context_line":"    service_type \u003d orm.relationship(\u0027ServiceType\u0027)"},{"line_number":205,"context_line":"    # points to row in service specific table if any."}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F8%2BQ%3D","line":202,"updated":"2014-02-08 17:09:44.000000000","message":"that could be just a string identifier, per suggestion above","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e622e9c9af3c934f1f8b3ce69960d9f3146ad60c","unresolved":false,"context_lines":[{"line_number":261,"context_line":"    index \u003d sa.Column(sa.Integer, nullable\u003dTrue)        # disambiguation"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"class LogicalServiceHostingDeviceBinding(model_base.BASEV2, models_v2.HasId):"},{"line_number":265,"context_line":"    \"\"\"Represents binding with HostingDevice and LogicalResource."},{"line_number":266,"context_line":"    Since Device can accomodate multiple services, it\u0027s many-to-one"},{"line_number":267,"context_line":"    relationship."}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F89c%3D","line":264,"updated":"2014-02-08 17:09:44.000000000","message":"Id is not necessary for this model.\nthere should be PK on both columns","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"0004457de7277e18423ea7e8d8381e689bc5e504","unresolved":false,"context_lines":[{"line_number":261,"context_line":"    index \u003d sa.Column(sa.Integer, nullable\u003dTrue)        # disambiguation"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"class LogicalServiceHostingDeviceBinding(model_base.BASEV2, models_v2.HasId):"},{"line_number":265,"context_line":"    \"\"\"Represents binding with HostingDevice and LogicalResource."},{"line_number":266,"context_line":"    Since Device can accomodate multiple services, it\u0027s many-to-one"},{"line_number":267,"context_line":"    relationship."}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F4UQ%3D","line":264,"in_reply_to":"AAAAUX%2F%2F89c%3D","updated":"2014-02-10 08:56:14.000000000","message":"Done","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"db6e42755360ea78ab1844d4400d7cf88bbc64fd","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    service_types \u003d orm.relationship(\u0027ServiceType\u0027, backref\u003d\u0027template\u0027)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    # driver to create hosting device. e.g. noop, nova, heat, etc..."},{"line_number":63,"context_line":"    device_driver \u003d sa.Column(sa.String(255))"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    # mgmt driver to communicate with hosting device."},{"line_number":66,"context_line":"    # e.g. noop, OpenStack MGMT, OpenStack notification, netconf, snmp,"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAXH%2F%2FnXE%3D","line":63,"updated":"2014-04-18 19:55:29.000000000","message":"is it an alias or what?","commit_id":"25db0a52cd80420afebb7638e74e529cd1428bdd"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"db6e42755360ea78ab1844d4400d7cf88bbc64fd","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    # mgmt driver to communicate with hosting device."},{"line_number":66,"context_line":"    # e.g. noop, OpenStack MGMT, OpenStack notification, netconf, snmp,"},{"line_number":67,"context_line":"    #      ssh, etc..."},{"line_number":68,"context_line":"    mgmt_driver \u003d sa.Column(sa.String(255))"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    # (key, value) pair to spin up"},{"line_number":71,"context_line":"    attributes \u003d orm.relationship(\u0027DeviceTemplateAttribute\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAXH%2F%2Fnmw%3D","line":68,"updated":"2014-04-18 19:55:29.000000000","message":"same question as above","commit_id":"25db0a52cd80420afebb7638e74e529cd1428bdd"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"db6e42755360ea78ab1844d4400d7cf88bbc64fd","unresolved":false,"context_lines":[{"line_number":98,"context_line":"# this table corresponds to Service_Type in ServiceVM of the original spec"},{"line_number":99,"context_line":"# TODO(yamahata): reach consensus for naming."},{"line_number":100,"context_line":"#                 \u0027service\u0027 might be too generic terminology."},{"line_number":101,"context_line":"class ServiceType(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":102,"context_line":"    \"\"\"Represents service type which hosting device provides."},{"line_number":103,"context_line":"    Since a device may provide many services, This is one-to-many"},{"line_number":104,"context_line":"    relationship."}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAXH%2F%2FnWE%3D","line":101,"updated":"2014-04-18 19:55:29.000000000","message":"as i said in some previous review, I\u0027d be against such model name. Service type is a broad term which has particular meaning in neutron advanced services.","commit_id":"25db0a52cd80420afebb7638e74e529cd1428bdd"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"be537c9933426e8b68d5445c29bcb932f67ed022","unresolved":false,"context_lines":[{"line_number":673,"context_line":"    # logical service instance"},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"    # called internally, not by REST API"},{"line_number":676,"context_line":"    def _create_service_instance(self, context, device_id,"},{"line_number":677,"context_line":"                                 service_instance_param):"},{"line_number":678,"context_line":"        \"\"\""},{"line_number":679,"context_line":"        :param service_instance_param: dictionary to create"}],"source_content_type":"text/x-python","patch_set":21,"id":"da9df570_293a2fe7","line":676,"updated":"2014-09-25 21:55:13.000000000","message":"where is this called from?","commit_id":"25db0a52cd80420afebb7638e74e529cd1428bdd"}],"neutron/extensions/servicevm.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"178fdf134661c29449da242b3d50a80377d31bb2","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        },"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        # TODO(yamahata): Allow post?"},{"line_number":179,"context_line":"        \u0027logivcal_services\u0027: {"},{"line_number":180,"context_line":"            \u0027allow_post\u0027: False,"},{"line_number":181,"context_line":"            \u0027allow_put\u0027: False,"},{"line_number":182,"context_line":"            \u0027validate\u0027: {\u0027type:uuid\u0027: None},"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9oyk%3D","line":179,"updated":"2013-12-09 13:26:28.000000000","message":"typo","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"4130453b0dc69e5712d53e7f201f0b0798c90c44","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        },"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        # TODO(yamahata): Allow post?"},{"line_number":179,"context_line":"        \u0027logivcal_services\u0027: {"},{"line_number":180,"context_line":"            \u0027allow_post\u0027: False,"},{"line_number":181,"context_line":"            \u0027allow_put\u0027: False,"},{"line_number":182,"context_line":"            \u0027validate\u0027: {\u0027type:uuid\u0027: None},"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9Xmc%3D","line":179,"in_reply_to":"AAAATn%2F9oyk%3D","updated":"2013-12-12 06:44:10.000000000","message":"Done","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e622e9c9af3c934f1f8b3ce69960d9f3146ad60c","unresolved":false,"context_lines":[{"line_number":196,"context_line":"            \u0027allow_post\u0027: True,"},{"line_number":197,"context_line":"            \u0027allow_put\u0027: False,"},{"line_number":198,"context_line":"            \u0027convert_to\u0027: attr.convert_to_list,"},{"line_number":199,"context_line":"            \u0027validate\u0027: {\u0027type:service_type_list\u0027: None},"},{"line_number":200,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":201,"context_line":"            \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":202,"context_line":"        },"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F89A%3D","line":199,"updated":"2014-02-08 17:09:44.000000000","message":"my suggestion to make it a string see comments to db","commit_id":"bf65d4a8f7e58a02d94cc442397527e5af20a69a"}],"neutron/vm/drivers/noop/noop.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"178fdf134661c29449da242b3d50a80377d31bb2","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from neutron.openstack.commmon import uuidutils"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class HostingDeviceNoop(abstract_driver.HostingDeviceAbstrctDriver):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    \"\"\"Noop driver of hosting device for tests. \"\"\""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9pOM%3D","line":27,"updated":"2013-12-09 13:26:28.000000000","message":"current approach is to place noop drivers in UT folder","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"4130453b0dc69e5712d53e7f201f0b0798c90c44","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from neutron.openstack.commmon import uuidutils"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class HostingDeviceNoop(abstract_driver.HostingDeviceAbstrctDriver):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    \"\"\"Noop driver of hosting device for tests. \"\"\""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9XmI%3D","line":27,"in_reply_to":"AAAATn%2F9pOM%3D","updated":"2013-12-12 06:44:10.000000000","message":"Will move once unittest are addressed.","commit_id":"f03a7051af78bc6bfdbe645d5b0a3d47a00505b2"}]}
