)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"07771bc266f15b75d2c55643b1a528ef9208b4d6","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Ensure bridge exists before resuming a VM after an offline snapshot"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If we take a cold snapshot of a local instance and only one instance"},{"line_number":10,"context_line":"on the host, neutron would deleted the bridge after the instance is"},{"line_number":11,"context_line":"paused."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"1a6ced46_b278de2c","line":9,"updated":"2015-03-22 12:00:44.000000000","message":"the patch also deals with shelve","commit_id":"1f0a931475a5130bba00fb402c21dd9d1c54930d"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"07771bc266f15b75d2c55643b1a528ef9208b4d6","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Ensure bridge exists before resuming a VM after an offline snapshot"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If we take a cold snapshot of a local instance and only one instance"},{"line_number":10,"context_line":"on the host, neutron would deleted the bridge after the instance is"},{"line_number":11,"context_line":"paused."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Therefore, when this instance is resuming after cold snapshot is done,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"1a6ced46_e6a9c07c","line":10,"updated":"2015-03-22 12:00:44.000000000","message":"you should say that this problem is specific to the neutron linuxbridge agent","commit_id":"1f0a931475a5130bba00fb402c21dd9d1c54930d"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"85786c2783131480b3b843b99df61caaaba2e64c","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If we take a cold snapshot of a local instance and only one instance"},{"line_number":10,"context_line":"on the host, neutron (only occurs when we use neutron linuxbridge)"},{"line_number":11,"context_line":"would delete the bridge after the instance is paused."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Therefore, when this instance is resuming after cold snapshot is done,"},{"line_number":14,"context_line":"it may raise an exception \"libvirt error, can\u0027t get the bridge MTU\"."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"1a6ced46_8a6d5907","line":11,"updated":"2015-03-23 10:44:48.000000000","message":"the \u0027paused\u0027 should be poweroff ? \nthe code looks like handle snapshot instead of pause","commit_id":"0a8f767771e650c0811ee931e8de5a3e799ae495"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9541f707cdf00b0d84308df4b8b7c8e6b02eccc9","unresolved":false,"context_lines":[{"line_number":9,"context_line":"If we take a cold snapshot of a local instance and only one instance"},{"line_number":10,"context_line":"on the host, neutron (only occurs when we use neutron linuxbridge)"},{"line_number":11,"context_line":"would delete the bridge after nova called the libvirt function"},{"line_number":12,"context_line":"\u0027managedSave\u0027."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Therefore, when this instance is resuming after cold snapshot is done,"},{"line_number":15,"context_line":"it may raise an exception \"libvirt error, can\u0027t get the bridge MTU\"."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"da20952f_69a4dab8","line":12,"updated":"2015-09-08 19:28:53.000000000","message":"The bug goes into more detail about why neutron deletes the bridge, which would be good information to have here - the key is that there is only the one tap device for the one instance on the bridge, and when that is gone the neutron linuxbridge agent removes the empty bridge.","commit_id":"25c6b66598ba8cbdbe3dc288633c9b8f320ced17"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9541f707cdf00b0d84308df4b8b7c8e6b02eccc9","unresolved":false,"context_lines":[{"line_number":12,"context_line":"\u0027managedSave\u0027."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Therefore, when this instance is resuming after cold snapshot is done,"},{"line_number":15,"context_line":"it may raise an exception \"libvirt error, can\u0027t get the bridge MTU\"."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"In this patch, we re-plug the vif for the instance before resuming it."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"da20952f_045505f9","line":15,"updated":"2015-09-08 19:28:53.000000000","message":"So in this change you update the virt driver snapshot method to pass network info and you plumb that through the other virt drivers, but you only implement the fix for libvirt - what about the other drivers?  Either call out here that you\u0027re only fixing this for libvirt or line up other changes after this which fix the other drivers - or see how the virt driver maintainers want to handle this (vmware: garyk, hyperv: claudiub, xen: BobBall).","commit_id":"25c6b66598ba8cbdbe3dc288633c9b8f320ced17"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9541f707cdf00b0d84308df4b8b7c8e6b02eccc9","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"In this patch, we re-plug the vif for the instance before resuming it."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"And since nova image-create and nova shelve also involve the operation"},{"line_number":20,"context_line":"of doing snapshot, this patch deal with them too."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I43fd09c6c36aa401b53a1af77fcb6775313797c1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"da20952f_c975e6cc","line":19,"updated":"2015-09-08 19:28:53.000000000","message":"https://bugs.launchpad.net/nova/+bug/1293540/comments/6 also says that rescue is affected but that\u0027s not addressed here?\n\nSame for reboot, which I also see in this CI job:\n\nhttp://logs.openstack.org/37/220737/10/check/gate-functional-neutron-dsvm-ec2api/fd85409/logs/screen-n-cpu.txt.gz?level\u003dTRACE#_2015-09-08_15_28_57_951","commit_id":"25c6b66598ba8cbdbe3dc288633c9b8f320ced17"}],"nova/compute/manager.py":[{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"07771bc266f15b75d2c55643b1a528ef9208b4d6","unresolved":false,"context_lines":[{"line_number":3184,"context_line":"        instance.power_state \u003d self._get_power_state(context, instance)"},{"line_number":3185,"context_line":""},{"line_number":3186,"context_line":"        # Note(luogangyi): get network info and pass it to snapshot"},{"line_number":3187,"context_line":"        # method"},{"line_number":3188,"context_line":"        network_info \u003d self._get_instance_nw_info(context, instance)"},{"line_number":3189,"context_line":""},{"line_number":3190,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6ced46_66b5d0cc","line":3187,"updated":"2015-03-22 12:00:44.000000000","message":"there is no need for this comment","commit_id":"1f0a931475a5130bba00fb402c21dd9d1c54930d"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"07771bc266f15b75d2c55643b1a528ef9208b4d6","unresolved":false,"context_lines":[{"line_number":3210,"context_line":"                instance.save(expected_task_state\u003dexpected_state)"},{"line_number":3211,"context_line":""},{"line_number":3212,"context_line":"            # Note(luogangyi): network_info is needed when resume"},{"line_number":3213,"context_line":"            # the domain in case of Neutron Bug#1293540"},{"line_number":3214,"context_line":"            self.driver.snapshot(context, instance, image_id,"},{"line_number":3215,"context_line":"                                 update_task_state, network_info)"},{"line_number":3216,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6ced46_86c9ec5c","line":3213,"updated":"2015-03-22 12:00:44.000000000","message":"this comment is not needed. People can use the git history to get things like this.","commit_id":"1f0a931475a5130bba00fb402c21dd9d1c54930d"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"07771bc266f15b75d2c55643b1a528ef9208b4d6","unresolved":false,"context_lines":[{"line_number":4309,"context_line":"        self._power_off_instance(context, instance, clean_shutdown)"},{"line_number":4310,"context_line":""},{"line_number":4311,"context_line":"        # Note(luogangyi): get network info and pass it to snapshot"},{"line_number":4312,"context_line":"        # method"},{"line_number":4313,"context_line":"        network_info \u003d self._get_instance_nw_info(context, instance)"},{"line_number":4314,"context_line":""},{"line_number":4315,"context_line":"        self.driver.snapshot(context, instance, image_id, update_task_state,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6ced46_a6c6e847","line":4312,"updated":"2015-03-22 12:00:44.000000000","message":"this comment is stating the obvious","commit_id":"1f0a931475a5130bba00fb402c21dd9d1c54930d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9541f707cdf00b0d84308df4b8b7c8e6b02eccc9","unresolved":false,"context_lines":[{"line_number":2959,"context_line":"                instance.task_state \u003d task_state"},{"line_number":2960,"context_line":"                instance.save(expected_task_state\u003dexpected_state)"},{"line_number":2961,"context_line":""},{"line_number":2962,"context_line":"            self.driver.snapshot(context, instance, image_id,"},{"line_number":2963,"context_line":"                                 update_task_state, net_info)"},{"line_number":2964,"context_line":""},{"line_number":2965,"context_line":"            instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":20,"id":"da20952f_4948f68a","line":2962,"updated":"2015-09-08 19:28:53.000000000","message":"Where is the unit test change to make sure net_info is passed in?","commit_id":"25c6b66598ba8cbdbe3dc288633c9b8f320ced17"}],"nova/tests/unit/compute/test_shelve.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9541f707cdf00b0d84308df4b8b7c8e6b02eccc9","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            self.compute.network_api.cleanup_instance_network_on_host("},{"line_number":75,"context_line":"                self.context, instance, instance.host)"},{"line_number":76,"context_line":"        self.compute.driver.snapshot(self.context, instance, \u0027fake_image_id\u0027,"},{"line_number":77,"context_line":"                mox.IgnoreArg(), mox.IgnoreArg())"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        tracking \u003d {\u0027last_state\u0027: instance.vm_state}"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"da20952f_e43c91c1","line":77,"updated":"2015-09-08 19:28:53.000000000","message":"You should be able to at least create a stub network info object, I think it\u0027s just a list of dicts.  I\u0027d prefer to not ignore more args.","commit_id":"25c6b66598ba8cbdbe3dc288633c9b8f320ced17"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"379511d7a810ab64956cdfe572eda35b4376aac9","unresolved":false,"context_lines":[{"line_number":13695,"context_line":"        def fake_plug_vifs(instance, network_info):"},{"line_number":13696,"context_line":"            pass"},{"line_number":13697,"context_line":""},{"line_number":13698,"context_line":"        self.stubs.Set(driver, \u0027plug_vifs\u0027, fake_plug_vifs)"},{"line_number":13699,"context_line":"        driver.snapshot(self.context, self.instance_ref, image_id,"},{"line_number":13700,"context_line":"                        self.mock_update_task_state)"},{"line_number":13701,"context_line":"        snapshot \u003d self.image_service.show(self.context, image_id)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3afb71cf_4ca65e11","line":13698,"updated":"2015-06-09 03:35:53.000000000","message":"Why introduce stubs.Set into this test? You should use mock like you did on L13765-13770","commit_id":"1ade7c4eb21de43247866897f78a3eb5e7020bfe"},{"author":{"_account_id":13630,"name":"Luo Gangyi","email":"luogangyi@corp.netease.com","username":"luogangyi"},"change_message_id":"8f814b860c2a57e16d51d3f79895ccf51d76cfce","unresolved":false,"context_lines":[{"line_number":13695,"context_line":"        def fake_plug_vifs(instance, network_info):"},{"line_number":13696,"context_line":"            pass"},{"line_number":13697,"context_line":""},{"line_number":13698,"context_line":"        self.stubs.Set(driver, \u0027plug_vifs\u0027, fake_plug_vifs)"},{"line_number":13699,"context_line":"        driver.snapshot(self.context, self.instance_ref, image_id,"},{"line_number":13700,"context_line":"                        self.mock_update_task_state)"},{"line_number":13701,"context_line":"        snapshot \u003d self.image_service.show(self.context, image_id)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3afb71cf_d8d9e484","line":13698,"in_reply_to":"3afb71cf_4ca65e11","updated":"2015-06-09 05:23:26.000000000","message":"Yes, this code is written long time ago, I will rewrite it.","commit_id":"1ade7c4eb21de43247866897f78a3eb5e7020bfe"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"73011c93b4fdc8878f5437824a7cdef5b8def914","unresolved":false,"context_lines":[{"line_number":13766,"context_line":""},{"line_number":13767,"context_line":"            driver.snapshot(self.context, self.instance_ref, recv_meta[\u0027id\u0027],"},{"line_number":13768,"context_line":"                            self.mock_update_task_state, _fake_network_info)"},{"line_number":13769,"context_line":"            mock_plug_vifs.assert_called_with(self.instance_ref,"},{"line_number":13770,"context_line":"                                              _fake_network_info)"},{"line_number":13771,"context_line":""},{"line_number":13772,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"ba3cc151_2f81004b","line":13769,"updated":"2015-06-29 14:41:58.000000000","message":"assert_called_once_with*\n\nI know the plug_vifs method is called once, but as a general rule, assert_called_once_with is safer. This will ensure the code is called once, the reviewers can see that it is called only once and won\u0027t have to check how many times / when it is called. If it is called more than once, .has_calls show be used instead.","commit_id":"1ade7c4eb21de43247866897f78a3eb5e7020bfe"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9541f707cdf00b0d84308df4b8b7c8e6b02eccc9","unresolved":false,"context_lines":[{"line_number":14831,"context_line":"    \"\"\""},{"line_number":14832,"context_line":"    def setUp(self):"},{"line_number":14833,"context_line":"        super(LibvirtColdSnapshotTests, self).setUp()"},{"line_number":14834,"context_line":"        self.flags(disable_libvirt_livesnapshot\u003dTrue, group\u003d\"workarounds\")"},{"line_number":14835,"context_line":""},{"line_number":14836,"context_line":"    @mock.patch.object(imagebackend.Image, \u0027resolve_driver_format\u0027)"},{"line_number":14837,"context_line":"    @mock.patch.object(host.Host, \u0027get_domain\u0027)"}],"source_content_type":"text/x-python","patch_set":20,"id":"da20952f_a41539e6","line":14834,"updated":"2015-09-08 19:28:53.000000000","message":"Live snapshot is already disabled by default:\n\nhttp://git.openstack.org/cgit/openstack/nova/tree/nova/utils.py#n101\n\nSo why do we need this extra class that will duplicate all of the tests in the parent class?  I don\u0027t see disable_libvirt_livesnapshot\u003dFalse in the parent tests.","commit_id":"25c6b66598ba8cbdbe3dc288633c9b8f320ced17"}],"nova/tests/unit/virt/test_virt_drivers.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"379511d7a810ab64956cdfe572eda35b4376aac9","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        def fake_plug_vifs(instance, network_info):"},{"line_number":276,"context_line":"            pass"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        self.stubs.Set(self.connection, \u0027plug_vifs\u0027, fake_plug_vifs)"},{"line_number":279,"context_line":"        self.connection.snapshot(self.ctxt, instance_ref, img_ref[\u0027id\u0027],"},{"line_number":280,"context_line":"                                 lambda *args, **kwargs: None)"},{"line_number":281,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3afb71cf_ecabcad4","line":278,"updated":"2015-06-09 03:35:53.000000000","message":"Same, use mock","commit_id":"1ade7c4eb21de43247866897f78a3eb5e7020bfe"}],"nova/virt/driver.py":[{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"07771bc266f15b75d2c55643b1a528ef9208b4d6","unresolved":false,"context_lines":[{"line_number":494,"context_line":"        :param instance: nova.objects.instance.Instance"},{"line_number":495,"context_line":"        :param image_id: Reference to a pre-created image that will"},{"line_number":496,"context_line":"                         hold the snapshot."},{"line_number":497,"context_line":"        :param network_info:"},{"line_number":498,"context_line":"           :py:meth:`~nova.network.manager.NetworkManager.get_instance_nw_info`"},{"line_number":499,"context_line":"        \"\"\""},{"line_number":500,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6ced46_66ecf0c8","line":497,"updated":"2015-03-22 12:00:44.000000000","message":"instance network information","commit_id":"1f0a931475a5130bba00fb402c21dd9d1c54930d"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":5319,"name":"Sam Stoelinga","email":"sammiestoel@gmail.com","username":"sammiestoel"},"change_message_id":"552b4914dbdd8dbe37dbf8220c54d64823851450","unresolved":false,"context_lines":[{"line_number":1369,"context_line":"                if CONF.libvirt.virt_type !\u003d \u0027lxc\u0027 and not live_snapshot:"},{"line_number":1370,"context_line":"                    # Note(luogangyi): Ensure vif is plugged in case of"},{"line_number":1371,"context_line":"                    # Neturon bug#1293540"},{"line_number":1372,"context_line":"                    self.plug_vifs(instance, network_info)"},{"line_number":1373,"context_line":"                    if state \u003d\u003d power_state.RUNNING:"},{"line_number":1374,"context_line":"                        new_dom \u003d self._create_domain(domain\u003dvirt_dom)"},{"line_number":1375,"context_line":"                    elif state \u003d\u003d power_state.PAUSED:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_327bf22a","line":1372,"updated":"2015-03-11 06:33:49.000000000","message":"the function plug_vifs will break if you supply a None value. Please see the following snippet of jenkins logs of nova compute: http://paste.openstack.org/show/191502/ \n\nThe whole log can be found here: http://logs.openstack.org/42/149942/6/check/check-tempest-dsvm-nova-v21-full/79d8c71/logs/screen-n-cpu.txt.gz\n\nMy suggestion is to add an extra check like:\nif network_info \u003d\u003d None:\n     network_info \u003d []\n\nYou can add this check to the plug_vifs function before the for loop.","commit_id":"f0b7f55d135fcf5bae0634e2c5b8f1b61236a745"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"07771bc266f15b75d2c55643b1a528ef9208b4d6","unresolved":false,"context_lines":[{"line_number":1388,"context_line":"                #              for LXC, _create_domain must not be called."},{"line_number":1389,"context_line":"                if CONF.libvirt.virt_type !\u003d \u0027lxc\u0027 and not live_snapshot:"},{"line_number":1390,"context_line":"                    # Note(luogangyi): Ensure vif is plugged in case of"},{"line_number":1391,"context_line":"                    # Neturon bug#1293540"},{"line_number":1392,"context_line":"                    self.plug_vifs(instance, network_info)"},{"line_number":1393,"context_line":"                    if state \u003d\u003d power_state.RUNNING:"},{"line_number":1394,"context_line":"                        new_dom \u003d self._create_domain(domain\u003dvirt_dom)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6ced46_c6c3e436","line":1391,"updated":"2015-03-22 12:00:44.000000000","message":"no need for this comment as that infomation will be in the git history","commit_id":"1f0a931475a5130bba00fb402c21dd9d1c54930d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9541f707cdf00b0d84308df4b8b7c8e6b02eccc9","unresolved":false,"context_lines":[{"line_number":1436,"context_line":"                #              for LXC, _create_domain must not be called."},{"line_number":1437,"context_line":"                if CONF.libvirt.virt_type !\u003d \u0027lxc\u0027 and not live_snapshot:"},{"line_number":1438,"context_line":""},{"line_number":1439,"context_line":"                    self.plug_vifs(instance, network_info)"},{"line_number":1440,"context_line":"                    if state \u003d\u003d power_state.RUNNING:"},{"line_number":1441,"context_line":"                        guest \u003d self._create_domain(domain\u003dvirt_dom)"},{"line_number":1442,"context_line":"                    elif state \u003d\u003d power_state.PAUSED:"}],"source_content_type":"text/x-python","patch_set":20,"id":"da20952f_44869d17","line":1439,"updated":"2015-09-08 19:28:53.000000000","message":"plug_vifs should only be called if network_info is not None, else you\u0027ll get a NoneType because plug_vifs doesn\u0027t check that.","commit_id":"25c6b66598ba8cbdbe3dc288633c9b8f320ced17"}]}
