)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"991a2489e0af2138498b203b2eccdb1aa6bf5341","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Matt Riedemann \u003cmriedem.os@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-02-22 15:42:56 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add vif info to migration object"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"- This change adds a new VIFMigrateData object."},{"line_number":10,"context_line":"- This change adds a new vifs field to the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3fa0c359_0d866167","line":7,"updated":"2018-02-22 22:07:12.000000000","message":"Add VIFMigrateData object\n\nWe have a different migration object.","commit_id":"1b160e3dda45342c4e9e18e637b5853386d47ac9"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b3177d0e54c1cd29074b2151aabf8d70143070b6","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"- This change adds a new VIFMigrateData object."},{"line_number":10,"context_line":"- This change adds a new vifs field to the"},{"line_number":11,"context_line":"  base LiveMigrationData object."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Later patches will populate this information during"},{"line_number":14,"context_line":"live migration where nova uses the neutron port"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"bf659307_16fafbbb","line":11,"range":{"start_line":11,"start_character":7,"end_line":11,"end_character":24},"updated":"2018-03-31 17:21:39.000000000","message":"LiveMigrateData","commit_id":"94beea530e838a259e29babfc33c3920dbaf9995"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cdbd6ccf380bf3ec7e49ca1b28cf8b975e0040fb","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"- This change adds a new VIFMigrateData object."},{"line_number":10,"context_line":"- This change adds a new vifs field to the"},{"line_number":11,"context_line":"  base LiveMigrationData object."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Later patches will populate this information during"},{"line_number":14,"context_line":"live migration where nova uses the neutron port"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"bf659307_6a3c6a92","line":11,"range":{"start_line":11,"start_character":7,"end_line":11,"end_character":24},"in_reply_to":"bf659307_16fafbbb","updated":"2018-04-04 14:27:41.000000000","message":"Done","commit_id":"94beea530e838a259e29babfc33c3920dbaf9995"}],"nova/objects/fields.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4e6a195aff4ac4e21a4331de6240ddc0481943f6","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"    def to_primitive(obj, attr, value):"},{"line_number":1012,"context_line":"        return jsonutils.dumps(value)"},{"line_number":1013,"context_line":""},{"line_number":1014,"context_line":"    @staticmethod"},{"line_number":1015,"context_line":"    def from_primitive(obj, attr, value):"},{"line_number":1016,"context_line":"        return network_model.VIF.hydrate(value)"},{"line_number":1017,"context_line":""},{"line_number":1018,"context_line":"    def get_schema(self):"},{"line_number":1019,"context_line":"        return {\u0027type\u0027: [\u0027string\u0027]}"}],"source_content_type":"text/x-python","patch_set":9,"id":"df7087c5_f5527dde","line":1016,"range":{"start_line":1014,"start_character":4,"end_line":1016,"end_character":47},"updated":"2018-03-19 13:09:56.000000000","message":"This is blowing up:\n\nhttp://logs.openstack.org/73/552173/3/check/legacy-tempest-dsvm-multinode-live-migration/83b8b25/logs/subnode-2/screen-n-cpu.txt.gz#_Mar_16_23_02_47_599906\n\nLooks like it\u0027s the json version, which makes sense, so need to load it up first.","commit_id":"b16f7f8b0f080dc73037991d3b8dfa5e7152bea3"}],"nova/objects/migrate_data.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"96831d7938ab26314919d7320bc7d795ecbb6117","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    }"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":140,"context_line":"        super(LibvirtLiveMigrateData, self).obj_make_compatible("},{"line_number":141,"context_line":"            primitive, target_version)"},{"line_number":142,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":143,"context_line":"        if target_version \u003c (1, 4):"},{"line_number":144,"context_line":"            if \u0027old_vol_attachment_ids\u0027 in primitive:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_f6dde1dc","side":"PARENT","line":141,"range":{"start_line":140,"start_character":8,"end_line":141,"end_character":38},"updated":"2017-10-27 00:27:23.000000000","message":"thecnically this was always logically incorrect.\n\nin any case where you are not using the default noop implementation of obj_make_compatible if you have two classes in an inheritance chain directly  passing the target verion form the most derived class to a supper class\nmay result in invalid objects.\n\n\nif for example this classes parent was at say version 1.4 when this class was created with version 1.0. assume at some point i rev the derived class to version 1.1.\n\ncalling derived.obj_make_compatible(primitve,\u00271.0\u0027) would both downgrade derived to 1.0 and derived\u0027s base to 1.0 however properties inherited for derived\u0027s base should have been to 1.4 when derived was at 1.0.\n\nthe result is that the downgraded object will contain any field that were delete between 1.0 and 1.4 in the base class and will be missing any field that were added between 1.0 and 1.4 resulting in an invalid object.\n\nin this particalar inheritence tree we do not trigger this bug as LiveMigrateData does not overload obj_make_compatible however if anyone was to inherit from any of the derived classes and call their super obj_make_compatible with the target_version they were called with it will trigger this bug.","commit_id":"df9fbbfec97a1ce13364d025bcd66621725bb7e4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3e56e23805a721bdfb0ae0d8da4efe6fafb5b21a","unresolved":false,"context_lines":[{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"@obj_base.NovaObjectRegistry.register"},{"line_number":28,"context_line":"class LiveMigrateData(obj_base.NovaObject):"},{"line_number":29,"context_line":"    # Version 1.0: Initial version"},{"line_number":30,"context_line":"    # Version 1.1: Added old_vol_attachment_ids field."}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_341a5c16","line":27,"updated":"2017-10-26 18:22:50.000000000","message":"Please don\u0027t do this. This is intended to be unregistered so that nobody ever sends it over the wire and always implements their own for their virt driver.","commit_id":"a55c9b4bbf4da5b0da46d030950892b276cceb86"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"96831d7938ab26314919d7320bc7d795ecbb6117","unresolved":false,"context_lines":[{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"@obj_base.NovaObjectRegistry.register"},{"line_number":28,"context_line":"class LiveMigrateData(obj_base.NovaObject):"},{"line_number":29,"context_line":"    # Version 1.0: Initial version"},{"line_number":30,"context_line":"    # Version 1.1: Added old_vol_attachment_ids field."}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_d639c5a3","line":27,"in_reply_to":"3f4b6375_341a5c16","updated":"2017-10-27 00:27:23.000000000","message":"cool that ill revert this i was not sure why this class was different then the rest. that makes sense","commit_id":"a55c9b4bbf4da5b0da46d030950892b276cceb86"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3e56e23805a721bdfb0ae0d8da4efe6fafb5b21a","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        super(LiveMigrateData, self).obj_make_compatible("},{"line_number":46,"context_line":"            primitive, target_version)"},{"line_number":47,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":48,"context_line":"        if target_version \u003c (1, 2) and \u0027vifs\u0027 in primitive:"},{"line_number":49,"context_line":"            del primitive[\u0027vifs\u0027]"},{"line_number":50,"context_line":"        if target_version \u003c (1, 1) and \u0027old_vol_attachment_ids\u0027 in primitive:"},{"line_number":51,"context_line":"            del primitive[\u0027old_vol_attachment_ids\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_d4c1c855","line":48,"updated":"2017-10-26 18:22:50.000000000","message":"This won\u0027t work. If we\u0027re doing libvirt migration, this will not trigger at the right version. Registering this class doesn\u0027t fix that. There is no magic that will run this with the matching version from the base class in some way. This needs to be done in each subclass at the version in which this change will bring it to them.","commit_id":"a55c9b4bbf4da5b0da46d030950892b276cceb86"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"96831d7938ab26314919d7320bc7d795ecbb6117","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        super(LiveMigrateData, self).obj_make_compatible("},{"line_number":46,"context_line":"            primitive, target_version)"},{"line_number":47,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":48,"context_line":"        if target_version \u003c (1, 2) and \u0027vifs\u0027 in primitive:"},{"line_number":49,"context_line":"            del primitive[\u0027vifs\u0027]"},{"line_number":50,"context_line":"        if target_version \u003c (1, 1) and \u0027old_vol_attachment_ids\u0027 in primitive:"},{"line_number":51,"context_line":"            del primitive[\u0027old_vol_attachment_ids\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_b60ac9ce","line":48,"in_reply_to":"3f4b6375_d4c1c855","updated":"2017-10-27 00:27:23.000000000","message":"well this is called via the call to super.obj_make_compatible in line 159 with version 1.1 not the target version it was called with so it should correctly remove the vifs object.\nthe derived class is tracking the version of the base that is compatible with each of its versions.\n\ni don\u0027t need to register this class to version it.","commit_id":"a55c9b4bbf4da5b0da46d030950892b276cceb86"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3e56e23805a721bdfb0ae0d8da4efe6fafb5b21a","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":157,"context_line":"        if version \u003c (1, 5):"},{"line_number":158,"context_line":"            super(LibvirtLiveMigrateData, self).obj_make_compatible("},{"line_number":159,"context_line":"                  primitive, \u00271.1\u0027)"},{"line_number":160,"context_line":"        elif version \u003c (1, 4):"},{"line_number":161,"context_line":"            super(LibvirtLiveMigrateData, self).obj_make_compatible("},{"line_number":162,"context_line":"                  primitive, \u00271.0\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_f4a3a4b0","line":159,"updated":"2017-10-26 18:22:50.000000000","message":"I think this\u0027ll just be confusing. You\u0027re bumping to 1.5 here with a log message, so just do the snipping here. Especially since the backport is not complicated, there\u0027s no reason not to just do it here, IMHO.","commit_id":"a55c9b4bbf4da5b0da46d030950892b276cceb86"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"96831d7938ab26314919d7320bc7d795ecbb6117","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":157,"context_line":"        if version \u003c (1, 5):"},{"line_number":158,"context_line":"            super(LibvirtLiveMigrateData, self).obj_make_compatible("},{"line_number":159,"context_line":"                  primitive, \u00271.1\u0027)"},{"line_number":160,"context_line":"        elif version \u003c (1, 4):"},{"line_number":161,"context_line":"            super(LibvirtLiveMigrateData, self).obj_make_compatible("},{"line_number":162,"context_line":"                  primitive, \u00271.0\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_f6ecc1bb","line":159,"in_reply_to":"3f4b6375_f4a3a4b0","updated":"2017-10-27 00:27:23.000000000","message":"if i delegate this to the childeren \n\nany objection to adding a new helper function to the base  nova object class like this\n\ndef del_versioned_atrib(self,atrib,primitve,added_version,target_version, action\u003dlambda:del primitive[atrib] ):\n    if target_version \u003c added_version and\n       atrib in primitive:\n        action()\n\nthen i could replace the below by  \n\nself.del_versioned_atrib(\"vifs\",primitive,(1,5),target_version)\nself.del_versioned_atrib(\"old_vol_attachment_ids\",primitive,(1,4),target_version)\nself.del_versioned_atrib(\"supported_perf_events\",primitive,(1,3),target_version)\nself.del_versioned_atrib(\"serial_listen_ports\",primitive,(1,2),target_version)\nself.del_versioned_atrib(\"target_connect_addr\",primitive,(1,1),target_version)","commit_id":"a55c9b4bbf4da5b0da46d030950892b276cceb86"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ff2ce9cd4a19a04ad8aa42c8f52c75d82c38e287","unresolved":false,"context_lines":[{"line_number":329,"context_line":"        elif version \u003c (1, 3):"},{"line_number":330,"context_line":"            super(HyperVLiveMigrateData, self).obj_make_compatible("},{"line_number":331,"context_line":"                primitive, \u00271.1\u0027)"},{"line_number":332,"context_line":"        if target_version \u003c (1, 1):"},{"line_number":333,"context_line":"            if \u0027is_shared_instance_path\u0027 in primitive:"},{"line_number":334,"context_line":"                del primitive[\u0027is_shared_instance_path\u0027]"},{"line_number":335,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1f485f77_0ab81fc6","line":332,"range":{"start_line":332,"start_character":11,"end_line":332,"end_character":25},"updated":"2017-11-10 23:02:28.000000000","message":"this should be version.\nalso the fact that this works on python 2 and fails on python 3 is slightly terrifing...","commit_id":"dea8d9ded065523e6b1ae04cb356f28785957e16"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ff2ce9cd4a19a04ad8aa42c8f52c75d82c38e287","unresolved":false,"context_lines":[{"line_number":373,"context_line":"        elif version \u003c (1, 3):"},{"line_number":374,"context_line":"            super(PowerVMLiveMigrateData, self).obj_make_compatible("},{"line_number":375,"context_line":"                primitive, \u00271.1\u0027)"},{"line_number":376,"context_line":"        if target_version \u003c (1, 1):"},{"line_number":377,"context_line":"            if \u0027vea_vlan_mappings\u0027 in primitive:"},{"line_number":378,"context_line":"                del primitive[\u0027vea_vlan_mappings\u0027]"},{"line_number":379,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1f485f77_cab1e7e3","line":376,"range":{"start_line":376,"start_character":11,"end_line":376,"end_character":25},"updated":"2017-11-10 23:02:28.000000000","message":"also terrifing...","commit_id":"dea8d9ded065523e6b1ae04cb356f28785957e16"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4fcadcb034bd18cbe67e18ec8def50b5d0ed9d02","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    fields \u003d {"},{"line_number":33,"context_line":"        \u0027port_id\u0027: fields.StringField(),"},{"line_number":34,"context_line":"        \u0027vnic_type\u0027: fields.StringField(),  # TODO(sean-k-mooney): make enum"},{"line_number":35,"context_line":"        \u0027vif_type\u0027: fields.StringField(),"},{"line_number":36,"context_line":"        \u0027vif_details\u0027: fields.DictOfStringsField(),"},{"line_number":37,"context_line":"        \u0027profile\u0027: fields.DictOfStringsField(),  # TODO(sean-k-mooney) remove?"},{"line_number":38,"context_line":"        \u0027host_id\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_af9ebf60","line":35,"range":{"start_line":35,"start_character":9,"end_line":35,"end_character":17},"updated":"2018-03-09 20:22:57.000000000","message":"I wonder if this should be \u0027type\u0027 (and vif_details should be \u0027details\u0027) because looking at how we\u0027re going to use this data in the libvirt driver during live migration, I\u0027m assuming we want to be able to use the os_vif_util code to get the vif config to put into the guest xml, and that code relies on entries like vif[\u0027type\u0027] and vif[\u0027details\u0027] and vif[\u0027profile\u0027]:\n\nhttps://github.com/openstack/nova/blob/fcda5c2d1a8653242e580cc2c00d130a5d4f4e2e/nova/network/os_vif_util.py#L486\n\nBut what we have here does match what is supposed to be in the response from the port binding API, so at some level we\u0027ll need a translation method to convert to our vif model, e.g.:\n\nhttps://github.com/openstack/nova/blob/fcda5c2d1a8653242e580cc2c00d130a5d4f4e2e/nova/network/model.py#L390\n\nSo maybe we just need to add a to_vif_model() method or something in here, similar to LibvirtLiveMigrateBDMInfo.as_disk_info.","commit_id":"1b160e3dda45342c4e9e18e637b5853386d47ac9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"31f5cec4a1733269bf63d2e5b6a49fc8218c0a62","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        \u0027vnic_type\u0027: fields.StringField(),  # TODO(sean-k-mooney): make enum"},{"line_number":35,"context_line":"        \u0027vif_type\u0027: fields.StringField(),"},{"line_number":36,"context_line":"        \u0027vif_details\u0027: fields.DictOfStringsField(),"},{"line_number":37,"context_line":"        \u0027profile\u0027: fields.DictOfStringsField(),  # TODO(sean-k-mooney) remove?"},{"line_number":38,"context_line":"        \u0027host_id\u0027: fields.StringField(),"},{"line_number":39,"context_line":"    }"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_0fc7ab47","line":37,"range":{"start_line":37,"start_character":49,"end_line":37,"end_character":78},"updated":"2018-03-09 20:24:35.000000000","message":"I don\u0027t think so if we\u0027re going to go through the os-vif code to get the new destination host vif config:\n\nhttps://github.com/openstack/nova/blob/fcda5c2d1a8653242e580cc2c00d130a5d4f4e2e/nova/network/os_vif_util.py#L290","commit_id":"1b160e3dda45342c4e9e18e637b5853386d47ac9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1cfaf8b2dd8a7bdfe2108677a0b521fe1bcb01ef","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        # for each volume so they can be restored on a migration rollback. The"},{"line_number":57,"context_line":"        # key is the volume_id, and the value is the attachment_id."},{"line_number":58,"context_line":"        \u0027old_vol_attachment_ids\u0027: fields.DictOfStringsField(),"},{"line_number":59,"context_line":"        \u0027vifs\u0027: fields.ListOfObjectsField(\u0027VIFMigrateData\u0027, nullable\u003dTrue),"},{"line_number":60,"context_line":"    }"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def to_legacy_dict(self, pre_migration_result\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa0c359_976d7a04","line":59,"updated":"2018-02-25 14:18:39.000000000","message":"This would be set to None in which circumstances?\n\nJust to be clear, nullable\u003dTrue means \"can be set to None\". Any field can be unset if we just don\u0027t have a value for it at the moment.","commit_id":"1b160e3dda45342c4e9e18e637b5853386d47ac9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4fcadcb034bd18cbe67e18ec8def50b5d0ed9d02","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        # for each volume so they can be restored on a migration rollback. The"},{"line_number":57,"context_line":"        # key is the volume_id, and the value is the attachment_id."},{"line_number":58,"context_line":"        \u0027old_vol_attachment_ids\u0027: fields.DictOfStringsField(),"},{"line_number":59,"context_line":"        \u0027vifs\u0027: fields.ListOfObjectsField(\u0027VIFMigrateData\u0027, nullable\u003dTrue),"},{"line_number":60,"context_line":"    }"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def to_legacy_dict(self, pre_migration_result\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_0f9ecb53","line":59,"in_reply_to":"3fa0c359_976d7a04","updated":"2018-03-09 20:22:57.000000000","message":"Based on how it\u0027s currently written in conductor to set this, it wouldn\u0027t be None:\n\nhttps://review.openstack.org/#/c/522537/3/nova/conductor/tasks/live_migrate.py@263\n\nSo we can remove the nullable\u003dTrue on this I think.","commit_id":"1b160e3dda45342c4e9e18e637b5853386d47ac9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"04504c76eca8242be979f01ab605eb508f9c052f","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        \u0027vif_type\u0027: fields.StringField(),"},{"line_number":36,"context_line":"        \u0027vif_details\u0027: fields.DictOfStringsField(),"},{"line_number":37,"context_line":"        \u0027profile\u0027: fields.DictOfStringsField(),"},{"line_number":38,"context_line":"        \u0027host_id\u0027: fields.StringField(),"},{"line_number":39,"context_line":"    }"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    # TODO(sean-k-mooney): host_id,vif_type,details and profile"}],"source_content_type":"text/x-python","patch_set":8,"id":"df7087c5_df1f7307","line":38,"range":{"start_line":38,"start_character":9,"end_line":38,"end_character":16},"updated":"2018-03-16 21:45:10.000000000","message":"This should be \u0027host\u0027 per the API spec:\n\nhttps://review.openstack.org/#/c/484389/8/neutron_lib/api/definitions/portbindings_extended.py@58","commit_id":"9e58f3a31d5b77ce398dd1578324f7e29cc02ffc"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c78e7bdddfa5931366c746f81b200971f7aac6df","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        \u0027src_supports_native_luks\u0027: fields.BooleanField(),"},{"line_number":184,"context_line":"    }"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    # FIXME(mriedem): I don\u0027t know why this is needed for vifs but not for"},{"line_number":187,"context_line":"    # old_vol_attachment_ids which is inherited from LiveMigrateData. Is"},{"line_number":188,"context_line":"    # it because vifs is a field on a versioned object and"},{"line_number":189,"context_line":"    # old_vol_attachment_ids is not?"}],"source_content_type":"text/x-python","patch_set":9,"id":"df7087c5_a21aa46c","line":186,"updated":"2018-03-16 22:33:11.000000000","message":"This shouldn\u0027t be required for anything anymore. The only code that looks at this is compatibility stuff in o.vo. I\u0027ll look (later) at what\u0027s going on that caused you to need to add this.","commit_id":"b16f7f8b0f080dc73037991d3b8dfa5e7152bea3"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2a167b9361ed9c68589939f0b24426adb0539ee7","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        \u0027src_supports_native_luks\u0027: fields.BooleanField(),"},{"line_number":184,"context_line":"    }"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    # FIXME(mriedem): I don\u0027t know why this is needed for vifs but not for"},{"line_number":187,"context_line":"    # old_vol_attachment_ids which is inherited from LiveMigrateData. Is"},{"line_number":188,"context_line":"    # it because vifs is a field on a versioned object and"},{"line_number":189,"context_line":"    # old_vol_attachment_ids is not?"}],"source_content_type":"text/x-python","patch_set":9,"id":"df7087c5_089e0f54","line":186,"in_reply_to":"","updated":"2018-03-17 02:31:54.000000000","message":"I think Its required for correctness on downgrading. Version 1.6 of this object is compatible with 1.0 of the vif object. If we only called make compatible on the libvirtmigrationdata object and did not also enforce the 1.0 version of the vif object it could break older nova that lacked support for a vifmigrationdata 1.1 object.","commit_id":"b16f7f8b0f080dc73037991d3b8dfa5e7152bea3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f513840eb88985b27bcb31e26d7597a971dd7bed","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        \u0027src_supports_native_luks\u0027: fields.BooleanField(),"},{"line_number":184,"context_line":"    }"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    # FIXME(mriedem): I don\u0027t know why this is needed for vifs but not for"},{"line_number":187,"context_line":"    # old_vol_attachment_ids which is inherited from LiveMigrateData. Is"},{"line_number":188,"context_line":"    # it because vifs is a field on a versioned object and"},{"line_number":189,"context_line":"    # old_vol_attachment_ids is not?"}],"source_content_type":"text/x-python","patch_set":9,"id":"df7087c5_f8827152","line":186,"in_reply_to":"df7087c5_089e0f54","updated":"2018-03-19 14:18:07.000000000","message":"These relationship maps are no longer needed at all:\n\n % grep obj_relationships -r nova/objects | wc -l\n 0\n\nIt\u0027s the old way of doing nested object backports. If you\u0027re hitting code that uses these, it\u0027s compatibility code in o.vo. I\u0027ll dig through to see why you\u0027re hitting this and figure out what the problem is.\n\nSee 93a3017999a6f71e94c86f29c83395e9d220250c.","commit_id":"b16f7f8b0f080dc73037991d3b8dfa5e7152bea3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"95645d494f74c531a124c8e0975182f2e52e93e2","unresolved":false,"context_lines":[{"line_number":189,"context_line":"    # old_vol_attachment_ids is not?"},{"line_number":190,"context_line":"    obj_relationships \u003d {"},{"line_number":191,"context_line":"        \u0027vifs\u0027: [(\u00271.6\u0027, \u00271.0\u0027)],"},{"line_number":192,"context_line":"    }"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":195,"context_line":"        super(LibvirtLiveMigrateData, self).obj_make_compatible("}],"source_content_type":"text/x-python","patch_set":10,"id":"df7087c5_7e3ac9cd","line":192,"updated":"2018-03-19 15:21:09.000000000","message":"Nuke this.","commit_id":"a9eaf8437cffcbfd1662879312c2c0468526062e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a031dafcd0dddca0d6dfd8d4f809906e2702aa57","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        # representation of the port on the source host which can be used"},{"line_number":45,"context_line":"        # for filling in blanks about the VIF (port) when building a"},{"line_number":46,"context_line":"        # configuration reference for the destination host."},{"line_number":47,"context_line":"        \u0027source_vif\u0027: fields.Field(fields.NetworkVIFModel()),"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    # TODO(sean-k-mooney): host_id,vif_type,details and profile"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f6a8fd7_0a9e34b8","line":47,"updated":"2018-04-24 19:42:23.000000000","message":"We might not end up needing this depending on how https://review.openstack.org/#/c/551370/ works.","commit_id":"139ff3ed973dc00656d93b25bbe50a19279e7e0c"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"55b7882c69135d59fb1edb5a8bf5748217b4b9ef","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        # representation of the port on the source host which can be used"},{"line_number":45,"context_line":"        # for filling in blanks about the VIF (port) when building a"},{"line_number":46,"context_line":"        # configuration reference for the destination host."},{"line_number":47,"context_line":"        \u0027source_vif\u0027: fields.Field(fields.NetworkVIFModel()),"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    # TODO(sean-k-mooney): host_id,vif_type,details and profile"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_6b03b777","line":47,"updated":"2018-06-19 07:46:35.000000000","message":"We need an other field to store some host configuration.\n\n  virt_type\n  use_virtio_for_bridge\n  firewall_driver\n  rx_queue_size\n  tx_queue_size","commit_id":"04af5dfd6d534b6c1b7a7d6c7dd8a60e1d891bcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c65612c2789649d8e35c9f6d02e92d15b0e2b5f0","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        # representation of the port on the source host which can be used"},{"line_number":45,"context_line":"        # for filling in blanks about the VIF (port) when building a"},{"line_number":46,"context_line":"        # configuration reference for the destination host."},{"line_number":47,"context_line":"        \u0027source_vif\u0027: fields.Field(fields.NetworkVIFModel()),"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    # TODO(sean-k-mooney): host_id,vif_type,details and profile"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_502696bc","line":47,"in_reply_to":"5f7c97a3_34f2fb9c","updated":"2018-06-19 23:40:42.000000000","message":"Since I had to rebase the entire series, I put a TODO in here with a reference to the big note in the libvirt driver when generating the xml on the source host for what\u0027s to be transferred to the destination host. I\u0027m out the rest of this week so will have to investigate the feasibility of storing the full vif objects (or xml) from the dest host in this object (really LibvirtLiveMigrateData probably if we store the dest host vif interface xml) - and to see if that would resolve the live migration failures I\u0027m seeing now at the end of the series, which seem to be new with libvirt 4.0.0 in the Queens UCA:\n\nhttp://logs.openstack.org/37/522537/29/check/nova-live-migration/08534a4/logs/subnode-2/libvirt/libvirtd.txt.gz#_2018-06-19_01_11_49_517\n\n(later)\n\nThis might actually be the problem:\n\nhttps://review.openstack.org/#/c/576664/","commit_id":"04af5dfd6d534b6c1b7a7d6c7dd8a60e1d891bcf"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"8e5433824a7d61341aab45c7ae280051d323a7ac","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        # representation of the port on the source host which can be used"},{"line_number":45,"context_line":"        # for filling in blanks about the VIF (port) when building a"},{"line_number":46,"context_line":"        # configuration reference for the destination host."},{"line_number":47,"context_line":"        \u0027source_vif\u0027: fields.Field(fields.NetworkVIFModel()),"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    # TODO(sean-k-mooney): host_id,vif_type,details and profile"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_75ecd6ba","line":47,"in_reply_to":"5f7c97a3_502696bc","updated":"2018-06-20 10:56:02.000000000","message":"I don\u0027t know we will ended with a duplicate of information if we store the whole XML.\n\nAlso the other drivers may be in that same situation and have their VIF configurations based on host configurations. So I think it would be easier to just have a simple dict of strings where we will put the relevant host configuration. It will be easy to cast the values since we already know their types. But for libvirt at least an extra work needs to be done in libvirt/vif.py to change usage of the global CONF to a passed parameter.\n\nBut anyway, if we have a TODO note, at least we know that we will have to think of that at some point.\n\n\n \u003e (later)\n \u003e \n \u003e This might actually be the problem:\n \u003e \n \u003e https://review.openstack.org/#/c/576664/\n\nIt seems that your patch is fixing the issue..","commit_id":"04af5dfd6d534b6c1b7a7d6c7dd8a60e1d891bcf"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"de6f9e247c40a3a11324c274736f779a8dfee8a0","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        # representation of the port on the source host which can be used"},{"line_number":45,"context_line":"        # for filling in blanks about the VIF (port) when building a"},{"line_number":46,"context_line":"        # configuration reference for the destination host."},{"line_number":47,"context_line":"        \u0027source_vif\u0027: fields.Field(fields.NetworkVIFModel()),"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    # TODO(sean-k-mooney): host_id,vif_type,details and profile"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_447ec6af","line":47,"in_reply_to":"5f7c97a3_58fb0f46","updated":"2018-06-20 14:40:21.000000000","message":"\u003e Yes that\u0027s true and something else I thought about. Unless the libvirt live migrate data had the full vif xmls from the destination host, we\u0027d have to change how nova/virt/libvirt/vif.py works to pass through host configuration values to build the dest host guest interface xml from the source host, and that\u0027s probably a bridge we should cross when we have to since it would only apply to certain types of vifs.\n\nHum I might not well understand - Why don\u0027t we build this from dest? It was basically my point on your conductor patch. If we can have VIFMigrateData initialized from destination host we could have in same time libvirt to build the XML (if we want store the XML)\n\nconductor/live_migrate is calling compute/manager which is calling driver, all of that via the methods check_can_live_migrate_destination_destination().","commit_id":"04af5dfd6d534b6c1b7a7d6c7dd8a60e1d891bcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"24a3df93dc620d5f5459433e77e8876eb4d28b4e","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        # representation of the port on the source host which can be used"},{"line_number":45,"context_line":"        # for filling in blanks about the VIF (port) when building a"},{"line_number":46,"context_line":"        # configuration reference for the destination host."},{"line_number":47,"context_line":"        \u0027source_vif\u0027: fields.Field(fields.NetworkVIFModel()),"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    # TODO(sean-k-mooney): host_id,vif_type,details and profile"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_43bd6000","line":47,"in_reply_to":"5f7c97a3_58fb0f46","updated":"2018-06-20 12:23:41.000000000","message":"Also, the firewall_driver option should be noop everywhere if you\u0027re using neutron, and goes away once we drop nova-network (hopefully in Stein now).","commit_id":"04af5dfd6d534b6c1b7a7d6c7dd8a60e1d891bcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"871a379c25c2ef0029c762ce1565e394426031b7","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        # representation of the port on the source host which can be used"},{"line_number":45,"context_line":"        # for filling in blanks about the VIF (port) when building a"},{"line_number":46,"context_line":"        # configuration reference for the destination host."},{"line_number":47,"context_line":"        \u0027source_vif\u0027: fields.Field(fields.NetworkVIFModel()),"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    # TODO(sean-k-mooney): host_id,vif_type,details and profile"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_34f2fb9c","line":47,"in_reply_to":"5f7c97a3_6b03b777","updated":"2018-06-19 13:17:16.000000000","message":"I definitely thought about this, but not sure what needs to be done (if anything). See replies in https://review.openstack.org/#/c/551370/23/nova/virt/libvirt/migration.py.\n\nThe rx_queue_size and tx_queue_size stuff didn\u0027t exist when I wrote this.\n\nfirewall_driver should always be NoopFirewallDriver now since we\u0027re using neutron.\n\nvirt_type is checked in conductor:\n\nhttps://github.com/openstack/nova/blob/afcf078715554e3efe5b71d583586dc112159299/nova/conductor/tasks/live_migrate.py#L210\n\nuse_virtio_for_bridge is per-host config, and if we don\u0027t store what\u0027s configured on the dest host we\u0027ll use whatever was set on the source host, hopefully those are compatible.\n\nOr we go down the harder alternative road I mentioned later in the driver.py about building the vifs on the destination host during pre_live_migration and send them back to the source via the LibvirtLiveMigrateData object.","commit_id":"04af5dfd6d534b6c1b7a7d6c7dd8a60e1d891bcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c5f86781d27c9ee991ce683378662dc05c340747","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        # representation of the port on the source host which can be used"},{"line_number":45,"context_line":"        # for filling in blanks about the VIF (port) when building a"},{"line_number":46,"context_line":"        # configuration reference for the destination host."},{"line_number":47,"context_line":"        \u0027source_vif\u0027: fields.Field(fields.NetworkVIFModel()),"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    # TODO(sean-k-mooney): host_id,vif_type,details and profile"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_58fb0f46","line":47,"in_reply_to":"5f7c97a3_75ecd6ba","updated":"2018-06-20 12:04:59.000000000","message":"\u003e So I think it would be easier to just have a simple dict of strings where we will put the relevant host configuration.\n\nIn general we want to avoid random dicts of strings if we can help it since it gets hard to know what is in there during upgrades. We\u0027re dealing with that already with the port binding profile and vif_details dicts.\n\n\u003e But for libvirt at least an extra work needs to be done in libvirt/vif.py to change usage of the global CONF to a passed parameter.\n\nYes that\u0027s true and something else I thought about. Unless the libvirt live migrate data had the full vif xmls from the destination host, we\u0027d have to change how nova/virt/libvirt/vif.py works to pass through host configuration values to build the dest host guest interface xml from the source host, and that\u0027s probably a bridge we should cross when we have to since it would only apply to certain types of vifs. And we already know that the conductor live migrate task deals with hypervisor type and version compatibility checks, so I\u0027m less concerned about those. The rx/tx queue stuff is another matter, but I figured those would be set the same globally if you\u0027re using them correct?\n\nAnyway, I\u0027ll convert the TODO to a NOTE and leave that in here for posterity if it becomes a problem.","commit_id":"04af5dfd6d534b6c1b7a7d6c7dd8a60e1d891bcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dcca63f0d8bcbd05414237211fc41bc346a362dc","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027port_id\u0027: fields.StringField(),"},{"line_number":38,"context_line":"        \u0027vnic_type\u0027: fields.StringField(),  # TODO(sean-k-mooney): make enum?"},{"line_number":39,"context_line":"        \u0027vif_type\u0027: fields.StringField(),"},{"line_number":40,"context_line":"        \u0027vif_details\u0027: fields.DictOfStringsField(),"},{"line_number":41,"context_line":"        \u0027profile\u0027: fields.DictOfStringsField(),"},{"line_number":42,"context_line":"        \u0027host\u0027: fields.StringField(),"},{"line_number":43,"context_line":"        # The source_vif attribute is a copy of the VIF network model"},{"line_number":44,"context_line":"        # representation of the port on the source host which can be used"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_ac3baece","line":41,"range":{"start_line":40,"start_character":8,"end_line":41,"end_character":47},"updated":"2018-06-25 15:40:27.000000000","message":"I don\u0027t think we can use DictOfStringsField here because that will coerce the values to strings and there are a ton of random key/value pairs available depending on the vif type, so rather than handle all of those individually, we just need to throw them into a big old bag-o-dicts.\n\nFTR, this is my count of what\u0027s possible in just vif_details:\n\nvhostuser_mode\n\nvhostuser_socket\n\ndatapath_type\n\nvhostuser_fp_plug\n\nvhostuser_ovs_plug\n\nvhostuser_vrouter_plug\n\nprofileid\n\nvlan\n\nmacvtap_source\n\nmacvtap_mode\n\nphysical_interface\n\nmac_address\n\novs_hybrid_plug\n\nbridge_name\n\nport_filter\n\nphysical_network","commit_id":"10df8573e6bba8e2bd400ff06c11378182797195"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"55491e991885144772f29ec39005c73674750c50","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027port_id\u0027: fields.StringField(),"},{"line_number":38,"context_line":"        \u0027vnic_type\u0027: fields.StringField(),  # TODO(sean-k-mooney): make enum?"},{"line_number":39,"context_line":"        \u0027vif_type\u0027: fields.StringField(),"},{"line_number":40,"context_line":"        \u0027vif_details\u0027: fields.DictOfStringsField(),"},{"line_number":41,"context_line":"        \u0027profile\u0027: fields.DictOfStringsField(),"},{"line_number":42,"context_line":"        \u0027host\u0027: fields.StringField(),"},{"line_number":43,"context_line":"        # The source_vif attribute is a copy of the VIF network model"},{"line_number":44,"context_line":"        # representation of the port on the source host which can be used"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_ecb1a602","line":41,"range":{"start_line":40,"start_character":8,"end_line":41,"end_character":47},"in_reply_to":"5f7c97a3_4cec5a28","updated":"2018-06-25 15:51:55.000000000","message":"Looks like \"profile\" can have at least the following things we care about:\n\npci_slot - string\n\ntrusted - string (or boolean?)","commit_id":"10df8573e6bba8e2bd400ff06c11378182797195"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"02059619928ce88743ac2e34f7dd45eeb9a983b7","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027port_id\u0027: fields.StringField(),"},{"line_number":38,"context_line":"        \u0027vnic_type\u0027: fields.StringField(),  # TODO(sean-k-mooney): make enum?"},{"line_number":39,"context_line":"        \u0027vif_type\u0027: fields.StringField(),"},{"line_number":40,"context_line":"        \u0027vif_details\u0027: fields.DictOfStringsField(),"},{"line_number":41,"context_line":"        \u0027profile\u0027: fields.DictOfStringsField(),"},{"line_number":42,"context_line":"        \u0027host\u0027: fields.StringField(),"},{"line_number":43,"context_line":"        # The source_vif attribute is a copy of the VIF network model"},{"line_number":44,"context_line":"        # representation of the port on the source host which can be used"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_4cec5a28","line":41,"range":{"start_line":40,"start_character":8,"end_line":41,"end_character":47},"in_reply_to":"5f7c97a3_ac3baece","updated":"2018-06-25 15:47:18.000000000","message":"And Dict is a CompoundFieldType so it requires an element type, so we\u0027d basically have to, I think, serialize and deserialize vif_details and profile and just store it as a StringField, similar to how BlockDeviceMapping.connection_info works (which sucks but same situation - what\u0027s in it totally depends on the volume type).","commit_id":"10df8573e6bba8e2bd400ff06c11378182797195"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b3915bce39ba72a6c56ef68c42e440f51e1631bf","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        # configuration reference for the destination host."},{"line_number":52,"context_line":"        # NOTE(mriedem): This might not be sufficient based on how the"},{"line_number":53,"context_line":"        # destination host is configured for all vif types. See the note in"},{"line_number":54,"context_line":"        # the libvirt driver here: https://review.openstack.org/#/c/551370/"},{"line_number":55,"context_line":"        \u0027source_vif\u0027: fields.Field(fields.NetworkVIFModel()),"},{"line_number":56,"context_line":"    }"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"5f7c97a3_d28ef730","line":54,"range":{"start_line":54,"start_character":35,"end_line":54,"end_character":75},"updated":"2018-07-17 18:12:23.000000000","message":"Do we not want to pin this in case it disappears later or whatever?\n\nhttps://review.openstack.org/#/c/551370/29/nova/virt/libvirt/driver.py@7036","commit_id":"df99b02efa8a7ff02fd921acb4a4acaee1a16d86"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6cca726081b8a70a75b14c01164890466ec0b8e8","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        # configuration reference for the destination host."},{"line_number":52,"context_line":"        # NOTE(mriedem): This might not be sufficient based on how the"},{"line_number":53,"context_line":"        # destination host is configured for all vif types. See the note in"},{"line_number":54,"context_line":"        # the libvirt driver here: https://review.openstack.org/#/c/551370/"},{"line_number":55,"context_line":"        \u0027source_vif\u0027: fields.Field(fields.NetworkVIFModel()),"},{"line_number":56,"context_line":"    }"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"5f7c97a3_a0b50a7f","line":54,"range":{"start_line":54,"start_character":35,"end_line":54,"end_character":75},"in_reply_to":"5f7c97a3_d28ef730","updated":"2018-07-18 15:06:38.000000000","message":"I guess but can that be done in a follow up?","commit_id":"df99b02efa8a7ff02fd921acb4a4acaee1a16d86"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"b1638931d062b9d05b726b308cb7b2c3a7f33a6a","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @property"},{"line_number":59,"context_line":"    def vif_details(self):"},{"line_number":60,"context_line":"        return jsonutils.loads(self.vif_details_json)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @vif_details.setter"},{"line_number":63,"context_line":"    def vif_details(self, vif_details_dict):"}],"source_content_type":"text/x-python","patch_set":29,"id":"5f7c97a3_e14a0881","line":60,"updated":"2018-07-09 08:25:10.000000000","message":"The behavior of this can be unexpected if the value is NULL or \"\".","commit_id":"df99b02efa8a7ff02fd921acb4a4acaee1a16d86"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"673a5f833140387e92116ccb63c454488bd818e5","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @property"},{"line_number":59,"context_line":"    def vif_details(self):"},{"line_number":60,"context_line":"        return jsonutils.loads(self.vif_details_json)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @vif_details.setter"},{"line_number":63,"context_line":"    def vif_details(self, vif_details_dict):"}],"source_content_type":"text/x-python","patch_set":29,"id":"5f7c97a3_e9fa8675","line":60,"in_reply_to":"5f7c97a3_e14a0881","updated":"2018-07-12 21:08:13.000000000","message":"Well, it can\u0027t be None because the vif_details_json field is not nullable, we\u0027d blow up on assignment to None. And it wouldn\u0027t really be \u0027\u0027 either since it\u0027s going to come back from neutron as a dict: http://git.openstack.org/cgit/openstack/neutron/tree/neutron/objects/ports.py#n74","commit_id":"df99b02efa8a7ff02fd921acb4a4acaee1a16d86"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4bb4250efb7c014708633fa28d6018824741b79","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @property"},{"line_number":59,"context_line":"    def vif_details(self):"},{"line_number":60,"context_line":"        return jsonutils.loads(self.vif_details_json)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @vif_details.setter"},{"line_number":63,"context_line":"    def vif_details(self, vif_details_dict):"}],"source_content_type":"text/x-python","patch_set":29,"id":"5f7c97a3_bae917ac","line":60,"in_reply_to":"5f7c97a3_e9fa8675","updated":"2018-07-13 20:34:52.000000000","message":"From Miguel:\n\n(3:31:48 PM) mlavalle: mriedem: when building the port binding dictionary, we have to decide whether the binding comes in as an OVO or as a SQLalchemy object: https://review.openstack.org/#/c/414251/73/neutron/plugins/ml2/plugin.py@2007\n(3:33:08 PM) mlavalle: mriedem: for the latter, if vif_details is None or \u0027\u0027, we are going to return {}: https://github.com/openstack/neutron/blob/master/neutron/plugins/ml2/plugin.py#L609","commit_id":"df99b02efa8a7ff02fd921acb4a4acaee1a16d86"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"b1638931d062b9d05b726b308cb7b2c3a7f33a6a","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.vif_details_json \u003d jsonutils.dumps(vif_details_dict)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @property"},{"line_number":67,"context_line":"    def profile(self):"},{"line_number":68,"context_line":"        return jsonutils.loads(self.profile_json)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    @profile.setter"}],"source_content_type":"text/x-python","patch_set":29,"id":"5f7c97a3_414f3c8b","line":67,"updated":"2018-07-09 08:25:10.000000000","message":"Same here, we don\u0027t always have port profile set","commit_id":"df99b02efa8a7ff02fd921acb4a4acaee1a16d86"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"673a5f833140387e92116ccb63c454488bd818e5","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.vif_details_json \u003d jsonutils.dumps(vif_details_dict)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @property"},{"line_number":67,"context_line":"    def profile(self):"},{"line_number":68,"context_line":"        return jsonutils.loads(self.profile_json)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    @profile.setter"}],"source_content_type":"text/x-python","patch_set":29,"id":"5f7c97a3_09d102cd","line":67,"in_reply_to":"5f7c97a3_414f3c8b","updated":"2018-07-12 21:08:13.000000000","message":"It will be set when the object is created - it can\u0027t be None since the field isn\u0027t nullable, and it\u0027s a dict in neutron:\n\nhttp://git.openstack.org/cgit/openstack/neutron/tree/neutron/objects/ports.py#n72\n\nSo if anything it\u0027s going to be {}.\n\nI think we should blow up if it\u0027s set or accessed improperly rather than default to {}.","commit_id":"df99b02efa8a7ff02fd921acb4a4acaee1a16d86"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"08aabf705f486499f283303393d4fe46322a0a84","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        # and can be any number of types for the values, so we just store it"},{"line_number":42,"context_line":"        # as a serialized dict"},{"line_number":43,"context_line":"        \u0027vif_details_json\u0027: fields.StringField(),"},{"line_number":44,"context_line":"        # profile is in the same random dict of terrible boat as vif_details"},{"line_number":45,"context_line":"        # so it\u0027s stored as a serialized json string"},{"line_number":46,"context_line":"        \u0027profile_json\u0027: fields.StringField(),"},{"line_number":47,"context_line":"        \u0027host\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":30,"id":"5f7c97a3_4d073472","line":44,"range":{"start_line":44,"start_character":57,"end_line":44,"end_character":61},"updated":"2018-07-23 09:22:49.000000000","message":"bloat? :)","commit_id":"0a71a542e02e41ba514984ad49608168b5865696"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e35dcc43d4a30bd8bbe3801fc044bcb66c44c40d","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        # and can be any number of types for the values, so we just store it"},{"line_number":42,"context_line":"        # as a serialized dict"},{"line_number":43,"context_line":"        \u0027vif_details_json\u0027: fields.StringField(),"},{"line_number":44,"context_line":"        # profile is in the same random dict of terrible boat as vif_details"},{"line_number":45,"context_line":"        # so it\u0027s stored as a serialized json string"},{"line_number":46,"context_line":"        \u0027profile_json\u0027: fields.StringField(),"},{"line_number":47,"context_line":"        \u0027host\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":30,"id":"5f7c97a3_0f4926b7","line":44,"range":{"start_line":44,"start_character":57,"end_line":44,"end_character":61},"in_reply_to":"5f7c97a3_4d073472","updated":"2018-07-23 16:42:47.000000000","message":"Nope, \"boat\" is intentional, but you\u0027re the 2nd person to comment on this. It\u0027s a common phrase in America at least to say \"in the same boat\". In this case, the name of the boat is called the \"random dict of terrible\".","commit_id":"0a71a542e02e41ba514984ad49608168b5865696"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a132d9b8376e65bb3a1981ad50480f1c7aa8060d","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        # and can be any number of types for the values, so we just store it"},{"line_number":42,"context_line":"        # as a serialized dict"},{"line_number":43,"context_line":"        \u0027vif_details_json\u0027: fields.StringField(),"},{"line_number":44,"context_line":"        # profile is in the same random dict of terrible boat as vif_details"},{"line_number":45,"context_line":"        # so it\u0027s stored as a serialized json string"},{"line_number":46,"context_line":"        \u0027profile_json\u0027: fields.StringField(),"},{"line_number":47,"context_line":"        \u0027host\u0027: fields.StringField(),"},{"line_number":48,"context_line":"        # The source_vif attribute is a copy of the VIF network model"}],"source_content_type":"text/x-python","patch_set":30,"id":"5f7c97a3_ddc808a8","line":45,"range":{"start_line":44,"start_character":8,"end_line":45,"end_character":52},"updated":"2018-07-19 21:42:19.000000000","message":"the profile can also have any random garbage the end users cases to add as long as its valid json so its acutlly even less deterministic then vif_details so just storing it is definetly better then trying to assert something more strict here.","commit_id":"0a71a542e02e41ba514984ad49608168b5865696"}],"nova/tests/unit/objects/test_migrate_data.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"95645d494f74c531a124c8e0975182f2e52e93e2","unresolved":false,"context_lines":[{"line_number":268,"context_line":"            source_vif\u003dsource_vif)"},{"line_number":269,"context_line":"        obj \u003d migrate_data.LibvirtLiveMigrateData()"},{"line_number":270,"context_line":"        obj.vifs \u003d [vif_data]"},{"line_number":271,"context_line":"        primitive \u003d obj.obj_to_primitive(target_version\u003d\u00271.5\u0027)"},{"line_number":272,"context_line":"        self.assertNotIn(\u0027vifs\u0027, primitive)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"df7087c5_be6e21c7","line":271,"updated":"2018-03-19 15:21:09.000000000","message":"To execute this the way the RPC layer will (and avoid the fallback to the obj_relationships mapping), do this:\n\n from oslo_versionedobjects import base as ovo_base\n manifest \u003d ovo_base.obj_tree_get_versions(obj.obj_name())\n primitive \u003d obj.obj_to_primitive(target_version\u003d\u00271.5\u0027,\n                                  version_manifest\u003dmanifest)","commit_id":"a9eaf8437cffcbfd1662879312c2c0468526062e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4394cceb1570c63525a0edc2bc4510b52d032251","unresolved":false,"context_lines":[{"line_number":268,"context_line":"            source_vif\u003dsource_vif)"},{"line_number":269,"context_line":"        obj \u003d migrate_data.LibvirtLiveMigrateData()"},{"line_number":270,"context_line":"        obj.vifs \u003d [vif_data]"},{"line_number":271,"context_line":"        primitive \u003d obj.obj_to_primitive(target_version\u003d\u00271.5\u0027)"},{"line_number":272,"context_line":"        self.assertNotIn(\u0027vifs\u0027, primitive)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"df7087c5_14d92921","line":271,"in_reply_to":"df7087c5_be6e21c7","updated":"2018-03-19 19:13:31.000000000","message":"Thanks.","commit_id":"a9eaf8437cffcbfd1662879312c2c0468526062e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"95645d494f74c531a124c8e0975182f2e52e93e2","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        obj \u003d migrate_data.LibvirtLiveMigrateData()"},{"line_number":270,"context_line":"        obj.vifs \u003d [vif_data]"},{"line_number":271,"context_line":"        primitive \u003d obj.obj_to_primitive(target_version\u003d\u00271.5\u0027)"},{"line_number":272,"context_line":"        self.assertNotIn(\u0027vifs\u0027, primitive)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"class TestLibvirtLiveMigrateData(test_objects._LocalTest,"}],"source_content_type":"text/x-python","patch_set":10,"id":"df7087c5_de5af528","line":272,"updated":"2018-03-19 15:21:09.000000000","message":"This won\u0027t be right. You want:\n\n self.assertNotIn(\u0027vifs\u0027, primitive[\u0027nova_object.data\u0027])","commit_id":"a9eaf8437cffcbfd1662879312c2c0468526062e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ab951295b915745b339bfec80a0c079dcd7d437f","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        obj \u003d migrate_data.LibvirtLiveMigrateData()"},{"line_number":270,"context_line":"        obj.vifs \u003d [vif_data]"},{"line_number":271,"context_line":"        primitive \u003d obj.obj_to_primitive(target_version\u003d\u00271.5\u0027)"},{"line_number":272,"context_line":"        self.assertNotIn(\u0027vifs\u0027, primitive)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"class TestLibvirtLiveMigrateData(test_objects._LocalTest,"}],"source_content_type":"text/x-python","patch_set":10,"id":"df7087c5_77e2e703","line":272,"in_reply_to":"df7087c5_74cc2561","updated":"2018-03-19 19:48:04.000000000","message":"Yeah I guess so, it\u0027s kinda the problem with assertNotIn, really. Print one of these primitives and you\u0027ll see. At least one assertIn for a base attribute would be a good pattern-setting measure before a slew of assertNotIn calls.","commit_id":"a9eaf8437cffcbfd1662879312c2c0468526062e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4394cceb1570c63525a0edc2bc4510b52d032251","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        obj \u003d migrate_data.LibvirtLiveMigrateData()"},{"line_number":270,"context_line":"        obj.vifs \u003d [vif_data]"},{"line_number":271,"context_line":"        primitive \u003d obj.obj_to_primitive(target_version\u003d\u00271.5\u0027)"},{"line_number":272,"context_line":"        self.assertNotIn(\u0027vifs\u0027, primitive)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"class TestLibvirtLiveMigrateData(test_objects._LocalTest,"}],"source_content_type":"text/x-python","patch_set":10,"id":"df7087c5_74cc2561","line":272,"in_reply_to":"df7087c5_de5af528","updated":"2018-03-19 19:13:31.000000000","message":"OK, I assume all of the test_*obj_make_compatible tests above are also wrong then too?","commit_id":"a9eaf8437cffcbfd1662879312c2c0468526062e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4b26dcd912085a74bda14b41c2e7495fc108a9fb","unresolved":false,"context_lines":[{"line_number":274,"context_line":"            port_id\u003duuids.port_id,"},{"line_number":275,"context_line":"            vnic_type\u003dnetwork_model.VNIC_TYPE_NORMAL,"},{"line_number":276,"context_line":"            vif_type\u003dnetwork_model.VIF_TYPE_BRIDGE,"},{"line_number":277,"context_line":"            details\u003d{}, profile\u003d{}, host\u003d\u0027dest-host\u0027,"},{"line_number":278,"context_line":"            source_vif\u003dsource_vif)"},{"line_number":279,"context_line":"        obj \u003d migrate_data.LibvirtLiveMigrateData(block_migration\u003dFalse)"},{"line_number":280,"context_line":"        obj.vifs \u003d [vif_data]"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_6ce03698","line":277,"range":{"start_line":277,"start_character":12,"end_line":277,"end_character":19},"updated":"2018-06-25 16:21:25.000000000","message":"This should be vif_details.","commit_id":"10df8573e6bba8e2bd400ff06c11378182797195"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"b1638931d062b9d05b726b308cb7b2c3a7f33a6a","unresolved":false,"context_lines":[{"line_number":281,"context_line":"            active\u003dTrue,"},{"line_number":282,"context_line":"            profile\u003d{\u0027migrating_to\u0027: \u0027dest-host\u0027})"},{"line_number":283,"context_line":"        vif_details_dict \u003d {\u0027port_filter\u0027: True}"},{"line_number":284,"context_line":"        profile_dict \u003d {\u0027trusted\u0027: False}"},{"line_number":285,"context_line":"        vif_data \u003d objects.VIFMigrateData("},{"line_number":286,"context_line":"            port_id\u003duuids.port_id,"},{"line_number":287,"context_line":"            vnic_type\u003dnetwork_model.VNIC_TYPE_NORMAL,"}],"source_content_type":"text/x-python","patch_set":29,"id":"5f7c97a3_843a42c1","line":284,"updated":"2018-07-09 08:25:10.000000000","message":"We don\u0027t always have port profile. I\u0027m scary about the json error which could happen if we try to get attribute \u0027profile\u0027 when the value is an empty string.","commit_id":"df99b02efa8a7ff02fd921acb4a4acaee1a16d86"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"53c9336dd0e81004d3f2a9434265c4056cebdd81","unresolved":false,"context_lines":[{"line_number":281,"context_line":"            active\u003dTrue,"},{"line_number":282,"context_line":"            profile\u003d{\u0027migrating_to\u0027: \u0027dest-host\u0027})"},{"line_number":283,"context_line":"        vif_details_dict \u003d {\u0027port_filter\u0027: True}"},{"line_number":284,"context_line":"        profile_dict \u003d {\u0027trusted\u0027: False}"},{"line_number":285,"context_line":"        vif_data \u003d objects.VIFMigrateData("},{"line_number":286,"context_line":"            port_id\u003duuids.port_id,"},{"line_number":287,"context_line":"            vnic_type\u003dnetwork_model.VNIC_TYPE_NORMAL,"}],"source_content_type":"text/x-python","patch_set":29,"id":"5f7c97a3_6d9ad46f","line":284,"in_reply_to":"5f7c97a3_69f8b649","updated":"2018-07-16 06:56:15.000000000","message":"There is not always a value for port profile and I was not sure of the value returned. Thanks for the investigation you did with Neutron.","commit_id":"df99b02efa8a7ff02fd921acb4a4acaee1a16d86"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e34633aa40a2d2c881398c27e7f1eb8acbdf7dd","unresolved":false,"context_lines":[{"line_number":281,"context_line":"            active\u003dTrue,"},{"line_number":282,"context_line":"            profile\u003d{\u0027migrating_to\u0027: \u0027dest-host\u0027})"},{"line_number":283,"context_line":"        vif_details_dict \u003d {\u0027port_filter\u0027: True}"},{"line_number":284,"context_line":"        profile_dict \u003d {\u0027trusted\u0027: False}"},{"line_number":285,"context_line":"        vif_data \u003d objects.VIFMigrateData("},{"line_number":286,"context_line":"            port_id\u003duuids.port_id,"},{"line_number":287,"context_line":"            vnic_type\u003dnetwork_model.VNIC_TYPE_NORMAL,"}],"source_content_type":"text/x-python","patch_set":29,"id":"5f7c97a3_6894d541","line":284,"in_reply_to":"5f7c97a3_6d9ad46f","updated":"2018-07-17 16:24:03.000000000","message":"Yeah Miguel updated the neutron port binding API to make sure it defaults to {} if the object in neutron has None set:\n\nhttps://review.openstack.org/#/c/414251/73..74/neutron/plugins/ml2/plugin.py@a2011","commit_id":"df99b02efa8a7ff02fd921acb4a4acaee1a16d86"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"673a5f833140387e92116ccb63c454488bd818e5","unresolved":false,"context_lines":[{"line_number":281,"context_line":"            active\u003dTrue,"},{"line_number":282,"context_line":"            profile\u003d{\u0027migrating_to\u0027: \u0027dest-host\u0027})"},{"line_number":283,"context_line":"        vif_details_dict \u003d {\u0027port_filter\u0027: True}"},{"line_number":284,"context_line":"        profile_dict \u003d {\u0027trusted\u0027: False}"},{"line_number":285,"context_line":"        vif_data \u003d objects.VIFMigrateData("},{"line_number":286,"context_line":"            port_id\u003duuids.port_id,"},{"line_number":287,"context_line":"            vnic_type\u003dnetwork_model.VNIC_TYPE_NORMAL,"}],"source_content_type":"text/x-python","patch_set":29,"id":"5f7c97a3_69f8b649","line":284,"in_reply_to":"5f7c97a3_843a42c1","updated":"2018-07-12 21:08:13.000000000","message":"According to the port binding API in neutron, profile and vif_details will always be returned in that API for a port binding resource:\n\nhttps://review.openstack.org/#/c/414251/73/neutron/plugins/ml2/plugin.py@2007\n\nSo they\u0027ll always be in the response and shouldn\u0027t be None. Do you know of a specific vif type that will return None for profile or vif_details for a port binding?","commit_id":"df99b02efa8a7ff02fd921acb4a4acaee1a16d86"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b3915bce39ba72a6c56ef68c42e440f51e1631bf","unresolved":false,"context_lines":[{"line_number":290,"context_line":"            host\u003d\u0027dest-host\u0027, source_vif\u003dsource_vif)"},{"line_number":291,"context_line":"        # Make sure the vif_details and profile fields are converted and"},{"line_number":292,"context_line":"        # stored properly."},{"line_number":293,"context_line":"        self.assertEqual("},{"line_number":294,"context_line":"            jsonutils.dumps(vif_details_dict), vif_data.vif_details_json)"},{"line_number":295,"context_line":"        self.assertEqual("},{"line_number":296,"context_line":"            jsonutils.dumps(profile_dict), vif_data.profile_json)"},{"line_number":297,"context_line":"        self.assertDictEqual(vif_details_dict, vif_data.vif_details)"},{"line_number":298,"context_line":"        self.assertDictEqual(profile_dict, vif_data.profile)"},{"line_number":299,"context_line":"        obj \u003d migrate_data.LibvirtLiveMigrateData("}],"source_content_type":"text/x-python","patch_set":29,"id":"5f7c97a3_b29fbb4f","line":296,"range":{"start_line":293,"start_character":0,"end_line":296,"end_character":65},"updated":"2018-07-17 18:12:23.000000000","message":"Won\u0027t we have unpredictable dict ordering errors here? Should loads() the fields and assertDictEqual instead.","commit_id":"df99b02efa8a7ff02fd921acb4a4acaee1a16d86"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"269830ac4bf5193f53656269b0ed301e5e067374","unresolved":false,"context_lines":[{"line_number":290,"context_line":"            host\u003d\u0027dest-host\u0027, source_vif\u003dsource_vif)"},{"line_number":291,"context_line":"        # Make sure the vif_details and profile fields are converted and"},{"line_number":292,"context_line":"        # stored properly."},{"line_number":293,"context_line":"        self.assertEqual("},{"line_number":294,"context_line":"            jsonutils.dumps(vif_details_dict), vif_data.vif_details_json)"},{"line_number":295,"context_line":"        self.assertEqual("},{"line_number":296,"context_line":"            jsonutils.dumps(profile_dict), vif_data.profile_json)"},{"line_number":297,"context_line":"        self.assertDictEqual(vif_details_dict, vif_data.vif_details)"},{"line_number":298,"context_line":"        self.assertDictEqual(profile_dict, vif_data.profile)"},{"line_number":299,"context_line":"        obj \u003d migrate_data.LibvirtLiveMigrateData("}],"source_content_type":"text/x-python","patch_set":29,"id":"5f7c97a3_5b9c0ebe","line":296,"range":{"start_line":293,"start_character":0,"end_line":296,"end_character":65},"in_reply_to":"5f7c97a3_b29fbb4f","updated":"2018-07-19 13:48:18.000000000","message":"\u003e Should loads() the fields and assertDictEqual instead.\n\nAlso, that\u0027s basically what the assertions below are doing:\n\nself.assertDictEqual(vif_details_dict, vif_data.vif_details)\nself.assertDictEqual(profile_dict, vif_data.profile)\n\nvif_data.vif_details and vif_data.profile are loading the json.","commit_id":"df99b02efa8a7ff02fd921acb4a4acaee1a16d86"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6cca726081b8a70a75b14c01164890466ec0b8e8","unresolved":false,"context_lines":[{"line_number":290,"context_line":"            host\u003d\u0027dest-host\u0027, source_vif\u003dsource_vif)"},{"line_number":291,"context_line":"        # Make sure the vif_details and profile fields are converted and"},{"line_number":292,"context_line":"        # stored properly."},{"line_number":293,"context_line":"        self.assertEqual("},{"line_number":294,"context_line":"            jsonutils.dumps(vif_details_dict), vif_data.vif_details_json)"},{"line_number":295,"context_line":"        self.assertEqual("},{"line_number":296,"context_line":"            jsonutils.dumps(profile_dict), vif_data.profile_json)"},{"line_number":297,"context_line":"        self.assertDictEqual(vif_details_dict, vif_data.vif_details)"},{"line_number":298,"context_line":"        self.assertDictEqual(profile_dict, vif_data.profile)"},{"line_number":299,"context_line":"        obj \u003d migrate_data.LibvirtLiveMigrateData("}],"source_content_type":"text/x-python","patch_set":29,"id":"5f7c97a3_c0ba866f","line":296,"range":{"start_line":293,"start_character":0,"end_line":296,"end_character":65},"in_reply_to":"5f7c97a3_b29fbb4f","updated":"2018-07-18 15:06:38.000000000","message":"No that won\u0027t happen because the dicts only have a single key.","commit_id":"df99b02efa8a7ff02fd921acb4a4acaee1a16d86"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"687ca2bc3b1826d14ab4bc25c966fc1cfcfb701f","unresolved":false,"context_lines":[{"line_number":290,"context_line":"            host\u003d\u0027dest-host\u0027, source_vif\u003dsource_vif)"},{"line_number":291,"context_line":"        # Make sure the vif_details and profile fields are converted and"},{"line_number":292,"context_line":"        # stored properly."},{"line_number":293,"context_line":"        self.assertEqual("},{"line_number":294,"context_line":"            jsonutils.dumps(vif_details_dict), vif_data.vif_details_json)"},{"line_number":295,"context_line":"        self.assertEqual("},{"line_number":296,"context_line":"            jsonutils.dumps(profile_dict), vif_data.profile_json)"},{"line_number":297,"context_line":"        self.assertDictEqual(vif_details_dict, vif_data.vif_details)"},{"line_number":298,"context_line":"        self.assertDictEqual(profile_dict, vif_data.profile)"},{"line_number":299,"context_line":"        obj \u003d migrate_data.LibvirtLiveMigrateData("}],"source_content_type":"text/x-python","patch_set":29,"id":"5f7c97a3_a043ca6a","line":296,"range":{"start_line":293,"start_character":0,"end_line":296,"end_character":65},"in_reply_to":"5f7c97a3_c0ba866f","updated":"2018-07-18 15:10:17.000000000","message":"For now...","commit_id":"df99b02efa8a7ff02fd921acb4a4acaee1a16d86"}]}
