)]}'
{"nova/objects/migrate_data.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7bfb197ac786610b30797c24eafa9d758ddca577","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    fields \u003d {"},{"line_number":173,"context_line":"        \u0027block_migration\u0027: fields.BooleanField(),"},{"line_number":174,"context_line":"        \u0027destination_sr_ref\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":175,"context_line":"        \u0027migrate_send_data\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":176,"context_line":"        \u0027sr_uuid_map\u0027: fields.DictOfStringsField(),"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_90569bcc","line":173,"updated":"2015-11-26 16:19:47.000000000","message":"shouldn\u0027t this one be in the base object?","commit_id":"d7938034295d9e3bf22dbebf26ec964c46ee3d84"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"18bc9812eba2a3062c5f4320a7f7fd78fa8f41d1","unresolved":false,"context_lines":[{"line_number":172,"context_line":"    fields \u003d {"},{"line_number":173,"context_line":"        \u0027block_migration\u0027: fields.BooleanField(),"},{"line_number":174,"context_line":"        \u0027destination_sr_ref\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":175,"context_line":"        \u0027migrate_send_data\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":176,"context_line":"        \u0027sr_uuid_map\u0027: fields.DictOfStringsField(),"},{"line_number":177,"context_line":"    }"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_0139e8f1","line":175,"updated":"2015-11-27 10:22:22.000000000","message":"This is a dict as returned from XenAPI","commit_id":"d7938034295d9e3bf22dbebf26ec964c46ee3d84"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"c902c2dc7ca0708e58f083d113c78eac464de177","unresolved":false,"context_lines":[{"line_number":172,"context_line":"    fields \u003d {"},{"line_number":173,"context_line":"        \u0027block_migration\u0027: fields.BooleanField(),"},{"line_number":174,"context_line":"        \u0027destination_sr_ref\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":175,"context_line":"        \u0027migrate_send_data\u0027: fields.DictOfStringsField(nullable\u003dTrue),"},{"line_number":176,"context_line":"        \u0027sr_uuid_map\u0027: fields.DictOfStringsField(),"},{"line_number":177,"context_line":"    }"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_16c2ab34","line":175,"updated":"2015-12-11 17:56:57.000000000","message":"we might want to move this to some \"opaque blob\" type given those version issues you raised, but thats a follow up thing.","commit_id":"94b689f2151f8c50924cfee9103e1b07ee373041"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"44af775030835c7296a3da5b6813e21aeccc645a","unresolved":false,"context_lines":[{"line_number":183,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    fields \u003d {"},{"line_number":186,"context_line":"        \u0027block_migration\u0027: fields.BooleanField(),"},{"line_number":187,"context_line":"        \u0027destination_sr_ref\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":188,"context_line":"        \u0027migrate_send_data\u0027: fields.DictOfStringsField(nullable\u003dTrue),"},{"line_number":189,"context_line":"        \u0027sr_uuid_map\u0027: fields.DictOfStringsField(),"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a7b0d38_52ec36c7","line":186,"updated":"2015-12-23 08:23:04.000000000","message":"can we make this as nullable\u003dTrue ?\nblock_migration can be calculated if it is None in xen driver layer.\nbecause we want to implement this blue print.\nhttps://blueprints.launchpad.net/openstack/?searchtext\u003dmaking-live-migration-api-friendly","commit_id":"4168afedce04ddc48bbfb03f44b75e4873955d9e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b21ba1ef8406b54000aba396a1872b8bfc8425cf","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def to_legacy_dict(self):"},{"line_number":193,"context_line":"        legacy \u003d super(XenapiLiveMigrateData, self).to_legacy_dict()"},{"line_number":194,"context_line":"        if self.obj_attr_is_set(\u0027block_migration\u0027):"},{"line_number":195,"context_line":"            legacy[\u0027block_migration\u0027] \u003d self.block_migration"},{"line_number":196,"context_line":"        if self.obj_attr_is_set(\u0027migrate_send_data\u0027):"},{"line_number":197,"context_line":"            legacy[\u0027migrate_data\u0027] \u003d {"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a7b0d38_a0f996ca","line":194,"updated":"2015-12-22 21:11:17.000000000","message":"If we have these conditions it\u0027d be good to have unit tests where the attributes aren\u0027t set.","commit_id":"4168afedce04ddc48bbfb03f44b75e4873955d9e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b21ba1ef8406b54000aba396a1872b8bfc8425cf","unresolved":false,"context_lines":[{"line_number":192,"context_line":"    def to_legacy_dict(self):"},{"line_number":193,"context_line":"        legacy \u003d super(XenapiLiveMigrateData, self).to_legacy_dict()"},{"line_number":194,"context_line":"        if self.obj_attr_is_set(\u0027block_migration\u0027):"},{"line_number":195,"context_line":"            legacy[\u0027block_migration\u0027] \u003d self.block_migration"},{"line_number":196,"context_line":"        if self.obj_attr_is_set(\u0027migrate_send_data\u0027):"},{"line_number":197,"context_line":"            legacy[\u0027migrate_data\u0027] \u003d {"},{"line_number":198,"context_line":"                \u0027migrate_send_data\u0027: self.migrate_send_data,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a7b0d38_202b66ed","line":195,"updated":"2015-12-22 21:11:17.000000000","message":"Should we default block_migration to False if the attribute isn\u0027t set?\n\nI\u0027m wondering about check_can_live_migrate_source converting from a legacy dict and not having the block_migration attribute being set.","commit_id":"4168afedce04ddc48bbfb03f44b75e4873955d9e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a9ef193bbde9da1f5fc93a40a6ca6926fe1a7ad3","unresolved":false,"context_lines":[{"line_number":192,"context_line":"    def to_legacy_dict(self):"},{"line_number":193,"context_line":"        legacy \u003d super(XenapiLiveMigrateData, self).to_legacy_dict()"},{"line_number":194,"context_line":"        if self.obj_attr_is_set(\u0027block_migration\u0027):"},{"line_number":195,"context_line":"            legacy[\u0027block_migration\u0027] \u003d self.block_migration"},{"line_number":196,"context_line":"        if self.obj_attr_is_set(\u0027migrate_send_data\u0027):"},{"line_number":197,"context_line":"            legacy[\u0027migrate_data\u0027] \u003d {"},{"line_number":198,"context_line":"                \u0027migrate_send_data\u0027: self.migrate_send_data,"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa69d971_e355fb4f","line":195,"in_reply_to":"1a7b0d38_202b66ed","updated":"2016-01-04 19:05:26.000000000","message":"I\u0027m trying to mimic the behavior of the existing blob, which is that it can be missing depending on the config.","commit_id":"4168afedce04ddc48bbfb03f44b75e4873955d9e"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"c15d07fa8b54e2ec53aa7671fccacfd42a6f3a72","unresolved":false,"context_lines":[{"line_number":189,"context_line":"        \u0027sr_uuid_map\u0027: fields.DictOfStringsField(),"},{"line_number":190,"context_line":"    }"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def to_legacy_dict(self):"},{"line_number":193,"context_line":"        legacy \u003d super(XenapiLiveMigrateData, self).to_legacy_dict()"},{"line_number":194,"context_line":"        if self.obj_attr_is_set(\u0027block_migration\u0027):"},{"line_number":195,"context_line":"            legacy[\u0027block_migration\u0027] \u003d self.block_migration"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa69d971_60450441","line":192,"range":{"start_line":192,"start_character":8,"end_line":192,"end_character":22},"updated":"2016-01-07 03:24:06.000000000","message":"looks like also missing \"pre_migration_result\u003dFalse\" in the parameters","commit_id":"5b32d139b9add630c00f28e520c3d15af85e4ab9"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"c5ebe6108356b8d7838d7a4f67de0e7398f621d9","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                \u0027migrate_send_data\u0027: self.migrate_send_data,"},{"line_number":199,"context_line":"                \u0027destination_sr_ref\u0027: self.destination_sr_ref,"},{"line_number":200,"context_line":"            }"},{"line_number":201,"context_line":"        return legacy"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def from_legacy_dict(self, legacy):"},{"line_number":204,"context_line":"        super(XenapiLiveMigrateData, self).from_legacy_dict(legacy)"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa69d971_f2ac6ea0","line":201,"range":{"start_line":201,"start_character":15,"end_line":201,"end_character":21},"updated":"2016-01-07 02:36:14.000000000","message":"\u0027sr_uuid_map\u0027 is missing, after xen driver add sr_uuid_map in \u0027pre_live_migration\u0027, the XenapiLiveMigrateData will convert to legacy dict, then that field missed. Correct me if I missing something...","commit_id":"5b32d139b9add630c00f28e520c3d15af85e4ab9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"860358613f52c15f9481c5eaf9a8bd212dbb23db","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                \u0027migrate_send_data\u0027: self.migrate_send_data,"},{"line_number":199,"context_line":"                \u0027destination_sr_ref\u0027: self.destination_sr_ref,"},{"line_number":200,"context_line":"            }"},{"line_number":201,"context_line":"        return legacy"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def from_legacy_dict(self, legacy):"},{"line_number":204,"context_line":"        super(XenapiLiveMigrateData, self).from_legacy_dict(legacy)"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa69d971_9fe39633","line":201,"range":{"start_line":201,"start_character":15,"end_line":201,"end_character":21},"in_reply_to":"fa69d971_f2ac6ea0","updated":"2016-01-07 18:39:39.000000000","message":"Yep, good catch again. Fixed and added a test.","commit_id":"5b32d139b9add630c00f28e520c3d15af85e4ab9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2bf234252c9ea00bb943d355504c3ea209f8a85c","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                \u0027migrate_send_data\u0027: self.migrate_send_data,"},{"line_number":199,"context_line":"                \u0027destination_sr_ref\u0027: self.destination_sr_ref,"},{"line_number":200,"context_line":"            }"},{"line_number":201,"context_line":"        live_result \u003d {"},{"line_number":202,"context_line":"            \u0027sr_uuid_map\u0027: (\u0027sr_uuid_map\u0027 in self and self.sr_uuid_map"},{"line_number":203,"context_line":"                            or []),"},{"line_number":204,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa69d971_ab21dc4e","line":201,"range":{"start_line":201,"start_character":8,"end_line":201,"end_character":19},"updated":"2016-01-11 17:11:13.000000000","message":"You could construct this in the if pre_migration_result block blow, it\u0027s not used otherwise.","commit_id":"b280c24f8e2b84e88df6de7442812ce13789ef11"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"37aa79df2929c8ddcbb8397642a84c858cf2fd46","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            }"},{"line_number":201,"context_line":"        live_result \u003d {"},{"line_number":202,"context_line":"            \u0027sr_uuid_map\u0027: (\u0027sr_uuid_map\u0027 in self and self.sr_uuid_map"},{"line_number":203,"context_line":"                            or []),"},{"line_number":204,"context_line":"        }"},{"line_number":205,"context_line":"        if pre_migration_result:"},{"line_number":206,"context_line":"            legacy[\u0027pre_live_migration_result\u0027] \u003d live_result"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa69d971_0ba7c80b","line":203,"range":{"start_line":203,"start_character":31,"end_line":203,"end_character":33},"updated":"2016-01-11 17:10:07.000000000","message":"This should be a dict.","commit_id":"b280c24f8e2b84e88df6de7442812ce13789ef11"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"474b75c2829cbd5901471902d8af9ea4dd134547","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            }"},{"line_number":201,"context_line":"        live_result \u003d {"},{"line_number":202,"context_line":"            \u0027sr_uuid_map\u0027: (\u0027sr_uuid_map\u0027 in self and self.sr_uuid_map"},{"line_number":203,"context_line":"                            or []),"},{"line_number":204,"context_line":"        }"},{"line_number":205,"context_line":"        if pre_migration_result:"},{"line_number":206,"context_line":"            legacy[\u0027pre_live_migration_result\u0027] \u003d live_result"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa69d971_95c5118f","line":203,"range":{"start_line":203,"start_character":31,"end_line":203,"end_character":33},"in_reply_to":"fa69d971_0ba7c80b","updated":"2016-01-11 19:08:01.000000000","message":"Nice, yeah, thanks","commit_id":"b280c24f8e2b84e88df6de7442812ce13789ef11"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"37aa79df2929c8ddcbb8397642a84c858cf2fd46","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                            or []),"},{"line_number":204,"context_line":"        }"},{"line_number":205,"context_line":"        if pre_migration_result:"},{"line_number":206,"context_line":"            legacy[\u0027pre_live_migration_result\u0027] \u003d live_result"},{"line_number":207,"context_line":"        return legacy"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def from_legacy_dict(self, legacy):"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa69d971_cbdbf07a","line":206,"range":{"start_line":206,"start_character":20,"end_line":206,"end_character":45},"updated":"2016-01-11 17:10:07.000000000","message":"Like in the libvirt migrate data object, from_legacy_dict should be checking for this key and then using it to set sr_uuid_map on this object.","commit_id":"b280c24f8e2b84e88df6de7442812ce13789ef11"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"474b75c2829cbd5901471902d8af9ea4dd134547","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                            or []),"},{"line_number":204,"context_line":"        }"},{"line_number":205,"context_line":"        if pre_migration_result:"},{"line_number":206,"context_line":"            legacy[\u0027pre_live_migration_result\u0027] \u003d live_result"},{"line_number":207,"context_line":"        return legacy"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def from_legacy_dict(self, legacy):"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa69d971_b5c29583","line":206,"range":{"start_line":206,"start_character":20,"end_line":206,"end_character":45},"in_reply_to":"fa69d971_cbdbf07a","updated":"2016-01-11 19:08:01.000000000","message":"Done","commit_id":"b280c24f8e2b84e88df6de7442812ce13789ef11"}],"nova/tests/unit/objects/test_migrate_data.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"37aa79df2929c8ddcbb8397642a84c858cf2fd46","unresolved":false,"context_lines":[{"line_number":246,"context_line":""},{"line_number":247,"context_line":"    def test_to_legacy_with_pre_result(self):"},{"line_number":248,"context_line":"        obj \u003d migrate_data.XenapiLiveMigrateData("},{"line_number":249,"context_line":"            sr_uuid_map\u003d{\u0027a\u0027: \u0027b\u0027})"},{"line_number":250,"context_line":"        self.assertNotIn(\u0027sr_uuid_map\u0027, obj.to_legacy_dict())"},{"line_number":251,"context_line":"        legacy \u003d obj.to_legacy_dict(True)"},{"line_number":252,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":20,"id":"fa69d971_ab4c7c42","line":249,"updated":"2016-01-11 17:10:07.000000000","message":"Need to test a case where this attribute isn\u0027t set and assert that obj.to_legacy_dict(True) sets an empty dict as the default.","commit_id":"b280c24f8e2b84e88df6de7442812ce13789ef11"}],"nova/tests/unit/virt/xenapi/test_xenapi.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"6578dcb6cb4688b79545f3667a43c42acefa1a87","unresolved":false,"context_lines":[{"line_number":3431,"context_line":"        expected \u003d {\u0027block_migration\u0027: True,"},{"line_number":3432,"context_line":"                    \u0027is_volume_backed\u0027: False,"},{"line_number":3433,"context_line":"                    \u0027migrate_data\u0027: {"},{"line_number":3434,"context_line":"                        \u0027migrate_send_data\u0027: \"fake_migrate_data\","},{"line_number":3435,"context_line":"                        \u0027destination_sr_ref\u0027: \u0027asdf\u0027"},{"line_number":3436,"context_line":"                        }"},{"line_number":3437,"context_line":"                    }"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_dc6743e7","line":3434,"updated":"2015-11-27 10:29:58.000000000","message":"ah, so this is a bad test...","commit_id":"d7938034295d9e3bf22dbebf26ec964c46ee3d84"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"343ad35b25afd1f5f1f2035e05071db0ecb1f7f9","unresolved":false,"context_lines":[{"line_number":3431,"context_line":"        expected \u003d {\u0027block_migration\u0027: True,"},{"line_number":3432,"context_line":"                    \u0027is_volume_backed\u0027: False,"},{"line_number":3433,"context_line":"                    \u0027migrate_data\u0027: {"},{"line_number":3434,"context_line":"                        \u0027migrate_send_data\u0027: \"fake_migrate_data\","},{"line_number":3435,"context_line":"                        \u0027destination_sr_ref\u0027: \u0027asdf\u0027"},{"line_number":3436,"context_line":"                        }"},{"line_number":3437,"context_line":"                    }"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_f6b34398","line":3434,"in_reply_to":"9a8ffd7b_0256c6cd","updated":"2015-11-27 12:53:46.000000000","message":"A real example is:\n\n{\u0027xenops\u0027: \u0027http://10.219.10.31/services/xenops?session_id\u003dOpaqueRef:78d843a8-e984-dd5c-0897-4367cab52a17\u0027, \u0027host\u0027: \u0027OpaqueRef:46c068e3-bdff-594e-2319-b5274236c095\u0027, \u0027master\u0027: \u0027http://10.219.10.31/\u0027, \u0027session_id\u0027: \u0027OpaqueRef:78d843a8-e984-dd5c-0897-4367cab52a17\u0027, \u0027SM\u0027: \u0027http://10.219.10.31/services/SM?session_id\u003dOpaqueRef:78d843a8-e984-dd5c-0897-4367cab52a17\u0027}\n\nI guess as long as it\u0027s dict of strings then it\u0027s covered.  XAPI reserves the right to modify or extend any of these values as they are just intended to be passed back.\n\nAnother option might be to encode the return value and store in the object as a string, so XAPI can even change the type if desired?","commit_id":"d7938034295d9e3bf22dbebf26ec964c46ee3d84"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"46fb97ecc8e5d87d1eca39c42d8fa534e603f2a5","unresolved":false,"context_lines":[{"line_number":3431,"context_line":"        expected \u003d {\u0027block_migration\u0027: True,"},{"line_number":3432,"context_line":"                    \u0027is_volume_backed\u0027: False,"},{"line_number":3433,"context_line":"                    \u0027migrate_data\u0027: {"},{"line_number":3434,"context_line":"                        \u0027migrate_send_data\u0027: \"fake_migrate_data\","},{"line_number":3435,"context_line":"                        \u0027destination_sr_ref\u0027: \u0027asdf\u0027"},{"line_number":3436,"context_line":"                        }"},{"line_number":3437,"context_line":"                    }"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_0256c6cd","line":3434,"in_reply_to":"9a8ffd7b_bcfa7f73","updated":"2015-11-27 11:01:00.000000000","message":"{\"host_ref\": \"foo\", \"access_token\": \"bar\"} is likely a better test it would seem. Bob would that cover it?","commit_id":"d7938034295d9e3bf22dbebf26ec964c46ee3d84"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"c7944341ed01b63f4dc3b5836312f30cb54bdfac","unresolved":false,"context_lines":[{"line_number":3431,"context_line":"        expected \u003d {\u0027block_migration\u0027: True,"},{"line_number":3432,"context_line":"                    \u0027is_volume_backed\u0027: False,"},{"line_number":3433,"context_line":"                    \u0027migrate_data\u0027: {"},{"line_number":3434,"context_line":"                        \u0027migrate_send_data\u0027: \"fake_migrate_data\","},{"line_number":3435,"context_line":"                        \u0027destination_sr_ref\u0027: \u0027asdf\u0027"},{"line_number":3436,"context_line":"                        }"},{"line_number":3437,"context_line":"                    }"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_bcfa7f73","line":3434,"in_reply_to":"9a8ffd7b_dc6743e7","updated":"2015-11-27 10:33:00.000000000","message":"We need a better example response here:\nhttps://github.com/openstack/nova/blob/master/nova/virt/xenapi/fake.py#L823","commit_id":"d7938034295d9e3bf22dbebf26ec964c46ee3d84"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"9fc35c43a7d6b92818cce8e84daad0280573c96b","unresolved":false,"context_lines":[{"line_number":3431,"context_line":"        expected \u003d {\u0027block_migration\u0027: True,"},{"line_number":3432,"context_line":"                    \u0027is_volume_backed\u0027: False,"},{"line_number":3433,"context_line":"                    \u0027migrate_data\u0027: {"},{"line_number":3434,"context_line":"                        \u0027migrate_send_data\u0027: \"fake_migrate_data\","},{"line_number":3435,"context_line":"                        \u0027destination_sr_ref\u0027: \u0027asdf\u0027"},{"line_number":3436,"context_line":"                        }"},{"line_number":3437,"context_line":"                    }"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_3833a8f8","line":3434,"in_reply_to":"9a8ffd7b_f6b34398","updated":"2015-11-30 15:19:31.000000000","message":"Well, that breaks our ability to version our own API. I would think that sticking with a dict of strings would be best at the moment, and if we run into some change that breaks that, our own interfaces will break so we\u0027ll know about it and can deal with it then.\n\nYou could argue that we should just JSON up anything from the hypervisor and assume that the hypervisor handles the compatibility, but we\u0027d have to be extra sure that *we* never depend on the contents that way.","commit_id":"d7938034295d9e3bf22dbebf26ec964c46ee3d84"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"c902c2dc7ca0708e58f083d113c78eac464de177","unresolved":false,"context_lines":[{"line_number":3443,"context_line":"        expected \u003d {\u0027block_migration\u0027: True,"},{"line_number":3444,"context_line":"                    \u0027is_volume_backed\u0027: False,"},{"line_number":3445,"context_line":"                    \u0027migrate_data\u0027: {"},{"line_number":3446,"context_line":"                        \u0027migrate_send_data\u0027: {\u0027value\u0027: \u0027fake_migrate_data\u0027},"},{"line_number":3447,"context_line":"                        \u0027destination_sr_ref\u0027: \u0027asdf\u0027"},{"line_number":3448,"context_line":"                        }"},{"line_number":3449,"context_line":"                    }"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_96a8db8d","line":3446,"updated":"2015-12-11 17:56:57.000000000","message":"Thanks for fixing that up.","commit_id":"94b689f2151f8c50924cfee9103e1b07ee373041"}],"nova/virt/xenapi/vmops.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"6578dcb6cb4688b79545f3667a43c42acefa1a87","unresolved":false,"context_lines":[{"line_number":2100,"context_line":"        nwref \u003d pifs[pifs.keys()[0]][\u0027network\u0027]"},{"line_number":2101,"context_line":"        try:"},{"line_number":2102,"context_line":"            options \u003d {}"},{"line_number":2103,"context_line":"            migrate_data \u003d self._session.call_xenapi(\"host.migrate_receive\","},{"line_number":2104,"context_line":"                                                     destref,"},{"line_number":2105,"context_line":"                                                     nwref,"},{"line_number":2106,"context_line":"                                                     options)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_7c6ad782","line":2103,"updated":"2015-11-27 10:29:58.000000000","message":"ah, good point, this is a dict of strings, don\u0027t remember if its nested.\n\nBob, what is a good example response?","commit_id":"d7938034295d9e3bf22dbebf26ec964c46ee3d84"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"6578dcb6cb4688b79545f3667a43c42acefa1a87","unresolved":false,"context_lines":[{"line_number":2139,"context_line":"        dest_check_data \u003d migrate_data_obj.XenapiLiveMigrateData()"},{"line_number":2140,"context_line":"        if block_migration:"},{"line_number":2141,"context_line":"            dest_check_data.block_migration \u003d True"},{"line_number":2142,"context_line":"            dest_check_data.migrate_send_data \u003d self._migrate_receive(ctxt)"},{"line_number":2143,"context_line":"            dest_check_data.destination_sr_ref \u003d vm_utils.safe_find_sr("},{"line_number":2144,"context_line":"                self._session)"},{"line_number":2145,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_1c294b37","line":2142,"updated":"2015-11-27 10:29:58.000000000","message":"I guess this is where it goes wrong then?","commit_id":"d7938034295d9e3bf22dbebf26ec964c46ee3d84"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"6578dcb6cb4688b79545f3667a43c42acefa1a87","unresolved":false,"context_lines":[{"line_number":2195,"context_line":"            }"},{"line_number":2196,"context_line":"            try:"},{"line_number":2197,"context_line":"                self._call_live_migrate_command("},{"line_number":2198,"context_line":"                    \"VM.assert_can_migrate\", vm_ref, migrate_data)"},{"line_number":2199,"context_line":"            except self._session.XenAPI.Failure as exc:"},{"line_number":2200,"context_line":"                reason \u003d exc.details[0]"},{"line_number":2201,"context_line":"                msg \u003d _(\u0027assert_can_migrate failed because: %s\u0027) % reason"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_213e6cda","line":2198,"updated":"2015-11-27 10:29:58.000000000","message":"ah, so this needs to be a string?","commit_id":"d7938034295d9e3bf22dbebf26ec964c46ee3d84"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"6578dcb6cb4688b79545f3667a43c42acefa1a87","unresolved":false,"context_lines":[{"line_number":2322,"context_line":"            if migrate_data is not None:"},{"line_number":2323,"context_line":"                (kernel, ramdisk) \u003d vm_utils.lookup_kernel_ramdisk("},{"line_number":2324,"context_line":"                    self._session, vm_ref)"},{"line_number":2325,"context_line":"                migrate_data[\u0027kernel-file\u0027] \u003d kernel"},{"line_number":2326,"context_line":"                migrate_data[\u0027ramdisk-file\u0027] \u003d ramdisk"},{"line_number":2327,"context_line":""},{"line_number":2328,"context_line":"            if block_migration:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_a101fc07","line":2325,"updated":"2015-11-27 10:29:58.000000000","message":"I wonder if we have issues in here as well now?","commit_id":"d7938034295d9e3bf22dbebf26ec964c46ee3d84"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b21ba1ef8406b54000aba396a1872b8bfc8425cf","unresolved":false,"context_lines":[{"line_number":2186,"context_line":"            obj.from_legacy_dict(dest_check_data)"},{"line_number":2187,"context_line":"            dest_check_data \u003d obj"},{"line_number":2188,"context_line":""},{"line_number":2189,"context_line":"        if dest_check_data.block_migration:"},{"line_number":2190,"context_line":"            vm_ref \u003d self._get_vm_opaque_ref(instance_ref)"},{"line_number":2191,"context_line":"            migrate_data \u003d {"},{"line_number":2192,"context_line":"                \u0027destination_sr_ref\u0027: dest_check_data.destination_sr_ref,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a7b0d38_201286b5","line":2189,"updated":"2015-12-22 21:11:17.000000000","message":"The object doesn\u0027t default the block_migration attribute, so if it wasn\u0027t in the legacy dict couldn\u0027t we blow up here with an AttributeError?","commit_id":"4168afedce04ddc48bbfb03f44b75e4873955d9e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a9ef193bbde9da1f5fc93a40a6ca6926fe1a7ad3","unresolved":false,"context_lines":[{"line_number":2186,"context_line":"            obj.from_legacy_dict(dest_check_data)"},{"line_number":2187,"context_line":"            dest_check_data \u003d obj"},{"line_number":2188,"context_line":""},{"line_number":2189,"context_line":"        if dest_check_data.block_migration:"},{"line_number":2190,"context_line":"            vm_ref \u003d self._get_vm_opaque_ref(instance_ref)"},{"line_number":2191,"context_line":"            migrate_data \u003d {"},{"line_number":2192,"context_line":"                \u0027destination_sr_ref\u0027: dest_check_data.destination_sr_ref,"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa69d971_665fd9e5","line":2189,"in_reply_to":"1a7b0d38_201286b5","updated":"2016-01-04 19:05:26.000000000","message":"Yep, but I think the proper fix is to make it handle that (like it did before) and not to default it.","commit_id":"4168afedce04ddc48bbfb03f44b75e4873955d9e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"08e9ea2874825d313c1a424deb04fa033afabcf0","unresolved":false,"context_lines":[{"line_number":2188,"context_line":""},{"line_number":2189,"context_line":"        if dest_check_data.block_migration:"},{"line_number":2190,"context_line":"            vm_ref \u003d self._get_vm_opaque_ref(instance_ref)"},{"line_number":2191,"context_line":"            migrate_data \u003d {"},{"line_number":2192,"context_line":"                \u0027destination_sr_ref\u0027: dest_check_data.destination_sr_ref,"},{"line_number":2193,"context_line":"                \u0027migrate_send_data\u0027: dest_check_data.migrate_send_data,"},{"line_number":2194,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa69d971_caa42d4c","line":2191,"updated":"2016-01-06 15:01:25.000000000","message":"Might be nice to have a TODO to eventually start passing the XenapiLiveMigrateData object into _call_live_migrate_command rather than the old migrate_data dict, simply because then the caller has to know the key/value pairs that are needed in _call_live_migrate_command which is tightly coupling all of this code.\n\nWe just can\u0027t start passing the migration object into that method until we change live_migration also - which comes later.","commit_id":"4168afedce04ddc48bbfb03f44b75e4873955d9e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a113b7291a2a4a7127aaaa93f32431b5460b2f1b","unresolved":false,"context_lines":[{"line_number":2186,"context_line":"            obj.from_legacy_dict(dest_check_data)"},{"line_number":2187,"context_line":"            dest_check_data \u003d obj"},{"line_number":2188,"context_line":""},{"line_number":2189,"context_line":"        if (\u0027block_migration\u0027 in dest_check_data and"},{"line_number":2190,"context_line":"                dest_check_data.block_migration):"},{"line_number":2191,"context_line":"            vm_ref \u003d self._get_vm_opaque_ref(instance_ref)"},{"line_number":2192,"context_line":"            migrate_data \u003d {"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa69d971_376771ea","line":2189,"updated":"2016-01-06 15:30:19.000000000","message":"There isn\u0027t dict compat on the object, so \u0027in\u0027 doesn\u0027t work here does it? I thought you needed to use obj_attr_is_set? Are we missing a unit test for this case?\n\nIt looks like the existing unit test for this method passes in a dict that has the block_migration key set, so we don\u0027t cover the case where block_migration isn\u0027t in dest_check_data - that\u0027s not really your fault since you\u0027re just updating existing tests. I\u0027m just surprised this is working since I didn\u0027t think \u0027in\u0027 worked w/o dict compat on the object.","commit_id":"5b32d139b9add630c00f28e520c3d15af85e4ab9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ca4cf4f2ceb7cce82636311aa73069fbacd00c24","unresolved":false,"context_lines":[{"line_number":2186,"context_line":"            obj.from_legacy_dict(dest_check_data)"},{"line_number":2187,"context_line":"            dest_check_data \u003d obj"},{"line_number":2188,"context_line":""},{"line_number":2189,"context_line":"        if (\u0027block_migration\u0027 in dest_check_data and"},{"line_number":2190,"context_line":"                dest_check_data.block_migration):"},{"line_number":2191,"context_line":"            vm_ref \u003d self._get_vm_opaque_ref(instance_ref)"},{"line_number":2192,"context_line":"            migrate_data \u003d {"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa69d971_f771d90c","line":2189,"in_reply_to":"fa69d971_376771ea","updated":"2016-01-06 15:39:05.000000000","message":"As noted in IRC, the base class has __contains__:\n\nhttps://github.com/openstack/oslo.versionedobjects/commit/7b67b8540bd136f6758dc7aa05ca0b684114b8c5\n\nSo that\u0027s why this works now. Sweet.\n\nA test for the case that block_migration isn\u0027t in dest_check_data would be nice, but we can do that separately later (or I can build on this change with that test).","commit_id":"5b32d139b9add630c00f28e520c3d15af85e4ab9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a113b7291a2a4a7127aaaa93f32431b5460b2f1b","unresolved":false,"context_lines":[{"line_number":2189,"context_line":"        if (\u0027block_migration\u0027 in dest_check_data and"},{"line_number":2190,"context_line":"                dest_check_data.block_migration):"},{"line_number":2191,"context_line":"            vm_ref \u003d self._get_vm_opaque_ref(instance_ref)"},{"line_number":2192,"context_line":"            migrate_data \u003d {"},{"line_number":2193,"context_line":"                \u0027destination_sr_ref\u0027: dest_check_data.destination_sr_ref,"},{"line_number":2194,"context_line":"                \u0027migrate_send_data\u0027: dest_check_data.migrate_send_data,"},{"line_number":2195,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa69d971_97773d9f","line":2192,"updated":"2016-01-06 15:30:19.000000000","message":"(from PS16):\n\nMight be nice to have a TODO to eventually start passing the XenapiLiveMigrateData object into _call_live_migrate_command rather than the old migrate_data dict, simply because then the caller has to know the key/value pairs that are needed in _call_live_migrate_command which is tightly coupling all of this code.\n\nWe just can\u0027t start passing the migration object into that method until we change live_migration also - which comes later.","commit_id":"5b32d139b9add630c00f28e520c3d15af85e4ab9"}]}
