)]}'
{"cinder/backup/manager.py":[{"author":{"_account_id":18026,"name":"huanan","email":"huanan@huawei.com","username":"huanan"},"change_message_id":"c29326bb4fd2341e3dd92350e50ba3dad08c3d1c","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        self.volume_rpcapi \u003d volume_rpcapi.VolumeAPI()"},{"line_number":104,"context_line":"        super(BackupManager, self).__init__(service_name\u003d\u0027backup\u0027,"},{"line_number":105,"context_line":"                                            *args, **kwargs)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def _get_volume_backend(self, host\u003dNone, allow_null_host\u003dFalse):"},{"line_number":108,"context_line":"        if host is None:"},{"line_number":109,"context_line":"            if not allow_null_host:"},{"line_number":110,"context_line":"                msg \u003d _(\"NULL host not allowed for volume backend lookup.\")"},{"line_number":111,"context_line":"                raise exception.BackupFailedToGetVolumeBackend(msg)"},{"line_number":112,"context_line":"        else:"},{"line_number":113,"context_line":"            LOG.debug(\"Checking hostname \u0027%s\u0027 for backend info.\", host)"},{"line_number":114,"context_line":"            # NOTE(xyang): If host\u003d\u0027myhost@lvmdriver\u0027, backend\u003d\u0027lvmdriver\u0027"},{"line_number":115,"context_line":"            # by the logic below. This is different from extract_host."},{"line_number":116,"context_line":"            # vol_utils.extract_host(host, \u0027backend\u0027)\u003d\u0027myhost@lvmdriver\u0027."},{"line_number":117,"context_line":"            part \u003d host.partition(\u0027@\u0027)"},{"line_number":118,"context_line":"            if (part[1] \u003d\u003d \u0027@\u0027) and (part[2] !\u003d \u0027\u0027):"},{"line_number":119,"context_line":"                backend \u003d part[2]"},{"line_number":120,"context_line":"                LOG.debug(\"Got backend \u0027%s\u0027.\", backend)"},{"line_number":121,"context_line":"                return backend"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        LOG.info(_LI(\"Backend not found in hostname (%s) so using default.\"),"},{"line_number":124,"context_line":"                 host)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        if \u0027default\u0027 not in self.volume_managers:"},{"line_number":127,"context_line":"            # For multi-backend we just pick the top of the list."},{"line_number":128,"context_line":"            return next(iter(self.volume_managers))"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        return \u0027default\u0027"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def _get_manager(self, backend):"},{"line_number":133,"context_line":"        LOG.debug(\"Manager requested for volume_backend \u0027%s\u0027.\","},{"line_number":134,"context_line":"                  backend)"},{"line_number":135,"context_line":"        if backend is None:"},{"line_number":136,"context_line":"            LOG.debug(\"Fetching default backend.\")"},{"line_number":137,"context_line":"            backend \u003d self._get_volume_backend(allow_null_host\u003dTrue)"},{"line_number":138,"context_line":"        if backend not in self.volume_managers:"},{"line_number":139,"context_line":"            msg \u003d (_(\"Volume manager for backend \u0027%s\u0027 does not exist.\") %"},{"line_number":140,"context_line":"                   (backend))"},{"line_number":141,"context_line":"            raise exception.BackupFailedToGetVolumeBackend(msg)"},{"line_number":142,"context_line":"        return self.volume_managers[backend]"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _get_driver(self, backend\u003dNone):"},{"line_number":145,"context_line":"        LOG.debug(\"Driver requested for volume_backend \u0027%s\u0027.\","},{"line_number":146,"context_line":"                  backend)"},{"line_number":147,"context_line":"        if backend is None:"},{"line_number":148,"context_line":"            LOG.debug(\"Fetching default backend.\")"},{"line_number":149,"context_line":"            backend \u003d self._get_volume_backend(allow_null_host\u003dTrue)"},{"line_number":150,"context_line":"        mgr \u003d self._get_manager(backend)"},{"line_number":151,"context_line":"        mgr.driver.db \u003d self.db"},{"line_number":152,"context_line":"        return mgr.driver"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def _setup_volume_drivers(self):"},{"line_number":155,"context_line":"        if CONF.enabled_backends:"},{"line_number":156,"context_line":"            for backend in CONF.enabled_backends:"},{"line_number":157,"context_line":"                host \u003d \"%s@%s\" % (CONF.host, backend)"},{"line_number":158,"context_line":"                mgr \u003d importutils.import_object(CONF.volume_manager,"},{"line_number":159,"context_line":"                                                host\u003dhost,"},{"line_number":160,"context_line":"                                                service_name\u003dbackend)"},{"line_number":161,"context_line":"                config \u003d mgr.configuration"},{"line_number":162,"context_line":"                backend_name \u003d config.safe_get(\u0027volume_backend_name\u0027)"},{"line_number":163,"context_line":"                LOG.debug(\"Registering backend %(backend)s (host\u003d%(host)s \""},{"line_number":164,"context_line":"                          \"backend_name\u003d%(backend_name)s).\","},{"line_number":165,"context_line":"                          {\u0027backend\u0027: backend, \u0027host\u0027: host,"},{"line_number":166,"context_line":"                           \u0027backend_name\u0027: backend_name})"},{"line_number":167,"context_line":"                self.volume_managers[backend] \u003d mgr"},{"line_number":168,"context_line":"        else:"},{"line_number":169,"context_line":"            default \u003d importutils.import_object(CONF.volume_manager)"},{"line_number":170,"context_line":"            LOG.debug(\"Registering default backend %s.\", default)"},{"line_number":171,"context_line":"            self.volume_managers[\u0027default\u0027] \u003d default"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def _init_volume_driver(self, ctxt, driver):"},{"line_number":174,"context_line":"        LOG.info(_LI(\"Starting volume driver %(driver_name)s (%(version)s).\"),"},{"line_number":175,"context_line":"                 {\u0027driver_name\u0027: driver.__class__.__name__,"},{"line_number":176,"context_line":"                  \u0027version\u0027: driver.get_version()})"},{"line_number":177,"context_line":"        try:"},{"line_number":178,"context_line":"            driver.do_setup(ctxt)"},{"line_number":179,"context_line":"            driver.check_for_setup_error()"},{"line_number":180,"context_line":"        except Exception:"},{"line_number":181,"context_line":"            LOG.exception(_LE(\"Error encountered during initialization of \""},{"line_number":182,"context_line":"                              \"driver: %(name)s.\"),"},{"line_number":183,"context_line":"                          {\u0027name\u0027: driver.__class__.__name__})"},{"line_number":184,"context_line":"            # we don\u0027t want to continue since we failed"},{"line_number":185,"context_line":"            # to initialize the driver correctly."},{"line_number":186,"context_line":"            return"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        driver.set_initialized()"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    @property"},{"line_number":191,"context_line":"    def driver_name(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_406216d9","side":"PARENT","line":188,"range":{"start_line":106,"start_character":0,"end_line":188,"end_character":32},"updated":"2016-08-01 11:06:07.000000000","message":"Why remove this part of code?","commit_id":"c47d38dc94792c409a0b345b29abbd21460d978e"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"764992be60bde3e2b7fa2522d670c6c860718e4a","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        self.volume_rpcapi \u003d volume_rpcapi.VolumeAPI()"},{"line_number":104,"context_line":"        super(BackupManager, self).__init__(service_name\u003d\u0027backup\u0027,"},{"line_number":105,"context_line":"                                            *args, **kwargs)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def _get_volume_backend(self, host\u003dNone, allow_null_host\u003dFalse):"},{"line_number":108,"context_line":"        if host is None:"},{"line_number":109,"context_line":"            if not allow_null_host:"},{"line_number":110,"context_line":"                msg \u003d _(\"NULL host not allowed for volume backend lookup.\")"},{"line_number":111,"context_line":"                raise exception.BackupFailedToGetVolumeBackend(msg)"},{"line_number":112,"context_line":"        else:"},{"line_number":113,"context_line":"            LOG.debug(\"Checking hostname \u0027%s\u0027 for backend info.\", host)"},{"line_number":114,"context_line":"            # NOTE(xyang): If host\u003d\u0027myhost@lvmdriver\u0027, backend\u003d\u0027lvmdriver\u0027"},{"line_number":115,"context_line":"            # by the logic below. This is different from extract_host."},{"line_number":116,"context_line":"            # vol_utils.extract_host(host, \u0027backend\u0027)\u003d\u0027myhost@lvmdriver\u0027."},{"line_number":117,"context_line":"            part \u003d host.partition(\u0027@\u0027)"},{"line_number":118,"context_line":"            if (part[1] \u003d\u003d \u0027@\u0027) and (part[2] !\u003d \u0027\u0027):"},{"line_number":119,"context_line":"                backend \u003d part[2]"},{"line_number":120,"context_line":"                LOG.debug(\"Got backend \u0027%s\u0027.\", backend)"},{"line_number":121,"context_line":"                return backend"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        LOG.info(_LI(\"Backend not found in hostname (%s) so using default.\"),"},{"line_number":124,"context_line":"                 host)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        if \u0027default\u0027 not in self.volume_managers:"},{"line_number":127,"context_line":"            # For multi-backend we just pick the top of the list."},{"line_number":128,"context_line":"            return next(iter(self.volume_managers))"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        return \u0027default\u0027"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def _get_manager(self, backend):"},{"line_number":133,"context_line":"        LOG.debug(\"Manager requested for volume_backend \u0027%s\u0027.\","},{"line_number":134,"context_line":"                  backend)"},{"line_number":135,"context_line":"        if backend is None:"},{"line_number":136,"context_line":"            LOG.debug(\"Fetching default backend.\")"},{"line_number":137,"context_line":"            backend \u003d self._get_volume_backend(allow_null_host\u003dTrue)"},{"line_number":138,"context_line":"        if backend not in self.volume_managers:"},{"line_number":139,"context_line":"            msg \u003d (_(\"Volume manager for backend \u0027%s\u0027 does not exist.\") %"},{"line_number":140,"context_line":"                   (backend))"},{"line_number":141,"context_line":"            raise exception.BackupFailedToGetVolumeBackend(msg)"},{"line_number":142,"context_line":"        return self.volume_managers[backend]"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _get_driver(self, backend\u003dNone):"},{"line_number":145,"context_line":"        LOG.debug(\"Driver requested for volume_backend \u0027%s\u0027.\","},{"line_number":146,"context_line":"                  backend)"},{"line_number":147,"context_line":"        if backend is None:"},{"line_number":148,"context_line":"            LOG.debug(\"Fetching default backend.\")"},{"line_number":149,"context_line":"            backend \u003d self._get_volume_backend(allow_null_host\u003dTrue)"},{"line_number":150,"context_line":"        mgr \u003d self._get_manager(backend)"},{"line_number":151,"context_line":"        mgr.driver.db \u003d self.db"},{"line_number":152,"context_line":"        return mgr.driver"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def _setup_volume_drivers(self):"},{"line_number":155,"context_line":"        if CONF.enabled_backends:"},{"line_number":156,"context_line":"            for backend in CONF.enabled_backends:"},{"line_number":157,"context_line":"                host \u003d \"%s@%s\" % (CONF.host, backend)"},{"line_number":158,"context_line":"                mgr \u003d importutils.import_object(CONF.volume_manager,"},{"line_number":159,"context_line":"                                                host\u003dhost,"},{"line_number":160,"context_line":"                                                service_name\u003dbackend)"},{"line_number":161,"context_line":"                config \u003d mgr.configuration"},{"line_number":162,"context_line":"                backend_name \u003d config.safe_get(\u0027volume_backend_name\u0027)"},{"line_number":163,"context_line":"                LOG.debug(\"Registering backend %(backend)s (host\u003d%(host)s \""},{"line_number":164,"context_line":"                          \"backend_name\u003d%(backend_name)s).\","},{"line_number":165,"context_line":"                          {\u0027backend\u0027: backend, \u0027host\u0027: host,"},{"line_number":166,"context_line":"                           \u0027backend_name\u0027: backend_name})"},{"line_number":167,"context_line":"                self.volume_managers[backend] \u003d mgr"},{"line_number":168,"context_line":"        else:"},{"line_number":169,"context_line":"            default \u003d importutils.import_object(CONF.volume_manager)"},{"line_number":170,"context_line":"            LOG.debug(\"Registering default backend %s.\", default)"},{"line_number":171,"context_line":"            self.volume_managers[\u0027default\u0027] \u003d default"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def _init_volume_driver(self, ctxt, driver):"},{"line_number":174,"context_line":"        LOG.info(_LI(\"Starting volume driver %(driver_name)s (%(version)s).\"),"},{"line_number":175,"context_line":"                 {\u0027driver_name\u0027: driver.__class__.__name__,"},{"line_number":176,"context_line":"                  \u0027version\u0027: driver.get_version()})"},{"line_number":177,"context_line":"        try:"},{"line_number":178,"context_line":"            driver.do_setup(ctxt)"},{"line_number":179,"context_line":"            driver.check_for_setup_error()"},{"line_number":180,"context_line":"        except Exception:"},{"line_number":181,"context_line":"            LOG.exception(_LE(\"Error encountered during initialization of \""},{"line_number":182,"context_line":"                              \"driver: %(name)s.\"),"},{"line_number":183,"context_line":"                          {\u0027name\u0027: driver.__class__.__name__})"},{"line_number":184,"context_line":"            # we don\u0027t want to continue since we failed"},{"line_number":185,"context_line":"            # to initialize the driver correctly."},{"line_number":186,"context_line":"            return"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        driver.set_initialized()"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    @property"},{"line_number":191,"context_line":"    def driver_name(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_4ee54307","side":"PARENT","line":188,"range":{"start_line":106,"start_character":0,"end_line":188,"end_character":32},"in_reply_to":"bacf61ea_406216d9","updated":"2016-08-05 04:27:51.000000000","message":"These code is introduced at https://review.openstack.org/#/c/321943/7/cinder/backup/manager.py@94. It was originally designed to fix snapshot backup in single node. But when we enabled backup on remote node, these code are not necessary. You can checkout the comments in the link.","commit_id":"c47d38dc94792c409a0b345b29abbd21460d978e"}],"cinder/tests/unit/backup/test_backup.py":[{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1bc0473915d70dc98b3c6e2297db8c447dd0c992","unresolved":false,"context_lines":[{"line_number":633,"context_line":"        # use them in assert_called_with"},{"line_number":634,"context_line":"        db_vol \u003d db.volume_get(self.ctxt, vol_id)"},{"line_number":635,"context_line":"        mock_db_volume_get \u003d self.mock_object(db, \u0027volume_get\u0027)"},{"line_number":636,"context_line":"        mock_db_volume_get.return_value \u003d db_vol"},{"line_number":637,"context_line":""},{"line_number":638,"context_line":"        attach_info \u003d {"},{"line_number":639,"context_line":"            \u0027device\u0027: {\u0027path\u0027: \u0027/dev/null\u0027},"}],"source_content_type":"text/x-python","patch_set":7,"id":"bacf61ea_382e7943","line":636,"updated":"2016-07-29 15:22:50.000000000","message":"Even with the same vol_id, the multiple db volume objects \u003ccinder.db.sqlalchemy.models.Volume\u003e returned by db.volume_get() are not considered equal. Then later in mock_initialize_connection_snapshot.assert_called_once_with(..), it rasies error. Is there a better solution than forcing all db.volume_get to return the same object here?","commit_id":"0c319e0cb52a57055a9c08d3236e4dada2d796db"}],"cinder/volume/driver.py":[{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"b53451758ab38d0d5808b7964cc97405a2888044","unresolved":false,"context_lines":[{"line_number":996,"context_line":"                    LOG.error(err_msg)"},{"line_number":997,"context_line":"                    raise exception.VolumeBackendAPIException(data\u003dex_msg)"},{"line_number":998,"context_line":"                raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":999,"context_line":"        return self._connect_device(conn)"},{"line_number":1000,"context_line":""},{"line_number":1001,"context_line":"    def _connect_device(self, conn):"},{"line_number":1002,"context_line":"        # Use Brick\u0027s code to do attach/detach"}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_2803d20e","side":"PARENT","line":999,"updated":"2016-07-29 13:15:16.000000000","message":"Why you deleted \u0027self._connect_device()\u0027?","commit_id":"ebee5c09fba9349f253aaf4fee0b1793e96a7e1d"}],"cinder/volume/manager.py":[{"author":{"_account_id":18026,"name":"huanan","email":"huanan@huawei.com","username":"huanan"},"change_message_id":"c29326bb4fd2341e3dd92350e50ba3dad08c3d1c","unresolved":false,"context_lines":[{"line_number":1436,"context_line":""},{"line_number":1437,"context_line":"    def initialize_connection_snapshot(self, context, snapshot_id, connector):"},{"line_number":1438,"context_line":"        snapshot \u003d objects.Snapshot.get_by_id(context, snapshot_id)"},{"line_number":1439,"context_line":"        return self.driver._attach_snapshot(context, snapshot, connector)"},{"line_number":1440,"context_line":""},{"line_number":1441,"context_line":"    def terminate_connection(self, context, volume_id, connector, force\u003dFalse):"},{"line_number":1442,"context_line":"        \"\"\"Cleanup connection from host represented by connector."}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_b256c727","line":1439,"range":{"start_line":1439,"start_character":27,"end_line":1439,"end_character":43},"updated":"2016-08-01 11:06:07.000000000","message":"This is a private function in driver.py, We should not call it like this.","commit_id":"6783d53f9f6ea95478933bdd51e1864598b1436f"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"764992be60bde3e2b7fa2522d670c6c860718e4a","unresolved":false,"context_lines":[{"line_number":1436,"context_line":""},{"line_number":1437,"context_line":"    def initialize_connection_snapshot(self, context, snapshot_id, connector):"},{"line_number":1438,"context_line":"        snapshot \u003d objects.Snapshot.get_by_id(context, snapshot_id)"},{"line_number":1439,"context_line":"        return self.driver._attach_snapshot(context, snapshot, connector)"},{"line_number":1440,"context_line":""},{"line_number":1441,"context_line":"    def terminate_connection(self, context, volume_id, connector, force\u003dFalse):"},{"line_number":1442,"context_line":"        \"\"\"Cleanup connection from host represented by connector."}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_2ee56fa3","line":1439,"range":{"start_line":1439,"start_character":27,"end_line":1439,"end_character":43},"in_reply_to":"bacf61ea_b256c727","updated":"2016-08-05 04:27:51.000000000","message":"Here\u0027s currently how methods are invoked:\n\n    volume.manager.initialize_connection -\u003e driver.initialize_connection -\u003e driver._attach_volume.\n\n    volume.manager.initialize_connection_snapshot -\u003e driver._attach_snapshot\n\nI tried to modify initialize_connection_snapshot to invoke driver.initialize_connection_snapshot, but it seems however driver.initialize_connection_snapshot is doing completely a different thing. It\u0027s confusing ...\n\nFor now I added a public driver.attach_snapshot and driver.detach_snapshot to hide the private invoke.","commit_id":"6783d53f9f6ea95478933bdd51e1864598b1436f"},{"author":{"_account_id":18026,"name":"huanan","email":"huanan@huawei.com","username":"huanan"},"change_message_id":"c29326bb4fd2341e3dd92350e50ba3dad08c3d1c","unresolved":false,"context_lines":[{"line_number":1463,"context_line":"    def terminate_connection_snapshot(self, context, snapshot_id,"},{"line_number":1464,"context_line":"                                      connector, force\u003dFalse):"},{"line_number":1465,"context_line":"        snapshot \u003d self.db.snapshot_get(context, snapshot_id)"},{"line_number":1466,"context_line":"        self.driver._detach_snapshot(context, snapshot, connector)"},{"line_number":1467,"context_line":""},{"line_number":1468,"context_line":"    def remove_export(self, context, volume_id):"},{"line_number":1469,"context_line":"        \"\"\"Removes an export for a volume.\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_f232ff0e","line":1466,"range":{"start_line":1466,"start_character":20,"end_line":1466,"end_character":36},"updated":"2016-08-01 11:06:07.000000000","message":"ditto","commit_id":"6783d53f9f6ea95478933bdd51e1864598b1436f"}],"cinder/volume/rpcapi.py":[{"author":{"_account_id":18026,"name":"huanan","email":"huanan@huawei.com","username":"huanan"},"change_message_id":"c29326bb4fd2341e3dd92350e50ba3dad08c3d1c","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        return cctxt.call(ctxt, \u0027terminate_connection\u0027, volume_id\u003dvolume[\u0027id\u0027],"},{"line_number":217,"context_line":"                          connector\u003dconnector, force\u003dforce)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def initialize_connection_snapshot(self, ctxt, volume, snapshot,"},{"line_number":220,"context_line":"                                       connector):"},{"line_number":221,"context_line":"        cctxt \u003d self._get_cctxt(volume[\u0027host\u0027], \u00272.3\u0027)"},{"line_number":222,"context_line":"        return cctxt.call(ctxt, \u0027initialize_connection_snapshot\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_40c85674","line":219,"range":{"start_line":219,"start_character":7,"end_line":219,"end_character":40},"updated":"2016-08-01 11:06:07.000000000","message":"Please add unit test for volume rpcapi.","commit_id":"6783d53f9f6ea95478933bdd51e1864598b1436f"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"764992be60bde3e2b7fa2522d670c6c860718e4a","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        return cctxt.call(ctxt, \u0027terminate_connection\u0027, volume_id\u003dvolume[\u0027id\u0027],"},{"line_number":217,"context_line":"                          connector\u003dconnector, force\u003dforce)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def initialize_connection_snapshot(self, ctxt, volume, snapshot,"},{"line_number":220,"context_line":"                                       connector):"},{"line_number":221,"context_line":"        cctxt \u003d self._get_cctxt(volume[\u0027host\u0027], \u00272.3\u0027)"},{"line_number":222,"context_line":"        return cctxt.call(ctxt, \u0027initialize_connection_snapshot\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_693be1d1","line":219,"range":{"start_line":219,"start_character":7,"end_line":219,"end_character":40},"in_reply_to":"bacf61ea_40c85674","updated":"2016-08-05 04:27:51.000000000","message":"I will add unit tests later.","commit_id":"6783d53f9f6ea95478933bdd51e1864598b1436f"},{"author":{"_account_id":18026,"name":"huanan","email":"huanan@huawei.com","username":"huanan"},"change_message_id":"c29326bb4fd2341e3dd92350e50ba3dad08c3d1c","unresolved":false,"context_lines":[{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def initialize_connection_snapshot(self, ctxt, volume, snapshot,"},{"line_number":220,"context_line":"                                       connector):"},{"line_number":221,"context_line":"        cctxt \u003d self._get_cctxt(volume[\u0027host\u0027], \u00272.3\u0027)"},{"line_number":222,"context_line":"        return cctxt.call(ctxt, \u0027initialize_connection_snapshot\u0027,"},{"line_number":223,"context_line":"                          snapshot_id\u003dsnapshot[\u0027id\u0027],"},{"line_number":224,"context_line":"                          connector\u003dconnector)"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_f2c83f24","line":221,"range":{"start_line":221,"start_character":48,"end_line":221,"end_character":53},"updated":"2016-08-01 11:06:07.000000000","message":"If here should be \u00272.4\u0027?","commit_id":"6783d53f9f6ea95478933bdd51e1864598b1436f"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"764992be60bde3e2b7fa2522d670c6c860718e4a","unresolved":false,"context_lines":[{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def initialize_connection_snapshot(self, ctxt, volume, snapshot,"},{"line_number":220,"context_line":"                                       connector):"},{"line_number":221,"context_line":"        cctxt \u003d self._get_cctxt(volume[\u0027host\u0027], \u00272.3\u0027)"},{"line_number":222,"context_line":"        return cctxt.call(ctxt, \u0027initialize_connection_snapshot\u0027,"},{"line_number":223,"context_line":"                          snapshot_id\u003dsnapshot[\u0027id\u0027],"},{"line_number":224,"context_line":"                          connector\u003dconnector)"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_a91af96c","line":221,"range":{"start_line":221,"start_character":48,"end_line":221,"end_character":53},"in_reply_to":"bacf61ea_f2c83f24","updated":"2016-08-05 04:27:51.000000000","message":"Done","commit_id":"6783d53f9f6ea95478933bdd51e1864598b1436f"},{"author":{"_account_id":18026,"name":"huanan","email":"huanan@huawei.com","username":"huanan"},"change_message_id":"c29326bb4fd2341e3dd92350e50ba3dad08c3d1c","unresolved":false,"context_lines":[{"line_number":220,"context_line":"                                       connector):"},{"line_number":221,"context_line":"        cctxt \u003d self._get_cctxt(volume[\u0027host\u0027], \u00272.3\u0027)"},{"line_number":222,"context_line":"        return cctxt.call(ctxt, \u0027initialize_connection_snapshot\u0027,"},{"line_number":223,"context_line":"                          snapshot_id\u003dsnapshot[\u0027id\u0027],"},{"line_number":224,"context_line":"                          connector\u003dconnector)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def terminate_connection_snapshot(self, ctxt, volume, snapshot, connector,"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_f2bddf68","line":223,"range":{"start_line":223,"start_character":38,"end_line":223,"end_character":53},"updated":"2016-08-01 11:06:07.000000000","message":"Please use versionobject.","commit_id":"6783d53f9f6ea95478933bdd51e1864598b1436f"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"764992be60bde3e2b7fa2522d670c6c860718e4a","unresolved":false,"context_lines":[{"line_number":220,"context_line":"                                       connector):"},{"line_number":221,"context_line":"        cctxt \u003d self._get_cctxt(volume[\u0027host\u0027], \u00272.3\u0027)"},{"line_number":222,"context_line":"        return cctxt.call(ctxt, \u0027initialize_connection_snapshot\u0027,"},{"line_number":223,"context_line":"                          snapshot_id\u003dsnapshot[\u0027id\u0027],"},{"line_number":224,"context_line":"                          connector\u003dconnector)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def terminate_connection_snapshot(self, ctxt, volume, snapshot, connector,"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_e926b1b8","line":223,"range":{"start_line":223,"start_character":38,"end_line":223,"end_character":53},"in_reply_to":"bacf61ea_f2bddf68","updated":"2016-08-05 04:27:51.000000000","message":"Done","commit_id":"6783d53f9f6ea95478933bdd51e1864598b1436f"},{"author":{"_account_id":18026,"name":"huanan","email":"huanan@huawei.com","username":"huanan"},"change_message_id":"c29326bb4fd2341e3dd92350e50ba3dad08c3d1c","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                          snapshot_id\u003dsnapshot[\u0027id\u0027],"},{"line_number":224,"context_line":"                          connector\u003dconnector)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def terminate_connection_snapshot(self, ctxt, volume, snapshot, connector,"},{"line_number":227,"context_line":"                                      force\u003dFalse):"},{"line_number":228,"context_line":"        cctxt \u003d self._get_cctxt(volume[\u0027host\u0027], \u00272.3\u0027)"},{"line_number":229,"context_line":"        return cctxt.call(ctxt, \u0027terminate_connection_snapshot\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_e0ccea8a","line":226,"range":{"start_line":226,"start_character":8,"end_line":226,"end_character":37},"updated":"2016-08-01 11:06:07.000000000","message":"Please add unit test for volume rpcapi.","commit_id":"6783d53f9f6ea95478933bdd51e1864598b1436f"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"764992be60bde3e2b7fa2522d670c6c860718e4a","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                          snapshot_id\u003dsnapshot[\u0027id\u0027],"},{"line_number":224,"context_line":"                          connector\u003dconnector)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def terminate_connection_snapshot(self, ctxt, volume, snapshot, connector,"},{"line_number":227,"context_line":"                                      force\u003dFalse):"},{"line_number":228,"context_line":"        cctxt \u003d self._get_cctxt(volume[\u0027host\u0027], \u00272.3\u0027)"},{"line_number":229,"context_line":"        return cctxt.call(ctxt, \u0027terminate_connection_snapshot\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_892e158a","line":226,"range":{"start_line":226,"start_character":8,"end_line":226,"end_character":37},"in_reply_to":"bacf61ea_e0ccea8a","updated":"2016-08-05 04:27:51.000000000","message":"I will add unit tests later.","commit_id":"6783d53f9f6ea95478933bdd51e1864598b1436f"},{"author":{"_account_id":18026,"name":"huanan","email":"huanan@huawei.com","username":"huanan"},"change_message_id":"c29326bb4fd2341e3dd92350e50ba3dad08c3d1c","unresolved":false,"context_lines":[{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def terminate_connection_snapshot(self, ctxt, volume, snapshot, connector,"},{"line_number":227,"context_line":"                                      force\u003dFalse):"},{"line_number":228,"context_line":"        cctxt \u003d self._get_cctxt(volume[\u0027host\u0027], \u00272.3\u0027)"},{"line_number":229,"context_line":"        return cctxt.call(ctxt, \u0027terminate_connection_snapshot\u0027,"},{"line_number":230,"context_line":"                          snapshot_id\u003dsnapshot[\u0027id\u0027],"},{"line_number":231,"context_line":"                          connector\u003dconnector, force\u003dforce)"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_12d4f3ba","line":228,"range":{"start_line":228,"start_character":49,"end_line":228,"end_character":52},"updated":"2016-08-01 11:06:07.000000000","message":"ditto","commit_id":"6783d53f9f6ea95478933bdd51e1864598b1436f"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"764992be60bde3e2b7fa2522d670c6c860718e4a","unresolved":false,"context_lines":[{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def terminate_connection_snapshot(self, ctxt, volume, snapshot, connector,"},{"line_number":227,"context_line":"                                      force\u003dFalse):"},{"line_number":228,"context_line":"        cctxt \u003d self._get_cctxt(volume[\u0027host\u0027], \u00272.3\u0027)"},{"line_number":229,"context_line":"        return cctxt.call(ctxt, \u0027terminate_connection_snapshot\u0027,"},{"line_number":230,"context_line":"                          snapshot_id\u003dsnapshot[\u0027id\u0027],"},{"line_number":231,"context_line":"                          connector\u003dconnector, force\u003dforce)"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_c92bed80","line":228,"range":{"start_line":228,"start_character":49,"end_line":228,"end_character":52},"in_reply_to":"bacf61ea_12d4f3ba","updated":"2016-08-05 04:27:51.000000000","message":"Done","commit_id":"6783d53f9f6ea95478933bdd51e1864598b1436f"},{"author":{"_account_id":18026,"name":"huanan","email":"huanan@huawei.com","username":"huanan"},"change_message_id":"c29326bb4fd2341e3dd92350e50ba3dad08c3d1c","unresolved":false,"context_lines":[{"line_number":227,"context_line":"                                      force\u003dFalse):"},{"line_number":228,"context_line":"        cctxt \u003d self._get_cctxt(volume[\u0027host\u0027], \u00272.3\u0027)"},{"line_number":229,"context_line":"        return cctxt.call(ctxt, \u0027terminate_connection_snapshot\u0027,"},{"line_number":230,"context_line":"                          snapshot_id\u003dsnapshot[\u0027id\u0027],"},{"line_number":231,"context_line":"                          connector\u003dconnector, force\u003dforce)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    def remove_export(self, ctxt, volume):"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_32b49780","line":230,"range":{"start_line":230,"start_character":38,"end_line":230,"end_character":52},"updated":"2016-08-01 11:06:07.000000000","message":"Same","commit_id":"6783d53f9f6ea95478933bdd51e1864598b1436f"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"764992be60bde3e2b7fa2522d670c6c860718e4a","unresolved":false,"context_lines":[{"line_number":227,"context_line":"                                      force\u003dFalse):"},{"line_number":228,"context_line":"        cctxt \u003d self._get_cctxt(volume[\u0027host\u0027], \u00272.3\u0027)"},{"line_number":229,"context_line":"        return cctxt.call(ctxt, \u0027terminate_connection_snapshot\u0027,"},{"line_number":230,"context_line":"                          snapshot_id\u003dsnapshot[\u0027id\u0027],"},{"line_number":231,"context_line":"                          connector\u003dconnector, force\u003dforce)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    def remove_export(self, ctxt, volume):"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_291d6962","line":230,"range":{"start_line":230,"start_character":38,"end_line":230,"end_character":52},"in_reply_to":"bacf61ea_32b49780","updated":"2016-08-05 04:27:51.000000000","message":"Done","commit_id":"6783d53f9f6ea95478933bdd51e1864598b1436f"}]}
