)]}'
{"zun/api/controllers/v1/containers.py":[{"author":{"_account_id":22406,"name":"Kien Nguyen","email":"kiennt2609@gmail.com","username":"kiennt"},"change_message_id":"9cc3f078e8926960a678f3a04aea9b926f2b0605","unresolved":false,"context_lines":[{"line_number":293,"context_line":"            req_version \u003d pecan.request.version"},{"line_number":294,"context_line":"            min_version \u003d versions.Version(\u0027\u0027, \u0027\u0027, \u0027\u0027, \u00271.10\u0027)"},{"line_number":295,"context_line":"            if req_version \u003c min_version:"},{"line_number":296,"context_line":"                msg \u003d _(\u0027Invalid param mounts because current request \u0027"},{"line_number":297,"context_line":"                        \u0027version is %(req_version)s. `mounts` is only \u0027"},{"line_number":298,"context_line":"                        \u0027supported from version %(min_version)s\u0027) % \\"},{"line_number":299,"context_line":"                    {\u0027req_version\u0027: req_version,"},{"line_number":300,"context_line":"                     \u0027min_version\u0027: min_version}"},{"line_number":301,"context_line":"                raise exception.InvalidParam(msg)"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"        requested_volumes \u003d self._build_requested_volumes(context, mounts)"},{"line_number":304,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1f2f7f8d_7127b0b8","line":301,"range":{"start_line":296,"start_character":16,"end_line":301,"end_character":49},"updated":"2017-09-19 02:08:53.000000000","message":"NIT: You can simply raise InvalidParamInVersion exception instead.\nBut it can fix in another patch.","commit_id":"1277756503d0647e01edcb3d09094f0abc484f2f"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"11f8943e4a78318d63b9f8db285d4a1677bc9613","unresolved":false,"context_lines":[{"line_number":397,"context_line":"        cinder_api \u003d cinder.CinderAPI(context)"},{"line_number":398,"context_line":"        requested_volumes \u003d []"},{"line_number":399,"context_line":"        for mount in mounts:"},{"line_number":400,"context_line":"            volume \u003d cinder_api.search_volume(mount[\u0027source\u0027])"},{"line_number":401,"context_line":"            cinder_api.ensure_volume_usable(volume)"},{"line_number":402,"context_line":"            volmapp \u003d objects.VolumeMapping("},{"line_number":403,"context_line":"                context,"}],"source_content_type":"text/x-python","patch_set":18,"id":"bf57530f_c373254d","line":400,"range":{"start_line":400,"start_character":46,"end_line":400,"end_character":61},"updated":"2017-09-20 08:45:43.000000000","message":"This might fail if the mount dict is empty. Better to add a try block here.","commit_id":"251a00982fd93047e769ef8a239402892c2b4b31"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"69598897110887a6c379b153a96331a65d0798c3","unresolved":false,"context_lines":[{"line_number":397,"context_line":"        cinder_api \u003d cinder.CinderAPI(context)"},{"line_number":398,"context_line":"        requested_volumes \u003d []"},{"line_number":399,"context_line":"        for mount in mounts:"},{"line_number":400,"context_line":"            volume \u003d cinder_api.search_volume(mount[\u0027source\u0027])"},{"line_number":401,"context_line":"            cinder_api.ensure_volume_usable(volume)"},{"line_number":402,"context_line":"            volmapp \u003d objects.VolumeMapping("},{"line_number":403,"context_line":"                context,"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f515b1d_1273c982","line":400,"range":{"start_line":400,"start_character":46,"end_line":400,"end_character":61},"in_reply_to":"7f515b1d_9b723f11","updated":"2017-09-22 05:58:29.000000000","message":"That\u0027s better.","commit_id":"251a00982fd93047e769ef8a239402892c2b4b31"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"ba53de111b8e1667315d23600c45a741b0c00ddf","unresolved":false,"context_lines":[{"line_number":397,"context_line":"        cinder_api \u003d cinder.CinderAPI(context)"},{"line_number":398,"context_line":"        requested_volumes \u003d []"},{"line_number":399,"context_line":"        for mount in mounts:"},{"line_number":400,"context_line":"            volume \u003d cinder_api.search_volume(mount[\u0027source\u0027])"},{"line_number":401,"context_line":"            cinder_api.ensure_volume_usable(volume)"},{"line_number":402,"context_line":"            volmapp \u003d objects.VolumeMapping("},{"line_number":403,"context_line":"                context,"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f515b1d_9b723f11","line":400,"range":{"start_line":400,"start_character":46,"end_line":400,"end_character":61},"in_reply_to":"bf57530f_c373254d","updated":"2017-09-21 23:22:45.000000000","message":"Thanks for catching this pitfall. Instead of using a try block, I lean to define a json schema for that: https://review.openstack.org/#/c/499383/20/zun/common/validation/parameter_types.py . With the schema, we are sure the mount dict is not empty.","commit_id":"251a00982fd93047e769ef8a239402892c2b4b31"},{"author":{"_account_id":22406,"name":"Kien Nguyen","email":"kiennt2609@gmail.com","username":"kiennt"},"change_message_id":"042368bf3b6fb8bfd427166c965b8f5f67d33c98","unresolved":false,"context_lines":[{"line_number":292,"context_line":"            req_version \u003d pecan.request.version"},{"line_number":293,"context_line":"            min_version \u003d versions.Version(\u0027\u0027, \u0027\u0027, \u0027\u0027, \u00271.10\u0027)"},{"line_number":294,"context_line":"            if req_version \u003c min_version:"},{"line_number":295,"context_line":"                msg \u003d _(\u0027Invalid param mounts because current request \u0027"},{"line_number":296,"context_line":"                        \u0027version is %(req_version)s. `mounts` is only \u0027"},{"line_number":297,"context_line":"                        \u0027supported from version %(min_version)s\u0027) % \\"},{"line_number":298,"context_line":"                    {\u0027req_version\u0027: req_version,"},{"line_number":299,"context_line":"                     \u0027min_version\u0027: min_version}"},{"line_number":300,"context_line":"                raise exception.InvalidParamInVersion(param\u003d\u0027mounts\u0027,"},{"line_number":301,"context_line":"                                                      req_version\u003dreq_version,"},{"line_number":302,"context_line":"                                                      min_version\u003dmin_version)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f515b1d_88930550","line":299,"range":{"start_line":295,"start_character":16,"end_line":299,"end_character":48},"updated":"2017-09-22 10:31:34.000000000","message":"The msg is unused now.","commit_id":"6fec6a5f3d6c1447e3f721be2a5cefd77994d5ee"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"798285b6eb8566ab5910e8f2d97890b57d9b8f1d","unresolved":false,"context_lines":[{"line_number":292,"context_line":"            req_version \u003d pecan.request.version"},{"line_number":293,"context_line":"            min_version \u003d versions.Version(\u0027\u0027, \u0027\u0027, \u0027\u0027, \u00271.10\u0027)"},{"line_number":294,"context_line":"            if req_version \u003c min_version:"},{"line_number":295,"context_line":"                msg \u003d _(\u0027Invalid param mounts because current request \u0027"},{"line_number":296,"context_line":"                        \u0027version is %(req_version)s. `mounts` is only \u0027"},{"line_number":297,"context_line":"                        \u0027supported from version %(min_version)s\u0027) % \\"},{"line_number":298,"context_line":"                    {\u0027req_version\u0027: req_version,"},{"line_number":299,"context_line":"                     \u0027min_version\u0027: min_version}"},{"line_number":300,"context_line":"                raise exception.InvalidParamInVersion(param\u003d\u0027mounts\u0027,"},{"line_number":301,"context_line":"                                                      req_version\u003dreq_version,"},{"line_number":302,"context_line":"                                                      min_version\u003dmin_version)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f515b1d_46a819da","line":299,"range":{"start_line":295,"start_character":16,"end_line":299,"end_character":48},"in_reply_to":"7f515b1d_88930550","updated":"2017-09-26 02:00:53.000000000","message":"Done","commit_id":"6fec6a5f3d6c1447e3f721be2a5cefd77994d5ee"}],"zun/compute/manager.py":[{"author":{"_account_id":22406,"name":"Kien Nguyen","email":"kiennt2609@gmail.com","username":"kiennt"},"change_message_id":"9cc3f078e8926960a678f3a04aea9b926f2b0605","unresolved":false,"context_lines":[{"line_number":194,"context_line":"                volume.container_uuid \u003d container.uuid"},{"line_number":195,"context_line":"                self._attach_volume(context, volume)"},{"line_number":196,"context_line":"            return True"},{"line_number":197,"context_line":"        except Exception as e:"},{"line_number":198,"context_line":"            with excutils.save_and_reraise_exception(reraise\u003dFalse):"},{"line_number":199,"context_line":"                self._fail_container(context, container, six.text_type(e),"},{"line_number":200,"context_line":"                                     unset_host\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":17,"id":"1f2f7f8d_2e6c2707","line":197,"range":{"start_line":197,"start_character":15,"end_line":197,"end_character":24},"updated":"2017-09-19 02:08:53.000000000","message":"IMO, it is too broad. The specified exception classes (VolumeAttachException etc.) will be better to follow.","commit_id":"1277756503d0647e01edcb3d09094f0abc484f2f"},{"author":{"_account_id":22406,"name":"Kien Nguyen","email":"kiennt2609@gmail.com","username":"kiennt"},"change_message_id":"9cc3f078e8926960a678f3a04aea9b926f2b0605","unresolved":false,"context_lines":[{"line_number":207,"context_line":"                  \u0027host\u0027: CONF.host})"},{"line_number":208,"context_line":"        try:"},{"line_number":209,"context_line":"            self.driver.attach_volume(context, volume)"},{"line_number":210,"context_line":"        except Exception:"},{"line_number":211,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":212,"context_line":"                volume.destroy()"},{"line_number":213,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1f2f7f8d_0e716be1","line":210,"range":{"start_line":210,"start_character":15,"end_line":210,"end_character":24},"updated":"2017-09-19 02:08:53.000000000","message":"ditto","commit_id":"1277756503d0647e01edcb3d09094f0abc484f2f"},{"author":{"_account_id":22406,"name":"Kien Nguyen","email":"kiennt2609@gmail.com","username":"kiennt"},"change_message_id":"9cc3f078e8926960a678f3a04aea9b926f2b0605","unresolved":false,"context_lines":[{"line_number":221,"context_line":"        context \u003d context.elevated()"},{"line_number":222,"context_line":"        try:"},{"line_number":223,"context_line":"            self.driver.detach_volume(context, volume)"},{"line_number":224,"context_line":"        except Exception:"},{"line_number":225,"context_line":"            with excutils.save_and_reraise_exception(reraise\u003dreraise):"},{"line_number":226,"context_line":"                LOG.error(\"Failed to detach %(volume_id)s\","},{"line_number":227,"context_line":"                          {\u0027volume_id\u0027: volume.volume_id})"}],"source_content_type":"text/x-python","patch_set":17,"id":"1f2f7f8d_ee75ffcd","line":224,"range":{"start_line":224,"start_character":15,"end_line":224,"end_character":24},"updated":"2017-09-19 02:08:53.000000000","message":"ditto","commit_id":"1277756503d0647e01edcb3d09094f0abc484f2f"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"11f8943e4a78318d63b9f8db285d4a1677bc9613","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        try:"},{"line_number":53,"context_line":"            self._detach_volumes(context, container)"},{"line_number":54,"context_line":"        except Exception:"},{"line_number":55,"context_line":"            LOG.exception(\"Failed to detach volumes\")"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        container.status \u003d consts.ERROR"},{"line_number":58,"context_line":"        container.status_reason \u003d error"}],"source_content_type":"text/x-python","patch_set":18,"id":"bf57530f_43ebb5af","line":55,"updated":"2017-09-20 08:45:43.000000000","message":"It will be helpful to debug if we add more details to the log message like the container and volume name.","commit_id":"251a00982fd93047e769ef8a239402892c2b4b31"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"ba53de111b8e1667315d23600c45a741b0c00ddf","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        try:"},{"line_number":53,"context_line":"            self._detach_volumes(context, container)"},{"line_number":54,"context_line":"        except Exception:"},{"line_number":55,"context_line":"            LOG.exception(\"Failed to detach volumes\")"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        container.status \u003d consts.ERROR"},{"line_number":58,"context_line":"        container.status_reason \u003d error"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f515b1d_1bd52fba","line":55,"in_reply_to":"bf57530f_43ebb5af","updated":"2017-09-21 23:22:45.000000000","message":"Done. I added the original exception to the log, which should contains more details.","commit_id":"251a00982fd93047e769ef8a239402892c2b4b31"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"11f8943e4a78318d63b9f8db285d4a1677bc9613","unresolved":false,"context_lines":[{"line_number":225,"context_line":"            with excutils.save_and_reraise_exception(reraise\u003dreraise):"},{"line_number":226,"context_line":"                LOG.error(\"Failed to detach %(volume_id)s\","},{"line_number":227,"context_line":"                          {\u0027volume_id\u0027: volume.volume_id})"},{"line_number":228,"context_line":"        volume.destroy()"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def _use_sandbox(self):"},{"line_number":231,"context_line":"        if CONF.use_sandbox and self.driver.capabilities[\"support_sandbox\"]:"}],"source_content_type":"text/x-python","patch_set":18,"id":"bf57530f_a37831f8","line":228,"range":{"start_line":228,"start_character":8,"end_line":228,"end_character":24},"updated":"2017-09-20 08:45:43.000000000","message":"Does detach_volume deletes the volume also?\nIs this line meant to be under the except block?","commit_id":"251a00982fd93047e769ef8a239402892c2b4b31"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"69598897110887a6c379b153a96331a65d0798c3","unresolved":false,"context_lines":[{"line_number":225,"context_line":"            with excutils.save_and_reraise_exception(reraise\u003dreraise):"},{"line_number":226,"context_line":"                LOG.error(\"Failed to detach %(volume_id)s\","},{"line_number":227,"context_line":"                          {\u0027volume_id\u0027: volume.volume_id})"},{"line_number":228,"context_line":"        volume.destroy()"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def _use_sandbox(self):"},{"line_number":231,"context_line":"        if CONF.use_sandbox and self.driver.capabilities[\"support_sandbox\"]:"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f515b1d_72643dba","line":228,"range":{"start_line":228,"start_character":8,"end_line":228,"end_character":24},"in_reply_to":"7f515b1d_fb02533e","updated":"2017-09-22 05:58:29.000000000","message":"Ok got it. I missed that this is db object inside Zun.","commit_id":"251a00982fd93047e769ef8a239402892c2b4b31"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"ba53de111b8e1667315d23600c45a741b0c00ddf","unresolved":false,"context_lines":[{"line_number":225,"context_line":"            with excutils.save_and_reraise_exception(reraise\u003dreraise):"},{"line_number":226,"context_line":"                LOG.error(\"Failed to detach %(volume_id)s\","},{"line_number":227,"context_line":"                          {\u0027volume_id\u0027: volume.volume_id})"},{"line_number":228,"context_line":"        volume.destroy()"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def _use_sandbox(self):"},{"line_number":231,"context_line":"        if CONF.use_sandbox and self.driver.capabilities[\"support_sandbox\"]:"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f515b1d_fb02533e","line":228,"range":{"start_line":228,"start_character":8,"end_line":228,"end_character":24},"in_reply_to":"bf57530f_a37831f8","updated":"2017-09-21 23:22:45.000000000","message":"The intention is to destroy the volume if there is no exception, or exception reraising is disabled.","commit_id":"251a00982fd93047e769ef8a239402892c2b4b31"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"cb1062c5a999c2dfe281ce2fe1007b81ac235b5e","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            self._detach_volumes(context, container)"},{"line_number":54,"context_line":"        except Exception as e:"},{"line_number":55,"context_line":"            LOG.exception(\"Failed to detach volumes: %s\","},{"line_number":56,"context_line":"                          six.text_type(e))"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        container.status \u003d consts.ERROR"},{"line_number":59,"context_line":"        container.status_reason \u003d error"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f4e5783_f06900be","line":56,"updated":"2017-10-12 08:49:07.000000000","message":"Helpful to include container and volume name here.","commit_id":"23a9e6e0e948e1fa19834edf599d3709a4f4b141"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"cb1062c5a999c2dfe281ce2fe1007b81ac235b5e","unresolved":false,"context_lines":[{"line_number":210,"context_line":"            self.driver.attach_volume(context, volume)"},{"line_number":211,"context_line":"        except Exception:"},{"line_number":212,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":213,"context_line":"                volume.destroy()"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def _detach_volumes(self, context, container, reraise\u003dTrue):"},{"line_number":216,"context_line":"        volumes \u003d objects.VolumeMapping.list_by_container(context,"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f4e5783_10f6dcfa","line":213,"updated":"2017-10-12 08:49:07.000000000","message":"Loggin the attach failure information here will be useful for debugging purpose.","commit_id":"23a9e6e0e948e1fa19834edf599d3709a4f4b141"}],"zun/container/docker/driver.py":[{"author":{"_account_id":22406,"name":"Kien Nguyen","email":"kiennt2609@gmail.com","username":"kiennt"},"change_message_id":"042368bf3b6fb8bfd427166c965b8f5f67d33c98","unresolved":false,"context_lines":[{"line_number":684,"context_line":"            docker.start(sandbox[\u0027Id\u0027])"},{"line_number":685,"context_line":"            return sandbox[\u0027Id\u0027]"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"    def attach_volume(self, context, volume):"},{"line_number":688,"context_line":"        volume_driver \u003d vol_driver.driver(provider\u003dvolume.volume_provider,"},{"line_number":689,"context_line":"                                          context\u003dcontext)"},{"line_number":690,"context_line":"        volume_driver.attach(volume)"},{"line_number":691,"context_line":""},{"line_number":692,"context_line":"    def detach_volume(self, context, volume):"},{"line_number":693,"context_line":"        volume_driver \u003d vol_driver.driver(provider\u003dvolume.volume_provider,"},{"line_number":694,"context_line":"                                          context\u003dcontext)"},{"line_number":695,"context_line":"        volume_driver.detach(volume)"},{"line_number":696,"context_line":""},{"line_number":697,"context_line":"    def _get_or_create_docker_network(self, context, network_api,"},{"line_number":698,"context_line":"                                      neutron_net_id):"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f515b1d_8303e60d","line":695,"range":{"start_line":687,"start_character":4,"end_line":695,"end_character":36},"updated":"2017-09-22 10:31:34.000000000","message":"This block is inconsistency with base class ContainerDriver methods:\n\n    def attach_volume(self, context, volume_mapping):\n        raise NotImplementedError()\n\n    def detach_volume(self, context, volume_mapping):\n        raise NotImplementedError()","commit_id":"6fec6a5f3d6c1447e3f721be2a5cefd77994d5ee"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"798285b6eb8566ab5910e8f2d97890b57d9b8f1d","unresolved":false,"context_lines":[{"line_number":684,"context_line":"            docker.start(sandbox[\u0027Id\u0027])"},{"line_number":685,"context_line":"            return sandbox[\u0027Id\u0027]"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"    def attach_volume(self, context, volume):"},{"line_number":688,"context_line":"        volume_driver \u003d vol_driver.driver(provider\u003dvolume.volume_provider,"},{"line_number":689,"context_line":"                                          context\u003dcontext)"},{"line_number":690,"context_line":"        volume_driver.attach(volume)"},{"line_number":691,"context_line":""},{"line_number":692,"context_line":"    def detach_volume(self, context, volume):"},{"line_number":693,"context_line":"        volume_driver \u003d vol_driver.driver(provider\u003dvolume.volume_provider,"},{"line_number":694,"context_line":"                                          context\u003dcontext)"},{"line_number":695,"context_line":"        volume_driver.detach(volume)"},{"line_number":696,"context_line":""},{"line_number":697,"context_line":"    def _get_or_create_docker_network(self, context, network_api,"},{"line_number":698,"context_line":"                                      neutron_net_id):"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f515b1d_e6b8252b","line":695,"range":{"start_line":687,"start_character":4,"end_line":695,"end_character":36},"in_reply_to":"7f515b1d_8303e60d","updated":"2017-09-26 02:00:53.000000000","message":"Done","commit_id":"6fec6a5f3d6c1447e3f721be2a5cefd77994d5ee"}]}
