)]}'
{"nova/compute/claims.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"847b55ade3b95cd907957d41a96e23083f562c46","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        # If we are passed a SchedulerLimits object, convert it to the dict"},{"line_number":94,"context_line":"        # format, which all the called methods expect."},{"line_number":95,"context_line":"        if isinstance(limits, objects.SchedulerLimits):"},{"line_number":96,"context_line":"            limits \u003d limits.to_dict()"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        # Check claim at constructor to avoid mess code"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_14191384","line":95,"updated":"2017-12-04 20:30:00.000000000","message":"I\u0027m thinking this shouldn\u0027t be happening in this patch. This should be controlled in conductor so that we\u0027re not sending SchedulerLimits objects to the compute, especially if you\u0027re not bumping the service version of the compute and checking that in conductor. For example, any Pike computes that we send limits to unconverted will blow up because they won\u0027t have this code.","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"312c1cafce961c018b64ef5682693c3e19930f64","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        resources required to execute the claim."},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        :param resources: available local compute node resources"},{"line_number":135,"context_line":"        :param limits: Dict of oversubscription limits for memory, disk, and"},{"line_number":136,"context_line":"                       CPUs."},{"line_number":137,"context_line":"        :returns: Return true if resources are available to claim."},{"line_number":138,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"df87a7cf_783629e9","line":135,"updated":"2017-12-06 02:10:18.000000000","message":"nit: I\u0027d omit this in this change until you actually need to change anything in this code - clutters up the review otherwise.","commit_id":"544f50c34517355f1d530dd5a6d70f8d9f367c26"}],"nova/compute/manager.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"847b55ade3b95cd907957d41a96e23083f562c46","unresolved":false,"context_lines":[{"line_number":1741,"context_line":"                     security_groups\u003dNone, block_device_mapping\u003dNone,"},{"line_number":1742,"context_line":"                     node\u003dNone, limits\u003dNone):"},{"line_number":1743,"context_line":""},{"line_number":1744,"context_line":"        # If we are passed a SchedulerLimits object, convert it to the dict"},{"line_number":1745,"context_line":"        # format, which all the called methods expect."},{"line_number":1746,"context_line":"        if isinstance(limits, objects.SchedulerLimits):"},{"line_number":1747,"context_line":"            limits \u003d limits.to_dict()"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_74073f1e","line":1744,"updated":"2017-12-04 20:30:00.000000000","message":"You\u0027re already doing this in the compute rpcapi client so I\u0027m not sure why it\u0027s needed here.","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"847b55ade3b95cd907957d41a96e23083f562c46","unresolved":false,"context_lines":[{"line_number":2829,"context_line":"                       that information."},{"line_number":2830,"context_line":"        \"\"\""},{"line_number":2831,"context_line":"        context \u003d context.elevated()"},{"line_number":2832,"context_line":"        # If we are passed a SchedulerLimits object, convert it to the dict"},{"line_number":2833,"context_line":"        # format, which all the called methods expect."},{"line_number":2834,"context_line":"        if isinstance(limits, objects.SchedulerLimits):"},{"line_number":2835,"context_line":"            limits \u003d limits.to_dict()"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_773501da","line":2832,"updated":"2017-12-04 20:30:00.000000000","message":"same - this wouldn\u0027t happen because the compute rpcapi client is converting it to a dict before we get here.","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"847b55ade3b95cd907957d41a96e23083f562c46","unresolved":false,"context_lines":[{"line_number":4002,"context_line":"        instance.save()"},{"line_number":4003,"context_line":""},{"line_number":4004,"context_line":"        limits \u003d filter_properties.get(\u0027limits\u0027, {})"},{"line_number":4005,"context_line":"        # If we are passed a SchedulerLimits object, convert it to the dict"},{"line_number":4006,"context_line":"        # format, which all the called methods expect."},{"line_number":4007,"context_line":"        if isinstance(limits, objects.SchedulerLimits):"},{"line_number":4008,"context_line":"            limits \u003d limits.to_dict()"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_d73dedbb","line":4005,"updated":"2017-12-04 20:30:00.000000000","message":"This should be handled in conductor (or compute rpcapi client as you are for the other methods).","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"312c1cafce961c018b64ef5682693c3e19930f64","unresolved":false,"context_lines":[{"line_number":2819,"context_line":"        :param scheduled_node: A node of the host chosen by the scheduler. If a"},{"line_number":2820,"context_line":"                               host was specified by the user, this will be"},{"line_number":2821,"context_line":"                               None"},{"line_number":2822,"context_line":"        :param limits: A dict of oversubscription limits for memory, disk, and"},{"line_number":2823,"context_line":"                       CPUs."},{"line_number":2824,"context_line":"        \"\"\""},{"line_number":2825,"context_line":"        context \u003d context.elevated()"}],"source_content_type":"text/x-python","patch_set":18,"id":"df87a7cf_9831adef","line":2822,"updated":"2017-12-06 02:10:18.000000000","message":"same - unnecessary change in this patch","commit_id":"544f50c34517355f1d530dd5a6d70f8d9f367c26"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc3006eb9b1dbb01f63748af9bffa6e5b1404662","unresolved":false,"context_lines":[{"line_number":4013,"context_line":"        instance.save()"},{"line_number":4014,"context_line":""},{"line_number":4015,"context_line":"        limits \u003d filter_properties.get(\u0027limits\u0027, {})"},{"line_number":4016,"context_line":"        # If we are passed a SchedulerLimits object, convert it to the dict"},{"line_number":4017,"context_line":"        # format, which all the called methods expect."},{"line_number":4018,"context_line":"        if isinstance(limits, objects.SchedulerLimits):"},{"line_number":4019,"context_line":"            limits \u003d limits.to_dict()"},{"line_number":4020,"context_line":"        rt \u003d self._get_resource_tracker()"},{"line_number":4021,"context_line":"        with rt.resize_claim(context, instance, instance_type, node,"},{"line_number":4022,"context_line":"                             migration, image_meta\u003dimage,"}],"source_content_type":"text/x-python","patch_set":22,"id":"df87a7cf_943c9f2f","line":4019,"range":{"start_line":4016,"start_character":8,"end_line":4019,"end_character":37},"updated":"2017-12-11 16:24:46.000000000","message":"We should do this in the compute rpcapi client like you had in an older patch set:\n\nhttps://review.openstack.org/#/c/516707/17/nova/compute/rpcapi.py","commit_id":"f982e4a9cb1923144eaa58354c567818a700e311"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc3006eb9b1dbb01f63748af9bffa6e5b1404662","unresolved":false,"context_lines":[{"line_number":4794,"context_line":""},{"line_number":4795,"context_line":"        rt \u003d self._get_resource_tracker()"},{"line_number":4796,"context_line":"        limits \u003d filter_properties.get(\u0027limits\u0027, {})"},{"line_number":4797,"context_line":"        # If we are passed a SchedulerLimits object, convert it to the dict"},{"line_number":4798,"context_line":"        # format, which all the called methods expect."},{"line_number":4799,"context_line":"        if isinstance(limits, objects.SchedulerLimits):"},{"line_number":4800,"context_line":"            limits \u003d limits.to_dict()"}],"source_content_type":"text/x-python","patch_set":22,"id":"df87a7cf_3447d3be","line":4797,"updated":"2017-12-11 16:24:46.000000000","message":"same, handle it in the compute rpcapi client:\n\nhttps://review.openstack.org/#/c/516707/17/nova/compute/rpcapi.py","commit_id":"f982e4a9cb1923144eaa58354c567818a700e311"}],"nova/compute/resource_tracker.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"847b55ade3b95cd907957d41a96e23083f562c46","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        :param instance: instance to reserve resources for."},{"line_number":167,"context_line":"        :type instance: nova.objects.instance.Instance object"},{"line_number":168,"context_line":"        :param nodename: The Ironic nodename selected by the scheduler"},{"line_number":169,"context_line":"        :param limits: Either a dict of oversubscription limits for memory,"},{"line_number":170,"context_line":"                       disk, and CPUs, or a SchedulerLimits object containing"},{"line_number":171,"context_line":"                       that information."},{"line_number":172,"context_line":"        :returns: A Claim ticket representing the reserved resources.  It can"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_f76fd1c2","line":169,"updated":"2017-12-04 20:30:00.000000000","message":"This should be a dict in this patch. Same as in the claims module, we should be passing a dict down from conductor until the compute is upgraded to handle that, and we\u0027re bumping compute rpcapi service versions to handle that.","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"847b55ade3b95cd907957d41a96e23083f562c46","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        \"\"\""},{"line_number":284,"context_line":"        image_meta \u003d image_meta or {}"},{"line_number":285,"context_line":"        # If we are passed a SchedulerLimits object, convert it to the dict"},{"line_number":286,"context_line":"        # format, which all the called methods expect."},{"line_number":287,"context_line":"        if isinstance(limits, objects.SchedulerLimits):"},{"line_number":288,"context_line":"            limits \u003d limits.to_dict()"},{"line_number":289,"context_line":"        if migration:"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_17759595","line":286,"updated":"2017-12-04 20:30:00.000000000","message":"same as above","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"}],"nova/compute/rpcapi.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"847b55ade3b95cd907957d41a96e23083f562c46","unresolved":false,"context_lines":[{"line_number":757,"context_line":"    # RPC API."},{"line_number":758,"context_line":"    def prep_resize(self, ctxt, instance, image, instance_type, host,"},{"line_number":759,"context_line":"                    migration, reservations\u003dNone, request_spec\u003dNone,"},{"line_number":760,"context_line":"                    filter_properties\u003dNone, node\u003dNone,"},{"line_number":761,"context_line":"                    clean_shutdown\u003dTrue):"},{"line_number":762,"context_line":"        image_p \u003d jsonutils.to_primitive(image)"},{"line_number":763,"context_line":"        msg_args \u003d {\u0027instance\u0027: instance,"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_942be392","line":760,"range":{"start_line":760,"start_character":20,"end_line":760,"end_character":37},"updated":"2017-12-04 20:30:00.000000000","message":"Conductor is passing limits through filter_properties, but you\u0027re not handling the SchedulerLimits here like in the other methods, but eventually prep_resize on the compute will pull those limits out and perform a move claim using them:\n\nhttps://github.com/openstack/nova/blob/2c4a1a390ad07d76b0a29b4d47173c7d8a80ec98/nova/compute/manager.py#L3994","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"847b55ade3b95cd907957d41a96e23083f562c46","unresolved":false,"context_lines":[{"line_number":799,"context_line":""},{"line_number":800,"context_line":"        # If we are passed a SchedulerLimits object, convert it to the dict"},{"line_number":801,"context_line":"        # format, which all the called methods expect."},{"line_number":802,"context_line":"        if isinstance(limits, objects.SchedulerLimits):"},{"line_number":803,"context_line":"            limits \u003d limits.to_dict()"},{"line_number":804,"context_line":""},{"line_number":805,"context_line":"        # NOTE(danms): kwargs is only here for cells compatibility, don\u0027t"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_97b52534","line":802,"updated":"2017-12-04 20:30:00.000000000","message":"We should handle these conversions in a separate patch IMO. These should go along with a compute service rpc api version bump, so that we can check if we can send a version with the object and if not, we convert it to a dict. Think of it similar to the version dance we do with sending Flavor and Migration objects down to compute.","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9088c73773fa298c2ebf5566917e564b4c04bebc","unresolved":false,"context_lines":[{"line_number":757,"context_line":"    # RPC API."},{"line_number":758,"context_line":"    def prep_resize(self, ctxt, instance, image, instance_type, host,"},{"line_number":759,"context_line":"                    migration, reservations\u003dNone, request_spec\u003dNone,"},{"line_number":760,"context_line":"                    filter_properties\u003dNone, node\u003dNone,"},{"line_number":761,"context_line":"                    clean_shutdown\u003dTrue):"},{"line_number":762,"context_line":"        image_p \u003d jsonutils.to_primitive(image)"},{"line_number":763,"context_line":"        msg_args \u003d {\u0027instance\u0027: instance,"}],"source_content_type":"text/x-python","patch_set":23,"id":"df87a7cf_df947739","line":760,"range":{"start_line":760,"start_character":20,"end_line":760,"end_character":37},"updated":"2017-12-11 22:08:39.000000000","message":"There is a limits dict in this thing isn\u0027t there? Or is that being converted back to a dict in the scheduler utils?\n\n\u003clater\u003e\n\nYes, this is handling it for prep_resize and unshelve_instance:\n\nhttps://review.openstack.org/#/c/516707/23/nova/scheduler/utils.py\n\nNote that if/when we do want to pass the SchedulerLimits object down to compute, that is going to be confusing because populate_filter_properties is handling it for us and we won\u0027t get an object in the filter_properties here, but arguably as long as we are going to be passing filter_properties, we should always assume it\u0027s full of primitives. If we want objects down in the compute, we should probably either get them from the request_spec or as separate individual parameters.","commit_id":"07cbf39bec4114e0f17f91bc00239b821ddb3fc5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9088c73773fa298c2ebf5566917e564b4c04bebc","unresolved":false,"context_lines":[{"line_number":1076,"context_line":"        cctxt.cast(ctxt, \u0027shelve_offload_instance\u0027, **msg_args)"},{"line_number":1077,"context_line":""},{"line_number":1078,"context_line":"    def unshelve_instance(self, ctxt, instance, host, image\u003dNone,"},{"line_number":1079,"context_line":"                          filter_properties\u003dNone, node\u003dNone):"},{"line_number":1080,"context_line":"        version \u003d \u00274.0\u0027"},{"line_number":1081,"context_line":"        msg_kwargs \u003d {"},{"line_number":1082,"context_line":"            \u0027instance\u0027: instance,"}],"source_content_type":"text/x-python","patch_set":23,"id":"df87a7cf_7f976b3b","line":1079,"range":{"start_line":1079,"start_character":26,"end_line":1079,"end_character":43},"updated":"2017-12-11 22:08:39.000000000","message":"same - don\u0027t we have a limits dict in this thing?","commit_id":"07cbf39bec4114e0f17f91bc00239b821ddb3fc5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0f7653eedd8dc03752083b7896326bb224a44a39","unresolved":false,"context_lines":[{"line_number":798,"context_line":"            kwargs\u003dNone):"},{"line_number":799,"context_line":"        # NOTE(edleafe): compute nodes can only use the dict form of limits."},{"line_number":800,"context_line":"        if isinstance(limits, objects.SchedulerLimits):"},{"line_number":801,"context_line":"            limits \u003d limits.to_dict()"},{"line_number":802,"context_line":"        # NOTE(danms): kwargs is only here for cells compatibility, don\u0027t"},{"line_number":803,"context_line":"        # actually send it to compute"},{"line_number":804,"context_line":"        extra \u003d {\u0027preserve_ephemeral\u0027: preserve_ephemeral,"}],"source_content_type":"text/x-python","patch_set":25,"id":"df87a7cf_814d1bc5","line":801,"updated":"2017-12-12 20:06:29.000000000","message":"I wonder if it\u0027s not better to just make this explicit. Like, does this get called anywhere without an object? Since this is client-side, we don\u0027t need compat handling here (same as below).","commit_id":"ca716ce4dd512e864886998a24e111e7d6e05848"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"cf758e58a48777543e1c38787bb356bb156ee8a5","unresolved":false,"context_lines":[{"line_number":798,"context_line":"            kwargs\u003dNone):"},{"line_number":799,"context_line":"        # NOTE(edleafe): compute nodes can only use the dict form of limits."},{"line_number":800,"context_line":"        if isinstance(limits, objects.SchedulerLimits):"},{"line_number":801,"context_line":"            limits \u003d limits.to_dict()"},{"line_number":802,"context_line":"        # NOTE(danms): kwargs is only here for cells compatibility, don\u0027t"},{"line_number":803,"context_line":"        # actually send it to compute"},{"line_number":804,"context_line":"        extra \u003d {\u0027preserve_ephemeral\u0027: preserve_ephemeral,"}],"source_content_type":"text/x-python","patch_set":25,"id":"df87a7cf_04726212","line":801,"in_reply_to":"df87a7cf_814d1bc5","updated":"2017-12-13 13:50:33.000000000","message":"\u0027limits\u0027 can be None (and are in the unit tests).","commit_id":"ca716ce4dd512e864886998a24e111e7d6e05848"}],"nova/conductor/manager.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"847b55ade3b95cd907957d41a96e23083f562c46","unresolved":false,"context_lines":[{"line_number":546,"context_line":"            spec_obj \u003d objects.RequestSpec.from_primitives("},{"line_number":547,"context_line":"                    context, request_spec, filter_properties)"},{"line_number":548,"context_line":"            host_lists \u003d self._schedule_instances(context, spec_obj,"},{"line_number":549,"context_line":"                    instance_uuids, return_alternates\u003dTrue)"},{"line_number":550,"context_line":"        except Exception as exc:"},{"line_number":551,"context_line":"            updates \u003d {\u0027vm_state\u0027: vm_states.ERROR, \u0027task_state\u0027: None}"},{"line_number":552,"context_line":"            for instance in instances:"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_17d11555","line":549,"range":{"start_line":549,"start_character":36,"end_line":549,"end_character":58},"updated":"2017-12-04 20:30:00.000000000","message":"Hmm, so the only time we get into build_instances is (1) cellsv1 from the API building a new instance or (2) reschedule from the compute. If we\u0027re doing a reschedule from the compute, we should already have alternates, why aren\u0027t we checking for those? Or is that a TODO for a later patch in the series?","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"c1ba2377894ce887bd5527daf793cdadc8c8ca4c","unresolved":false,"context_lines":[{"line_number":546,"context_line":"            spec_obj \u003d objects.RequestSpec.from_primitives("},{"line_number":547,"context_line":"                    context, request_spec, filter_properties)"},{"line_number":548,"context_line":"            host_lists \u003d self._schedule_instances(context, spec_obj,"},{"line_number":549,"context_line":"                    instance_uuids, return_alternates\u003dTrue)"},{"line_number":550,"context_line":"        except Exception as exc:"},{"line_number":551,"context_line":"            updates \u003d {\u0027vm_state\u0027: vm_states.ERROR, \u0027task_state\u0027: None}"},{"line_number":552,"context_line":"            for instance in instances:"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_232e5743","line":549,"range":{"start_line":549,"start_character":36,"end_line":549,"end_character":58},"in_reply_to":"df87a7cf_17d11555","updated":"2017-12-05 00:10:11.000000000","message":"Yes, it\u0027s later:\n\nhttps://review.openstack.org/#/c/511358/29/nova/conductor/manager.py@550","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"847b55ade3b95cd907957d41a96e23083f562c46","unresolved":false,"context_lines":[{"line_number":608,"context_line":"            limits \u003d host.limits"},{"line_number":609,"context_line":"            # If we are passed a SchedulerLimits object, convert it to the dict"},{"line_number":610,"context_line":"            # format, which all the called methods expect."},{"line_number":611,"context_line":"            if isinstance(limits, objects.SchedulerLimits):"},{"line_number":612,"context_line":"                limits \u003d limits.to_dict()"},{"line_number":613,"context_line":""},{"line_number":614,"context_line":"            self.compute_rpcapi.build_and_run_instance(context,"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_17f835e3","line":611,"updated":"2017-12-04 20:30:00.000000000","message":"This is redundant with doing it in the compute rpcapi client.","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"847b55ade3b95cd907957d41a96e23083f562c46","unresolved":false,"context_lines":[{"line_number":897,"context_line":""},{"line_number":898,"context_line":"            # If we are passed a SchedulerLimits object, convert it to the dict"},{"line_number":899,"context_line":"            # format, which all the called methods expect."},{"line_number":900,"context_line":"            if isinstance(limits, objects.SchedulerLimits):"},{"line_number":901,"context_line":"                limits \u003d limits.to_dict()"},{"line_number":902,"context_line":"            self.compute_rpcapi.rebuild_instance(context,"},{"line_number":903,"context_line":"                    instance\u003dinstance,"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_175fd5e2","line":900,"updated":"2017-12-04 20:30:00.000000000","message":"This is redundant with the check and conversion in the compute rpcapi client.","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"847b55ade3b95cd907957d41a96e23083f562c46","unresolved":false,"context_lines":[{"line_number":1163,"context_line":"            limits \u003d host.limits"},{"line_number":1164,"context_line":"            # If we are passed a SchedulerLimits object, convert it to the dict"},{"line_number":1165,"context_line":"            # format, which all the called methods expect."},{"line_number":1166,"context_line":"            if isinstance(limits, objects.SchedulerLimits):"},{"line_number":1167,"context_line":"                limits \u003d limits.to_dict()"},{"line_number":1168,"context_line":"            with obj_target_cell(instance, cell) as cctxt:"},{"line_number":1169,"context_line":"                self.compute_rpcapi.build_and_run_instance("}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_378f7924","line":1166,"updated":"2017-12-04 20:30:00.000000000","message":"Redundant with the compute rpcapi client code already handling this.","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"312c1cafce961c018b64ef5682693c3e19930f64","unresolved":false,"context_lines":[{"line_number":1153,"context_line":"            limits \u003d host.limits"},{"line_number":1154,"context_line":"            # If we are passed a SchedulerLimits object, convert it to the dict"},{"line_number":1155,"context_line":"            # format, which all the called methods expect."},{"line_number":1156,"context_line":"            if isinstance(limits, objects.SchedulerLimits):"},{"line_number":1157,"context_line":"                limits \u003d limits.to_dict()"},{"line_number":1158,"context_line":"            with obj_target_cell(instance, cell) as cctxt:"},{"line_number":1159,"context_line":"                self.compute_rpcapi.build_and_run_instance("}],"source_content_type":"text/x-python","patch_set":18,"id":"df87a7cf_f870f9a7","line":1156,"range":{"start_line":1156,"start_character":12,"end_line":1156,"end_character":59},"updated":"2017-12-06 02:10:18.000000000","message":"This is always going to be true, so we can remove this check. We should send the things we care about to the compute rpcapi as objects and let the compute rpcapi client back-level them to primitives if it can\u0027t send the objects.","commit_id":"544f50c34517355f1d530dd5a6d70f8d9f367c26"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62cc810e781c6538ef7602588df9b58be844f8ab","unresolved":false,"context_lines":[{"line_number":606,"context_line":"                    return"},{"line_number":607,"context_line":""},{"line_number":608,"context_line":"            limits \u003d host.limits"},{"line_number":609,"context_line":"            # If we are passed a SchedulerLimits object, convert it to the dict"},{"line_number":610,"context_line":"            # format, which all the called methods expect."},{"line_number":611,"context_line":"            if isinstance(limits, objects.SchedulerLimits):"},{"line_number":612,"context_line":"                limits \u003d limits.to_dict()"},{"line_number":613,"context_line":""},{"line_number":614,"context_line":"            self.compute_rpcapi.build_and_run_instance(context,"},{"line_number":615,"context_line":"                    instance\u003dinstance, host\u003dhost.service_host, image\u003dimage,"}],"source_content_type":"text/x-python","patch_set":22,"id":"df87a7cf_b48203ff","line":612,"range":{"start_line":609,"start_character":12,"end_line":612,"end_character":41},"updated":"2017-12-11 16:22:17.000000000","message":"Why don\u0027t we do this conversion in the compute rpcapi client? Then conductor manager code here (and below) can send the object, and the compute rpcapi client can convert them to a dict until we have an rpcapi version bump for compute that can handle the object. You had it that way in an earlier patch set.","commit_id":"f982e4a9cb1923144eaa58354c567818a700e311"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9088c73773fa298c2ebf5566917e564b4c04bebc","unresolved":false,"context_lines":[{"line_number":606,"context_line":"                    return"},{"line_number":607,"context_line":""},{"line_number":608,"context_line":"            limits \u003d host.limits"},{"line_number":609,"context_line":"            # If we are passed a SchedulerLimits object, convert it to the dict"},{"line_number":610,"context_line":"            # format, which all the called methods expect."},{"line_number":611,"context_line":"            if isinstance(limits, objects.SchedulerLimits):"},{"line_number":612,"context_line":"                limits \u003d limits.to_dict()"},{"line_number":613,"context_line":""},{"line_number":614,"context_line":"            self.compute_rpcapi.build_and_run_instance(context,"},{"line_number":615,"context_line":"                    instance\u003dinstance, host\u003dhost.service_host, image\u003dimage,"}],"source_content_type":"text/x-python","patch_set":23,"id":"df87a7cf_ffc37b36","line":612,"range":{"start_line":609,"start_character":12,"end_line":612,"end_character":41},"updated":"2017-12-11 22:08:39.000000000","message":"We don\u0027t need this here anymore, it\u0027s handled in the compute rpcapi code.","commit_id":"07cbf39bec4114e0f17f91bc00239b821ddb3fc5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9088c73773fa298c2ebf5566917e564b4c04bebc","unresolved":false,"context_lines":[{"line_number":895,"context_line":"                availability_zones.get_host_availability_zone("},{"line_number":896,"context_line":"                    context, host))"},{"line_number":897,"context_line":""},{"line_number":898,"context_line":"            # If we are passed a SchedulerLimits object, convert it to the dict"},{"line_number":899,"context_line":"            # format, which all the called methods expect."},{"line_number":900,"context_line":"            if isinstance(limits, objects.SchedulerLimits):"},{"line_number":901,"context_line":"                limits \u003d limits.to_dict()"},{"line_number":902,"context_line":"            self.compute_rpcapi.rebuild_instance(context,"},{"line_number":903,"context_line":"                    instance\u003dinstance,"},{"line_number":904,"context_line":"                    new_pass\u003dnew_pass,"}],"source_content_type":"text/x-python","patch_set":23,"id":"df87a7cf_bfdf330b","line":901,"range":{"start_line":898,"start_character":12,"end_line":901,"end_character":41},"updated":"2017-12-11 22:08:39.000000000","message":"Don\u0027t need this here anymore.","commit_id":"07cbf39bec4114e0f17f91bc00239b821ddb3fc5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9088c73773fa298c2ebf5566917e564b4c04bebc","unresolved":false,"context_lines":[{"line_number":1160,"context_line":"            # pass the objects."},{"line_number":1161,"context_line":"            legacy_secgroups \u003d [s.identifier"},{"line_number":1162,"context_line":"                                for s in request_spec.security_groups]"},{"line_number":1163,"context_line":"            # Compute nodes can\u0027t yet use the new objects, so convert the"},{"line_number":1164,"context_line":"            # SchedulerLimits to the older dict format."},{"line_number":1165,"context_line":"            limits \u003d host.limits.to_dict() if host.limits else {}"},{"line_number":1166,"context_line":"            with obj_target_cell(instance, cell) as cctxt:"},{"line_number":1167,"context_line":"                self.compute_rpcapi.build_and_run_instance("},{"line_number":1168,"context_line":"                    cctxt, instance\u003dinstance, image\u003dimage,"}],"source_content_type":"text/x-python","patch_set":23,"id":"df87a7cf_dfe237d5","line":1165,"range":{"start_line":1163,"start_character":12,"end_line":1165,"end_character":65},"updated":"2017-12-11 22:08:39.000000000","message":"Don\u0027t need this here, the compute rpcapi code handles it.","commit_id":"07cbf39bec4114e0f17f91bc00239b821ddb3fc5"}],"nova/conductor/tasks/live_migrate.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"847b55ade3b95cd907957d41a96e23083f562c46","unresolved":false,"context_lines":[{"line_number":290,"context_line":"            try:"},{"line_number":291,"context_line":"                selection_lists \u003d self.scheduler_client.select_destinations("},{"line_number":292,"context_line":"                        self.context, request_spec, [self.instance.uuid],"},{"line_number":293,"context_line":"                        return_objects\u003dTrue, return_alternates\u003dFalse)"},{"line_number":294,"context_line":"                # We only need the first item in the first list, as there is"},{"line_number":295,"context_line":"                # only one instance, and we don\u0027t care about any alternates."},{"line_number":296,"context_line":"                selection \u003d selection_lists[0][0]"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_97c20533","line":293,"range":{"start_line":293,"start_character":45,"end_line":293,"end_character":62},"updated":"2017-12-04 20:30:00.000000000","message":"I was going to ask for a TODO so we could eventually change this to get alternates from the scheduler rather than loop in this task asking for a new host each time, however, the number of alternates for live migration is based on a different config option (migrate_max_retries).","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c72aaac31a8a1452945d946c0f9f458cae6ba7e2","unresolved":false,"context_lines":[{"line_number":290,"context_line":"            try:"},{"line_number":291,"context_line":"                selection_lists \u003d self.scheduler_client.select_destinations("},{"line_number":292,"context_line":"                        self.context, request_spec, [self.instance.uuid],"},{"line_number":293,"context_line":"                        return_objects\u003dTrue, return_alternates\u003dFalse)"},{"line_number":294,"context_line":"                # We only need the first item in the first list, as there is"},{"line_number":295,"context_line":"                # only one instance, and we don\u0027t care about any alternates."},{"line_number":296,"context_line":"                selection \u003d selection_lists[0][0]"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_99279413","line":293,"range":{"start_line":293,"start_character":45,"end_line":293,"end_character":62},"in_reply_to":"df87a7cf_83c2c332","updated":"2017-12-05 01:36:40.000000000","message":"I think for now, first step, we\u0027re OK, we\u0027ll do it the old way in here and we can change things over time.","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"c1ba2377894ce887bd5527daf793cdadc8c8ca4c","unresolved":false,"context_lines":[{"line_number":290,"context_line":"            try:"},{"line_number":291,"context_line":"                selection_lists \u003d self.scheduler_client.select_destinations("},{"line_number":292,"context_line":"                        self.context, request_spec, [self.instance.uuid],"},{"line_number":293,"context_line":"                        return_objects\u003dTrue, return_alternates\u003dFalse)"},{"line_number":294,"context_line":"                # We only need the first item in the first list, as there is"},{"line_number":295,"context_line":"                # only one instance, and we don\u0027t care about any alternates."},{"line_number":296,"context_line":"                selection \u003d selection_lists[0][0]"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_83c2c332","line":293,"range":{"start_line":293,"start_character":45,"end_line":293,"end_character":62},"in_reply_to":"df87a7cf_97c20533","updated":"2017-12-05 00:10:11.000000000","message":"That was my original design (https://review.openstack.org/#/c/465767/), but I was told that that added unneeded complexity, and that max_attemps was all we\u0027d ever need.","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"}],"nova/conductor/tasks/migrate.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"847b55ade3b95cd907957d41a96e23083f562c46","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        migration \u003d self._preallocate_migration()"},{"line_number":242,"context_line":"        selection_lists \u003d self.scheduler_client.select_destinations("},{"line_number":243,"context_line":"                self.context, self.request_spec, [self.instance.uuid],"},{"line_number":244,"context_line":"                return_objects\u003dTrue, return_alternates\u003dFalse)"},{"line_number":245,"context_line":"        # We only need the first item in the first list, as there is only one"},{"line_number":246,"context_line":"        # instance, and we don\u0027t care about any alternates."},{"line_number":247,"context_line":"        selection \u003d selection_lists[0][0]"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_171355b7","line":244,"range":{"start_line":244,"start_character":37,"end_line":244,"end_character":60},"updated":"2017-12-04 20:30:00.000000000","message":"Why is return_alternates False here? resize does perform a reschedule, so we will want alternates. The resize reschedule loop is a bit different than server build, it doesn\u0027t go back through the build_instances method in the cell conductor, it goes through the same resize_instance conductor task API:\n\nhttps://github.com/openstack/nova/blob/2c4a1a390ad07d76b0a29b4d47173c7d8a80ec98/nova/compute/manager.py#L4090\n\nSo in that case, we\u0027d have to plumb the alternates through from conductor -\u003e compute -\u003e conductor.\n\nI think we are OK with not asking for alternates in this patch if you want, but we need a TODO in here for adding that support otherwise reschedules don\u0027t work for resize/cold migrate.","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"c1ba2377894ce887bd5527daf793cdadc8c8ca4c","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        migration \u003d self._preallocate_migration()"},{"line_number":242,"context_line":"        selection_lists \u003d self.scheduler_client.select_destinations("},{"line_number":243,"context_line":"                self.context, self.request_spec, [self.instance.uuid],"},{"line_number":244,"context_line":"                return_objects\u003dTrue, return_alternates\u003dFalse)"},{"line_number":245,"context_line":"        # We only need the first item in the first list, as there is only one"},{"line_number":246,"context_line":"        # instance, and we don\u0027t care about any alternates."},{"line_number":247,"context_line":"        selection \u003d selection_lists[0][0]"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_1ee92a19","line":244,"range":{"start_line":244,"start_character":37,"end_line":244,"end_character":60},"in_reply_to":"df87a7cf_171355b7","updated":"2017-12-05 00:10:11.000000000","message":"I was under the impression that migration was the reason we needed the second RPC parameter, since it didn\u0027t happen in the cells, and operators didn\u0027t want all the extra traffic.\n\nSee https://review.openstack.org/#/c/510159/8/nova/conductor/tasks/migrate.py@99 for the discussion that resulted in this code. The \u0027return_alternates\u0027 used to be a single flag that said \"I\u0027m a modern conductor, so give me the new stuff\".","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"ce69643a458e0b7ebb01a4399e86de761485a2f0","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        migration \u003d self._preallocate_migration()"},{"line_number":242,"context_line":"        selection_lists \u003d self.scheduler_client.select_destinations("},{"line_number":243,"context_line":"                self.context, self.request_spec, [self.instance.uuid],"},{"line_number":244,"context_line":"                return_objects\u003dTrue, return_alternates\u003dFalse)"},{"line_number":245,"context_line":"        # We only need the first item in the first list, as there is only one"},{"line_number":246,"context_line":"        # instance, and we don\u0027t care about any alternates."},{"line_number":247,"context_line":"        selection \u003d selection_lists[0][0]"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_fbf321e6","line":244,"range":{"start_line":244,"start_character":37,"end_line":244,"end_character":60},"in_reply_to":"df87a7cf_1962a43f","updated":"2017-12-05 16:12:10.000000000","message":"Based on IRC discussion, we\u0027ll leave this as False for now, and then add additional patches to the series that bumps the compute RPC version to handle alternates for resize.","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c72aaac31a8a1452945d946c0f9f458cae6ba7e2","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        migration \u003d self._preallocate_migration()"},{"line_number":242,"context_line":"        selection_lists \u003d self.scheduler_client.select_destinations("},{"line_number":243,"context_line":"                self.context, self.request_spec, [self.instance.uuid],"},{"line_number":244,"context_line":"                return_objects\u003dTrue, return_alternates\u003dFalse)"},{"line_number":245,"context_line":"        # We only need the first item in the first list, as there is only one"},{"line_number":246,"context_line":"        # instance, and we don\u0027t care about any alternates."},{"line_number":247,"context_line":"        selection \u003d selection_lists[0][0]"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_1962a43f","line":244,"range":{"start_line":244,"start_character":37,"end_line":244,"end_character":60},"in_reply_to":"df87a7cf_1ee92a19","updated":"2017-12-05 01:36:40.000000000","message":"No, the return_alternates was added because evacuate and unshelve don\u0027t do reschedules, so they don\u0027t need alternates. The initial build and cold migrate / resize do reschedules when the claim/build in the compute fails, so those need alternates.","commit_id":"4e40c791dc28bd056031a25e8c59b8464c7ef9c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"312c1cafce961c018b64ef5682693c3e19930f64","unresolved":false,"context_lines":[{"line_number":239,"context_line":"                cell\u003dinstance_mapping.cell_mapping)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"        migration \u003d self._preallocate_migration()"},{"line_number":242,"context_line":"        selection_lists \u003d self.scheduler_client.select_destinations("},{"line_number":243,"context_line":"                self.context, self.request_spec, [self.instance.uuid],"},{"line_number":244,"context_line":"                return_objects\u003dTrue, return_alternates\u003dFalse)"},{"line_number":245,"context_line":"        # We only need the first item in the first list, as there is only one"}],"source_content_type":"text/x-python","patch_set":18,"id":"df87a7cf_18a91dde","line":242,"updated":"2017-12-06 02:10:18.000000000","message":"nit: could leave a TODO to request alternates here.","commit_id":"544f50c34517355f1d530dd5a6d70f8d9f367c26"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9088c73773fa298c2ebf5566917e564b4c04bebc","unresolved":false,"context_lines":[{"line_number":249,"context_line":"        # instance, and we don\u0027t care about any alternates."},{"line_number":250,"context_line":"        selection \u003d selection_lists[0][0]"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        scheduler_utils.populate_filter_properties(legacy_props, selection)"},{"line_number":253,"context_line":"        # context is not serializable"},{"line_number":254,"context_line":"        legacy_props.pop(\u0027context\u0027, None)"},{"line_number":255,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"df87a7cf_bf1653a7","line":252,"range":{"start_line":252,"start_character":24,"end_line":252,"end_character":50},"updated":"2017-12-11 22:08:39.000000000","message":"This will convert the filter_properties[\u0027limits\u0027] to a dict before calling prep_resize in the compute rpcapi client, so the limits object-\u003edict conversion is handled for us. Just a note to myself.","commit_id":"07cbf39bec4114e0f17f91bc00239b821ddb3fc5"}],"nova/objects/request_spec.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fa09d82660134f69fe9b7c6d641035909ea0d099","unresolved":false,"context_lines":[{"line_number":212,"context_line":"            # Set the value anyway to avoid any call to obj_attr_is_set for it"},{"line_number":213,"context_line":"            self.instance_group \u003d None"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def _from_limits(self, limits):"},{"line_number":216,"context_line":"        if isinstance(limits, dict):"},{"line_number":217,"context_line":"            self.limits \u003d SchedulerLimits.from_dict(limits)"},{"line_number":218,"context_line":"        else:"},{"line_number":219,"context_line":"            # Already a SchedulerLimits object."},{"line_number":220,"context_line":"            self.limits \u003d limits"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def _from_hints(self, hints_dict):"},{"line_number":223,"context_line":"        if hints_dict is None:"}],"source_content_type":"text/x-python","patch_set":24,"id":"df87a7cf_ba08a191","line":220,"range":{"start_line":215,"start_character":4,"end_line":220,"end_character":32},"updated":"2017-12-11 22:42:39.000000000","message":"I don\u0027t see where this is actually needed now. I undid this change locally and conductor tests all passed, along with everything in nova.tests.functional.test_servers - but I guess it\u0027s not hurting anything to leave it in here and we have similar checks in some of the other _from* methods above.","commit_id":"6ce9b49ce47e109d372cf33fd6f401929e3bed68"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"9314bf6e755c7ffc68d30b955a0608079a0ff96a","unresolved":false,"context_lines":[{"line_number":212,"context_line":"            # Set the value anyway to avoid any call to obj_attr_is_set for it"},{"line_number":213,"context_line":"            self.instance_group \u003d None"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def _from_limits(self, limits):"},{"line_number":216,"context_line":"        if isinstance(limits, dict):"},{"line_number":217,"context_line":"            self.limits \u003d SchedulerLimits.from_dict(limits)"},{"line_number":218,"context_line":"        else:"},{"line_number":219,"context_line":"            # Already a SchedulerLimits object."},{"line_number":220,"context_line":"            self.limits \u003d limits"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def _from_hints(self, hints_dict):"},{"line_number":223,"context_line":"        if hints_dict is None:"}],"source_content_type":"text/x-python","patch_set":25,"id":"df87a7cf_580dd8e5","line":220,"range":{"start_line":215,"start_character":0,"end_line":220,"end_character":32},"updated":"2017-12-12 05:55:39.000000000","message":"nit: The unit tests for this change are not included in this patch.\nnova/tests/unit/objects/test_request_spec.py should be modified.","commit_id":"ca716ce4dd512e864886998a24e111e7d6e05848"}],"nova/tests/unit/conductor/tasks/test_live_migrate.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"9314bf6e755c7ffc68d30b955a0608079a0ff96a","unresolved":false,"context_lines":[{"line_number":29,"context_line":"from nova import utils"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"fake_selection1 \u003d objects.Selection(service_host\u003d\"host1\", nodename\u003d\"node1\","},{"line_number":33,"context_line":"        cell_uuid\u003duuids.cell)"},{"line_number":34,"context_line":"fake_selection2 \u003d objects.Selection(service_host\u003d\"host2\", nodename\u003d\"node2\","},{"line_number":35,"context_line":"        cell_uuid\u003duuids.cell)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class LiveMigrationTaskTestCase(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":25,"id":"df87a7cf_b8c18456","line":35,"range":{"start_line":32,"start_character":0,"end_line":35,"end_character":29},"updated":"2017-12-12 05:55:39.000000000","message":"nit: These are used in LiveMigrationTaskTestCase class only.\nSo they can be instance variables.","commit_id":"ca716ce4dd512e864886998a24e111e7d6e05848"}]}
