)]}'
{"compute_hyperv/nova/block_device_manager.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"bbc32732a609777c26f130d280c751027a39a9db","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    def __init__(self):"},{"line_number":50,"context_line":"        self._volops \u003d volumeops.VolumeOps()"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @staticmethod"},{"line_number":53,"context_line":"    def _get_device_bus(bdm):"},{"line_number":54,"context_line":"        \"\"\"Determines the device bus and it\u0027s hypervisor assigned address."},{"line_number":55,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_9c2ce0ac","side":"PARENT","line":52,"updated":"2017-10-24 16:55:07.000000000","message":"as far as I can see, self is not referenced in any way, we could leave the @staticmethod.","commit_id":"328d087368f4b4acdd13011da075cb4a91b9bca4"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"f20822f973598cd7c40ae62356d7d12505a039fc","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    def __init__(self):"},{"line_number":50,"context_line":"        self._volops \u003d volumeops.VolumeOps()"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @staticmethod"},{"line_number":53,"context_line":"    def _get_device_bus(bdm):"},{"line_number":54,"context_line":"        \"\"\"Determines the device bus and it\u0027s hypervisor assigned address."},{"line_number":55,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_92c3a738","side":"PARENT","line":52,"in_reply_to":"3f4b6375_9c2ce0ac","updated":"2017-10-24 17:05:25.000000000","message":"Done","commit_id":"328d087368f4b4acdd13011da075cb4a91b9bca4"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"68f313c352023fc76412edf503fe3092a3124f4c","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        connection_info \u003d drv_vol_bdm[\u0027connection_info\u0027]"},{"line_number":80,"context_line":"        if not connection_info:"},{"line_number":81,"context_line":"            LOG.warning(\"Missing connection info for volume %s. \","},{"line_number":82,"context_line":"                        bdm.volume_id)"},{"line_number":83,"context_line":"            return"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f4b6375_79bd5ab5","line":81,"range":{"start_line":81,"start_character":63,"end_line":81,"end_character":64},"updated":"2017-10-27 09:36:40.000000000","message":"minor nit: you can remove this whitespace.","commit_id":"bb0bbbc20d7e0837c2d39fec9c0bae19f5392841"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"cf9ac335bf2c38c35491cc3cf86a9c25c941c87d","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        connection_info \u003d drv_vol_bdm[\u0027connection_info\u0027]"},{"line_number":80,"context_line":"        if not connection_info:"},{"line_number":81,"context_line":"            LOG.warning(\"Missing connection info for volume %s. \","},{"line_number":82,"context_line":"                        bdm.volume_id)"},{"line_number":83,"context_line":"            return"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f4b6375_393c82df","line":81,"range":{"start_line":81,"start_character":63,"end_line":81,"end_character":64},"in_reply_to":"3f4b6375_79bd5ab5","updated":"2017-10-27 09:45:45.000000000","message":"Done","commit_id":"bb0bbbc20d7e0837c2d39fec9c0bae19f5392841"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"68f313c352023fc76412edf503fe3092a3124f4c","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            self._pathutils.get_instance_dir(instance.name), eph_filename)"},{"line_number":102,"context_line":"        if not os.path.exists(eph_path):"},{"line_number":103,"context_line":"            LOG.warning(\"Could not find ephemeral disk %s.\", eph_path)"},{"line_number":104,"context_line":"            return"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        return self._vmutils.get_disk_attachment_info(eph_path,"},{"line_number":107,"context_line":"                                                      is_physical\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f4b6375_790b1a8d","line":104,"updated":"2017-10-27 09:36:40.000000000","message":"hm, we have in pathutils lookup_ephemeral_vhd_path, which should probably simplify this a bit:\n\n    eph_path \u003d self._pathutils.lookup_ephemeral_vhd_path(instance.name,\n                                                         eph_filename)\n    if not eph_path:\n        ...","commit_id":"bb0bbbc20d7e0837c2d39fec9c0bae19f5392841"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"cf9ac335bf2c38c35491cc3cf86a9c25c941c87d","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            self._pathutils.get_instance_dir(instance.name), eph_filename)"},{"line_number":102,"context_line":"        if not os.path.exists(eph_path):"},{"line_number":103,"context_line":"            LOG.warning(\"Could not find ephemeral disk %s.\", eph_path)"},{"line_number":104,"context_line":"            return"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        return self._vmutils.get_disk_attachment_info(eph_path,"},{"line_number":107,"context_line":"                                                      is_physical\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f4b6375_b9007203","line":104,"in_reply_to":"3f4b6375_790b1a8d","updated":"2017-10-27 09:45:45.000000000","message":"I thought about using it but that one expects the image name (without the extension) and tries to guess the full file name, which would be undesired as we already have it.","commit_id":"bb0bbbc20d7e0837c2d39fec9c0bae19f5392841"}],"compute_hyperv/nova/driver.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"bbc32732a609777c26f130d280c751027a39a9db","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                                      instance.name)"},{"line_number":191,"context_line":"        self._block_dev_man.set_volume_bdm_connection_info("},{"line_number":192,"context_line":"            context, instance, connection_info)"},{"line_number":193,"context_line":"        self._vmops.update_device_metadata(context, instance)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    def detach_volume(self, connection_info, instance, mountpoint,"},{"line_number":196,"context_line":"                      encryption\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_9248475c","line":193,"updated":"2017-10-24 16:55:07.000000000","message":"hmmm..... \n\nThe Driver is supposed to have in it as little logic as possible, and pretty much be a container of the *ops classes and delegate calls to them (similar to the Composite pattern).\n\nIMO, we should move these bits in vmops, where all the device metadata logic exists anyways.","commit_id":"41842c415230bc49e015997ccf19cff47680b21d"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"f20822f973598cd7c40ae62356d7d12505a039fc","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                                      instance.name)"},{"line_number":191,"context_line":"        self._block_dev_man.set_volume_bdm_connection_info("},{"line_number":192,"context_line":"            context, instance, connection_info)"},{"line_number":193,"context_line":"        self._vmops.update_device_metadata(context, instance)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    def detach_volume(self, connection_info, instance, mountpoint,"},{"line_number":196,"context_line":"                      encryption\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_52164faa","line":193,"in_reply_to":"3f4b6375_9248475c","updated":"2017-10-24 17:05:25.000000000","message":"I could move those to volumeops, but then we\u0027d have to pass the context object as well.","commit_id":"41842c415230bc49e015997ccf19cff47680b21d"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"bbc32732a609777c26f130d280c751027a39a9db","unresolved":false,"context_lines":[{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        # The nova compute manager only updates the device metadata in"},{"line_number":201,"context_line":"        # case of tagged devices. We\u0027re including untagged devices as well."},{"line_number":202,"context_line":"        context \u003d nova_context.get_admin_context()"},{"line_number":203,"context_line":"        self._vmops.update_device_metadata(context, instance)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def get_volume_connector(self, instance):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_126e97c8","line":202,"updated":"2017-10-24 16:55:07.000000000","message":"atm it\u0027s fine, but ideally, nova-compute would pass the context as well.","commit_id":"41842c415230bc49e015997ccf19cff47680b21d"}],"compute_hyperv/nova/vmops.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"bbc32732a609777c26f130d280c751027a39a9db","unresolved":false,"context_lines":[{"line_number":252,"context_line":""},{"line_number":253,"context_line":"        return vif_metadata"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    def update_device_metadata(self, context, instance, save\u003dTrue):"},{"line_number":256,"context_line":"        \"\"\"Builds a metadata object for instance devices, that maps the user"},{"line_number":257,"context_line":"           provided tag to the hypervisor assigned device address."},{"line_number":258,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_12a33702","line":255,"updated":"2017-10-24 16:55:07.000000000","message":"am I missing something? no one is calling this with save\u003dFalse. If no one passes False for it, might as well remove it.\n\nor maybe you meant to pass save\u003dFalse in spawn?","commit_id":"41842c415230bc49e015997ccf19cff47680b21d"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"f20822f973598cd7c40ae62356d7d12505a039fc","unresolved":false,"context_lines":[{"line_number":252,"context_line":""},{"line_number":253,"context_line":"        return vif_metadata"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    def update_device_metadata(self, context, instance, save\u003dTrue):"},{"line_number":256,"context_line":"        \"\"\"Builds a metadata object for instance devices, that maps the user"},{"line_number":257,"context_line":"           provided tag to the hypervisor assigned device address."},{"line_number":258,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_f2853bd0","line":255,"in_reply_to":"3f4b6375_12a33702","updated":"2017-10-24 17:05:25.000000000","message":"I guess I can just remove the argument.","commit_id":"41842c415230bc49e015997ccf19cff47680b21d"}],"compute_hyperv/nova/volumeops.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"bbc32732a609777c26f130d280c751027a39a9db","unresolved":false,"context_lines":[{"line_number":461,"context_line":"        raise NotImplementedError()"},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"    def get_disk_attachment_info(self, connection_info):"},{"line_number":464,"context_line":"        if not self._is_block_dev:"},{"line_number":465,"context_line":"            disk_path \u003d self.get_disk_resource_path(connection_info)"},{"line_number":466,"context_line":"            serial \u003d None"},{"line_number":467,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_7216ebf3","line":464,"updated":"2017-10-24 16:55:07.000000000","message":"nit: can we reverse the logic here?\n\n    if self._is_block_dev:\n\nit looks cleaner.","commit_id":"41842c415230bc49e015997ccf19cff47680b21d"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"f20822f973598cd7c40ae62356d7d12505a039fc","unresolved":false,"context_lines":[{"line_number":461,"context_line":"        raise NotImplementedError()"},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"    def get_disk_attachment_info(self, connection_info):"},{"line_number":464,"context_line":"        if not self._is_block_dev:"},{"line_number":465,"context_line":"            disk_path \u003d self.get_disk_resource_path(connection_info)"},{"line_number":466,"context_line":"            serial \u003d None"},{"line_number":467,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_72714b0c","line":464,"in_reply_to":"3f4b6375_7216ebf3","updated":"2017-10-24 17:05:25.000000000","message":"Done","commit_id":"41842c415230bc49e015997ccf19cff47680b21d"}],"compute_hyperv/tests/unit/test_block_device_manager.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"36b6221d6116e012c834f19dc23a78b2fccb6fd5","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        connection_info \u003d self._FAKE_CONN_INFO.copy()"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"        mock_bdm \u003d mock.Mock()"},{"line_number":271,"context_line":"        mock_bdm.connection_info \u003d jsonutils.dumps(connection_info)"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"        updates \u003d dict(some_key\u003d\u0027some_val\u0027,"},{"line_number":274,"context_line":"                       some_other_key\u003d\u0027some_other_val\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f4b6375_bbc6db15","line":271,"updated":"2017-10-31 09:44:41.000000000","message":"hm, there\u0027s no need to copy the self._FAKE_CONN_INFO, since you serialize it anyways. this can easily become:\n\n    mock_bdm \u003d mock.Mock()\n    mock_bdm.connection_info \u003d jsonutils.dumps(self._FAKE_CONN_INFO)","commit_id":"8326d2c43c3e464f0c2e3b58bf57b4ffb9a344e7"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"b34cc4ac5c769f52502d277cc3e94bfb9332e428","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        connection_info \u003d self._FAKE_CONN_INFO.copy()"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"        mock_bdm \u003d mock.Mock()"},{"line_number":271,"context_line":"        mock_bdm.connection_info \u003d jsonutils.dumps(connection_info)"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"        updates \u003d dict(some_key\u003d\u0027some_val\u0027,"},{"line_number":274,"context_line":"                       some_other_key\u003d\u0027some_other_val\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f4b6375_261f7271","line":271,"in_reply_to":"3f4b6375_bbc6db15","updated":"2017-10-31 10:22:00.000000000","message":"Indeed. This is such a minor thing though that I guess I\u0027ll just leave it like this.","commit_id":"8326d2c43c3e464f0c2e3b58bf57b4ffb9a344e7"}],"compute_hyperv/tests/unit/test_driver.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"68f313c352023fc76412edf503fe3092a3124f4c","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        self.context \u003d \u0027context\u0027"},{"line_number":44,"context_line":"        self.driver \u003d driver.HyperVDriver(mock.sentinel.virtapi)"},{"line_number":45,"context_line":"        self.driver._block_dev_man \u003d mock.MagicMock()"},{"line_number":46,"context_line":"        self.driver._hostops \u003d mock.MagicMock()"},{"line_number":47,"context_line":"        self.driver._volumeops \u003d mock.MagicMock()"},{"line_number":48,"context_line":"        self.driver._vmops \u003d mock.MagicMock()"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f4b6375_c7790ac5","line":45,"updated":"2017-10-27 09:36:40.000000000","message":"unneeded","commit_id":"bb0bbbc20d7e0837c2d39fec9c0bae19f5392841"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"cf9ac335bf2c38c35491cc3cf86a9c25c941c87d","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        self.context \u003d \u0027context\u0027"},{"line_number":44,"context_line":"        self.driver \u003d driver.HyperVDriver(mock.sentinel.virtapi)"},{"line_number":45,"context_line":"        self.driver._block_dev_man \u003d mock.MagicMock()"},{"line_number":46,"context_line":"        self.driver._hostops \u003d mock.MagicMock()"},{"line_number":47,"context_line":"        self.driver._volumeops \u003d mock.MagicMock()"},{"line_number":48,"context_line":"        self.driver._vmops \u003d mock.MagicMock()"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f4b6375_5c204c9b","line":45,"in_reply_to":"3f4b6375_c7790ac5","updated":"2017-10-27 09:45:45.000000000","message":"Indeed, this is a leftover.","commit_id":"bb0bbbc20d7e0837c2d39fec9c0bae19f5392841"}],"compute_hyperv/tests/unit/test_volumeops.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"68f313c352023fc76412edf503fe3092a3124f4c","unresolved":false,"context_lines":[{"line_number":500,"context_line":""},{"line_number":501,"context_line":"        self.assertEqual("},{"line_number":502,"context_line":"            ret_val,"},{"line_number":503,"context_line":"            mock_vol_driver.get_disk_attachment_info.return_value)"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"@ddt.ddt"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f4b6375_39dec23d","line":503,"updated":"2017-10-27 09:36:40.000000000","message":"hm, expected value should be 1st.","commit_id":"bb0bbbc20d7e0837c2d39fec9c0bae19f5392841"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"cf9ac335bf2c38c35491cc3cf86a9c25c941c87d","unresolved":false,"context_lines":[{"line_number":500,"context_line":""},{"line_number":501,"context_line":"        self.assertEqual("},{"line_number":502,"context_line":"            ret_val,"},{"line_number":503,"context_line":"            mock_vol_driver.get_disk_attachment_info.return_value)"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"@ddt.ddt"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f4b6375_dc61dcd4","line":503,"in_reply_to":"3f4b6375_39dec23d","updated":"2017-10-27 09:45:45.000000000","message":"Done","commit_id":"bb0bbbc20d7e0837c2d39fec9c0bae19f5392841"}]}
