)]}'
{"nova/compute/manager.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6f50197cd26687d4b5ea513f2fe5f8bfd30b2bbe","unresolved":false,"context_lines":[{"line_number":1311,"context_line":"                      instance_uuid\u003dinstance_uuid)"},{"line_number":1312,"context_line":"            return"},{"line_number":1313,"context_line":""},{"line_number":1314,"context_line":"        if not request_spec:"},{"line_number":1315,"context_line":"            LOG.debug(\"No request spec, will not reschedule\","},{"line_number":1316,"context_line":"                      instance_uuid\u003dinstance_uuid)"},{"line_number":1317,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_da674a24","side":"PARENT","line":1314,"updated":"2018-07-12 23:22:14.000000000","message":"Maybe this should be left and the check in _reschedule_resize_or_reraise should be removed - or just remove both because it shouldn\u0027t happen, conductor is always passing a request spec.","commit_id":"536e5fa57f72f71217fd9f2160df0284a76102e1"}],"nova/compute/rpcapi.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3edf130b99bd8cb27efaa75d0973d363814fa6bd","unresolved":false,"context_lines":[{"line_number":733,"context_line":"        # TODO(mriedem): We should pass the ImageMeta object through to the"},{"line_number":734,"context_line":"        # compute but that also requires plumbing changes through the resize"},{"line_number":735,"context_line":"        # flow for other methods like resize_instance and finish_resize."},{"line_number":736,"context_line":"        image_p \u003d objects_base.obj_to_primitive(image)"},{"line_number":737,"context_line":"        msg_args \u003d {\u0027instance\u0027: instance,"},{"line_number":738,"context_line":"                    \u0027instance_type\u0027: instance_type,"},{"line_number":739,"context_line":"                    \u0027image\u0027: image_p,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_1db1e290","line":736,"updated":"2018-12-19 10:55:58.000000000","message":"I think this is the change that leads to the serialization error not the addition of the request_spec.\n\njsonutils.to_primitive:\n\n     ImageMeta(checksum\u003d\u003c?\u003e,container_format\u003d\u0027raw\u0027,created_at\u003d2011-01-01T01:02:03Z,direct_url\u003d\u003c?\u003e,disk_format\u003d\u0027raw\u0027,id\u003d155d900f-4e14-4e4c-a73d-069cbf4541e6,min_disk\u003d0,min_ram\u003d0,name\u003d\u0027fakeimage123456\u0027,owner\u003d\u003c?\u003e,properties\u003dImageMetaProps,protected\u003dFalse,size\u003d25165824,status\u003d\u0027active\u0027,tags\u003d[\u0027tag1\u0027,\u0027tag2\u0027],updated_at\u003d2011-01-01T01:02:03Z,virtual_size\u003d\u003c?\u003e,visibility\u003d\u0027public\u0027)\n\n\nobjects_base.obj_to_primitive:\n\n     {\u0027container_format\u0027: u\u0027raw\u0027,\n      \u0027created_at\u0027: datetime.datetime(2011, 1, 1, 1, 2, 3, tzinfo\u003d\u003ciso8601.Utc\u003e),\n      \u0027disk_format\u0027: u\u0027raw\u0027,\n      \u0027id\u0027: u\u0027155d900f-4e14-4e4c-a73d-069cbf4541e6\u0027,\n      \u0027min_disk\u0027: 0,\n      \u0027min_ram\u0027: 0,\n      \u0027name\u0027: u\u0027fakeimage123456\u0027,\n      \u0027properties\u0027: {\u0027hw_architecture\u0027: u\u0027x86_64\u0027},\n      \u0027protected\u0027: False,\n      \u0027size\u0027: 25165824,\n      \u0027status\u0027: u\u0027active\u0027,\n      \u0027tags\u0027: [u\u0027tag1\u0027, u\u0027tag2\u0027],\n      \u0027updated_at\u0027: datetime.datetime(2011, 1, 1, 1, 2, 3, tzinfo\u003d\u003ciso8601.Utc\u003e),\n      \u0027visibility\u0027: u\u0027public\u0027}","commit_id":"d21a997c3eaa0b4ab42105b05f44e22b7d32a8e1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c7fed6a334c6fb8d91995c7027e900e55f66f612","unresolved":false,"context_lines":[{"line_number":733,"context_line":"        # TODO(mriedem): We should pass the ImageMeta object through to the"},{"line_number":734,"context_line":"        # compute but that also requires plumbing changes through the resize"},{"line_number":735,"context_line":"        # flow for other methods like resize_instance and finish_resize."},{"line_number":736,"context_line":"        image_p \u003d objects_base.obj_to_primitive(image)"},{"line_number":737,"context_line":"        msg_args \u003d {\u0027instance\u0027: instance,"},{"line_number":738,"context_line":"                    \u0027instance_type\u0027: instance_type,"},{"line_number":739,"context_line":"                    \u0027image\u0027: image_p,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_36e87b7c","line":736,"in_reply_to":"3f79a3b5_1db1e290","updated":"2018-12-19 13:30:48.000000000","message":"Hmm, OK and we end up with datetime objects rather than strings. I used this because we used to call this to convert the RequestSpec.image_meta to a \u0027legacy dict\u0027:\n\nhttps://github.com/openstack/nova/blob/da17e0ed8a9b9ddc79b6d2004e6fb941c6163fbf/nova/objects/request_spec.py#L329\n\nBut I guess that was masked later when conductor did this:\n\nhttps://review.openstack.org/#/c/582417/6/nova/conductor/tasks/migrate.py@a292\n\nlegacy_spec \u003d jsonutils.loads(jsonutils.dumps(legacy_spec))\n\nI guess the problem with obj_to_primitive is it doesn\u0027t convert datetimes:\n\nhttps://github.com/openstack/nova/blob/da17e0ed8a9b9ddc79b6d2004e6fb941c6163fbf/nova/objects/base.py#L268\n\nI\u0027ll further run this through jsonutils.to_primitive and see if that fixes it, then we\u0027ll just have the TODO to fix up by passing the ImageMeta object to compute in it\u0027s Object form and let NovaObjectSerializer deal with it as normal.","commit_id":"d21a997c3eaa0b4ab42105b05f44e22b7d32a8e1"}],"nova/conductor/manager.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3c43ce1d2a39a2a83d3fef42c70e1cf86b993a2f","unresolved":false,"context_lines":[{"line_number":798,"context_line":"            try:"},{"line_number":799,"context_line":"                with compute_utils.EventReporter(context, \u0027schedule_instances\u0027,"},{"line_number":800,"context_line":"                                                 self.host, instance.uuid):"},{"line_number":801,"context_line":"                    if not request_spec:"},{"line_number":802,"context_line":"                        # NOTE(sbauza): We were unable to find an original"},{"line_number":803,"context_line":"                        # RequestSpec object - probably because the instance is"},{"line_number":804,"context_line":"                        # old. We need to mock that the old way"},{"line_number":805,"context_line":"                        filter_properties \u003d {}"},{"line_number":806,"context_line":"                        request_spec \u003d scheduler_utils.build_request_spec("},{"line_number":807,"context_line":"                            image, [instance])"},{"line_number":808,"context_line":"                        request_spec \u003d objects.RequestSpec.from_primitives("},{"line_number":809,"context_line":"                            context, request_spec, filter_properties)"},{"line_number":810,"context_line":"                    else:"},{"line_number":811,"context_line":"                        # NOTE(sbauza): Force_hosts/nodes needs to be reset"},{"line_number":812,"context_line":"                        # if we want to make sure that the next destination"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_60f41b57","line":809,"range":{"start_line":801,"start_character":20,"end_line":809,"end_character":69},"updated":"2018-12-17 17:02:26.000000000","message":"Why don\u0027t we remove this as well (in a separate change)?","commit_id":"48c5d9e9a3a772fe476e125b17abcb7ad3edb5a6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"997495ae4e83e1d83809e3a185f07bddb50cf0b9","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        # it only provides filter_properties legacy dict back to the"},{"line_number":303,"context_line":"        # conductor with no RequestSpec part of the payload for \u003cStein"},{"line_number":304,"context_line":"        # computes."},{"line_number":305,"context_line":"        # TODO(mriedem): We should be able to remove this in Train when we"},{"line_number":306,"context_line":"        # only support \u003e\u003dStein computes and request_spec is passed back to"},{"line_number":307,"context_line":"        # conductor on reschedule."},{"line_number":308,"context_line":"        if not request_spec:"},{"line_number":309,"context_line":"            # Make sure we hydrate a new RequestSpec object with the new flavor"}],"source_content_type":"text/x-python","patch_set":7,"id":"5faad753_2d851fae","line":306,"range":{"start_line":305,"start_character":25,"end_line":306,"end_character":39},"updated":"2019-09-06 19:45:14.000000000","message":"This is technically incorrect, see https://review.opendev.org/#/c/680762/.","commit_id":"fb94612294abc0fcf16a01fe1fb8e70260165ed2"}],"nova/conductor/tasks/migrate.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6f50197cd26687d4b5ea513f2fe5f8bfd30b2bbe","unresolved":false,"context_lines":[{"line_number":284,"context_line":"            availability_zones.get_host_availability_zone("},{"line_number":285,"context_line":"                self.context, host))"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        # FIXME(sbauza): Serialize/Unserialize the legacy dict because of"},{"line_number":288,"context_line":"        # oslo.messaging #1529084 to transform datetime values into strings."},{"line_number":289,"context_line":"        # tl;dr: datetimes in dicts are not accepted as correct values by the"},{"line_number":290,"context_line":"        # rpc fake driver."}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_da40aa62","side":"PARENT","line":287,"updated":"2018-07-12 23:22:14.000000000","message":"This can\u0027t be a problem anymore because we pass a full RequestSpec object to build_and_run_instance.","commit_id":"536e5fa57f72f71217fd9f2160df0284a76102e1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a63bc500c17067880dde6f6b6536a48cb6528bca","unresolved":false,"context_lines":[{"line_number":284,"context_line":"            availability_zones.get_host_availability_zone("},{"line_number":285,"context_line":"                self.context, host))"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        # FIXME(sbauza): Serialize/Unserialize the legacy dict because of"},{"line_number":288,"context_line":"        # oslo.messaging #1529084 to transform datetime values into strings."},{"line_number":289,"context_line":"        # tl;dr: datetimes in dicts are not accepted as correct values by the"},{"line_number":290,"context_line":"        # rpc fake driver."}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_7848eeb2","side":"PARENT","line":287,"in_reply_to":"5f7c97a3_da40aa62","updated":"2018-10-26 15:25:43.000000000","message":"Hmm, apparently this is still an issue:\n\n    b\u00272018-10-26 10:19:26,115 ERROR [oslo_messaging.rpc.server] Exception during message handling\u0027\n    b\u0027Traceback (most recent call last):\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py35/lib/python3.5/site-packages/oslo_messaging/rpc/server.py\", line 166, in _process_incoming\u0027\n    b\u0027    res \u003d self.dispatcher.dispatch(message)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py35/lib/python3.5/site-packages/oslo_messaging/rpc/dispatcher.py\", line 265, in dispatch\u0027\n    b\u0027    return self._do_dispatch(endpoint, method, ctxt, args)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py35/lib/python3.5/site-packages/oslo_messaging/rpc/dispatcher.py\", line 194, in _do_dispatch\u0027\n    b\u0027    result \u003d func(ctxt, **new_args)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py35/lib/python3.5/site-packages/oslo_messaging/rpc/server.py\", line 229, in inner\u0027\n    b\u0027    return func(*args, **kwargs)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/conductor/manager.py\", line 88, in wrapper\u0027\n    b\u0027    return fn(self, context, *args, **kwargs)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/compute/utils.py\", line 1157, in decorated_function\u0027\n    b\u0027    return function(self, context, *args, **kwargs)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/conductor/manager.py\", line 292, in migrate_server\u0027\n    b\u0027    host_list)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/conductor/manager.py\", line 356, in _cold_migrate\u0027\n    b\u0027    updates, ex, request_spec)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py35/lib/python3.5/site-packages/oslo_utils/excutils.py\", line 220, in __exit__\u0027\n    b\u0027    self.force_reraise()\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py35/lib/python3.5/site-packages/oslo_utils/excutils.py\", line 196, in force_reraise\u0027\n    b\u0027    six.reraise(self.type_, self.value, self.tb)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py35/lib/python3.5/site-packages/six.py\", line 693, in reraise\u0027\n    b\u0027    raise value\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/conductor/manager.py\", line 325, in _cold_migrate\u0027\n    b\u0027    task.execute()\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/conductor/tasks/base.py\", line 27, in wrap\u0027\n    b\u0027    self.rollback()\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py35/lib/python3.5/site-packages/oslo_utils/excutils.py\", line 220, in __exit__\u0027\n    b\u0027    self.force_reraise()\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py35/lib/python3.5/site-packages/oslo_utils/excutils.py\", line 196, in force_reraise\u0027\n    b\u0027    six.reraise(self.type_, self.value, self.tb)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py35/lib/python3.5/site-packages/six.py\", line 693, in reraise\u0027\n    b\u0027    raise value\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/conductor/tasks/base.py\", line 24, in wrap\u0027\n    b\u0027    return original(self)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/conductor/tasks/base.py\", line 42, in execute\u0027\n    b\u0027    return self._execute()\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/conductor/tasks/migrate.py\", line 284, in _execute\u0027\n    b\u0027    host_list\u003dself.host_list)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/compute/rpcapi.py\", line 741, in prep_resize\u0027\n    b\"    cctxt.cast(ctxt, \u0027prep_resize\u0027, **msg_args)\"\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py35/lib/python3.5/site-packages/oslo_messaging/rpc/client.py\", line 154, in cast\u0027\n    b\u0027    self.transport._send(self.target, msg_ctxt, msg, retry\u003dself.retry)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py35/lib/python3.5/site-packages/oslo_messaging/transport.py\", line 128, in _send\u0027\n    b\u0027    retry\u003dretry)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py35/lib/python3.5/site-packages/oslo_messaging/_drivers/impl_fake.py\", line 222, in send\u0027\n    b\u0027    return self._send(target, ctxt, message, wait_for_reply, timeout)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py35/lib/python3.5/site-packages/oslo_messaging/_drivers/impl_fake.py\", line 192, in _send\u0027\n    b\u0027    self._check_serialize(message)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py35/lib/python3.5/site-packages/oslo_messaging/_drivers/impl_fake.py\", line 189, in _check_serialize\u0027\n    b\u0027    json.dumps(message)\u0027\n    b\u0027  File \"/usr/lib/python3.5/json/__init__.py\", line 230, in dumps\u0027\n    b\u0027    return _default_encoder.encode(obj)\u0027\n    b\u0027  File \"/usr/lib/python3.5/json/encoder.py\", line 198, in encode\u0027\n    b\u0027    chunks \u003d self.iterencode(o, _one_shot\u003dTrue)\u0027\n    b\u0027  File \"/usr/lib/python3.5/json/encoder.py\", line 256, in iterencode\u0027\n    b\u0027    return _iterencode(o, 0)\u0027\n    b\u0027  File \"/usr/lib/python3.5/json/encoder.py\", line 179, in default\u0027\n    b\u0027    raise TypeError(repr(o) + \" is not JSON serializable\")\u0027\n    b\u0027TypeError: datetime.datetime(2011, 1, 1, 1, 2, 3, tzinfo\u003ddatetime.timezone.utc) is not JSON serializable\u0027","commit_id":"536e5fa57f72f71217fd9f2160df0284a76102e1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b74751206239e9ca3a672202d31b5917b41b71c4","unresolved":false,"context_lines":[{"line_number":288,"context_line":"                  self.host_list, instance\u003dself.instance)"},{"line_number":289,"context_line":"        # RPC cast to the destination host to start the migration process."},{"line_number":290,"context_line":"        self.compute_rpcapi.prep_resize("},{"line_number":291,"context_line":"            self.context, self.instance, self.request_spec.image,"},{"line_number":292,"context_line":"            self.flavor, host, migration,"},{"line_number":293,"context_line":"            request_spec\u003dself.request_spec, filter_properties\u003dlegacy_props,"},{"line_number":294,"context_line":"            node\u003dnode, clean_shutdown\u003dself.clean_shutdown,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_201dec0f","line":291,"range":{"start_line":291,"start_character":41,"end_line":291,"end_character":64},"updated":"2018-07-13 02:00:53.000000000","message":"Apparently this causes all sorts of wonkiness:\n\nhttp://logs.openstack.org/17/582417/1/check/nova-tox-functional/5bcc5aa/testr_results.html.gz","commit_id":"24f27c9a465bd73cd8934d4aa65d1ba64d85b82e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cd072401ff270d066d83c37be495cb3ebc276d82","unresolved":false,"context_lines":[{"line_number":288,"context_line":"                  self.host_list, instance\u003dself.instance)"},{"line_number":289,"context_line":"        # RPC cast to the destination host to start the migration process."},{"line_number":290,"context_line":"        self.compute_rpcapi.prep_resize("},{"line_number":291,"context_line":"            self.context, self.instance, self.request_spec.image,"},{"line_number":292,"context_line":"            self.flavor, host, migration,"},{"line_number":293,"context_line":"            request_spec\u003dself.request_spec, filter_properties\u003dlegacy_props,"},{"line_number":294,"context_line":"            node\u003dnode, clean_shutdown\u003dself.clean_shutdown,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_c0baf8de","line":291,"range":{"start_line":291,"start_character":41,"end_line":291,"end_character":64},"in_reply_to":"5f7c97a3_201dec0f","updated":"2018-07-13 02:03:59.000000000","message":"Ah OK so we\u0027d need to bump the compute rpc api version to signal that we can pass an ImageMeta object to prep_resize and if not, we have to backlevel it to a primitive for older computes.","commit_id":"24f27c9a465bd73cd8934d4aa65d1ba64d85b82e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0c69d94add35078f30dd2b2393cfa067fbbe1f7c","unresolved":false,"context_lines":[{"line_number":288,"context_line":"                  self.host_list, instance\u003dself.instance)"},{"line_number":289,"context_line":"        # RPC cast to the destination host to start the migration process."},{"line_number":290,"context_line":"        self.compute_rpcapi.prep_resize("},{"line_number":291,"context_line":"            self.context, self.instance, self.request_spec.image,"},{"line_number":292,"context_line":"            self.flavor, host, migration,"},{"line_number":293,"context_line":"            request_spec\u003dself.request_spec, filter_properties\u003dlegacy_props,"},{"line_number":294,"context_line":"            node\u003dnode, clean_shutdown\u003dself.clean_shutdown,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_183d3a8c","line":291,"range":{"start_line":291,"start_character":41,"end_line":291,"end_character":64},"in_reply_to":"5f7c97a3_c0baf8de","updated":"2018-10-26 14:03:16.000000000","message":"Actually I don\u0027t think the ImageMeta is a problem because the prep_resize rpc api method converts it to a primitive anyway.","commit_id":"24f27c9a465bd73cd8934d4aa65d1ba64d85b82e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1630c50c850b247ea0b647eacbffcdb0e4dd91c8","unresolved":false,"context_lines":[{"line_number":289,"context_line":"                  self.host_list, instance\u003dself.instance)"},{"line_number":290,"context_line":"        # RPC cast to the destination host to start the migration process."},{"line_number":291,"context_line":"        self.compute_rpcapi.prep_resize("},{"line_number":292,"context_line":"            # NOTE(mriedem): Using request_spec.image here is potentially"},{"line_number":293,"context_line":"            # dangerous if it is not kept up to date (i.e. rebuild/unshelve);"},{"line_number":294,"context_line":"            # seems like the sane thing to do would be to pass the current"},{"line_number":295,"context_line":"            # instance.image_meta since that is what MoveClaim will use for"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_1d7d53c2","line":292,"updated":"2018-12-19 22:44:32.000000000","message":"Maybe I should remove this note, but I noticed this issue while working on this code.","commit_id":"fb94612294abc0fcf16a01fe1fb8e70260165ed2"}]}
