)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"cf939003f7589a303392fa29ad27d823689bc5d3","unresolved":false,"context_lines":[{"line_number":7,"context_line":"libvirt: introduces module to handle domain xml migration"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This commit adds module to handle domain migration it also"},{"line_number":10,"context_line":"clean the driver in several places to avoid duplicate code."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I19612e0ec003212e12547a36243573531c5c5d20"},{"line_number":13,"context_line":"Implements: blueprint libvirt-clean-driver"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"5a18252c_b049378e","line":10,"updated":"2016-04-12 20:36:36.000000000","message":"s/clean the driver/cleans the driver/","commit_id":"81af665a1e27510014488fad2829dcf19590e658"}],"nova/tests/unit/virt/libvirt/test_migration.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"0b878dd50be8e35c49b6e9e30cb87980081d0a6d","unresolved":false,"context_lines":[{"line_number":95,"context_line":"\u003c/domain\u003e\"\"\""},{"line_number":96,"context_line":"        doc \u003d etree.fromstring(xml)"},{"line_number":97,"context_line":"        res \u003d etree.tostring(migration._update_serial_xml(doc, data))"},{"line_number":98,"context_line":"        self.assertIn(\u0027127.0.0.100\u0027, res)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def test_update_serial_xml_console(self):"},{"line_number":101,"context_line":"        data \u003d objects.LibvirtLiveMigrateData("}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_48575826","line":98,"updated":"2016-05-03 12:46:18.000000000","message":"In Py3K environments, you are getting the following error:\n\n testtools.matchers._impl.MismatchError: \u0027127.0.0.100\u0027 not in b\u0027\u003cdomain\u003e\\n  \u003cdevices\u003e\\n    \u003cserial type\u003d\"tcp\"\u003e\\n      \u003csource host\u003d\"127.0.0.100\"/\u003e\\n    \u003c/serial\u003e\\n  \u003c/devices\u003e\\n\u003c/domain\u003e\u0027\n\nYou will need to rewrite this assertion to convert res to a six.text_type():\n\n jaypipes@uberbox:~/repos/nova$ source .tox/py34/bin/activate\n(py34) jaypipes@uberbox:~/repos/nova$ python\nPython 3.4.3+ (default, Oct 14 2015, 16:03:50) \n[GCC 5.2.1 20151010] on linux\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n\u003e\u003e\u003e import six\n\u003e\u003e\u003e \n\u003e\u003e\u003e s \u003d b\u00271.1.1.1\u0027\n\u003e\u003e\u003e \u00271.1.1.1\u0027 in s\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\nTypeError: \u0027str\u0027 does not support the buffer interface\n\u003e\u003e\u003e \u00271.1.1.1\u0027 in six.text_type(s)\nTrue\n\nAlternately, I suppose a longer-term fix would be to have testtools.matchers correctly handle Py3K str comparisons in the assertIn() matcher.","commit_id":"c6dc5e67e6334bb76acfe9ae1880f16851a2fcab"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ad609d11f5924f596507cb3af5b3dcb1a4eb349a","unresolved":false,"context_lines":[{"line_number":5925,"context_line":"                                 CONF.libvirt.live_migration_bandwidth)"},{"line_number":5926,"context_line":"            else:"},{"line_number":5927,"context_line":"                new_xml_str \u003d libvirt_migrate.get_updated_guest_xml("},{"line_number":5928,"context_line":"                    # TODO(sahid): It\u0027s not a really well idea to pass"},{"line_number":5929,"context_line":"                    # the method _get_volume_config and we should to find"},{"line_number":5930,"context_line":"                    # a way to avoid this in future."},{"line_number":5931,"context_line":"                    guest, migrate_data, self._get_volume_config)"}],"source_content_type":"text/x-python","patch_set":10,"id":"dab17558_986bbdb6","line":5928,"updated":"2016-05-11 15:34:12.000000000","message":"nit: s/well/good/ :)","commit_id":"23191308ff1bb151e441e398d69e46fb845f4e65"}],"nova/virt/libvirt/guest.py":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"4056d987bcf4cd4dfff28fe46e5e6bb0ce0e8983","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        self._domain.suspend()"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"class Migrate(object):"},{"line_number":482,"context_line":"    def __init__(self, guest, get_volume_config):"},{"line_number":483,"context_line":"        self._guest \u003d guest"},{"line_number":484,"context_line":"        self._get_volume_config \u003d get_volume_config"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a061dce_e962d7ac","line":481,"range":{"start_line":481,"start_character":20,"end_line":481,"end_character":22},"updated":"2016-04-04 13:01:03.000000000","message":"I think we should really create a separate \u0027migration.py\u0027 file that just contains the methods related to migration in it - not seeing that having a class really adds any benefit over a method in a separate module. We could then later also move _live_migration_operation, _migration_downtime_steps, _live_migration_copy_disk_paths, _live_migration_data_gb and _live_migration_monitor out into that file.","commit_id":"a21aec11da919aafce0344d4c3ef3c94e5d1a70a"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"4e34c573bcf9dd9aadb15da6ad718520424af360","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        self._domain.suspend()"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"class Migrate(object):"},{"line_number":482,"context_line":"    def __init__(self, guest, get_volume_config):"},{"line_number":483,"context_line":"        self._guest \u003d guest"},{"line_number":484,"context_line":"        self._get_volume_config \u003d get_volume_config"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a061dce_6899986e","line":481,"in_reply_to":"9a061dce_08a0dcf3","updated":"2016-04-06 13:38:35.000000000","message":"I dunno, even _update_XXX() methods are really pretty much specific to migration","commit_id":"a21aec11da919aafce0344d4c3ef3c94e5d1a70a"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"083d20f849ef502bfbb7beed46f0f715e4dd0090","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        self._domain.suspend()"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"class Migrate(object):"},{"line_number":482,"context_line":"    def __init__(self, guest, get_volume_config):"},{"line_number":483,"context_line":"        self._guest \u003d guest"},{"line_number":484,"context_line":"        self._get_volume_config \u003d get_volume_config"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a061dce_b5d0b3f7","line":481,"in_reply_to":"9a061dce_6899986e","updated":"2016-04-06 13:41:54.000000000","message":"Ok so let\u0027s move all of these methods in a separated module and so keep the object Guest with less code.","commit_id":"a21aec11da919aafce0344d4c3ef3c94e5d1a70a"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"bb10ca80a19e32799dc58383e8126e24b0bee6b0","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        self._domain.suspend()"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"class Migrate(object):"},{"line_number":482,"context_line":"    def __init__(self, guest, get_volume_config):"},{"line_number":483,"context_line":"        self._guest \u003d guest"},{"line_number":484,"context_line":"        self._get_volume_config \u003d get_volume_config"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a061dce_08a0dcf3","line":481,"in_reply_to":"9a061dce_e962d7ac","updated":"2016-04-04 15:26:31.000000000","message":"Yes you make a good point, methods like \"graphics_listen_addrs()\" or \"serial_listen_addr()\" should probably live in migrations.py and then in future we can probably move all methods you have noticed.\n\nAbout the methods \u0027_update_serial(), \u0027_update_volume()\u0027 etc... They should probably remain in guest.py, probably in Guest object itself since they are closely related to the guest, don\u0027t you think ?","commit_id":"a21aec11da919aafce0344d4c3ef3c94e5d1a70a"}],"nova/virt/libvirt/migration.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"cf939003f7589a303392fa29ad27d823689bc5d3","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"Manages guests related migration"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_105f4b42","line":16,"updated":"2016-04-12 20:36:36.000000000","message":"This is really quite misleading. This module doesn\u0027t actually manage guest migration at all. It simply has some utility functions that update XML strings for libvirt. Perhaps in the future you plan to place code that manages guest migrations here, but right now, that\u0027s really not what this module does.","commit_id":"81af665a1e27510014488fad2829dcf19590e658"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"98e4512185e12e6facf47eb2ec6c118b97f48442","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"Manages guests related migration"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_f72c254c","line":16,"in_reply_to":"5a18252c_105f4b42","updated":"2016-04-13 12:21:34.000000000","message":"Yes that is the plan","commit_id":"81af665a1e27510014488fad2829dcf19590e658"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"cf939003f7589a303392fa29ad27d823689bc5d3","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    return listen_addr"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def update_guest(guest, migrate_data, get_volume_config):"},{"line_number":49,"context_line":"    xml_doc \u003d etree.fromstring(guest.get_xml_desc(dump_migratable\u003dTrue))"},{"line_number":50,"context_line":"    xml_doc \u003d _update_graphics(xml_doc, migrate_data)"},{"line_number":51,"context_line":"    xml_doc \u003d _update_serial(xml_doc, migrate_data)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_f05baf52","line":48,"updated":"2016-04-12 20:36:36.000000000","message":"Erm, this isn\u0027t updating the guest at all. It\u0027s updating some XML snippet. Better to keep this named update_guest_xml() or get_updated_guest_xml() since nothing about the Guest object is being updated...","commit_id":"81af665a1e27510014488fad2829dcf19590e658"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"98e4512185e12e6facf47eb2ec6c118b97f48442","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    return listen_addr"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def update_guest(guest, migrate_data, get_volume_config):"},{"line_number":49,"context_line":"    xml_doc \u003d etree.fromstring(guest.get_xml_desc(dump_migratable\u003dTrue))"},{"line_number":50,"context_line":"    xml_doc \u003d _update_graphics(xml_doc, migrate_data)"},{"line_number":51,"context_line":"    xml_doc \u003d _update_serial(xml_doc, migrate_data)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_57e35905","line":48,"in_reply_to":"5a18252c_f05baf52","updated":"2016-04-13 12:21:34.000000000","message":"Yes, get_updated_guest_xml()\u0027d be much better","commit_id":"81af665a1e27510014488fad2829dcf19590e658"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"cf939003f7589a303392fa29ad27d823689bc5d3","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    return etree.tostring(xml_doc)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def _update_graphics(xml_doc, migrate_data):"},{"line_number":57,"context_line":"    listen_addrs \u003d graphics_listen_addrs(migrate_data)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    # change over listen addresses"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_5059c359","line":56,"updated":"2016-04-12 20:36:36.000000000","message":"Ditto. How about _update_graphics_xml()","commit_id":"81af665a1e27510014488fad2829dcf19590e658"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"cf939003f7589a303392fa29ad27d823689bc5d3","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    return xml_doc"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"def _update_serial(xml_doc, migrate_data):"},{"line_number":72,"context_line":"    listen_addr \u003d serial_listen_addr(migrate_data)"},{"line_number":73,"context_line":"    for dev in xml_doc.findall(\"./devices/serial[@type\u003d\u0027tcp\u0027]/source\"):"},{"line_number":74,"context_line":"        if dev.get(\u0027host\u0027) is not None:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_3056c729","line":71,"updated":"2016-04-12 20:36:36.000000000","message":"_update_serial_xml()","commit_id":"81af665a1e27510014488fad2829dcf19590e658"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"cf939003f7589a303392fa29ad27d823689bc5d3","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    return xml_doc"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def _update_volume(xml_doc, migrate_data, get_volume_config):"},{"line_number":83,"context_line":"    \"\"\"Update XML using device information of destination host.\"\"\""},{"line_number":84,"context_line":"    migrate_bdm_info \u003d migrate_data.bdms"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_90319b0e","line":82,"updated":"2016-04-12 20:36:36.000000000","message":"_update_volume_xml()","commit_id":"81af665a1e27510014488fad2829dcf19590e658"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"be9bcb4e4580cebb2f233e2b6b1436f260853e6d","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        listen_addrs[\u0027spice\u0027] \u003d str("},{"line_number":36,"context_line":"            migrate_data.graphics_listen_addr_spice)"},{"line_number":37,"context_line":"    return listen_addrs"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def serial_listen_addr(migrate_data):"},{"line_number":41,"context_line":"    \"\"\"Returns listen address serial from a LibvirtLiveMigrateData\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_4a4dfec2","line":38,"updated":"2016-04-28 12:05:03.000000000","message":"I appreciatedthat this did not currently have any test coverage, so you\u0027re not making things any worse. Since we\u0027re moving these methods though, I think that we should take the opportunity to a test_migration.py to give test coverage for all these methods","commit_id":"53b457fda6aef00f868272ae40fcf6fe961da70a"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"02c431fa4c1c03b6b508880428fe142496caa5bd","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        listen_addrs[\u0027spice\u0027] \u003d str("},{"line_number":36,"context_line":"            migrate_data.graphics_listen_addr_spice)"},{"line_number":37,"context_line":"    return listen_addrs"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def serial_listen_addr(migrate_data):"},{"line_number":41,"context_line":"    \"\"\"Returns listen address serial from a LibvirtLiveMigrateData\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_cda3e8fe","line":38,"in_reply_to":"1a122d0e_4a4dfec2","updated":"2016-04-28 12:18:23.000000000","message":"Yes we should use that opportunity.","commit_id":"53b457fda6aef00f868272ae40fcf6fe961da70a"}]}
