)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"6ae9a3aa01ead289164a3c97a3ff3e0fdaf0c957","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This prepares for having the conductor query the scheduler for a list of"},{"line_number":10,"context_line":"hosts to schedule to.  By moving the scheduler call to the conductor it"},{"line_number":11,"context_line":"can handle long running operations without blocking the API return."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Part of bp query-scheduler"},{"line_number":14,"context_line":"Change-Id: I4539888e78ebdbb8cef6647273b959a012280110"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAO3%2F%2F%2Fnk%3D","line":12,"updated":"2013-05-15 10:13:24.000000000","message":"Minor nit:  It didn\u0027t actually block the API before, either... since we casted to the scheduler. :)   But this allows for better orchestration.","commit_id":"f57ab90f974541cfd8afaba49bc5de54eeb61b32"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"479fdebec52254a4deebd3a92fbb01beaa903b8d","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This prepares for having the conductor query the scheduler for a list of"},{"line_number":10,"context_line":"hosts to schedule to.  By moving the scheduler call to the conductor it"},{"line_number":11,"context_line":"can handle long running operations without blocking the API return."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Part of bp query-scheduler"},{"line_number":14,"context_line":"Change-Id: I4539888e78ebdbb8cef6647273b959a012280110"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAO3%2F%2F%2Bqs%3D","line":12,"in_reply_to":"AAAAO3%2F%2F%2Fnk%3D","updated":"2013-05-15 19:26:24.000000000","message":"Right.  This was a poorly worded attempt for me to explain why it\u0027s being moved to conductor.  When instance selection is no longer a cast to the scheduler it won\u0027t block the api.  I\u0027ll make this more clear.","commit_id":"f57ab90f974541cfd8afaba49bc5de54eeb61b32"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"06c4a8911ebb18300c7d2bfcdf50bf09037b680f","unresolved":false,"context_lines":[{"line_number":11,"context_line":"handle the orchestration of long running tasks like spawning instances."},{"line_number":12,"context_line":"By making this move, the API is free to return to the caller while"},{"line_number":13,"context_line":"conductor queries the scheduler for a host to provision to."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Part of bp query-scheduler"},{"line_number":16,"context_line":"Change-Id: I4539888e78ebdbb8cef6647273b959a012280110"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"AAAAPH%2F%2Fnek%3D","line":14,"updated":"2013-05-29 10:48:04.000000000","message":"I think its worth adding some info here on the cells related changes.","commit_id":"ad05d7caf81e939974aa1cc0e49e936d95dd4931"}],"nova/compute/api.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ab54d831bd57364a56636ded5ae1c27cb1eb31f9","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        self.servicegroup_api \u003d servicegroup.API()"},{"line_number":199,"context_line":"        #NOTE(alaski): Import here to avoid a circular dependency"},{"line_number":200,"context_line":"        from nova import conductor"},{"line_number":201,"context_line":"        self.conductor_api \u003d conductor.API()"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        super(API, self).__init__(**kwargs)"},{"line_number":204,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAOn%2F%2FU3k%3D","line":201,"updated":"2013-05-14 16:03:08.000000000","message":"I hit this one too, I went for calling the conductor api from all the places that called the old compute api. But thats a bit nasty.","commit_id":"1b3f4871b21d3e6c221f32d3de80e2bf876aebe3"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"275355fd4a379450a9231db9d2927c699fe9b172","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        self.servicegroup_api \u003d servicegroup.API()"},{"line_number":199,"context_line":"        #NOTE(alaski): Import here to avoid a circular dependency"},{"line_number":200,"context_line":"        from nova import conductor"},{"line_number":201,"context_line":"        self.conductor_api \u003d conductor.API()"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        super(API, self).__init__(**kwargs)"},{"line_number":204,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAOn%2F%2FUro%3D","line":201,"in_reply_to":"AAAAOn%2F%2FU3k%3D","updated":"2013-05-14 18:19:31.000000000","message":"Yeah, neither seems optimal right now.  It appears that conductor only calls compute api for three calls, so hopefully those can be removed in favor of a different approach and then this won\u0027t be necessary.\n\nI have in my mind an idealized flow of wsgi api -\u003e compute api -\u003e conductor -\u003e compute, and any shared logic sits outside of those pieces.  But that may be a fantasy world.","commit_id":"1b3f4871b21d3e6c221f32d3de80e2bf876aebe3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"080317ba8705c9d2305390fd8f851b65050c018f","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        self.servicegroup_api \u003d servicegroup.API()"},{"line_number":199,"context_line":"        #NOTE(alaski): Import here to avoid a circular dependency"},{"line_number":200,"context_line":"        from nova import conductor"},{"line_number":201,"context_line":"        self.conductor_api \u003d conductor.API()"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        super(API, self).__init__(**kwargs)"},{"line_number":204,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAO3%2F%2F%2Fvw%3D","line":201,"in_reply_to":"AAAAOn%2F%2FUro%3D","updated":"2013-05-15 09:52:58.000000000","message":"Yeah, I agree that is the best way, semantically. Some of the compute calls are direct to db, some call the conductor. Makes sense.\n\nShould we look at \"fixing\" the conductor so it doesn\u0027t call the compute api?","commit_id":"1b3f4871b21d3e6c221f32d3de80e2bf876aebe3"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"6ae9a3aa01ead289164a3c97a3ff3e0fdaf0c957","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        self.compute_rpcapi \u003d compute_rpcapi.ComputeAPI()"},{"line_number":197,"context_line":"        self.servicegroup_api \u003d servicegroup.API()"},{"line_number":198,"context_line":"        #NOTE(alaski): Import here to avoid a circular dependency"},{"line_number":199,"context_line":"        from nova import conductor"},{"line_number":200,"context_line":"        self.conductor_api \u003d conductor.API()"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        super(API, self).__init__(**kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAO3%2F%2F%2FnQ%3D","line":199,"updated":"2013-05-15 10:13:24.000000000","message":"Ah, that\u0027s unfortunate... since conductor manager can call back into here. :(","commit_id":"f57ab90f974541cfd8afaba49bc5de54eeb61b32"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"479fdebec52254a4deebd3a92fbb01beaa903b8d","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        self.compute_rpcapi \u003d compute_rpcapi.ComputeAPI()"},{"line_number":197,"context_line":"        self.servicegroup_api \u003d servicegroup.API()"},{"line_number":198,"context_line":"        #NOTE(alaski): Import here to avoid a circular dependency"},{"line_number":199,"context_line":"        from nova import conductor"},{"line_number":200,"context_line":"        self.conductor_api \u003d conductor.API()"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        super(API, self).__init__(**kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAO3%2F%2F%2BqQ%3D","line":199,"in_reply_to":"AAAAO3%2F%2F%2FnQ%3D","updated":"2013-05-15 19:26:24.000000000","message":"It\u0027s just three calls, which is what causes this dependency.  Maybe I should move self.conductor_api out to a property for now actually...\n\nBut I believe the calls from conductor manager back to here can be removed with a small amount of work.","commit_id":"f57ab90f974541cfd8afaba49bc5de54eeb61b32"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"6ae9a3aa01ead289164a3c97a3ff3e0fdaf0c957","unresolved":false,"context_lines":[{"line_number":714,"context_line":"        #NOTE(alaski): This is so that running conductor in local mode does"},{"line_number":715,"context_line":"        #not block the API return.  When/if local mode is deprecated then"},{"line_number":716,"context_line":"        #spawning a greenthread here will not be necessary."},{"line_number":717,"context_line":"        utils.spawn(schedule_in_conductor, context, request_spec,"},{"line_number":718,"context_line":"                admin_password, injected_files, requested_networks,"},{"line_number":719,"context_line":"                filter_properties)"},{"line_number":720,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAO3%2F%2F%2FnI%3D","line":717,"updated":"2013-05-15 10:13:24.000000000","message":"I was picturing putting this in the conductor LocalAPI class... so that we don\u0027t have to have this here.  If you do that, when LocalAPI goes away, the spawn hack automatically goes away.","commit_id":"f57ab90f974541cfd8afaba49bc5de54eeb61b32"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"479fdebec52254a4deebd3a92fbb01beaa903b8d","unresolved":false,"context_lines":[{"line_number":714,"context_line":"        #NOTE(alaski): This is so that running conductor in local mode does"},{"line_number":715,"context_line":"        #not block the API return.  When/if local mode is deprecated then"},{"line_number":716,"context_line":"        #spawning a greenthread here will not be necessary."},{"line_number":717,"context_line":"        utils.spawn(schedule_in_conductor, context, request_spec,"},{"line_number":718,"context_line":"                admin_password, injected_files, requested_networks,"},{"line_number":719,"context_line":"                filter_properties)"},{"line_number":720,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAO3%2F%2F%2BqM%3D","line":717,"in_reply_to":"AAAAO3%2F%2F%2FnI%3D","updated":"2013-05-15 19:26:24.000000000","message":"That\u0027s definitely better, will move.","commit_id":"f57ab90f974541cfd8afaba49bc5de54eeb61b32"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"f4ae7391c086f9f13d6943e04de1f82420ed776d","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        super(API, self).__init__(**kwargs)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    @property"},{"line_number":203,"context_line":"    def conductor_api(self):"},{"line_number":204,"context_line":"        if self._conductor_api is None:"},{"line_number":205,"context_line":"            # TODO(alaski): Remove calls into here from conductor manager so"},{"line_number":206,"context_line":"            # that this isn\u0027t necessary. #1180540"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAO3%2F%2F770%3D","line":203,"updated":"2013-05-16 18:09:43.000000000","message":"I like this..  Not the fact that you have to do this, but I like the solution. :)","commit_id":"7dba4679c96439f459daee31d57723365dc861a1"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"6409702adac0be0c7abef10bb6f525c74da79537","unresolved":false,"context_lines":[{"line_number":723,"context_line":"                                      instance_actions.CREATE)"},{"line_number":724,"context_line":""},{"line_number":725,"context_line":"            instance_p \u003d jsonutils.to_primitive(instance)"},{"line_number":726,"context_line":"            self.conductor_task_api.build_instance(context,"},{"line_number":727,"context_line":"                    instance\u003dinstance_p, request_spec\u003drequest_spec,"},{"line_number":728,"context_line":"                    filter_properties\u003dfilter_properties,"},{"line_number":729,"context_line":"                    admin_password\u003dadmin_password,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAPH%2F%2FyAg%3D","line":726,"updated":"2013-05-23 06:09:49.000000000","message":"Shoot.  I somehow missed this.  This change is going to have serious performance issues for those who currently use this behavior on a large number of instances.  I\u0027m going to try to -2 this even after I approved it.. to block it.  If it lands, it lands.  But I think we should think about this more.","commit_id":"749a29a214e2beceb457b12e550e110378c0924c"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"ed188ee38686a2fa487233f20c539af0244a9993","unresolved":false,"context_lines":[{"line_number":723,"context_line":"                                      instance_actions.CREATE)"},{"line_number":724,"context_line":""},{"line_number":725,"context_line":"            instance_p \u003d jsonutils.to_primitive(instance)"},{"line_number":726,"context_line":"            self.conductor_task_api.build_instance(context,"},{"line_number":727,"context_line":"                    instance\u003dinstance_p, request_spec\u003drequest_spec,"},{"line_number":728,"context_line":"                    filter_properties\u003dfilter_properties,"},{"line_number":729,"context_line":"                    admin_password\u003dadmin_password,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAPH%2F%2FwrE%3D","line":726,"in_reply_to":"AAAAPH%2F%2Fw1c%3D","updated":"2013-05-23 17:09:59.000000000","message":"Yeah, there\u0027s currently no scheduler logic that really does anything special with the knowledge that it\u0027s building more than 1 instance.  But I can see some value in that and someone wanting to do that at some point -- I think the group scheduling BP might come into play.  It becomes more of an issue with the 2nd patch.  Maybe should look @ that BP to make sure you\u0027re not doing anything that makes that work impossible... hehe.\n\nHeh, group retries will be a PITA.. this is true.","commit_id":"749a29a214e2beceb457b12e550e110378c0924c"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"aec62b5db71fd4dec87252235e372c1a55b41570","unresolved":false,"context_lines":[{"line_number":723,"context_line":"                                      instance_actions.CREATE)"},{"line_number":724,"context_line":""},{"line_number":725,"context_line":"            instance_p \u003d jsonutils.to_primitive(instance)"},{"line_number":726,"context_line":"            self.conductor_task_api.build_instance(context,"},{"line_number":727,"context_line":"                    instance\u003dinstance_p, request_spec\u003drequest_spec,"},{"line_number":728,"context_line":"                    filter_properties\u003dfilter_properties,"},{"line_number":729,"context_line":"                    admin_password\u003dadmin_password,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAPH%2F%2Fw1c%3D","line":726,"in_reply_to":"AAAAPH%2F%2FxDw%3D","updated":"2013-05-23 16:11:49.000000000","message":"The reason I did the split here is that there\u0027s state associated with each scheduler request, mainly retries.  That\u0027s currently handled by splitting the request_spec when scheduler calls into compute.  By splitting here the state can be contained to a method call in the conductor.  When the group is passed to conductor it has to be tracked within the method, which can be done but is a bit messy.  And also since we have no process for doing group retries I was hoping to pull group semantics out of this call and find a better way to handle that overall.\n\nOther than the performance issue I didn\u0027t see any scheduler logic that changed the weighted hosts that were returned based on multiple instances.\n\nBut I\u0027ll modify this to stay consistent with what we have now.","commit_id":"749a29a214e2beceb457b12e550e110378c0924c"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"a8f1b3cc3c01ff883c36caec674c6286ca48bcbd","unresolved":false,"context_lines":[{"line_number":723,"context_line":"                                      instance_actions.CREATE)"},{"line_number":724,"context_line":""},{"line_number":725,"context_line":"            instance_p \u003d jsonutils.to_primitive(instance)"},{"line_number":726,"context_line":"            self.conductor_task_api.build_instance(context,"},{"line_number":727,"context_line":"                    instance\u003dinstance_p, request_spec\u003drequest_spec,"},{"line_number":728,"context_line":"                    filter_properties\u003dfilter_properties,"},{"line_number":729,"context_line":"                    admin_password\u003dadmin_password,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAPH%2F%2FxDw%3D","line":726,"in_reply_to":"AAAAPH%2F%2FyAg%3D","updated":"2013-05-23 15:08:55.000000000","message":"There seems to be some desire to schedule instances as a group together based on summit discussions.\n\nPerhaps we should change the conductor task method to \"build_instances\" and hen push the loop over to the conductor task manager.  That would allow for efficient group scheduling.","commit_id":"749a29a214e2beceb457b12e550e110378c0924c"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"a74ed018659d84428b35db5c64c09cf2c6b4f7e8","unresolved":false,"context_lines":[{"line_number":673,"context_line":"            \u0027image\u0027: jsonutils.to_primitive(image),"},{"line_number":674,"context_line":"            \u0027instance_properties\u0027: base_options,"},{"line_number":675,"context_line":"            \u0027instance_type\u0027: instance_type,"},{"line_number":676,"context_line":"            \u0027instance_uuids\u0027: instance_uuids,"},{"line_number":677,"context_line":"            \u0027block_device_mapping\u0027: block_device_mapping,"},{"line_number":678,"context_line":"            \u0027security_group\u0027: security_groups,"},{"line_number":679,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPH%2F%2Fuz8%3D","side":"PARENT","line":676,"updated":"2013-05-24 08:40:53.000000000","message":"You can ditch this instance_uuids here... since you stuff it back in on the manager side for now... And the new cells scheduler method doesn\u0027t use it.  I think I might have seen your 2nd patch removes it.. but you can safely remove it here, instead, AFAICT.","commit_id":"d68392a911cf756890b19a69a69bafd60237ae53"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"f26957c56b8ffd507b53521248c80973b5046dcf","unresolved":false,"context_lines":[{"line_number":673,"context_line":"            \u0027image\u0027: jsonutils.to_primitive(image),"},{"line_number":674,"context_line":"            \u0027instance_properties\u0027: base_options,"},{"line_number":675,"context_line":"            \u0027instance_type\u0027: instance_type,"},{"line_number":676,"context_line":"            \u0027instance_uuids\u0027: instance_uuids,"},{"line_number":677,"context_line":"            \u0027block_device_mapping\u0027: block_device_mapping,"},{"line_number":678,"context_line":"            \u0027security_group\u0027: security_groups,"},{"line_number":679,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPH%2F%2FuXQ%3D","side":"PARENT","line":676,"in_reply_to":"AAAAPH%2F%2Fuz8%3D","updated":"2013-05-24 12:57:02.000000000","message":"The second patch removes it, but it\u0027s not necessary here either so I\u0027ll remove it.","commit_id":"d68392a911cf756890b19a69a69bafd60237ae53"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"a74ed018659d84428b35db5c64c09cf2c6b4f7e8","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            \u0027instance_uuids\u0027: instance_uuids,"},{"line_number":677,"context_line":"            \u0027block_device_mapping\u0027: block_device_mapping,"},{"line_number":678,"context_line":"            \u0027security_group\u0027: security_groups,"},{"line_number":679,"context_line":"        }"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"        return (instances, request_spec, filter_properties)"},{"line_number":682,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPH%2F%2Fuz4%3D","side":"PARENT","line":679,"updated":"2013-05-24 08:40:53.000000000","message":"I\u0027d love to clean this up even more, but I think we can do it later.  Ie, \u0027instance_properties\u0027 is really just a copy of the 1st instance...and you\u0027re now passing in all of the instances as a separate argument.","commit_id":"d68392a911cf756890b19a69a69bafd60237ae53"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"05b20bb3392105bd3be7b26c546e95ddaca1136e","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            \u0027instance_uuids\u0027: instance_uuids,"},{"line_number":677,"context_line":"            \u0027block_device_mapping\u0027: block_device_mapping,"},{"line_number":678,"context_line":"            \u0027security_group\u0027: security_groups,"},{"line_number":679,"context_line":"        }"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"        return (instances, request_spec, filter_properties)"},{"line_number":682,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPH%2F%2FuB4%3D","side":"PARENT","line":679,"in_reply_to":"AAAAPH%2F%2FuW4%3D","updated":"2013-05-24 15:18:26.000000000","message":"Cool :)  I like doing it while you\u0027re creating the whole new call.  Agree with completely removing request_spec.. (and rebuilding it for now on conductor side)","commit_id":"d68392a911cf756890b19a69a69bafd60237ae53"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"f26957c56b8ffd507b53521248c80973b5046dcf","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            \u0027instance_uuids\u0027: instance_uuids,"},{"line_number":677,"context_line":"            \u0027block_device_mapping\u0027: block_device_mapping,"},{"line_number":678,"context_line":"            \u0027security_group\u0027: security_groups,"},{"line_number":679,"context_line":"        }"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"        return (instances, request_spec, filter_properties)"},{"line_number":682,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPH%2F%2FuW4%3D","side":"PARENT","line":679,"in_reply_to":"AAAAPH%2F%2Fuz4%3D","updated":"2013-05-24 12:57:02.000000000","message":"Yeah, I definitely want to clean this up more.  If I felt confident on everything that\u0027s actually being used and for what I would modify it a bit.  But I haven\u0027t taken the time to figure it out yet, and since it doesn\u0027t change any APIs to modify what\u0027s in here I was going to put it off until later.\n\nBut now that I look it seems that block_device_mapping and security_group are worth pulling out and adding to the API.  And actually I\u0027m liking John\u0027s idea of building request_spec in the conductor even more now.  Going to see what doing away with this entirely looks like.","commit_id":"d68392a911cf756890b19a69a69bafd60237ae53"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"18a9897630203efc5e31195f8990ff93101f2fad","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    def compute_task_api(self):"},{"line_number":205,"context_line":"        if self._compute_task_api is None:"},{"line_number":206,"context_line":"            # TODO(alaski): Remove calls into here from conductor manager so"},{"line_number":207,"context_line":"            # that this isn\u0027t necessary. #1180540"},{"line_number":208,"context_line":"            from nova import conductor"},{"line_number":209,"context_line":"            self._compute_task_api \u003d conductor.ComputeTaskAPI()"},{"line_number":210,"context_line":"        return self._compute_task_api"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPH%2F%2FtQ4%3D","line":207,"updated":"2013-05-24 20:33:33.000000000","message":"Is this TODO for this patch or a future patch?","commit_id":"af63993d4cfb6905db9cd11afaa31180faa5c2ed"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"05f0852ff6407b7f553385444e8ce1be132dae7d","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    def compute_task_api(self):"},{"line_number":205,"context_line":"        if self._compute_task_api is None:"},{"line_number":206,"context_line":"            # TODO(alaski): Remove calls into here from conductor manager so"},{"line_number":207,"context_line":"            # that this isn\u0027t necessary. #1180540"},{"line_number":208,"context_line":"            from nova import conductor"},{"line_number":209,"context_line":"            self._compute_task_api \u003d conductor.ComputeTaskAPI()"},{"line_number":210,"context_line":"        return self._compute_task_api"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPH%2F%2FtHg%3D","line":207,"in_reply_to":"AAAAPH%2F%2FtQ4%3D","updated":"2013-05-24 23:54:31.000000000","message":"This is for a future patch.  It\u0027s going to take a non trivial amount of work to change this situation.","commit_id":"af63993d4cfb6905db9cd11afaa31180faa5c2ed"},{"author":{"_account_id":7758,"name":"David Xie","email":"david.scriptfan@gmail.com","username":"davidx"},"change_message_id":"5a02bc72ba8e3e4e0677d24fb3d5581b234b3a14","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        self.compute_rpcapi \u003d compute_rpcapi.ComputeAPI()"},{"line_number":200,"context_line":"        self._compute_task_api \u003d None"},{"line_number":201,"context_line":"        self.servicegroup_api \u003d servicegroup.API()"},{"line_number":202,"context_line":"        self._compute_task_api \u003d None"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        super(API, self).__init__(**kwargs)"},{"line_number":205,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAPH%2F%2FbtA%3D","line":202,"updated":"2013-06-04 02:36:03.000000000","message":"Same as line #200","commit_id":"9932df264d67cb5ecd4cc0adb2a563cecc86d3ab"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"0302c9bdcc90b4bdd0aa0e451349c319b80ef4b6","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        self.compute_rpcapi \u003d compute_rpcapi.ComputeAPI()"},{"line_number":200,"context_line":"        self._compute_task_api \u003d None"},{"line_number":201,"context_line":"        self.servicegroup_api \u003d servicegroup.API()"},{"line_number":202,"context_line":"        self._compute_task_api \u003d None"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        super(API, self).__init__(**kwargs)"},{"line_number":205,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAPX%2F%2F%2FJ8%3D","line":202,"in_reply_to":"AAAAPH%2F%2FbtA%3D","updated":"2013-06-04 14:32:45.000000000","message":"Nice catch.  Artifact from a rebase, but I\u0027m surprised it wasn\u0027t marked as a conflict.","commit_id":"9932df264d67cb5ecd4cc0adb2a563cecc86d3ab"},{"author":{"_account_id":7758,"name":"David Xie","email":"david.scriptfan@gmail.com","username":"davidx"},"change_message_id":"5a02bc72ba8e3e4e0677d24fb3d5581b234b3a14","unresolved":false,"context_lines":[{"line_number":715,"context_line":"        if not instance_type:"},{"line_number":716,"context_line":"            instance_type \u003d flavors.get_default_instance_type()"},{"line_number":717,"context_line":"        image_id, image \u003d self._get_image(context, image_href)"},{"line_number":718,"context_line":"        availability_zone, forced_host, forced_node \u003d \\"},{"line_number":719,"context_line":"                self._handle_availability_zone(availability_zone)"},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"        base_options \u003d self._validate_and_build_base_options(context,"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAPH%2F%2Fbs8%3D","line":718,"updated":"2013-06-04 02:36:03.000000000","message":"Isn\u0027t backslash forbidden?","commit_id":"9932df264d67cb5ecd4cc0adb2a563cecc86d3ab"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"0302c9bdcc90b4bdd0aa0e451349c319b80ef4b6","unresolved":false,"context_lines":[{"line_number":715,"context_line":"        if not instance_type:"},{"line_number":716,"context_line":"            instance_type \u003d flavors.get_default_instance_type()"},{"line_number":717,"context_line":"        image_id, image \u003d self._get_image(context, image_href)"},{"line_number":718,"context_line":"        availability_zone, forced_host, forced_node \u003d \\"},{"line_number":719,"context_line":"                self._handle_availability_zone(availability_zone)"},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"        base_options \u003d self._validate_and_build_base_options(context,"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAPX%2F%2F%2FIg%3D","line":718,"in_reply_to":"AAAAPH%2F%2Fbs8%3D","updated":"2013-06-04 14:32:45.000000000","message":"I wouldn\u0027t say forbidden, but in general should be avoided.  This was a copy as part of a refactor, but since I need to fix what you pointed out above I can go ahead and address this.","commit_id":"9932df264d67cb5ecd4cc0adb2a563cecc86d3ab"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b189a596cef7ed3e59c9fbbc8ca7bf3bfa7155f4","unresolved":false,"context_lines":[{"line_number":612,"context_line":"            \u0027config_drive\u0027: config_drive or \u0027\u0027,"},{"line_number":613,"context_line":"            \u0027user_id\u0027: context.user_id,"},{"line_number":614,"context_line":"            \u0027project_id\u0027: context.project_id,"},{"line_number":615,"context_line":"            \u0027launch_time\u0027: time.strftime(\u0027%Y-%m-%dT%H:%M:%SZ\u0027,"},{"line_number":616,"context_line":"                time.gmtime()),"},{"line_number":617,"context_line":"            \u0027instance_type_id\u0027: instance_type[\u0027id\u0027],"},{"line_number":618,"context_line":"            \u0027memory_mb\u0027: instance_type[\u0027memory_mb\u0027],"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPX%2F%2F%2Br0%3D","line":615,"updated":"2013-06-04 17:29:09.000000000","message":"I think Chris is removing this upstream right now. Perhaps we should avoid adding it back in?","commit_id":"9a9374fcb69e751c5785e90975bb4ce9c7f941f7"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"a7c5a8c75f04bf208c633d0b7b77beefe3e0dd39","unresolved":false,"context_lines":[{"line_number":612,"context_line":"            \u0027config_drive\u0027: config_drive or \u0027\u0027,"},{"line_number":613,"context_line":"            \u0027user_id\u0027: context.user_id,"},{"line_number":614,"context_line":"            \u0027project_id\u0027: context.project_id,"},{"line_number":615,"context_line":"            \u0027launch_time\u0027: time.strftime(\u0027%Y-%m-%dT%H:%M:%SZ\u0027,"},{"line_number":616,"context_line":"                time.gmtime()),"},{"line_number":617,"context_line":"            \u0027instance_type_id\u0027: instance_type[\u0027id\u0027],"},{"line_number":618,"context_line":"            \u0027memory_mb\u0027: instance_type[\u0027memory_mb\u0027],"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPX%2F%2F%2BpI%3D","line":615,"in_reply_to":"AAAAPX%2F%2F%2Bq0%3D","updated":"2013-06-04 17:43:39.000000000","message":"Yeah, sorry, I meant to warn of this too.  I didn\u0027t know which was going to land first.  Looks like mine just went in.","commit_id":"9a9374fcb69e751c5785e90975bb4ce9c7f941f7"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"bd7533c8940ce2b37d8b07d0b7482402e2882f16","unresolved":false,"context_lines":[{"line_number":612,"context_line":"            \u0027config_drive\u0027: config_drive or \u0027\u0027,"},{"line_number":613,"context_line":"            \u0027user_id\u0027: context.user_id,"},{"line_number":614,"context_line":"            \u0027project_id\u0027: context.project_id,"},{"line_number":615,"context_line":"            \u0027launch_time\u0027: time.strftime(\u0027%Y-%m-%dT%H:%M:%SZ\u0027,"},{"line_number":616,"context_line":"                time.gmtime()),"},{"line_number":617,"context_line":"            \u0027instance_type_id\u0027: instance_type[\u0027id\u0027],"},{"line_number":618,"context_line":"            \u0027memory_mb\u0027: instance_type[\u0027memory_mb\u0027],"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPX%2F%2F%2Bq0%3D","line":615,"in_reply_to":"AAAAPX%2F%2F%2Br0%3D","updated":"2013-06-04 17:37:45.000000000","message":"Definitely.  Looks like I\u0027m going to have to rebase after his patch merges anyways.","commit_id":"9a9374fcb69e751c5785e90975bb4ce9c7f941f7"}],"nova/conductor/api.py":[{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"6ae9a3aa01ead289164a3c97a3ff3e0fdaf0c957","unresolved":false,"context_lines":[{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def run_instance(self, context, request_spec, admin_password,"},{"line_number":347,"context_line":"            injected_files, requested_networks, filter_properties):"},{"line_number":348,"context_line":"        self._manager.run_instance(context, request_spec\u003drequest_spec,"},{"line_number":349,"context_line":"                admin_password\u003dadmin_password, injected_files\u003dinjected_files,"},{"line_number":350,"context_line":"                requested_networks\u003drequested_networks,"},{"line_number":351,"context_line":"                filter_properties\u003dfilter_properties)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAO3%2F%2F%2FnE%3D","line":348,"updated":"2013-05-15 10:13:24.000000000","message":"spawn here :)","commit_id":"f57ab90f974541cfd8afaba49bc5de54eeb61b32"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"a8f1b3cc3c01ff883c36caec674c6286ca48bcbd","unresolved":false,"context_lines":[{"line_number":691,"context_line":"    def __init__(self):"},{"line_number":692,"context_line":"        self.conductor_compute_rpcapi \u003d rpcapi.ComputeTaskAPI()"},{"line_number":693,"context_line":""},{"line_number":694,"context_line":"    def build_instance(self, context, instance, request_spec,"},{"line_number":695,"context_line":"            filter_properties, admin_password, injected_files,"},{"line_number":696,"context_line":"            requested_networks):"},{"line_number":697,"context_line":"        self.conductor_compute_rpcapi.build_instance(context,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAPH%2F%2FxDc%3D","line":694,"updated":"2013-05-23 15:08:55.000000000","message":"pluralize to build_instances?","commit_id":"749a29a214e2beceb457b12e550e110378c0924c"}],"nova/conductor/manager.py":[{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"a8f1b3cc3c01ff883c36caec674c6286ca48bcbd","unresolved":false,"context_lines":[{"line_number":461,"context_line":"        self.compute_api.unrescue(context, instance)"},{"line_number":462,"context_line":""},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"class ComputeTaskManager(object):"},{"line_number":465,"context_line":"    \"\"\"Namespace for compute methods."},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"    This class presents an rpc API for nova-conductor under the \u0027compute_task\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAPH%2F%2FxDA%3D","line":464,"updated":"2013-05-23 15:08:55.000000000","message":"I think it would be nice to pull this class out into a separate module.  It would be easier to read and have a shorter import list","commit_id":"749a29a214e2beceb457b12e550e110378c0924c"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"a8f1b3cc3c01ff883c36caec674c6286ca48bcbd","unresolved":false,"context_lines":[{"line_number":480,"context_line":"            filter_properties, admin_password, injected_files,"},{"line_number":481,"context_line":"            requested_networks):"},{"line_number":482,"context_line":"        request_spec[\u0027instance_uuids\u0027] \u003d [instance[\u0027uuid\u0027]]"},{"line_number":483,"context_line":"        self.scheduler_rpcapi.run_instance(context, request_spec\u003drequest_spec,"},{"line_number":484,"context_line":"                admin_password\u003dadmin_password, injected_files\u003dinjected_files,"},{"line_number":485,"context_line":"                requested_networks\u003drequested_networks, is_first_time\u003dTrue,"},{"line_number":486,"context_line":"                filter_properties\u003dfilter_properties)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAPH%2F%2Fw%2Fo%3D","line":483,"updated":"2013-05-23 15:08:55.000000000","message":"Do we need logic here to talk to cells rather than just directly scheduling?","commit_id":"749a29a214e2beceb457b12e550e110378c0924c"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"7a13839fcc08be6b1a6e473569343ce4412c2a6e","unresolved":false,"context_lines":[{"line_number":483,"context_line":"        request_spec \u003d scheduler_utils.build_request_spec(image, instances)"},{"line_number":484,"context_line":"        # NOTE(alaski): For compatibility until a new scheduler method is used."},{"line_number":485,"context_line":"        request_spec.update({\u0027block_device_mapping\u0027: block_device_mapping,"},{"line_number":486,"context_line":"                \u0027security_group\u0027: security_groups})"},{"line_number":487,"context_line":"        self.scheduler_rpcapi.run_instance(context, request_spec\u003drequest_spec,"},{"line_number":488,"context_line":"                admin_password\u003dadmin_password, injected_files\u003dinjected_files,"},{"line_number":489,"context_line":"                requested_networks\u003drequested_networks, is_first_time\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPH%2F%2Fh8M%3D","line":486,"updated":"2013-05-31 05:54:22.000000000","message":"would look nicer lined up with previous line :)","commit_id":"bf353b36613192bee508a7aa4284a74fbc12dcd5"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"a2f14b1bb62f01f13f757ecda0215ef1a6e17cb3","unresolved":false,"context_lines":[{"line_number":483,"context_line":"        request_spec \u003d scheduler_utils.build_request_spec(image, instances)"},{"line_number":484,"context_line":"        # NOTE(alaski): For compatibility until a new scheduler method is used."},{"line_number":485,"context_line":"        request_spec.update({\u0027block_device_mapping\u0027: block_device_mapping,"},{"line_number":486,"context_line":"                \u0027security_group\u0027: security_groups})"},{"line_number":487,"context_line":"        self.scheduler_rpcapi.run_instance(context, request_spec\u003drequest_spec,"},{"line_number":488,"context_line":"                admin_password\u003dadmin_password, injected_files\u003dinjected_files,"},{"line_number":489,"context_line":"                requested_networks\u003drequested_networks, is_first_time\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPH%2F%2FhHA%3D","line":486,"in_reply_to":"AAAAPH%2F%2Fh8M%3D","updated":"2013-05-31 13:14:47.000000000","message":":) Can do.  I\u0027m always torn about whether to line up for neatness or go with the default multiline spacing.","commit_id":"bf353b36613192bee508a7aa4284a74fbc12dcd5"}],"nova/conductor/rpcapi.py":[{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"a8f1b3cc3c01ff883c36caec674c6286ca48bcbd","unresolved":false,"context_lines":[{"line_number":459,"context_line":"                topic\u003dCONF.conductor.topic,"},{"line_number":460,"context_line":"                default_version\u003dself.BASE_RPC_API_VERSION)"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":"    def build_instance(self, context, instance, request_spec,"},{"line_number":463,"context_line":"            filter_properties, admin_password, injected_files,"},{"line_number":464,"context_line":"            requested_networks):"},{"line_number":465,"context_line":"        msg \u003d self.make_msg(\u0027build_instance\u0027, instance\u003dinstance,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAPH%2F%2FxCk%3D","line":462,"updated":"2013-05-23 15:08:55.000000000","message":"pluralize?","commit_id":"749a29a214e2beceb457b12e550e110378c0924c"}],"nova/scheduler/utils.py":[{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"7a13839fcc08be6b1a6e473569343ce4412c2a6e","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"Utility methods for scheduling\"\"\""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from nova.compute import flavors"},{"line_number":18,"context_line":"from nova.openstack.common import jsonutils"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPH%2F%2Fh74%3D","line":15,"updated":"2013-05-31 05:54:22.000000000","message":"our hacking check should have failed on this i think..  1 line doc strings should end in periods?","commit_id":"bf353b36613192bee508a7aa4284a74fbc12dcd5"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"a2f14b1bb62f01f13f757ecda0215ef1a6e17cb3","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"Utility methods for scheduling\"\"\""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from nova.compute import flavors"},{"line_number":18,"context_line":"from nova.openstack.common import jsonutils"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPH%2F%2FhG8%3D","line":15,"in_reply_to":"AAAAPH%2F%2Fh74%3D","updated":"2013-05-31 13:14:47.000000000","message":"Maybe because it\u0027s not attached to a method?  Will fix.","commit_id":"bf353b36613192bee508a7aa4284a74fbc12dcd5"}],"nova/tests/cells/test_cells_scheduler.py":[{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"a78f05040dd90aee420136f378ad9a27912e3df3","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def setUp(self):"},{"line_number":61,"context_line":"        super(CellsSchedulerTestCase, self).setUp()"},{"line_number":62,"context_line":"        self.flags(scheduler_filter_classes\u003d[], scheduler_weight_classes\u003d[],"},{"line_number":63,"context_line":"                   group\u003d\u0027cells\u0027)"},{"line_number":64,"context_line":"        self._init_cells_scheduler()"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPH%2F%2Fllk%3D","line":62,"updated":"2013-05-29 21:30:28.000000000","message":"Using mutable default arguments is dangerous in Python.  It would be better to use None as a sentinel value and reassign to [] in an if statement.","commit_id":"bf353b36613192bee508a7aa4284a74fbc12dcd5"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"7a13839fcc08be6b1a6e473569343ce4412c2a6e","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def setUp(self):"},{"line_number":61,"context_line":"        super(CellsSchedulerTestCase, self).setUp()"},{"line_number":62,"context_line":"        self.flags(scheduler_filter_classes\u003d[], scheduler_weight_classes\u003d[],"},{"line_number":63,"context_line":"                   group\u003d\u0027cells\u0027)"},{"line_number":64,"context_line":"        self._init_cells_scheduler()"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPH%2F%2Fh7w%3D","line":62,"in_reply_to":"AAAAPH%2F%2FlcE%3D","updated":"2013-05-31 05:54:22.000000000","message":"ya, those aren\u0027t default kwargs... or default anything.  They are explicit assignments of CONF settings.","commit_id":"bf353b36613192bee508a7aa4284a74fbc12dcd5"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"0fc164e22e9e4e3b044355542784d6a6e3b0865e","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def setUp(self):"},{"line_number":61,"context_line":"        super(CellsSchedulerTestCase, self).setUp()"},{"line_number":62,"context_line":"        self.flags(scheduler_filter_classes\u003d[], scheduler_weight_classes\u003d[],"},{"line_number":63,"context_line":"                   group\u003d\u0027cells\u0027)"},{"line_number":64,"context_line":"        self._init_cells_scheduler()"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPH%2F%2FlcE%3D","line":62,"in_reply_to":"AAAAPH%2F%2Fllk%3D","updated":"2013-05-29 22:18:45.000000000","message":"I definitely agree, and have caught a few reviews doing that.  But this line is passing in arguments, not defining default arguments, and is outside of my changeset.\n\nI\u0027ll look over my other changes to see if I\u0027ve done this somewhere inadvertently though.","commit_id":"bf353b36613192bee508a7aa4284a74fbc12dcd5"}],"nova/tests/conductor/test_conductor.py":[{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"18a9897630203efc5e31195f8990ff93101f2fad","unresolved":false,"context_lines":[{"line_number":1169,"context_line":"                requested_networks\u003d\u0027requested_networks\u0027, is_first_time\u003dTrue,"},{"line_number":1170,"context_line":"                filter_properties\u003d{})"},{"line_number":1171,"context_line":"        self.mox.ReplayAll()"},{"line_number":1172,"context_line":"        # TODO(alaski): This should really have a helper method"},{"line_number":1173,"context_line":"        system_metadata \u003d ["},{"line_number":1174,"context_line":"                {\u0027key\u0027: \u0027instance_type_id\u0027, \u0027value\u0027: 1},"},{"line_number":1175,"context_line":"                {\u0027key\u0027: \u0027instance_type_name\u0027, \u0027value\u0027: \u0027fake\u0027},"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPH%2F%2FtRI%3D","line":1172,"updated":"2013-05-24 20:33:33.000000000","message":"This is your reminder to finish this TODO.","commit_id":"af63993d4cfb6905db9cd11afaa31180faa5c2ed"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"05f0852ff6407b7f553385444e8ce1be132dae7d","unresolved":false,"context_lines":[{"line_number":1169,"context_line":"                requested_networks\u003d\u0027requested_networks\u0027, is_first_time\u003dTrue,"},{"line_number":1170,"context_line":"                filter_properties\u003d{})"},{"line_number":1171,"context_line":"        self.mox.ReplayAll()"},{"line_number":1172,"context_line":"        # TODO(alaski): This should really have a helper method"},{"line_number":1173,"context_line":"        system_metadata \u003d ["},{"line_number":1174,"context_line":"                {\u0027key\u0027: \u0027instance_type_id\u0027, \u0027value\u0027: 1},"},{"line_number":1175,"context_line":"                {\u0027key\u0027: \u0027instance_type_name\u0027, \u0027value\u0027: \u0027fake\u0027},"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPH%2F%2Fs%2F8%3D","line":1172,"in_reply_to":"AAAAPH%2F%2FtRI%3D","updated":"2013-05-24 23:54:31.000000000","message":"Thanks.  Turns out there are already some methods that will take care of this.","commit_id":"af63993d4cfb6905db9cd11afaa31180faa5c2ed"}],"nova/utils.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"c1b3a82cf6710c7c579eabb448d2ddb618c79dd4","unresolved":false,"context_lines":[{"line_number":1114,"context_line":"        raise exception.InvalidInput(message\u003dmsg)"},{"line_number":1115,"context_line":""},{"line_number":1116,"context_line":""},{"line_number":1117,"context_line":"def spawn(func, *args, **kwargs):"},{"line_number":1118,"context_line":"    \"\"\"Passthrough method for eventlet.spawn."},{"line_number":1119,"context_line":""},{"line_number":1120,"context_line":"    This utility exists so that it can be stubbed for testing without"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAO3%2F%2F%2Fvk%3D","line":1117,"updated":"2013-05-15 09:53:03.000000000","message":"Maybe these could be decorators? I wonder about having another conductor API, like local call but on a thread.","commit_id":"f57ab90f974541cfd8afaba49bc5de54eeb61b32"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"f0325002940f8fd2bb3db2302539490d0a720f8e","unresolved":false,"context_lines":[{"line_number":1114,"context_line":"        raise exception.InvalidInput(message\u003dmsg)"},{"line_number":1115,"context_line":""},{"line_number":1116,"context_line":""},{"line_number":1117,"context_line":"def spawn(func, *args, **kwargs):"},{"line_number":1118,"context_line":"    \"\"\"Passthrough method for eventlet.spawn."},{"line_number":1119,"context_line":""},{"line_number":1120,"context_line":"    This utility exists so that it can be stubbed for testing without"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAO3%2F%2F%2BDg%3D","line":1117,"in_reply_to":"AAAAO3%2F%2F%2Boc%3D","updated":"2013-05-15 21:54:59.000000000","message":"I messed around with decorators for a bit, but couldn\u0027t work out how to get them in line for testing.  You can\u0027t really stub out a wrapper as far as I could figure out, so I didn\u0027t come up with a way to have tests be async without getting too intrusive.","commit_id":"f57ab90f974541cfd8afaba49bc5de54eeb61b32"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"479fdebec52254a4deebd3a92fbb01beaa903b8d","unresolved":false,"context_lines":[{"line_number":1114,"context_line":"        raise exception.InvalidInput(message\u003dmsg)"},{"line_number":1115,"context_line":""},{"line_number":1116,"context_line":""},{"line_number":1117,"context_line":"def spawn(func, *args, **kwargs):"},{"line_number":1118,"context_line":"    \"\"\"Passthrough method for eventlet.spawn."},{"line_number":1119,"context_line":""},{"line_number":1120,"context_line":"    This utility exists so that it can be stubbed for testing without"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAO3%2F%2F%2Boc%3D","line":1117,"in_reply_to":"AAAAO3%2F%2F%2Fvk%3D","updated":"2013-05-15 19:26:24.000000000","message":"A decorator is interesting.  I\u0027ll play around with that a bit.","commit_id":"f57ab90f974541cfd8afaba49bc5de54eeb61b32"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"f4ae7391c086f9f13d6943e04de1f82420ed776d","unresolved":false,"context_lines":[{"line_number":1123,"context_line":"    eventlet.spawn(func, *args, **kwargs)"},{"line_number":1124,"context_line":""},{"line_number":1125,"context_line":""},{"line_number":1126,"context_line":"def spawn_and_wait(func, *args, **kwargs):"},{"line_number":1127,"context_line":"    gt \u003d eventlet.spawn(func, *args, **kwargs)"},{"line_number":1128,"context_line":"    return gt.wait()"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAO3%2F%2F760%3D","line":1126,"updated":"2013-05-16 18:09:43.000000000","message":"This is functionally equivalent to just:  return func(*args, **kwargs)  so I don\u0027t think we need to have this here.\n\nYou could just make your stub in return func() in your fake module.","commit_id":"7dba4679c96439f459daee31d57723365dc861a1"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"a74ed018659d84428b35db5c64c09cf2c6b4f7e8","unresolved":false,"context_lines":[{"line_number":1101,"context_line":"    This utility exists so that it can be stubbed for testing without"},{"line_number":1102,"context_line":"    interfering with the service spawns."},{"line_number":1103,"context_line":"    \"\"\""},{"line_number":1104,"context_line":"    eventlet.spawn(func, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPH%2F%2FuzY%3D","line":1104,"updated":"2013-05-24 08:40:53.000000000","message":"Technically this should return the value.. so caller can get the greenthread.  But that brought another thought to my mind... technically you don\u0027t care about a response from the greenthread for the Local case, so this should really be a spawn_n()... Heh.","commit_id":"8a4b41611be884682130660ad00318996a374e82"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"f26957c56b8ffd507b53521248c80973b5046dcf","unresolved":false,"context_lines":[{"line_number":1101,"context_line":"    This utility exists so that it can be stubbed for testing without"},{"line_number":1102,"context_line":"    interfering with the service spawns."},{"line_number":1103,"context_line":"    \"\"\""},{"line_number":1104,"context_line":"    eventlet.spawn(func, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPH%2F%2FuVo%3D","line":1104,"in_reply_to":"AAAAPH%2F%2FuzY%3D","updated":"2013-05-24 12:57:02.000000000","message":"Good call.  This is a holdover from trying to inject a wait() for testing purposes.  spawn_n makes more sense for my purposes.","commit_id":"8a4b41611be884682130660ad00318996a374e82"}]}
