)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"4dfaf4c29b43e875239a97fb70e61130ef35e451","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix upgrades by implementing indirection_api"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When an object is received in an incompatible version,"},{"line_number":10,"context_line":"IncompatibleObjectVersion is raised. Implementation of the indirection API"},{"line_number":11,"context_line":"allows the object to be backported to a supported version by the conductor."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"ba15a1d1_6866612b","line":9,"updated":"2015-09-17 19:18:26.000000000","message":"Can a better description be done for this? Maybe some information from the bug report. At the moment I don\u0027t understand what this patch is doing from this commit message.","commit_id":"fde824ff93efc5b9180babf3e5fd7666c512db18"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"b45254051775b2ca05909057e616ffa689c86c8d","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix upgrades by implementing indirection_api"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When an object is received in an incompatible version,"},{"line_number":10,"context_line":"IncompatibleObjectVersion is raised. Implementation of the indirection API"},{"line_number":11,"context_line":"allows the object to be backported to a supported version by the conductor."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"ba15a1d1_c0cdf266","line":9,"in_reply_to":"ba15a1d1_6866612b","updated":"2015-09-18 08:04:27.000000000","message":"Done","commit_id":"fde824ff93efc5b9180babf3e5fd7666c512db18"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"37595df08fab70471e1e20833292b9fc7c7dbe50","unresolved":false,"context_lines":[{"line_number":11,"context_line":"version, IncompatibleObjectVersion is raised. Implementation of the"},{"line_number":12,"context_line":"indirection API allows the object to be backported to a supported version"},{"line_number":13,"context_line":"by the conductor (conductor has to be the first service to be upgraded)."},{"line_number":14,"context_line":"I\u0027m not enabling RPC calls on object methods just yet, because they cause"},{"line_number":15,"context_line":"random timeouts on the CI gates. RPC calls made via the indirection_api"},{"line_number":16,"context_line":"should be enabled one-by-one, when the implications are fully understood."},{"line_number":17,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"ba15a1d1_0ef8bb7b","line":14,"updated":"2015-09-21 13:23:38.000000000","message":"I\u0027d rather this says explicitly that you\u0027re removing the remoteable decorators (and thus not enabling object RPC calls yet).\n\nAnd probably explain more of the \"why\" here; the fact that @remoteable doesn\u0027t actually do anything without this code, and that suddenly making @remoteable do things is apparently broken :)","commit_id":"333a63e0b6895f843bc84f373882a36e754be636"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"116cbaad490ed835a7a4d83d79dae79e5f566fea","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Grzegorz Grasza \u003cgrzegorz.grasza@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-09-22 10:04:11 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix rolling upgrades by implementing indirection_api"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"During a rolling upgrade, ironic conductor and api services are running"},{"line_number":10,"context_line":"with different versions. When an object is received in an incompatible"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"ba15a1d1_6357cd02","line":7,"updated":"2015-09-22 15:08:32.000000000","message":"This is not very accurate, and so I think it should just be \"Implement indirection_api\" or something like that.","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"b5403f62fb2ca62a1d1451cab952e5a0f623c352","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Grzegorz Grasza \u003cgrzegorz.grasza@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-09-22 10:04:11 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix rolling upgrades by implementing indirection_api"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"During a rolling upgrade, ironic conductor and api services are running"},{"line_number":10,"context_line":"with different versions. When an object is received in an incompatible"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"ba15a1d1_39ca646f","line":7,"in_reply_to":"ba15a1d1_6357cd02","updated":"2015-09-22 15:51:02.000000000","message":"Done","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"39b0f236fcf5e70cf3bcf87183ef5f1279e19b71","unresolved":false,"context_lines":[{"line_number":20,"context_line":"(probably due to a race in which Nova calls the ironic-api service before"},{"line_number":21,"context_line":"ironic-conductor is up). RPC calls made via the indirection_api should"},{"line_number":22,"context_line":"be enabled one-by-one, when the implications are fully understood."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Change-Id: Ia381348da93f95d764c83f3ec2a2ed5a1db5ad6d"},{"line_number":25,"context_line":"Closes-Bug: 1493816"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"ba15a1d1_55ea6dad","line":23,"updated":"2015-09-22 20:25:57.000000000","message":"Somewhere, not sure where, we ought to document that this doesn\u0027t fix rolling upgrades prior to Liberty. And that this lays the foundation to be able to do rolling upgrades of Liberty (or from this patch onwards) to Mitaka (or whenever we fix the rest of the stuff that needs to be fixed).","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"53110be4dac284b97cd2f0f4f4f6cc5e709d9d02","unresolved":false,"context_lines":[{"line_number":20,"context_line":"(probably due to a race in which Nova calls the ironic-api service before"},{"line_number":21,"context_line":"ironic-conductor is up). RPC calls made via the indirection_api should"},{"line_number":22,"context_line":"be enabled one-by-one, when the implications are fully understood."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Change-Id: Ia381348da93f95d764c83f3ec2a2ed5a1db5ad6d"},{"line_number":25,"context_line":"Closes-Bug: 1493816"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"ba15a1d1_027b4e29","line":23,"in_reply_to":"ba15a1d1_55ea6dad","updated":"2015-09-23 09:27:13.000000000","message":"Done","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"6c84d4a710a1cfec1effd802272460561ee4e69c","unresolved":false,"context_lines":[{"line_number":27,"context_line":"be enabled one-by-one, when the implications are fully understood."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: Ia381348da93f95d764c83f3ec2a2ed5a1db5ad6d"},{"line_number":30,"context_line":"Closes-Bug: 1493816"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"ba15a1d1_a93d9b90","line":30,"updated":"2015-09-23 12:23:45.000000000","message":"Because we are removing all decorators, does it mean that bug is closed ?  IIUC, this patch doesn\u0027t solve any actual problem, but it is providing a framework for which it can be expanded in future to solve the problem (by enabling the decorators). Shouldn\u0027t this be partial bug then ?","commit_id":"b59e01d6ad5190715557442bef4e92523d80a050"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"36a40439f9ecf3d8c22cdd8852d637d5d83d099e","unresolved":false,"context_lines":[{"line_number":27,"context_line":"be enabled one-by-one, when the implications are fully understood."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: Ia381348da93f95d764c83f3ec2a2ed5a1db5ad6d"},{"line_number":30,"context_line":"Closes-Bug: 1493816"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"ba15a1d1_ef1ab3c5","line":30,"in_reply_to":"ba15a1d1_a93d9b90","updated":"2015-09-23 13:10:56.000000000","message":"Well, without this patch, any object version change raises the IncompatibleObjectVersion exception. So the current situation looks like the framework is already in use (objects are versioned), but the backport functionality is missing.\n\nThe bug report pertains only to the backport mechanism of the indirection API.\n\nEnabling remotable calls is another functionality of indirection_api - this patch comments out the decorators to not change the current behavior.","commit_id":"b59e01d6ad5190715557442bef4e92523d80a050"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"8ace6baf6b57c5e89de6f6abcd08d0ebaad656a0","unresolved":false,"context_lines":[{"line_number":27,"context_line":"be enabled one-by-one, when the implications are fully understood."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: Ia381348da93f95d764c83f3ec2a2ed5a1db5ad6d"},{"line_number":30,"context_line":"Closes-Bug: 1493816"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"ba15a1d1_4197f347","line":30,"in_reply_to":"ba15a1d1_ef1ab3c5","updated":"2015-09-23 14:02:18.000000000","message":"I think we might want either 1. a more general \u0027rolling-upgrade doesn\u0027t work\u0027 bug to cover all the remaining things that need to be done to have it work; 2. separate rolling-upgrade bugs for each thing that needs to be done to have it done.\n\nAlmost seems like we need a spec but I don\u0027t want to go there.","commit_id":"b59e01d6ad5190715557442bef4e92523d80a050"}],"ironic/cmd/api.py":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"822e8665081c1f8d2ddd3efa21f1009d84f49c0e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# coding\u003dutf-8"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 Hewlett-Packard Development Company, L.P."},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_c4241861","line":1,"updated":"2015-09-18 14:33:23.000000000","message":"Why is this changed?","commit_id":"d6270dea4c0526f4d55bd7676639b86c20bc6fb6"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"880e0b438a4b22f7668caba86777ddddebde8f9f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# coding\u003dutf-8"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 Hewlett-Packard Development Company, L.P."},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_8744e249","line":1,"in_reply_to":"ba15a1d1_c4241861","updated":"2015-09-18 14:51:04.000000000","message":"No particular reason (reverting this change).","commit_id":"d6270dea4c0526f4d55bd7676639b86c20bc6fb6"}],"ironic/conductor/manager.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"90d788a702ee050bc85a3cf38f340d7c2cf4e734","unresolved":false,"context_lines":[{"line_number":2031,"context_line":""},{"line_number":2032,"context_line":"        return driver.raid.get_logical_disk_properties()"},{"line_number":2033,"context_line":""},{"line_number":2034,"context_line":"    def _object_dispatch(self, target, method, context, args, kwargs):"},{"line_number":2035,"context_line":"        \"\"\"Dispatch a call to an object method."},{"line_number":2036,"context_line":""},{"line_number":2037,"context_line":"        This ensures that object methods get called and any exception"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_6cebbcdc","line":2034,"updated":"2015-09-18 12:38:31.000000000","message":"This will require args and kwargs to be a list and a dictionary when calling functions, maybe use *args, **kwargs instead here and in 2 following functions?","commit_id":"847ae3943a402add572e314122030400a269695f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"fb210ec976c529aae8ea376b2b0e252c6f71f666","unresolved":false,"context_lines":[{"line_number":2031,"context_line":""},{"line_number":2032,"context_line":"        return driver.raid.get_logical_disk_properties()"},{"line_number":2033,"context_line":""},{"line_number":2034,"context_line":"    def _object_dispatch(self, target, method, context, args, kwargs):"},{"line_number":2035,"context_line":"        \"\"\"Dispatch a call to an object method."},{"line_number":2036,"context_line":""},{"line_number":2037,"context_line":"        This ensures that object methods get called and any exception"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_fdcbf4a1","line":2034,"in_reply_to":"ba15a1d1_6cebbcdc","updated":"2015-09-18 13:47:03.000000000","message":"This mirrors the RPC arguments, and RPC methods don\u0027t support the use of *args and **kwargs. Apart from that, I want it to be consistent with what you will encounter in other projects (Nova, Magnum...)","commit_id":"847ae3943a402add572e314122030400a269695f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2ce58952bbd750ab4a77af2528a115d19a845d83","unresolved":false,"context_lines":[{"line_number":2031,"context_line":""},{"line_number":2032,"context_line":"        return driver.raid.get_logical_disk_properties()"},{"line_number":2033,"context_line":""},{"line_number":2034,"context_line":"    def _object_dispatch(self, target, method, context, args, kwargs):"},{"line_number":2035,"context_line":"        \"\"\"Dispatch a call to an object method."},{"line_number":2036,"context_line":""},{"line_number":2037,"context_line":"        This ensures that object methods get called and any exception"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_743daf29","line":2034,"in_reply_to":"ba15a1d1_fdcbf4a1","updated":"2015-09-18 18:35:34.000000000","message":"Just to be clear, this is a defined API from the o.vo library. You can\u0027t change it.\n\nThis RPC method is called mechanically from the remotable decorators, which formulate args and kwargs appropriately. We don\u0027t want these RPC methods to actually take the args and kwargs of the calls we\u0027re making, but rather just pass them through for dispatching. If we made these *args and **kwargs here, the RPC signature of these methods would be not strictly defined, and change with each call that is proxied through this.","commit_id":"847ae3943a402add572e314122030400a269695f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"dbe11562b3c07fc5803b8d45e046ffe114c54d7f","unresolved":false,"context_lines":[{"line_number":2046,"context_line":"            raise messaging.ExpectedException()"},{"line_number":2047,"context_line":""},{"line_number":2048,"context_line":"    def object_class_action(self, context, objname, objmethod,"},{"line_number":2049,"context_line":"                            objver, args, kwargs):"},{"line_number":2050,"context_line":"        \"\"\"Perform an action on a VersionedObject class."},{"line_number":2051,"context_line":""},{"line_number":2052,"context_line":"        :param context: The context within which to perform the action"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba15a1d1_f9653a44","line":2049,"updated":"2015-09-18 18:19:46.000000000","message":"Note that I\u0027m in the middle of trying to deprecate this. I\u0027ve not landed the patch to add the new method yet because of the freeze. If this patch isn\u0027t going to land in Ironic presently, it would be good to wait and just implement the new method once it\u0027s available in the base class:\n\nhttps://review.openstack.org/#/c/224861/1/oslo_versionedobjects/base.py,cm","commit_id":"7517896105d5e04c6bea3914f84e59cd7f5ba007"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c3c8ae5c4b6b2e6901fffab25e9e270a7681b0e7","unresolved":false,"context_lines":[{"line_number":2046,"context_line":"            raise messaging.ExpectedException()"},{"line_number":2047,"context_line":""},{"line_number":2048,"context_line":"    def object_class_action(self, context, objname, objmethod,"},{"line_number":2049,"context_line":"                            objver, args, kwargs):"},{"line_number":2050,"context_line":"        \"\"\"Perform an action on a VersionedObject class."},{"line_number":2051,"context_line":""},{"line_number":2052,"context_line":"        :param context: The context within which to perform the action"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba15a1d1_db991121","line":2049,"in_reply_to":"ba15a1d1_33cf38b5","updated":"2015-09-21 17:16:30.000000000","message":"You\u0027re correct that the liberty code needs to make the backport call in order for a Mitaka conductor to do the backport. I was thinking about the manager changes specifically being essentially dead code in liberty, but if the desire is to merge the client and server bits together then that\u0027s fine.","commit_id":"7517896105d5e04c6bea3914f84e59cd7f5ba007"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0d4948aa0344ff59bc106bbe32e8a0a85d183902","unresolved":false,"context_lines":[{"line_number":2046,"context_line":"            raise messaging.ExpectedException()"},{"line_number":2047,"context_line":""},{"line_number":2048,"context_line":"    def object_class_action(self, context, objname, objmethod,"},{"line_number":2049,"context_line":"                            objver, args, kwargs):"},{"line_number":2050,"context_line":"        \"\"\"Perform an action on a VersionedObject class."},{"line_number":2051,"context_line":""},{"line_number":2052,"context_line":"        :param context: The context within which to perform the action"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba15a1d1_ca2165b6","line":2049,"in_reply_to":"ba15a1d1_69f86a4a","updated":"2015-09-20 03:33:05.000000000","message":"Just to be clear, getting it into liberty would be for kilo-\u003eliberty mixed version upgrades. Is that something that is likely to work given the RPC issues we identified and the fact that none of these objects have been tested with remotable methods yet? If so, then that makes sense to me.\n\nIf not, then it\u0027s really landing it in Mitaka that is required to make Liberty-\u003eMitaka upgrades work.\n\nAlso, for backports the critical bit is making sure that the manager-side RPC dispatchers use a serializer that is objects-enabled and have the indirection api set. I don\u0027t see that in this patch, but I\u0027m not super familiar with the Ironic layout. Can you point me at which calls coming from and to a service will be deserialized in the context where backports will be executed?","commit_id":"7517896105d5e04c6bea3914f84e59cd7f5ba007"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"2794234360a656445af08375f15d0ffe33335a58","unresolved":false,"context_lines":[{"line_number":2046,"context_line":"            raise messaging.ExpectedException()"},{"line_number":2047,"context_line":""},{"line_number":2048,"context_line":"    def object_class_action(self, context, objname, objmethod,"},{"line_number":2049,"context_line":"                            objver, args, kwargs):"},{"line_number":2050,"context_line":"        \"\"\"Perform an action on a VersionedObject class."},{"line_number":2051,"context_line":""},{"line_number":2052,"context_line":"        :param context: The context within which to perform the action"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba15a1d1_33cf38b5","line":2049,"in_reply_to":"ba15a1d1_ca2165b6","updated":"2015-09-20 11:28:29.000000000","message":"As I understand it, to be able to port objects from Liberty to Mitaka, the Liberty version should have code that calls the backport RPC method. Without it, Liberty code will just throw IncompatibleObjectVersion.\n\nIf this patch doesn\u0027t make it, in Mitaka we can try implementing something like compatibility mode from Cinder (it didn\u0027t make the Liberty release though), which would backport objects to their Liberty versions before sending them to an older service, thus supporting upgrades from Liberty to Mitaka.\n\nThe serializer is already connected in conductor/rpcapi.py and common/service.py\n\nExample object which is passed over RPC is Node in the update_node call.","commit_id":"7517896105d5e04c6bea3914f84e59cd7f5ba007"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"c6810dd8b2f248c8892027116f629c83ea4d9bf8","unresolved":false,"context_lines":[{"line_number":2046,"context_line":"            raise messaging.ExpectedException()"},{"line_number":2047,"context_line":""},{"line_number":2048,"context_line":"    def object_class_action(self, context, objname, objmethod,"},{"line_number":2049,"context_line":"                            objver, args, kwargs):"},{"line_number":2050,"context_line":"        \"\"\"Perform an action on a VersionedObject class."},{"line_number":2051,"context_line":""},{"line_number":2052,"context_line":"        :param context: The context within which to perform the action"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba15a1d1_69f86a4a","line":2049,"in_reply_to":"ba15a1d1_f9653a44","updated":"2015-09-19 20:10:34.000000000","message":"I would like to get this patch into liberty, since without it, the liberty api service will not backport objects.\n\nBut thanks for the heads up, I will follow this with a patch implementing the new method.","commit_id":"7517896105d5e04c6bea3914f84e59cd7f5ba007"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"dbe11562b3c07fc5803b8d45e046ffe114c54d7f","unresolved":false,"context_lines":[{"line_number":2100,"context_line":"        updates[\u0027obj_what_changed\u0027] \u003d objinst.obj_what_changed()"},{"line_number":2101,"context_line":"        return updates, result"},{"line_number":2102,"context_line":""},{"line_number":2103,"context_line":"    def object_backport(self, context, objinst, target_version):"},{"line_number":2104,"context_line":"        \"\"\"Perform a backport of an object instance to a specified version."},{"line_number":2105,"context_line":""},{"line_number":2106,"context_line":"        The default behavior of the base VersionedObjectSerializer, upon"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba15a1d1_391ad2c6","line":2103,"updated":"2015-09-18 18:19:46.000000000","message":"This method is now deprecated in o.vo (although the warning for it hasn\u0027t landed yet). Please use the new method from the start to avoid having to clean up this baggage later:\n\nhttps://review.openstack.org/#/c/224863/1/oslo_versionedobjects/base.py,cm","commit_id":"7517896105d5e04c6bea3914f84e59cd7f5ba007"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"c6810dd8b2f248c8892027116f629c83ea4d9bf8","unresolved":false,"context_lines":[{"line_number":2100,"context_line":"        updates[\u0027obj_what_changed\u0027] \u003d objinst.obj_what_changed()"},{"line_number":2101,"context_line":"        return updates, result"},{"line_number":2102,"context_line":""},{"line_number":2103,"context_line":"    def object_backport(self, context, objinst, target_version):"},{"line_number":2104,"context_line":"        \"\"\"Perform a backport of an object instance to a specified version."},{"line_number":2105,"context_line":""},{"line_number":2106,"context_line":"        The default behavior of the base VersionedObjectSerializer, upon"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba15a1d1_698f0acd","line":2103,"in_reply_to":"ba15a1d1_391ad2c6","updated":"2015-09-19 20:10:34.000000000","message":"Ok, I started this patch when o.vo was not yet fully integrated into Ironic. I will do as you suggest.","commit_id":"7517896105d5e04c6bea3914f84e59cd7f5ba007"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0d4948aa0344ff59bc106bbe32e8a0a85d183902","unresolved":false,"context_lines":[{"line_number":2100,"context_line":"        updates[\u0027obj_what_changed\u0027] \u003d objinst.obj_what_changed()"},{"line_number":2101,"context_line":"        return updates, result"},{"line_number":2102,"context_line":""},{"line_number":2103,"context_line":"    def object_backport(self, context, objinst, target_version):"},{"line_number":2104,"context_line":"        \"\"\"Perform a backport of an object instance to a specified version."},{"line_number":2105,"context_line":""},{"line_number":2106,"context_line":"        The default behavior of the base VersionedObjectSerializer, upon"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba15a1d1_2a17c155","line":2103,"in_reply_to":"ba15a1d1_698f0acd","updated":"2015-09-20 03:33:05.000000000","message":"Cool, thanks!","commit_id":"7517896105d5e04c6bea3914f84e59cd7f5ba007"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3a4c7e9f64f3298f55883b3baa6001faaf000d1a","unresolved":false,"context_lines":[{"line_number":2046,"context_line":"            raise messaging.ExpectedException()"},{"line_number":2047,"context_line":""},{"line_number":2048,"context_line":"    def object_class_action(self, context, objname, objmethod,"},{"line_number":2049,"context_line":"                            objver, args, kwargs):"},{"line_number":2050,"context_line":"        \"\"\"Perform an action on a VersionedObject class."},{"line_number":2051,"context_line":""},{"line_number":2052,"context_line":"        :param context: The context within which to perform the action"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba15a1d1_ad81844f","line":2049,"updated":"2015-09-21 17:24:49.000000000","message":"So, I still think that you should not implement this on the server side, implementing the new one proactively, and make your client-side indirection api intercept the old call to make the new one in a compatible way. See this:\n\nhttps://review.openstack.org/#/c/219432/4/nova/conductor/rpcapi.py,cm\n\nIn that code, we\u0027re calling the new server-side method if we\u0027re allowed. If you don\u0027t add this deprecated method now, you can do a similar thing, but without the version check, on your client side and avoid the baggage. Otherwise you\u0027ll need to keep this deprecated method around server-side until the RPC API here is bumped to 2.0.\n\nNote that we landed the above patch in nova already even though the library hasn\u0027t landed the change to add it, since we\u0027re directing to the newer server call from the client.\n\nBelieve me, especially since you\u0027re not building proper object relationship maps already, moving from L to M will be much easier if you have the L clients already calling the newer variant of this method with the version manifest!","commit_id":"92859d79e6bfcf4efe92bd97ff7a07aaf1d3483c"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"bb2a06a75785a64eccb18dfef90a4105d75c834e","unresolved":false,"context_lines":[{"line_number":2046,"context_line":"            raise messaging.ExpectedException()"},{"line_number":2047,"context_line":""},{"line_number":2048,"context_line":"    def object_class_action(self, context, objname, objmethod,"},{"line_number":2049,"context_line":"                            objver, args, kwargs):"},{"line_number":2050,"context_line":"        \"\"\"Perform an action on a VersionedObject class."},{"line_number":2051,"context_line":""},{"line_number":2052,"context_line":"        :param context: The context within which to perform the action"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba15a1d1_58e2cb30","line":2049,"in_reply_to":"ba15a1d1_ad81844f","updated":"2015-09-22 08:02:41.000000000","message":"Done","commit_id":"92859d79e6bfcf4efe92bd97ff7a07aaf1d3483c"},{"author":{"_account_id":14886,"name":"Alberto Fagner","email":"albertoffb@lsd.ufcg.edu.br","username":"albertofagner"},"change_message_id":"64b416bd713f01a98a85ac0f0a379702419ed09d","unresolved":false,"context_lines":[{"line_number":2041,"context_line":"        try:"},{"line_number":2042,"context_line":"            # NOTE(danms): Keep the getattr inside the try block since"},{"line_number":2043,"context_line":"            # a missing method is really a client problem"},{"line_number":2044,"context_line":"            return getattr(target, method)(context, *args, **kwargs)"},{"line_number":2045,"context_line":"        except Exception:"},{"line_number":2046,"context_line":"            raise messaging.ExpectedException()"},{"line_number":2047,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_176960be","line":2044,"updated":"2015-09-22 18:49:15.000000000","message":"Isn\u0027t there a better way to do this without using a try/except ? Like in line 2027","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"53110be4dac284b97cd2f0f4f4f6cc5e709d9d02","unresolved":false,"context_lines":[{"line_number":2041,"context_line":"        try:"},{"line_number":2042,"context_line":"            # NOTE(danms): Keep the getattr inside the try block since"},{"line_number":2043,"context_line":"            # a missing method is really a client problem"},{"line_number":2044,"context_line":"            return getattr(target, method)(context, *args, **kwargs)"},{"line_number":2045,"context_line":"        except Exception:"},{"line_number":2046,"context_line":"            raise messaging.ExpectedException()"},{"line_number":2047,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_bd5c031a","line":2044,"in_reply_to":"ba15a1d1_176960be","updated":"2015-09-23 09:27:13.000000000","message":"A Dan noted above, this should be handled by the client.\n\nFrom the comments below, I understand that handling it on the client won\u0027t cause any discrepancies.","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"efd47698c55410bdf3535e2c9c6f6c2b8b313dd5","unresolved":false,"context_lines":[{"line_number":2043,"context_line":"            # a missing method is really a client problem"},{"line_number":2044,"context_line":"            return getattr(target, method)(context, *args, **kwargs)"},{"line_number":2045,"context_line":"        except Exception:"},{"line_number":2046,"context_line":"            raise messaging.ExpectedException()"},{"line_number":2047,"context_line":""},{"line_number":2048,"context_line":"    def object_class_action_versions(self, context, objname, objmethod,"},{"line_number":2049,"context_line":"                                     object_versions, args, kwargs):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_e872cd10","line":2046,"updated":"2015-09-22 20:19:39.000000000","message":"If it barfs here, do we want to know whether it was due to the getattr() or the method call? Just wondering if this will be easy to debug.\n\nIt won\u0027t barf though so we\u0027re good I think...","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7d4f5252818f7ad857893bcc101bc684f2ffb4b","unresolved":false,"context_lines":[{"line_number":2043,"context_line":"            # a missing method is really a client problem"},{"line_number":2044,"context_line":"            return getattr(target, method)(context, *args, **kwargs)"},{"line_number":2045,"context_line":"        except Exception:"},{"line_number":2046,"context_line":"            raise messaging.ExpectedException()"},{"line_number":2047,"context_line":""},{"line_number":2048,"context_line":"    def object_class_action_versions(self, context, objname, objmethod,"},{"line_number":2049,"context_line":"                                     object_versions, args, kwargs):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_18642ce3","line":2046,"in_reply_to":"ba15a1d1_55010d69","updated":"2015-09-22 20:59:34.000000000","message":"Thx Dan. I didn\u0027t realize messaging.ExpectedException() was so magical :)","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c1776f2d09dfdcafd4f1e309b2c9457e715a14c9","unresolved":false,"context_lines":[{"line_number":2043,"context_line":"            # a missing method is really a client problem"},{"line_number":2044,"context_line":"            return getattr(target, method)(context, *args, **kwargs)"},{"line_number":2045,"context_line":"        except Exception:"},{"line_number":2046,"context_line":"            raise messaging.ExpectedException()"},{"line_number":2047,"context_line":""},{"line_number":2048,"context_line":"    def object_class_action_versions(self, context, objname, objmethod,"},{"line_number":2049,"context_line":"                                     object_versions, args, kwargs):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_55010d69","line":2046,"in_reply_to":"ba15a1d1_e872cd10","updated":"2015-09-22 20:30:11.000000000","message":"This is oslo.messaging fu. ExpectedException() grabs sys.exc_info here and forwards it along. This allows the caller to see the exception information, but causes us *not* to log it as such in this service. This is something that is quite critical so that things that conductor does on behalf of another node are not logged as exceptions in conductor logs. Otherwise, you\u0027d have the same thing logged in both places, even though an exception here *always* means that the caller screwed up, so there\u0027s no reason to log it here.","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"efd47698c55410bdf3535e2c9c6f6c2b8b313dd5","unresolved":false,"context_lines":[{"line_number":2078,"context_line":"        :param objmethod: The name of the action method to call"},{"line_number":2079,"context_line":"        :param args: The positional arguments to the action method"},{"line_number":2080,"context_line":"        :param kwargs: The keyword arguments to the action method"},{"line_number":2081,"context_line":"        :returns: The result of the action method"},{"line_number":2082,"context_line":"        \"\"\""},{"line_number":2083,"context_line":""},{"line_number":2084,"context_line":"        oldobj \u003d objinst.obj_clone()"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_6329fe36","line":2081,"updated":"2015-09-22 20:19:39.000000000","message":"it actually returns two things","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"53110be4dac284b97cd2f0f4f4f6cc5e709d9d02","unresolved":false,"context_lines":[{"line_number":2078,"context_line":"        :param objmethod: The name of the action method to call"},{"line_number":2079,"context_line":"        :param args: The positional arguments to the action method"},{"line_number":2080,"context_line":"        :param kwargs: The keyword arguments to the action method"},{"line_number":2081,"context_line":"        :returns: The result of the action method"},{"line_number":2082,"context_line":"        \"\"\""},{"line_number":2083,"context_line":""},{"line_number":2084,"context_line":"        oldobj \u003d objinst.obj_clone()"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_821e7e6e","line":2081,"in_reply_to":"ba15a1d1_6329fe36","updated":"2015-09-23 09:27:13.000000000","message":"Done","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"efd47698c55410bdf3535e2c9c6f6c2b8b313dd5","unresolved":false,"context_lines":[{"line_number":2109,"context_line":""},{"line_number":2110,"context_line":"        :param context: The context within which to perform the backport"},{"line_number":2111,"context_line":"        :param objinst: An instance of a VersionedObject to be backported"},{"line_number":2112,"context_line":"        :param object_versions: A dict of {objname: version} mappings"},{"line_number":2113,"context_line":"        :returns: The downgraded instance of objinst"},{"line_number":2114,"context_line":"        \"\"\""},{"line_number":2115,"context_line":"        target \u003d object_versions[objinst.obj_name()]"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_e815ede4","line":2112,"updated":"2015-09-22 20:19:39.000000000","message":"of what is supported in the local registry, right?","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7d4f5252818f7ad857893bcc101bc684f2ffb4b","unresolved":false,"context_lines":[{"line_number":2109,"context_line":""},{"line_number":2110,"context_line":"        :param context: The context within which to perform the backport"},{"line_number":2111,"context_line":"        :param objinst: An instance of a VersionedObject to be backported"},{"line_number":2112,"context_line":"        :param object_versions: A dict of {objname: version} mappings"},{"line_number":2113,"context_line":"        :returns: The downgraded instance of objinst"},{"line_number":2114,"context_line":"        \"\"\""},{"line_number":2115,"context_line":"        target \u003d object_versions[objinst.obj_name()]"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_b81ae015","line":2112,"in_reply_to":"ba15a1d1_952ec5f8","updated":"2015-09-22 20:59:34.000000000","message":"Oh, I thought it would contain the versions that the local conductor supports. Guess I ought to read the o.vo code. (NOOOO, don\u0027t make me do it!)","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c1776f2d09dfdcafd4f1e309b2c9457e715a14c9","unresolved":false,"context_lines":[{"line_number":2109,"context_line":""},{"line_number":2110,"context_line":"        :param context: The context within which to perform the backport"},{"line_number":2111,"context_line":"        :param objinst: An instance of a VersionedObject to be backported"},{"line_number":2112,"context_line":"        :param object_versions: A dict of {objname: version} mappings"},{"line_number":2113,"context_line":"        :returns: The downgraded instance of objinst"},{"line_number":2114,"context_line":"        \"\"\""},{"line_number":2115,"context_line":"        target \u003d object_versions[objinst.obj_name()]"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_952ec5f8","line":2112,"in_reply_to":"ba15a1d1_e815ede4","updated":"2015-09-22 20:30:11.000000000","message":"Remote, actually. However, he\u0027s just copying the o.vo docstring here, so not sure it\u0027s worth making a fuss over :)","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"6c84d4a710a1cfec1effd802272460561ee4e69c","unresolved":false,"context_lines":[{"line_number":2043,"context_line":"            # a missing method is really a client problem"},{"line_number":2044,"context_line":"            return getattr(target, method)(context, *args, **kwargs)"},{"line_number":2045,"context_line":"        except Exception:"},{"line_number":2046,"context_line":"            raise messaging.ExpectedException()"},{"line_number":2047,"context_line":""},{"line_number":2048,"context_line":"    def object_class_action_versions(self, context, objname, objmethod,"},{"line_number":2049,"context_line":"                                     object_versions, args, kwargs):"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba15a1d1_c9eecfec","line":2046,"updated":"2015-09-23 12:23:45.000000000","message":"Wouldn\u0027t it be worth giving the message of the exception back ?","commit_id":"b59e01d6ad5190715557442bef4e92523d80a050"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"36a40439f9ecf3d8c22cdd8852d637d5d83d099e","unresolved":false,"context_lines":[{"line_number":2043,"context_line":"            # a missing method is really a client problem"},{"line_number":2044,"context_line":"            return getattr(target, method)(context, *args, **kwargs)"},{"line_number":2045,"context_line":"        except Exception:"},{"line_number":2046,"context_line":"            raise messaging.ExpectedException()"},{"line_number":2047,"context_line":""},{"line_number":2048,"context_line":"    def object_class_action_versions(self, context, objname, objmethod,"},{"line_number":2049,"context_line":"                                     object_versions, args, kwargs):"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba15a1d1_3488fec4","line":2046,"in_reply_to":"ba15a1d1_c9eecfec","updated":"2015-09-23 13:10:56.000000000","message":"See Dan\u0027s comment on patch set 14. This is doing exactly that.","commit_id":"b59e01d6ad5190715557442bef4e92523d80a050"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"6c84d4a710a1cfec1effd802272460561ee4e69c","unresolved":false,"context_lines":[{"line_number":2065,"context_line":"        # NOTE(danms): The RPC layer will convert to primitives for us,"},{"line_number":2066,"context_line":"        # but in this case, we need to honor the version the client is"},{"line_number":2067,"context_line":"        # asking for, so we do it before returning here."},{"line_number":2068,"context_line":"        return (result.obj_to_primitive("},{"line_number":2069,"context_line":"            target_version\u003dobject_versions[objname],"},{"line_number":2070,"context_line":"            version_manifest\u003dobject_versions)"},{"line_number":2071,"context_line":"            if isinstance(result, objects_base.IronicObject) else result)"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba15a1d1_8989b728","line":2068,"updated":"2015-09-23 12:23:45.000000000","message":"Nit: this looks a bit cluttered to me. Better if we wrote it straightaway.\n\n  if isinstance(result, objects_base.IronicObject):\n    return result.obj_to_primitive(\n      target_version\u003dobject_versions[objname],\n      version_manifest\u003dobject_versions)\n\n  return result","commit_id":"b59e01d6ad5190715557442bef4e92523d80a050"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"66871d78fe7609a07858b0d3bf6b57e4b6bb3b43","unresolved":false,"context_lines":[{"line_number":2065,"context_line":"        # NOTE(danms): The RPC layer will convert to primitives for us,"},{"line_number":2066,"context_line":"        # but in this case, we need to honor the version the client is"},{"line_number":2067,"context_line":"        # asking for, so we do it before returning here."},{"line_number":2068,"context_line":"        return (result.obj_to_primitive("},{"line_number":2069,"context_line":"            target_version\u003dobject_versions[objname],"},{"line_number":2070,"context_line":"            version_manifest\u003dobject_versions)"},{"line_number":2071,"context_line":"            if isinstance(result, objects_base.IronicObject) else result)"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba15a1d1_81550bc3","line":2068,"in_reply_to":"ba15a1d1_8989b728","updated":"2015-09-23 13:18:17.000000000","message":"I agree.","commit_id":"b59e01d6ad5190715557442bef4e92523d80a050"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"6c84d4a710a1cfec1effd802272460561ee4e69c","unresolved":false,"context_lines":[{"line_number":2089,"context_line":"        # NOTE(danms): Diff the object with the one passed to us and"},{"line_number":2090,"context_line":"        # generate a list of changes to forward back"},{"line_number":2091,"context_line":"        for name, field in objinst.fields.items():"},{"line_number":2092,"context_line":"            if not objinst.obj_attr_is_set(name):"},{"line_number":2093,"context_line":"                # Avoid demand-loading anything"},{"line_number":2094,"context_line":"                continue"},{"line_number":2095,"context_line":"            if (not oldobj.obj_attr_is_set(name) or"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba15a1d1_89645722","line":2092,"updated":"2015-09-23 12:23:45.000000000","message":"May be a dumb question, but can\u0027t it happen other way round. Something was set in oldobj but was unset in objinst after executing the object method ?","commit_id":"b59e01d6ad5190715557442bef4e92523d80a050"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"36a40439f9ecf3d8c22cdd8852d637d5d83d099e","unresolved":false,"context_lines":[{"line_number":2089,"context_line":"        # NOTE(danms): Diff the object with the one passed to us and"},{"line_number":2090,"context_line":"        # generate a list of changes to forward back"},{"line_number":2091,"context_line":"        for name, field in objinst.fields.items():"},{"line_number":2092,"context_line":"            if not objinst.obj_attr_is_set(name):"},{"line_number":2093,"context_line":"                # Avoid demand-loading anything"},{"line_number":2094,"context_line":"                continue"},{"line_number":2095,"context_line":"            if (not oldobj.obj_attr_is_set(name) or"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba15a1d1_0f604700","line":2092,"in_reply_to":"ba15a1d1_89645722","updated":"2015-09-23 13:10:56.000000000","message":"I think here we are only concerned with updates of fields defined in versioned objects classes, they don\u0027t have an \"unset\" functionality.","commit_id":"b59e01d6ad5190715557442bef4e92523d80a050"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"6c84d4a710a1cfec1effd802272460561ee4e69c","unresolved":false,"context_lines":[{"line_number":2101,"context_line":"        updates[\u0027obj_what_changed\u0027] \u003d objinst.obj_what_changed()"},{"line_number":2102,"context_line":"        return updates, result"},{"line_number":2103,"context_line":""},{"line_number":2104,"context_line":"    def object_backport(self, context, objinst, object_versions):"},{"line_number":2105,"context_line":"        \"\"\"Perform a backport of an object instance."},{"line_number":2106,"context_line":""},{"line_number":2107,"context_line":"        The default behavior of the base VersionedObjectSerializer, upon"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba15a1d1_a91efb6d","line":2104,"updated":"2015-09-23 12:23:45.000000000","message":"No unit test cases for this","commit_id":"b59e01d6ad5190715557442bef4e92523d80a050"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"36a40439f9ecf3d8c22cdd8852d637d5d83d099e","unresolved":false,"context_lines":[{"line_number":2101,"context_line":"        updates[\u0027obj_what_changed\u0027] \u003d objinst.obj_what_changed()"},{"line_number":2102,"context_line":"        return updates, result"},{"line_number":2103,"context_line":""},{"line_number":2104,"context_line":"    def object_backport(self, context, objinst, object_versions):"},{"line_number":2105,"context_line":"        \"\"\"Perform a backport of an object instance."},{"line_number":2106,"context_line":""},{"line_number":2107,"context_line":"        The default behavior of the base VersionedObjectSerializer, upon"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba15a1d1_6f28e333","line":2104,"in_reply_to":"ba15a1d1_a91efb6d","updated":"2015-09-23 13:10:56.000000000","message":"Done","commit_id":"b59e01d6ad5190715557442bef4e92523d80a050"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9f3c78a6b0de08022724ed2f855f778212042193","unresolved":false,"context_lines":[{"line_number":2043,"context_line":"            # a missing method is really a client problem"},{"line_number":2044,"context_line":"            return getattr(target, method)(context, *args, **kwargs)"},{"line_number":2045,"context_line":"        except Exception:"},{"line_number":2046,"context_line":"            raise messaging.ExpectedException()"},{"line_number":2047,"context_line":""},{"line_number":2048,"context_line":"    def object_class_action_versions(self, context, objname, objmethod,"},{"line_number":2049,"context_line":"                                     object_versions, args, kwargs):"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba15a1d1_21a8bf76","line":2046,"updated":"2015-09-23 14:01:49.000000000","message":"Given that two of us didn\u0027t know this, if you do another revision, it would be good to add a comment here -- copy/paste part of Dan\u0027s comment from revision 14 :-)","commit_id":"3ad0e0ebfcc92d43c361045b44b3c161b374fe2d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9f3c78a6b0de08022724ed2f855f778212042193","unresolved":false,"context_lines":[{"line_number":2069,"context_line":"            return result.obj_to_primitive("},{"line_number":2070,"context_line":"                target_version\u003dobject_versions[objname],"},{"line_number":2071,"context_line":"                version_manifest\u003dobject_versions)"},{"line_number":2072,"context_line":"        return result"},{"line_number":2073,"context_line":""},{"line_number":2074,"context_line":"    def object_action(self, context, objinst, objmethod, args, kwargs):"},{"line_number":2075,"context_line":"        \"\"\"Perform an action on a VersionedObject instance."}],"source_content_type":"text/x-python","patch_set":17,"id":"ba15a1d1_2172ff11","line":2072,"updated":"2015-09-23 14:01:49.000000000","message":"I was fine with what you had before. I don\u0027t like this style because it seems prone to possible errors in the future.\n\nEither put an \u0027else\u0027 before this, or better (I think) at line 2069, s/return/result \u003d/\n\n(This is a nit of mine.)","commit_id":"3ad0e0ebfcc92d43c361045b44b3c161b374fe2d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9f3c78a6b0de08022724ed2f855f778212042193","unresolved":false,"context_lines":[{"line_number":2079,"context_line":"        :param objmethod: The name of the action method to call"},{"line_number":2080,"context_line":"        :param args: The positional arguments to the action method"},{"line_number":2081,"context_line":"        :param kwargs: The keyword arguments to the action method"},{"line_number":2082,"context_line":"        :returns: A touple with the updates made to the object and"},{"line_number":2083,"context_line":"                  the result of the action method"},{"line_number":2084,"context_line":"        \"\"\""},{"line_number":2085,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"ba15a1d1_e131675b","line":2082,"updated":"2015-09-23 14:01:49.000000000","message":"s/touple/tuple/","commit_id":"3ad0e0ebfcc92d43c361045b44b3c161b374fe2d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ff91d6b03a6386e5cfaa99bb494370c146b4be7c","unresolved":false,"context_lines":[{"line_number":2043,"context_line":"            # a missing method is really a client problem"},{"line_number":2044,"context_line":"            return getattr(target, method)(context, *args, **kwargs)"},{"line_number":2045,"context_line":"        except Exception:"},{"line_number":2046,"context_line":"            # NOTE(danms): This is oslo.messaging fu. ExpectedException()"},{"line_number":2047,"context_line":"            # grabs sys.exc_info here and forwards it along. This allows the"},{"line_number":2048,"context_line":"            # caller to see the exception information, but causes us *not* to"},{"line_number":2049,"context_line":"            # log it as such in this service. This is something that is quite"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba15a1d1_300ec33b","line":2046,"updated":"2015-09-23 15:11:28.000000000","message":"nit: not sure if some people might find this offensive (at least, I don\u0027t want to explain what fu means.)\n\ns/fu/stuff/ ? or s/ fu//","commit_id":"b801c646783c065e3642b8db68724d7932a85207"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c754b225b3d6791ce6214c0d835af8d145e796e4","unresolved":false,"context_lines":[{"line_number":2043,"context_line":"            # a missing method is really a client problem"},{"line_number":2044,"context_line":"            return getattr(target, method)(context, *args, **kwargs)"},{"line_number":2045,"context_line":"        except Exception:"},{"line_number":2046,"context_line":"            # NOTE(danms): This is oslo.messaging fu. ExpectedException()"},{"line_number":2047,"context_line":"            # grabs sys.exc_info here and forwards it along. This allows the"},{"line_number":2048,"context_line":"            # caller to see the exception information, but causes us *not* to"},{"line_number":2049,"context_line":"            # log it as such in this service. This is something that is quite"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba15a1d1_ab902844","line":2046,"in_reply_to":"ba15a1d1_300ec33b","updated":"2015-09-23 15:22:44.000000000","message":"My bad. I didn\u0027t realize that \u0027fu\u0027 was short for kung fu.\n\nIgnore my comment.","commit_id":"b801c646783c065e3642b8db68724d7932a85207"}],"ironic/conductor/rpcapi.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"dbe11562b3c07fc5803b8d45e046ffe114c54d7f","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    |           driver_vendor_passthru to a dictionary"},{"line_number":76,"context_line":"    |    1.30 - Added set_target_raid_config and"},{"line_number":77,"context_line":"    |           get_raid_logical_disk_properties"},{"line_number":78,"context_line":"    |    1.31 - Added Versioned Objects indirection API"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    \"\"\""},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba15a1d1_79d92af2","line":78,"updated":"2015-09-18 18:19:46.000000000","message":"Should probably say s/$/methods/ right? Otherwise it\u0027s not super clear. Probably also want to list what you added. Not sure what the convention(s) in ironic are though.","commit_id":"7517896105d5e04c6bea3914f84e59cd7f5ba007"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"c6810dd8b2f248c8892027116f629c83ea4d9bf8","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    |           driver_vendor_passthru to a dictionary"},{"line_number":76,"context_line":"    |    1.30 - Added set_target_raid_config and"},{"line_number":77,"context_line":"    |           get_raid_logical_disk_properties"},{"line_number":78,"context_line":"    |    1.31 - Added Versioned Objects indirection API"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    \"\"\""},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba15a1d1_09bbee76","line":78,"in_reply_to":"ba15a1d1_79d92af2","updated":"2015-09-19 20:10:34.000000000","message":"Done","commit_id":"7517896105d5e04c6bea3914f84e59cd7f5ba007"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3a4c7e9f64f3298f55883b3baa6001faaf000d1a","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    |           get_raid_logical_disk_properties"},{"line_number":78,"context_line":"    |    1.31 - Added Versioned Objects indirection API methods:"},{"line_number":79,"context_line":"    |           object_class_action, object_action and"},{"line_number":80,"context_line":"    |           object_backport"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    \"\"\""},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba15a1d1_ad2bc432","line":80,"updated":"2015-09-21 17:24:49.000000000","message":"I know you haven\u0027t been doing the proper thing in the project so far, but maybe this is a good time to start. Technically when adding something like this, you should check to see if 1.31 is allowed, and raise a meaningful exception if not. Otherwise people will just see a cryptic traceback of how the dispatch failed on the remote side.","commit_id":"92859d79e6bfcf4efe92bd97ff7a07aaf1d3483c"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"bb2a06a75785a64eccb18dfef90a4105d75c834e","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    |           get_raid_logical_disk_properties"},{"line_number":78,"context_line":"    |    1.31 - Added Versioned Objects indirection API methods:"},{"line_number":79,"context_line":"    |           object_class_action, object_action and"},{"line_number":80,"context_line":"    |           object_backport"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    \"\"\""},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba15a1d1_18d3f360","line":80,"in_reply_to":"ba15a1d1_ad2bc432","updated":"2015-09-22 08:02:41.000000000","message":"Done","commit_id":"92859d79e6bfcf4efe92bd97ff7a07aaf1d3483c"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"620e2ab75e5864b238029546b2d669a5ba8151de","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    |           get_raid_logical_disk_properties"},{"line_number":79,"context_line":"    |    1.31 - Added Versioned Objects indirection API methods:"},{"line_number":80,"context_line":"    |           object_class_action_versions, object_action and"},{"line_number":81,"context_line":"    |           object_backport"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    \"\"\""},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_3f424f3f","line":81,"updated":"2015-09-22 15:20:54.000000000","message":"The names of the methods doesn\u0027t match with what was implemented.\n\n\"... object_class_action, object_class_action_versions, object_action and object_backport_versions\"","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"b5403f62fb2ca62a1d1451cab952e5a0f623c352","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    |           get_raid_logical_disk_properties"},{"line_number":79,"context_line":"    |    1.31 - Added Versioned Objects indirection API methods:"},{"line_number":80,"context_line":"    |           object_class_action_versions, object_action and"},{"line_number":81,"context_line":"    |           object_backport"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    \"\"\""},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_d90328b7","line":81,"in_reply_to":"ba15a1d1_3f424f3f","updated":"2015-09-22 15:51:02.000000000","message":"the object_class_action RPC call is actually not implemented on the RPC layer, so I\u0027m leaving it out. I erred the last one though (fixed in the next patch).","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"116cbaad490ed835a7a4d83d79dae79e5f566fea","unresolved":false,"context_lines":[{"line_number":595,"context_line":"                          driver_name\u003ddriver_name)"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"    def object_class_action(self, context, objname, objmethod, objver,"},{"line_number":598,"context_line":"                            args, kwargs, topic\u003dNone):"},{"line_number":599,"context_line":"        \"\"\"Perform an action on a VersionedObject class."},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"        This method is implemented for compatibility with oslo.versionedobjects"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_d118e286","line":598,"range":{"start_line":598,"start_character":41,"end_line":598,"end_character":53},"updated":"2015-09-22 15:08:32.000000000","message":"These topic arguments are dead, AFAIK and unused. I would recommend you just remove them until/unless we need them at some point. Since they\u0027re not part of wire protocol, they could be added back later without much trouble if there was some reason.","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"b5403f62fb2ca62a1d1451cab952e5a0f623c352","unresolved":false,"context_lines":[{"line_number":595,"context_line":"                          driver_name\u003ddriver_name)"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"    def object_class_action(self, context, objname, objmethod, objver,"},{"line_number":598,"context_line":"                            args, kwargs, topic\u003dNone):"},{"line_number":599,"context_line":"        \"\"\"Perform an action on a VersionedObject class."},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"        This method is implemented for compatibility with oslo.versionedobjects"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_39c0247c","line":598,"in_reply_to":"ba15a1d1_a3c72511","updated":"2015-09-22 15:51:02.000000000","message":"I left the topic in, with a FIXME note, as Jim Rollenhagen  suggested.","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"620e2ab75e5864b238029546b2d669a5ba8151de","unresolved":false,"context_lines":[{"line_number":595,"context_line":"                          driver_name\u003ddriver_name)"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"    def object_class_action(self, context, objname, objmethod, objver,"},{"line_number":598,"context_line":"                            args, kwargs, topic\u003dNone):"},{"line_number":599,"context_line":"        \"\"\"Perform an action on a VersionedObject class."},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"        This method is implemented for compatibility with oslo.versionedobjects"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_a3c72511","line":598,"in_reply_to":"ba15a1d1_d118e286","updated":"2015-09-22 15:20:54.000000000","message":"We need topic cause that\u0027s how we route messages for the API to a specific conductor that can manage that node particulary (since Ironic can have multiple drivers enabled at the same time in one conductor)","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"620e2ab75e5864b238029546b2d669a5ba8151de","unresolved":false,"context_lines":[{"line_number":627,"context_line":"        :param args: The positional arguments to the action method"},{"line_number":628,"context_line":"        :param kwargs: The keyword arguments to the action method"},{"line_number":629,"context_line":"        :returns: The result of the action method, which may (or may not)"},{"line_number":630,"context_line":"        be an instance of the implementing VersionedObject class."},{"line_number":631,"context_line":"        \"\"\""},{"line_number":632,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":633,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_7f3be7eb","line":630,"updated":"2015-09-22 15:20:54.000000000","message":":raises NotImplemented:","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"b5403f62fb2ca62a1d1451cab952e5a0f623c352","unresolved":false,"context_lines":[{"line_number":627,"context_line":"        :param args: The positional arguments to the action method"},{"line_number":628,"context_line":"        :param kwargs: The keyword arguments to the action method"},{"line_number":629,"context_line":"        :returns: The result of the action method, which may (or may not)"},{"line_number":630,"context_line":"        be an instance of the implementing VersionedObject class."},{"line_number":631,"context_line":"        \"\"\""},{"line_number":632,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":633,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_f98b8c66","line":630,"in_reply_to":"ba15a1d1_7f3be7eb","updated":"2015-09-22 15:51:02.000000000","message":"Done","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"09ad66f30022a606f22cc0874266e1590a2684c7","unresolved":false,"context_lines":[{"line_number":629,"context_line":"        :returns: The result of the action method, which may (or may not)"},{"line_number":630,"context_line":"        be an instance of the implementing VersionedObject class."},{"line_number":631,"context_line":"        \"\"\""},{"line_number":632,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":633,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":634,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"},{"line_number":635,"context_line":"        return cctxt.call(context, \u0027object_class_action_versions\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_e1044ac7","line":632,"updated":"2015-09-22 09:22:57.000000000","message":"nits: wouldn\u0027t it better to use a constant variable for all \u00271.31\u0027?","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"116cbaad490ed835a7a4d83d79dae79e5f566fea","unresolved":false,"context_lines":[{"line_number":629,"context_line":"        :returns: The result of the action method, which may (or may not)"},{"line_number":630,"context_line":"        be an instance of the implementing VersionedObject class."},{"line_number":631,"context_line":"        \"\"\""},{"line_number":632,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":633,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":634,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"},{"line_number":635,"context_line":"        return cctxt.call(context, \u0027object_class_action_versions\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_b138ce3e","line":632,"in_reply_to":"ba15a1d1_4c468d50","updated":"2015-09-22 15:08:32.000000000","message":"Yeah, replacing these with a constant is not right, IMHO. It becomes too easy to make a change to that constant and break a bunch of other calls that haven\u0027t actually changed.\n\nEven though this looks like a constant string, it\u0027s actually very specifically related to this call and should not be defined outside the scope of it, IMHO.","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"c4bcceec06ba23f5f3c85250514569e54f2721ae","unresolved":false,"context_lines":[{"line_number":629,"context_line":"        :returns: The result of the action method, which may (or may not)"},{"line_number":630,"context_line":"        be an instance of the implementing VersionedObject class."},{"line_number":631,"context_line":"        \"\"\""},{"line_number":632,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":633,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":634,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"},{"line_number":635,"context_line":"        return cctxt.call(context, \u0027object_class_action_versions\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_08093784","line":632,"in_reply_to":"ba15a1d1_b138ce3e","updated":"2015-09-23 00:59:23.000000000","message":"Grzegorz, Dan,\n\nThanks for the comments.\nNow I understood the intention so that we cannot change the constant accidentally.\n\nBest regards,\nNaohiro","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"18e4b012dca63ac67edb7ea268c533a0c3306adf","unresolved":false,"context_lines":[{"line_number":629,"context_line":"        :returns: The result of the action method, which may (or may not)"},{"line_number":630,"context_line":"        be an instance of the implementing VersionedObject class."},{"line_number":631,"context_line":"        \"\"\""},{"line_number":632,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":633,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":634,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"},{"line_number":635,"context_line":"        return cctxt.call(context, \u0027object_class_action_versions\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_4c468d50","line":632,"in_reply_to":"ba15a1d1_e1044ac7","updated":"2015-09-22 09:43:41.000000000","message":"It\u0027s a convention to use a string (see methods above), Replacing it with a variable would probably look like V1_13 \u003d \u00271.31\u0027.","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"09ad66f30022a606f22cc0874266e1590a2684c7","unresolved":false,"context_lines":[{"line_number":631,"context_line":"        \"\"\""},{"line_number":632,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":633,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":634,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"},{"line_number":635,"context_line":"        return cctxt.call(context, \u0027object_class_action_versions\u0027,"},{"line_number":636,"context_line":"                          objname\u003dobjname, objmethod\u003dobjmethod,"},{"line_number":637,"context_line":"                          object_versions\u003dobject_versions,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_a125f25c","line":634,"updated":"2015-09-22 09:22:57.000000000","message":"ditto","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"09ad66f30022a606f22cc0874266e1590a2684c7","unresolved":false,"context_lines":[{"line_number":648,"context_line":"        :param kwargs: The keyword arguments to the action method"},{"line_number":649,"context_line":"        :returns: The result of the action method"},{"line_number":650,"context_line":"        \"\"\""},{"line_number":651,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":652,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":653,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"},{"line_number":654,"context_line":"        return cctxt.call(context, \u0027object_action\u0027, objinst\u003dobjinst,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_811b0e1c","line":651,"updated":"2015-09-22 09:22:57.000000000","message":"ditto","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"09ad66f30022a606f22cc0874266e1590a2684c7","unresolved":false,"context_lines":[{"line_number":650,"context_line":"        \"\"\""},{"line_number":651,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":652,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":653,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"},{"line_number":654,"context_line":"        return cctxt.call(context, \u0027object_action\u0027, objinst\u003dobjinst,"},{"line_number":655,"context_line":"                          objmethod\u003dobjmethod, args\u003dargs, kwargs\u003dkwargs)"},{"line_number":656,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_4115f6e2","line":653,"updated":"2015-09-22 09:22:57.000000000","message":"ditto","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"fe5f16b8684ea181aff94762bb142d4b3cd759e8","unresolved":false,"context_lines":[{"line_number":613,"context_line":"        :returns: The result of the action method, which may (or may not)"},{"line_number":614,"context_line":"                  be an instance of the implementing VersionedObject class."},{"line_number":615,"context_line":"        \"\"\""},{"line_number":616,"context_line":"        # FIXME(xek): The topic argument is is actually never used."},{"line_number":617,"context_line":"        versions \u003d ovo_base.obj_tree_get_versions(objname)"},{"line_number":618,"context_line":"        return self.object_class_action_versions("},{"line_number":619,"context_line":"            context, objname, objmethod, versions, args, kwargs, topic)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_95bd65d9","line":616,"updated":"2015-09-22 20:23:53.000000000","message":"nit: s/is is/is/\n\nditto below","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"efd47698c55410bdf3535e2c9c6f6c2b8b313dd5","unresolved":false,"context_lines":[{"line_number":616,"context_line":"        # FIXME(xek): The topic argument is is actually never used."},{"line_number":617,"context_line":"        versions \u003d ovo_base.obj_tree_get_versions(objname)"},{"line_number":618,"context_line":"        return self.object_class_action_versions("},{"line_number":619,"context_line":"            context, objname, objmethod, versions, args, kwargs, topic)"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"    def object_class_action_versions(self, context, objname, objmethod,"},{"line_number":622,"context_line":"                                     object_versions, args, kwargs,"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_032602ce","line":619,"updated":"2015-09-22 20:19:39.000000000","message":"so objver is never used?","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c1776f2d09dfdcafd4f1e309b2c9457e715a14c9","unresolved":false,"context_lines":[{"line_number":616,"context_line":"        # FIXME(xek): The topic argument is is actually never used."},{"line_number":617,"context_line":"        versions \u003d ovo_base.obj_tree_get_versions(objname)"},{"line_number":618,"context_line":"        return self.object_class_action_versions("},{"line_number":619,"context_line":"            context, objname, objmethod, versions, args, kwargs, topic)"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"    def object_class_action_versions(self, context, objname, objmethod,"},{"line_number":622,"context_line":"                                     object_versions, args, kwargs,"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_9515659c","line":619,"in_reply_to":"ba15a1d1_032602ce","updated":"2015-09-22 20:30:11.000000000","message":"Correct, because this is a compatibility shim that redirects to the newer version of this call. He can\u0027t remove it from the signature because it\u0027s part of the library API. He\u0027s doing the right thing here.","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7d4f5252818f7ad857893bcc101bc684f2ffb4b","unresolved":false,"context_lines":[{"line_number":616,"context_line":"        # FIXME(xek): The topic argument is is actually never used."},{"line_number":617,"context_line":"        versions \u003d ovo_base.obj_tree_get_versions(objname)"},{"line_number":618,"context_line":"        return self.object_class_action_versions("},{"line_number":619,"context_line":"            context, objname, objmethod, versions, args, kwargs, topic)"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"    def object_class_action_versions(self, context, objname, objmethod,"},{"line_number":622,"context_line":"                                     object_versions, args, kwargs,"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_98d6fc25","line":619,"in_reply_to":"ba15a1d1_9515659c","updated":"2015-09-22 20:59:34.000000000","message":"That\u0027s fine. I\u0027d just add a comment at line 608 that it isn\u0027t used.","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"53110be4dac284b97cd2f0f4f4f6cc5e709d9d02","unresolved":false,"context_lines":[{"line_number":616,"context_line":"        # FIXME(xek): The topic argument is is actually never used."},{"line_number":617,"context_line":"        versions \u003d ovo_base.obj_tree_get_versions(objname)"},{"line_number":618,"context_line":"        return self.object_class_action_versions("},{"line_number":619,"context_line":"            context, objname, objmethod, versions, args, kwargs, topic)"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"    def object_class_action_versions(self, context, objname, objmethod,"},{"line_number":622,"context_line":"                                     object_versions, args, kwargs,"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_1de40fde","line":619,"in_reply_to":"ba15a1d1_98d6fc25","updated":"2015-09-23 09:27:13.000000000","message":"I moved this method entirely to the IronicObjectIndirectionAPI object, because it\u0027s not really a part of the rpcapi.","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"efd47698c55410bdf3535e2c9c6f6c2b8b313dd5","unresolved":false,"context_lines":[{"line_number":632,"context_line":"        :param topic: RPC topic. Defaults to self.topic."},{"line_number":633,"context_line":"        :raises: NotImplemented when an operator makes an error during upgrade"},{"line_number":634,"context_line":"        :returns: The result of the action method, which may (or may not)"},{"line_number":635,"context_line":"        be an instance of the implementing VersionedObject class."},{"line_number":636,"context_line":"        \"\"\""},{"line_number":637,"context_line":"        # FIXME(xek): The topic argument is is actually never used."},{"line_number":638,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_a3663627","line":635,"updated":"2015-09-22 20:19:39.000000000","message":"nit: I think this ought to be indented","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"53110be4dac284b97cd2f0f4f4f6cc5e709d9d02","unresolved":false,"context_lines":[{"line_number":632,"context_line":"        :param topic: RPC topic. Defaults to self.topic."},{"line_number":633,"context_line":"        :raises: NotImplemented when an operator makes an error during upgrade"},{"line_number":634,"context_line":"        :returns: The result of the action method, which may (or may not)"},{"line_number":635,"context_line":"        be an instance of the implementing VersionedObject class."},{"line_number":636,"context_line":"        \"\"\""},{"line_number":637,"context_line":"        # FIXME(xek): The topic argument is is actually never used."},{"line_number":638,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_929b2918","line":635,"in_reply_to":"ba15a1d1_a3663627","updated":"2015-09-23 09:27:13.000000000","message":"Done","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"fe5f16b8684ea181aff94762bb142d4b3cd759e8","unresolved":false,"context_lines":[{"line_number":634,"context_line":"        :returns: The result of the action method, which may (or may not)"},{"line_number":635,"context_line":"        be an instance of the implementing VersionedObject class."},{"line_number":636,"context_line":"        \"\"\""},{"line_number":637,"context_line":"        # FIXME(xek): The topic argument is is actually never used."},{"line_number":638,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":639,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":640,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_35825901","line":637,"updated":"2015-09-22 20:23:53.000000000","message":"I might be missing something because \u0027topic\u0027 is being used in self.client.prepare(). Are you saying that client.prepare() doesn\u0027t do anything with the topic string?\n\nWhat does the FIXME mean? To remove it cuz it isn\u0027t used, or to fix it so it is used?","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c1776f2d09dfdcafd4f1e309b2c9457e715a14c9","unresolved":false,"context_lines":[{"line_number":634,"context_line":"        :returns: The result of the action method, which may (or may not)"},{"line_number":635,"context_line":"        be an instance of the implementing VersionedObject class."},{"line_number":636,"context_line":"        \"\"\""},{"line_number":637,"context_line":"        # FIXME(xek): The topic argument is is actually never used."},{"line_number":638,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":639,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":640,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_d51bddc8","line":637,"in_reply_to":"ba15a1d1_35825901","updated":"2015-09-22 20:30:11.000000000","message":"I think it should be removed here. There is no reason to have it when we control all calls of this method.","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7d4f5252818f7ad857893bcc101bc684f2ffb4b","unresolved":false,"context_lines":[{"line_number":634,"context_line":"        :returns: The result of the action method, which may (or may not)"},{"line_number":635,"context_line":"        be an instance of the implementing VersionedObject class."},{"line_number":636,"context_line":"        \"\"\""},{"line_number":637,"context_line":"        # FIXME(xek): The topic argument is is actually never used."},{"line_number":638,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":639,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":640,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_d8ed54b8","line":637,"in_reply_to":"ba15a1d1_d51bddc8","updated":"2015-09-22 20:59:34.000000000","message":"I don\u0027t have an opinion either way. Just want to understand it. But yeah, we can delete the topic argument and not pass it to self.client.prepare(). \n\nIf we need it, we could always add it in later. Some special topic for these special VersionedObjects :D","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"53110be4dac284b97cd2f0f4f4f6cc5e709d9d02","unresolved":false,"context_lines":[{"line_number":634,"context_line":"        :returns: The result of the action method, which may (or may not)"},{"line_number":635,"context_line":"        be an instance of the implementing VersionedObject class."},{"line_number":636,"context_line":"        \"\"\""},{"line_number":637,"context_line":"        # FIXME(xek): The topic argument is is actually never used."},{"line_number":638,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":639,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":640,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_9d46dfbe","line":637,"in_reply_to":"ba15a1d1_d8ed54b8","updated":"2015-09-23 09:27:13.000000000","message":"Jim Rollenhagen suggested leaving it here with this FIXME note.","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"efd47698c55410bdf3535e2c9c6f6c2b8b313dd5","unresolved":false,"context_lines":[{"line_number":654,"context_line":"        :param kwargs: The keyword arguments to the action method"},{"line_number":655,"context_line":"        :param topic: RPC topic. Defaults to self.topic."},{"line_number":656,"context_line":"        :raises: NotImplemented when an operator makes an error during upgrade"},{"line_number":657,"context_line":"        :returns: The result of the action method"},{"line_number":658,"context_line":"        \"\"\""},{"line_number":659,"context_line":"        # FIXME(xek): The topic argument is is actually never used."},{"line_number":660,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_2350e65d","line":657,"updated":"2015-09-22 20:19:39.000000000","message":"it returns 2 things now, right?","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c1776f2d09dfdcafd4f1e309b2c9457e715a14c9","unresolved":false,"context_lines":[{"line_number":654,"context_line":"        :param kwargs: The keyword arguments to the action method"},{"line_number":655,"context_line":"        :param topic: RPC topic. Defaults to self.topic."},{"line_number":656,"context_line":"        :raises: NotImplemented when an operator makes an error during upgrade"},{"line_number":657,"context_line":"        :returns: The result of the action method"},{"line_number":658,"context_line":"        \"\"\""},{"line_number":659,"context_line":"        # FIXME(xek): The topic argument is is actually never used."},{"line_number":660,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_d572fd10","line":657,"in_reply_to":"ba15a1d1_2350e65d","updated":"2015-09-22 20:30:11.000000000","message":"He\u0027s copying the (broken) docstring from o.vo here. IMHO, you could probably do away with all these docstrings and just say that these are implementations of the o.vo methods, and then document the meanings there.","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"53110be4dac284b97cd2f0f4f4f6cc5e709d9d02","unresolved":false,"context_lines":[{"line_number":654,"context_line":"        :param kwargs: The keyword arguments to the action method"},{"line_number":655,"context_line":"        :param topic: RPC topic. Defaults to self.topic."},{"line_number":656,"context_line":"        :raises: NotImplemented when an operator makes an error during upgrade"},{"line_number":657,"context_line":"        :returns: The result of the action method"},{"line_number":658,"context_line":"        \"\"\""},{"line_number":659,"context_line":"        # FIXME(xek): The topic argument is is actually never used."},{"line_number":660,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_9d749ffe","line":657,"in_reply_to":"ba15a1d1_cb182078","updated":"2015-09-23 09:27:13.000000000","message":"Done","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7d4f5252818f7ad857893bcc101bc684f2ffb4b","unresolved":false,"context_lines":[{"line_number":654,"context_line":"        :param kwargs: The keyword arguments to the action method"},{"line_number":655,"context_line":"        :param topic: RPC topic. Defaults to self.topic."},{"line_number":656,"context_line":"        :raises: NotImplemented when an operator makes an error during upgrade"},{"line_number":657,"context_line":"        :returns: The result of the action method"},{"line_number":658,"context_line":"        \"\"\""},{"line_number":659,"context_line":"        # FIXME(xek): The topic argument is is actually never used."},{"line_number":660,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_cb182078","line":657,"in_reply_to":"ba15a1d1_d572fd10","updated":"2015-09-22 20:59:34.000000000","message":"I like the docstrings here so I don\u0027t have to go look at the o.vo methods but whatever.\n\nSo yeah, someone should document the meanings there :)","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"6c84d4a710a1cfec1effd802272460561ee4e69c","unresolved":false,"context_lines":[{"line_number":611,"context_line":"        \"\"\""},{"line_number":612,"context_line":"        # FIXME(xek): The topic argument is actually never used."},{"line_number":613,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":614,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":615,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"},{"line_number":616,"context_line":"        return cctxt.call(context, \u0027object_class_action_versions\u0027,"},{"line_number":617,"context_line":"                          objname\u003dobjname, objmethod\u003dobjmethod,"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba15a1d1_94830a56","line":614,"updated":"2015-09-23 12:23:45.000000000","message":"Can we have some assertions for this path ? Ditto for other two RPC APIs.","commit_id":"b59e01d6ad5190715557442bef4e92523d80a050"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"36a40439f9ecf3d8c22cdd8852d637d5d83d099e","unresolved":false,"context_lines":[{"line_number":611,"context_line":"        \"\"\""},{"line_number":612,"context_line":"        # FIXME(xek): The topic argument is actually never used."},{"line_number":613,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":614,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":615,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"},{"line_number":616,"context_line":"        return cctxt.call(context, \u0027object_class_action_versions\u0027,"},{"line_number":617,"context_line":"                          objname\u003dobjname, objmethod\u003dobjmethod,"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba15a1d1_6f8543cd","line":614,"in_reply_to":"ba15a1d1_94830a56","updated":"2015-09-23 13:10:56.000000000","message":"I\u0027m not sure what you meant.","commit_id":"b59e01d6ad5190715557442bef4e92523d80a050"},{"author":{"_account_id":10697,"name":"Thiago Paiva Brito","email":"thiagop@lsd.ufcg.edu.br","username":"thiagop","inactive":true},"change_message_id":"57618bb19d2997832162f587d13b6e9494587f08","unresolved":false,"context_lines":[{"line_number":611,"context_line":"        \"\"\""},{"line_number":612,"context_line":"        # FIXME(xek): The topic argument is actually never used."},{"line_number":613,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":614,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":615,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"},{"line_number":616,"context_line":"        return cctxt.call(context, \u0027object_class_action_versions\u0027,"},{"line_number":617,"context_line":"                          objname\u003dobjname, objmethod\u003dobjmethod,"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba15a1d1_35fa3576","line":614,"updated":"2015-09-23 14:58:38.000000000","message":"ditto","commit_id":"3ad0e0ebfcc92d43c361045b44b3c161b374fe2d"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"66fdb6460d04d5d4cb9f107c8172dbd183208cb1","unresolved":false,"context_lines":[{"line_number":612,"context_line":"        # FIXME(xek): The topic argument is actually never used."},{"line_number":613,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":614,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":615,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"},{"line_number":616,"context_line":"        return cctxt.call(context, \u0027object_class_action_versions\u0027,"},{"line_number":617,"context_line":"                          objname\u003dobjname, objmethod\u003dobjmethod,"},{"line_number":618,"context_line":"                          object_versions\u003dobject_versions,"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba15a1d1_1a016006","line":615,"updated":"2015-09-23 14:43:41.000000000","message":"topic is being used here, within this function scope that\u0027s used.","commit_id":"3ad0e0ebfcc92d43c361045b44b3c161b374fe2d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9f3c78a6b0de08022724ed2f855f778212042193","unresolved":false,"context_lines":[{"line_number":629,"context_line":"        :param kwargs: The keyword arguments to the action method"},{"line_number":630,"context_line":"        :param topic: RPC topic. Defaults to self.topic."},{"line_number":631,"context_line":"        :raises: NotImplemented when an operator makes an error during upgrade"},{"line_number":632,"context_line":"        :returns: A touple with the updates made to the object and"},{"line_number":633,"context_line":"                  the result of the action method"},{"line_number":634,"context_line":"        \"\"\""},{"line_number":635,"context_line":"        # FIXME(xek): The topic argument is actually never used."}],"source_content_type":"text/x-python","patch_set":17,"id":"ba15a1d1_a1b84f76","line":632,"updated":"2015-09-23 14:01:49.000000000","message":"s/touple/tuple/","commit_id":"3ad0e0ebfcc92d43c361045b44b3c161b374fe2d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"4181b26d77f10fdcb380d16e3903d01d052d1ca3","unresolved":false,"context_lines":[{"line_number":632,"context_line":"        :returns: A touple with the updates made to the object and"},{"line_number":633,"context_line":"                  the result of the action method"},{"line_number":634,"context_line":"        \"\"\""},{"line_number":635,"context_line":"        # FIXME(xek): The topic argument is actually never used."},{"line_number":636,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":637,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":638,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba15a1d1_15d611f1","line":635,"updated":"2015-09-23 14:45:55.000000000","message":"Had an IRC chat about this, to get clarification from jroll as to what he meant [0]. We decided these FIXME comments are confusing, would be better to update the \u0027:param topic\u0027 above with something like \u0027In most cases, the default should be used since any conductor should be able to handle this.\u0027\n\n[0] 2015-09-23T14:30:16, http://eavesdrop.openstack.org/irclogs/%23openstack-ironic/%23openstack-ironic.2015-09-23.log","commit_id":"3ad0e0ebfcc92d43c361045b44b3c161b374fe2d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"df6a38f2e1a83c2179341db63920ebe0690aeb42","unresolved":false,"context_lines":[{"line_number":632,"context_line":"        :returns: A touple with the updates made to the object and"},{"line_number":633,"context_line":"                  the result of the action method"},{"line_number":634,"context_line":"        \"\"\""},{"line_number":635,"context_line":"        # FIXME(xek): The topic argument is actually never used."},{"line_number":636,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":637,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":638,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba15a1d1_9046af79","line":635,"in_reply_to":"ba15a1d1_15d611f1","updated":"2015-09-23 15:09:11.000000000","message":"A few minutes later (see IRC chatter mentioned in my previous comment), jroll decided that he was fine with removing the \u0027topic\u0027 parameter.","commit_id":"3ad0e0ebfcc92d43c361045b44b3c161b374fe2d"},{"author":{"_account_id":10697,"name":"Thiago Paiva Brito","email":"thiagop@lsd.ufcg.edu.br","username":"thiagop","inactive":true},"change_message_id":"57618bb19d2997832162f587d13b6e9494587f08","unresolved":false,"context_lines":[{"line_number":634,"context_line":"        \"\"\""},{"line_number":635,"context_line":"        # FIXME(xek): The topic argument is actually never used."},{"line_number":636,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":637,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":638,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"},{"line_number":639,"context_line":"        return cctxt.call(context, \u0027object_action\u0027, objinst\u003dobjinst,"},{"line_number":640,"context_line":"                          objmethod\u003dobjmethod, args\u003dargs, kwargs\u003dkwargs)"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba15a1d1_95e9c1b9","line":637,"updated":"2015-09-23 14:58:38.000000000","message":"The exception should say something about what happened since it can appear isolated in the logs. Like \"Incompatible object version. Please upgrade blah blah\"","commit_id":"3ad0e0ebfcc92d43c361045b44b3c161b374fe2d"},{"author":{"_account_id":10697,"name":"Thiago Paiva Brito","email":"thiagop@lsd.ufcg.edu.br","username":"thiagop","inactive":true},"change_message_id":"6a88a8f97ee20400a505bd3bdac85182c57e06ec","unresolved":false,"context_lines":[{"line_number":634,"context_line":"        \"\"\""},{"line_number":635,"context_line":"        # FIXME(xek): The topic argument is actually never used."},{"line_number":636,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":637,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":638,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"},{"line_number":639,"context_line":"        return cctxt.call(context, \u0027object_action\u0027, objinst\u003dobjinst,"},{"line_number":640,"context_line":"                          objmethod\u003dobjmethod, args\u003dargs, kwargs\u003dkwargs)"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba15a1d1_f84d8d72","line":637,"in_reply_to":"ba15a1d1_6dfa21bf","updated":"2015-09-23 17:06:56.000000000","message":"So \"Incompatible conductor version...\" or something like that.","commit_id":"3ad0e0ebfcc92d43c361045b44b3c161b374fe2d"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"6559d2f4a46acf657e50ac48bbcc7238c3ca1134","unresolved":false,"context_lines":[{"line_number":634,"context_line":"        \"\"\""},{"line_number":635,"context_line":"        # FIXME(xek): The topic argument is actually never used."},{"line_number":636,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":637,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":638,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"},{"line_number":639,"context_line":"        return cctxt.call(context, \u0027object_action\u0027, objinst\u003dobjinst,"},{"line_number":640,"context_line":"                          objmethod\u003dobjmethod, args\u003dargs, kwargs\u003dkwargs)"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba15a1d1_6dfa21bf","line":637,"in_reply_to":"ba15a1d1_95e9c1b9","updated":"2015-09-23 16:50:38.000000000","message":"Here I\u0027m only checking the RPC method version, so it\u0027s just that the current conductor is not supported.","commit_id":"3ad0e0ebfcc92d43c361045b44b3c161b374fe2d"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"fdf6d7cb88ca293ad236119d64443433b9827726","unresolved":false,"context_lines":[{"line_number":634,"context_line":"        \"\"\""},{"line_number":635,"context_line":"        # FIXME(xek): The topic argument is actually never used."},{"line_number":636,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":637,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":638,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"},{"line_number":639,"context_line":"        return cctxt.call(context, \u0027object_action\u0027, objinst\u003dobjinst,"},{"line_number":640,"context_line":"                          objmethod\u003dobjmethod, args\u003dargs, kwargs\u003dkwargs)"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba15a1d1_58a7d9a6","line":637,"in_reply_to":"ba15a1d1_f84d8d72","updated":"2015-09-23 17:17:56.000000000","message":"Done","commit_id":"3ad0e0ebfcc92d43c361045b44b3c161b374fe2d"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"66fdb6460d04d5d4cb9f107c8172dbd183208cb1","unresolved":false,"context_lines":[{"line_number":635,"context_line":"        # FIXME(xek): The topic argument is actually never used."},{"line_number":636,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":637,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":638,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"},{"line_number":639,"context_line":"        return cctxt.call(context, \u0027object_action\u0027, objinst\u003dobjinst,"},{"line_number":640,"context_line":"                          objmethod\u003dobjmethod, args\u003dargs, kwargs\u003dkwargs)"},{"line_number":641,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"ba15a1d1_5a0b582a","line":638,"updated":"2015-09-23 14:43:41.000000000","message":"topic is being used here, within this function scope that\u0027s used.","commit_id":"3ad0e0ebfcc92d43c361045b44b3c161b374fe2d"},{"author":{"_account_id":10697,"name":"Thiago Paiva Brito","email":"thiagop@lsd.ufcg.edu.br","username":"thiagop","inactive":true},"change_message_id":"57618bb19d2997832162f587d13b6e9494587f08","unresolved":false,"context_lines":[{"line_number":655,"context_line":"        \"\"\""},{"line_number":656,"context_line":"        # FIXME(xek): The topic argument is actually never used."},{"line_number":657,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":658,"context_line":"            raise NotImplemented(\u0027Please upgrade ironic-conductor first\u0027)"},{"line_number":659,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.31\u0027)"},{"line_number":660,"context_line":"        return cctxt.call(context, \u0027object_backport_versions\u0027, objinst\u003dobjinst,"},{"line_number":661,"context_line":"                          object_versions\u003dobject_versions)"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba15a1d1_d50ad989","line":658,"updated":"2015-09-23 14:58:38.000000000","message":"ditto","commit_id":"3ad0e0ebfcc92d43c361045b44b3c161b374fe2d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"1ee1e728ef52c22636eb6cc9f2e3c04f56e0b758","unresolved":false,"context_lines":[{"line_number":596,"context_line":"    def object_class_action_versions(self, context, objname, objmethod,"},{"line_number":597,"context_line":"                                     object_versions, args, kwargs):"},{"line_number":598,"context_line":"        \"\"\"Perform an action on a VersionedObject class."},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        :param context: The context within which to perform the action"},{"line_number":601,"context_line":"        :param objname: The registry name of the object"},{"line_number":602,"context_line":"        :param objmethod: The name of the action method to call"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba15a1d1_10f7ff59","line":599,"updated":"2015-09-23 15:06:18.000000000","message":"Since we aren\u0027t passing topic as an argument, I\u0027d like a comment here (and in the other methods) about that. Eg\n\nWe want any conductor to handle this, so it is intentional that there is no topic argument for this method.","commit_id":"b801c646783c065e3642b8db68724d7932a85207"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"921eab4ec001b8fa26c665127aef497bdec613b6","unresolved":false,"context_lines":[{"line_number":612,"context_line":"        \"\"\""},{"line_number":613,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":614,"context_line":"            raise NotImplemented(\u0027Incompatible conductor version - \u0027"},{"line_number":615,"context_line":"                                 \u0027please upgrade ironic-conductor first\u0027)"},{"line_number":616,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dself.topic, version\u003d\u00271.31\u0027)"},{"line_number":617,"context_line":"        return cctxt.call(context, \u0027object_class_action_versions\u0027,"},{"line_number":618,"context_line":"                          objname\u003dobjname, objmethod\u003dobjmethod,"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba15a1d1_335246df","line":615,"updated":"2015-09-23 17:36:07.000000000","message":"Ohhhh. We should _() the string.\n\nditto for the others below.","commit_id":"5ee4d48a207455bc41b6edd1f8a6caa78434e71c"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"924b2175074e2ec8a0ee5ad034fa1e965a970894","unresolved":false,"context_lines":[{"line_number":612,"context_line":"        \"\"\""},{"line_number":613,"context_line":"        if not self.client.can_send_version(\u00271.31\u0027):"},{"line_number":614,"context_line":"            raise NotImplemented(\u0027Incompatible conductor version - \u0027"},{"line_number":615,"context_line":"                                 \u0027please upgrade ironic-conductor first\u0027)"},{"line_number":616,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dself.topic, version\u003d\u00271.31\u0027)"},{"line_number":617,"context_line":"        return cctxt.call(context, \u0027object_class_action_versions\u0027,"},{"line_number":618,"context_line":"                          objname\u003dobjname, objmethod\u003dobjmethod,"}],"source_content_type":"text/x-python","patch_set":23,"id":"ba15a1d1_da8f5621","line":615,"updated":"2015-09-23 21:27:16.000000000","message":"This needs to be translated","commit_id":"705fa77ecc6fb28032710094728624bac6c14757"}],"ironic/objects/base.py":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"4dfaf4c29b43e875239a97fb70e61130ef35e451","unresolved":false,"context_lines":[{"line_number":94,"context_line":"class IronicObjectIndirectionAPI(object_base.VersionedObjectIndirectionAPI):"},{"line_number":95,"context_line":"    def __init__(self):"},{"line_number":96,"context_line":"        super(IronicObjectIndirectionAPI, self).__init__()"},{"line_number":97,"context_line":"        from ironic.conductor import rpcapi as conductor_api"},{"line_number":98,"context_line":"        self._conductor \u003d conductor_api.ConductorAPI()"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def object_action(self, context, objinst, objmethod, args, kwargs):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_48a11d45","line":97,"updated":"2015-09-17 19:18:26.000000000","message":"Why isn\u0027t this import done at the top of the file? Is there a good reason for it being here?","commit_id":"fde824ff93efc5b9180babf3e5fd7666c512db18"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"b45254051775b2ca05909057e616ffa689c86c8d","unresolved":false,"context_lines":[{"line_number":94,"context_line":"class IronicObjectIndirectionAPI(object_base.VersionedObjectIndirectionAPI):"},{"line_number":95,"context_line":"    def __init__(self):"},{"line_number":96,"context_line":"        super(IronicObjectIndirectionAPI, self).__init__()"},{"line_number":97,"context_line":"        from ironic.conductor import rpcapi as conductor_api"},{"line_number":98,"context_line":"        self._conductor \u003d conductor_api.ConductorAPI()"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def object_action(self, context, objinst, objmethod, args, kwargs):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_35074e83","line":97,"in_reply_to":"ba15a1d1_48a11d45","updated":"2015-09-18 08:04:27.000000000","message":"This would cause a cyclical import error.","commit_id":"fde824ff93efc5b9180babf3e5fd7666c512db18"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"f1ddda2e011d33bb76a8adcfac28f94ec539b4a4","unresolved":false,"context_lines":[{"line_number":94,"context_line":"class IronicObjectIndirectionAPI(object_base.VersionedObjectIndirectionAPI):"},{"line_number":95,"context_line":"    def __init__(self):"},{"line_number":96,"context_line":"        super(IronicObjectIndirectionAPI, self).__init__()"},{"line_number":97,"context_line":"        from ironic.conductor import rpcapi as conductor_api"},{"line_number":98,"context_line":"        self._conductor \u003d conductor_api.ConductorAPI()"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def object_action(self, context, objinst, objmethod, args, kwargs):"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_e4a6fc0d","line":97,"updated":"2015-09-18 14:27:54.000000000","message":"Can a comment be put here about this import being done here due to a cyclical import error?","commit_id":"d6270dea4c0526f4d55bd7676639b86c20bc6fb6"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"880e0b438a4b22f7668caba86777ddddebde8f9f","unresolved":false,"context_lines":[{"line_number":94,"context_line":"class IronicObjectIndirectionAPI(object_base.VersionedObjectIndirectionAPI):"},{"line_number":95,"context_line":"    def __init__(self):"},{"line_number":96,"context_line":"        super(IronicObjectIndirectionAPI, self).__init__()"},{"line_number":97,"context_line":"        from ironic.conductor import rpcapi as conductor_api"},{"line_number":98,"context_line":"        self._conductor \u003d conductor_api.ConductorAPI()"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def object_action(self, context, objinst, objmethod, args, kwargs):"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_474a4a56","line":97,"in_reply_to":"ba15a1d1_e4a6fc0d","updated":"2015-09-18 14:51:04.000000000","message":"Done","commit_id":"d6270dea4c0526f4d55bd7676639b86c20bc6fb6"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"a6df29d881f4657e903d6cd04b5f212dfb4931b7","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    def __init__(self):"},{"line_number":96,"context_line":"        super(IronicObjectIndirectionAPI, self).__init__()"},{"line_number":97,"context_line":"        from ironic.conductor import rpcapi as conductor_api"},{"line_number":98,"context_line":"        # NOTE(xek): importing here due to a cyclical import error"},{"line_number":99,"context_line":"        self._conductor \u003d conductor_api.ConductorAPI()"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def object_action(self, context, objinst, objmethod, args, kwargs):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_ed2edf41","line":98,"updated":"2015-09-18 15:30:15.000000000","message":"nit: Usually put comment above line of code being referenced.","commit_id":"91c2247a16ea210e62f2ef2af97239eca656b73c"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"620e2ab75e5864b238029546b2d669a5ba8151de","unresolved":false,"context_lines":[{"line_number":68,"context_line":"class IronicObjectIndirectionAPI(object_base.VersionedObjectIndirectionAPI):"},{"line_number":69,"context_line":"    def __init__(self):"},{"line_number":70,"context_line":"        super(IronicObjectIndirectionAPI, self).__init__()"},{"line_number":71,"context_line":"        # NOTE(xek): importing here due to a cyclical import error"},{"line_number":72,"context_line":"        from ironic.conductor import rpcapi as conductor_api"},{"line_number":73,"context_line":"        self._conductor \u003d conductor_api.ConductorAPI()"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_2251d6d8","line":71,"updated":"2015-09-22 15:20:54.000000000","message":"s/NOTE/FIXME\n\nThis is actually pretty bad ugly, we need to inform via FIXME that this should be refactored","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"b5403f62fb2ca62a1d1451cab952e5a0f623c352","unresolved":false,"context_lines":[{"line_number":68,"context_line":"class IronicObjectIndirectionAPI(object_base.VersionedObjectIndirectionAPI):"},{"line_number":69,"context_line":"    def __init__(self):"},{"line_number":70,"context_line":"        super(IronicObjectIndirectionAPI, self).__init__()"},{"line_number":71,"context_line":"        # NOTE(xek): importing here due to a cyclical import error"},{"line_number":72,"context_line":"        from ironic.conductor import rpcapi as conductor_api"},{"line_number":73,"context_line":"        self._conductor \u003d conductor_api.ConductorAPI()"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_462177b3","line":71,"in_reply_to":"ba15a1d1_2251d6d8","updated":"2015-09-22 15:51:02.000000000","message":"Done","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"620e2ab75e5864b238029546b2d669a5ba8151de","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def object_action(self, context, objinst, objmethod, args, kwargs):"},{"line_number":76,"context_line":"        return self._conductor.object_action(context, objinst, objmethod,"},{"line_number":77,"context_line":"                                             args, kwargs)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def object_class_action(self, context, objname, objmethod, objver,"},{"line_number":80,"context_line":"                            args, kwargs):"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_63b6ed8b","line":77,"updated":"2015-09-22 15:20:54.000000000","message":"do we want to handle the NotImplemented error here?","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"b5403f62fb2ca62a1d1451cab952e5a0f623c352","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def object_action(self, context, objinst, objmethod, args, kwargs):"},{"line_number":76,"context_line":"        return self._conductor.object_action(context, objinst, objmethod,"},{"line_number":77,"context_line":"                                             args, kwargs)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def object_class_action(self, context, objname, objmethod, objver,"},{"line_number":80,"context_line":"                            args, kwargs):"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_a6ee5389","line":77,"in_reply_to":"ba15a1d1_63b6ed8b","updated":"2015-09-22 15:51:02.000000000","message":"I added the NotImplemented error to provide more info to the operator who makes an error during upgrade. It can\u0027t be handled, because there was no equivalent call that can be made in previous RPC version.","commit_id":"275c2f9113a6db0eff73abb28e59a323461952d5"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"efd47698c55410bdf3535e2c9c6f6c2b8b313dd5","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def object_backport(self, context, objinst, target_version):"},{"line_number":85,"context_line":"        return self._conductor.object_backport(context, objinst,"},{"line_number":86,"context_line":"                                               target_version)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"class IronicObjectSerializer(object_base.VersionedObjectSerializer):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_9585655a","line":86,"updated":"2015-09-22 20:19:39.000000000","message":"this doesn\u0027t exist. There is self._conductor.object_backport_versions() but the args are different.","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c1776f2d09dfdcafd4f1e309b2c9457e715a14c9","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def object_backport(self, context, objinst, target_version):"},{"line_number":85,"context_line":"        return self._conductor.object_backport(context, objinst,"},{"line_number":86,"context_line":"                                               target_version)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"class IronicObjectSerializer(object_base.VersionedObjectSerializer):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_b54e69bf","line":86,"in_reply_to":"ba15a1d1_9585655a","updated":"2015-09-22 20:30:11.000000000","message":"Good catch!","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"53110be4dac284b97cd2f0f4f4f6cc5e709d9d02","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def object_backport(self, context, objinst, target_version):"},{"line_number":85,"context_line":"        return self._conductor.object_backport(context, objinst,"},{"line_number":86,"context_line":"                                               target_version)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"class IronicObjectSerializer(object_base.VersionedObjectSerializer):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_bd29639d","line":86,"in_reply_to":"ba15a1d1_b54e69bf","updated":"2015-09-23 09:27:13.000000000","message":"Done","commit_id":"dbc7b55a5c6e51dc5adade1cfb6f4e94320aef26"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"6c84d4a710a1cfec1effd802272460561ee4e69c","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                                     object_versions, args, kwargs):"},{"line_number":90,"context_line":"        return self._conductor.object_class_action_versions("},{"line_number":91,"context_line":"            context, objname, objmethod, object_versions, args, kwargs)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def object_backport_versions(self, context, objinst, object_versions):"},{"line_number":94,"context_line":"        return self._conductor.object_backport_versions(context, objinst,"},{"line_number":95,"context_line":"                                                        object_versions)"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba15a1d1_c9b6cf3d","line":92,"updated":"2015-09-23 12:23:45.000000000","message":"Don\u0027t we need to also implement object_backport method ? \nhttps://github.com/openstack/oslo.versionedobjects/blob/master/oslo_versionedobjects/base.py#L926-L949\n\nLike object_class_action, it is described that it will be deprecated soon.","commit_id":"b59e01d6ad5190715557442bef4e92523d80a050"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"36a40439f9ecf3d8c22cdd8852d637d5d83d099e","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                                     object_versions, args, kwargs):"},{"line_number":90,"context_line":"        return self._conductor.object_class_action_versions("},{"line_number":91,"context_line":"            context, objname, objmethod, object_versions, args, kwargs)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def object_backport_versions(self, context, objinst, object_versions):"},{"line_number":94,"context_line":"        return self._conductor.object_backport_versions(context, objinst,"},{"line_number":95,"context_line":"                                                        object_versions)"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba15a1d1_14ddbadf","line":92,"in_reply_to":"ba15a1d1_c9b6cf3d","updated":"2015-09-23 13:10:56.000000000","message":"No - o.vo tries to call object_backport_versions first, so object_backport isn\u0027t used when the first one is implemented.","commit_id":"b59e01d6ad5190715557442bef4e92523d80a050"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9f3c78a6b0de08022724ed2f855f778212042193","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                            args, kwargs):"},{"line_number":81,"context_line":"        # NOTE(xek): This method is implemented for compatibility with"},{"line_number":82,"context_line":"        # oslo.versionedobjects 0.10.0 and older. It will be replaced by"},{"line_number":83,"context_line":"        # object_class_action_versions."},{"line_number":84,"context_line":"        versions \u003d object_base.obj_tree_get_versions(objname)"},{"line_number":85,"context_line":"        return self.object_class_action_versions("},{"line_number":86,"context_line":"            context, objname, objmethod, versions, args, kwargs)"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba15a1d1_6467a5e9","line":83,"updated":"2015-09-23 14:01:49.000000000","message":"So we can delete this when the requirements change to oslo.versionedobjects \u003e 0.10.0, right?","commit_id":"3ad0e0ebfcc92d43c361045b44b3c161b374fe2d"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"021ea7121a5d9df246238c2e35cd3a3f6052431f","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                            args, kwargs):"},{"line_number":81,"context_line":"        # NOTE(xek): This method is implemented for compatibility with"},{"line_number":82,"context_line":"        # oslo.versionedobjects 0.10.0 and older. It will be replaced by"},{"line_number":83,"context_line":"        # object_class_action_versions."},{"line_number":84,"context_line":"        versions \u003d object_base.obj_tree_get_versions(objname)"},{"line_number":85,"context_line":"        return self.object_class_action_versions("},{"line_number":86,"context_line":"            context, objname, objmethod, versions, args, kwargs)"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba15a1d1_1744d9b4","line":83,"in_reply_to":"ba15a1d1_6467a5e9","updated":"2015-09-23 14:14:56.000000000","message":"yes","commit_id":"3ad0e0ebfcc92d43c361045b44b3c161b374fe2d"}],"ironic/objects/chassis.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"37595df08fab70471e1e20833292b9fc7c7dbe50","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        chassis.obj_reset_changes()"},{"line_number":56,"context_line":"        return chassis"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    # NOTE(xek): we don\u0027t want to enable RPC on this call just yet"},{"line_number":59,"context_line":"    # @object_base.remotable_classmethod"},{"line_number":60,"context_line":"    @classmethod"},{"line_number":61,"context_line":"    def get(cls, context, chassis_id):"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba15a1d1_5bfe7006","line":58,"updated":"2015-09-21 13:23:38.000000000","message":"I\u0027d love it if these comments had a note as to when we should enable it :)","commit_id":"333a63e0b6895f843bc84f373882a36e754be636"}],"ironic/tests/conductor/test_manager.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"90d788a702ee050bc85a3cf38f340d7c2cf4e734","unresolved":false,"context_lines":[{"line_number":4378,"context_line":"                if raise_exception:"},{"line_number":4379,"context_line":"                    raise Exception(\u0027test\u0027)"},{"line_number":4380,"context_line":"                else:"},{"line_number":4381,"context_line":"                    return \u0027test\u0027"},{"line_number":4382,"context_line":""},{"line_number":4383,"context_line":"        obj \u003d TestObject(self.context)"},{"line_number":4384,"context_line":"        if is_classmethod:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_67e67545","line":4381,"updated":"2015-09-18 12:38:31.000000000","message":"Case when it returns IronicObject is not tested.","commit_id":"847ae3943a402add572e314122030400a269695f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"fb210ec976c529aae8ea376b2b0e252c6f71f666","unresolved":false,"context_lines":[{"line_number":4378,"context_line":"                if raise_exception:"},{"line_number":4379,"context_line":"                    raise Exception(\u0027test\u0027)"},{"line_number":4380,"context_line":"                else:"},{"line_number":4381,"context_line":"                    return \u0027test\u0027"},{"line_number":4382,"context_line":""},{"line_number":4383,"context_line":"        obj \u003d TestObject(self.context)"},{"line_number":4384,"context_line":"        if is_classmethod:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_5e5c5718","line":4381,"in_reply_to":"ba15a1d1_67e67545","updated":"2015-09-18 13:47:03.000000000","message":"Done","commit_id":"847ae3943a402add572e314122030400a269695f"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"6c84d4a710a1cfec1effd802272460561ee4e69c","unresolved":false,"context_lines":[{"line_number":4396,"context_line":"                tuple(), {\u0027raise_exception\u0027: raise_exception,"},{"line_number":4397,"context_line":"                          \u0027return_object\u0027: return_object})"},{"line_number":4398,"context_line":"        else:"},{"line_number":4399,"context_line":"            updates, result \u003d self.conductor.object_action("},{"line_number":4400,"context_line":"                self.context, obj, \u0027foo\u0027, tuple(),"},{"line_number":4401,"context_line":"                {\u0027raise_exception\u0027: raise_exception,"},{"line_number":4402,"context_line":"                 \u0027return_object\u0027: return_object})"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba15a1d1_d45f420d","line":4399,"updated":"2015-09-23 12:23:45.000000000","message":"I am not sure, but I think should be doing some mock oslo objects and assertions on updates to see if we are capturing the updates correctly or not.","commit_id":"b59e01d6ad5190715557442bef4e92523d80a050"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"36a40439f9ecf3d8c22cdd8852d637d5d83d099e","unresolved":false,"context_lines":[{"line_number":4396,"context_line":"                tuple(), {\u0027raise_exception\u0027: raise_exception,"},{"line_number":4397,"context_line":"                          \u0027return_object\u0027: return_object})"},{"line_number":4398,"context_line":"        else:"},{"line_number":4399,"context_line":"            updates, result \u003d self.conductor.object_action("},{"line_number":4400,"context_line":"                self.context, obj, \u0027foo\u0027, tuple(),"},{"line_number":4401,"context_line":"                {\u0027raise_exception\u0027: raise_exception,"},{"line_number":4402,"context_line":"                 \u0027return_object\u0027: return_object})"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba15a1d1_6fea2376","line":4399,"in_reply_to":"ba15a1d1_d45f420d","updated":"2015-09-23 13:10:56.000000000","message":"I believe this is already fully tested in test_objects.py","commit_id":"b59e01d6ad5190715557442bef4e92523d80a050"}],"ironic/tests/objects/test_objects.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"90d788a702ee050bc85a3cf38f340d7c2cf4e734","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import datetime"},{"line_number":17,"context_line":"import gettext"},{"line_number":18,"context_line":"import iso8601"},{"line_number":19,"context_line":"import mock"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from oslo_context import context"},{"line_number":22,"context_line":"from oslo_utils import timeutils"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_a7fc8db8","line":19,"updated":"2015-09-18 12:38:31.000000000","message":"This should be added to second group of imports.","commit_id":"847ae3943a402add572e314122030400a269695f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"fb210ec976c529aae8ea376b2b0e252c6f71f666","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import datetime"},{"line_number":17,"context_line":"import gettext"},{"line_number":18,"context_line":"import iso8601"},{"line_number":19,"context_line":"import mock"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from oslo_context import context"},{"line_number":22,"context_line":"from oslo_utils import timeutils"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_5e8a1765","line":19,"in_reply_to":"ba15a1d1_a7fc8db8","updated":"2015-09-18 13:47:03.000000000","message":"Done","commit_id":"847ae3943a402add572e314122030400a269695f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"90d788a702ee050bc85a3cf38f340d7c2cf4e734","unresolved":false,"context_lines":[{"line_number":471,"context_line":"            for item in thing2:"},{"line_number":472,"context_line":"                self.assertIsInstance(item, MyObj)"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"    @mock.patch(\u0027ironic.objects.base.IronicObject.indirection_api\u0027)"},{"line_number":475,"context_line":"    def _test_deserialize_entity_newer(self, obj_version, backported_to,"},{"line_number":476,"context_line":"                                       mock_indirection_api,"},{"line_number":477,"context_line":"                                       my_version\u003d\u00271.6\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_e724c560","line":474,"updated":"2015-09-18 12:38:31.000000000","message":"Please use mock.patch.object, also add autospec\u003dTrue","commit_id":"847ae3943a402add572e314122030400a269695f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"fb210ec976c529aae8ea376b2b0e252c6f71f666","unresolved":false,"context_lines":[{"line_number":471,"context_line":"            for item in thing2:"},{"line_number":472,"context_line":"                self.assertIsInstance(item, MyObj)"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"    @mock.patch(\u0027ironic.objects.base.IronicObject.indirection_api\u0027)"},{"line_number":475,"context_line":"    def _test_deserialize_entity_newer(self, obj_version, backported_to,"},{"line_number":476,"context_line":"                                       mock_indirection_api,"},{"line_number":477,"context_line":"                                       my_version\u003d\u00271.6\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_fe844b5e","line":474,"in_reply_to":"ba15a1d1_e724c560","updated":"2015-09-18 13:47:03.000000000","message":"It won\u0027t work, since IronicObject by default doesn\u0027t have an indirection_api.\n\n\npatch.object throws:\n\nAttributeError: ironic.objects.base.IronicObject does not have the attribute \u0027indirection_api\u0027","commit_id":"847ae3943a402add572e314122030400a269695f"}]}
