)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"d5d2ef7c48fe91b00ad4d68ed3c67cf0205a7770","unresolved":false,"context_lines":[{"line_number":11,"context_line":"by a conductor when a node is mapped to it by changes in the"},{"line_number":12,"context_line":"hash distribution."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Ib74a8ded49e4a85964c46d4a445ff0a2df39862a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"AAAATn%2F9nkI%3D","line":14,"updated":"2013-12-09 17:03:33.000000000","message":"Needs to add https://blueprints.launchpad.net/ironic/+spec/instance-mapping-by-consistent-hash ?","commit_id":"92ccfbb5a5cb1d46c62347d0a9934376e5934a11"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"91b3ae37d10b34a54f02a357b7dc31b68b5e4fbd","unresolved":false,"context_lines":[{"line_number":11,"context_line":"by a conductor when a node is mapped to it by changes in the"},{"line_number":12,"context_line":"hash distribution."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Ib74a8ded49e4a85964c46d4a445ff0a2df39862a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"AAAATn%2F9NoY%3D","line":14,"in_reply_to":"AAAATn%2F9nkI%3D","updated":"2013-12-13 23:32:32.000000000","message":"Done","commit_id":"92ccfbb5a5cb1d46c62347d0a9934376e5934a11"}],"ironic/conductor/manager.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a828bf6e849fcf0d1f5f73462cce204d060708ed","unresolved":false,"context_lines":[{"line_number":110,"context_line":"            self.dbapi.register_conductor({\u0027hostname\u0027: self.host,"},{"line_number":111,"context_line":"                                           \u0027drivers\u0027: self.drivers})"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        self.hash_rings \u003d self._get_current_ring()"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    # TODO(deva): add stop() to call unregister_conductor"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9zHY%3D","line":113,"updated":"2013-12-05 19:40:48.000000000","message":"It would be useful for me, if there was a comment that describes this. It is a dict, driver -\u003e hashring of hosts. Or something like that :)\n\nThe other thing I wonder, is whether it makes sense to call it \u0027hash_rings\u0027, vs eg driver_thingies. What if, in the future, the conductor had foo and bar widgets, and you wanted hash_rings for these widgets -\u003ehosts?","commit_id":"92ccfbb5a5cb1d46c62347d0a9934376e5934a11"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"c252a6a6e8e4d3f66d44d00b057c6986f6facac8","unresolved":false,"context_lines":[{"line_number":110,"context_line":"            self.dbapi.register_conductor({\u0027hostname\u0027: self.host,"},{"line_number":111,"context_line":"                                           \u0027drivers\u0027: self.drivers})"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        self.hash_rings \u003d self._get_current_ring()"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    # TODO(deva): add stop() to call unregister_conductor"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9Nnk%3D","line":113,"in_reply_to":"AAAATn%2F9zHY%3D","updated":"2013-12-13 23:36:09.000000000","message":"Done","commit_id":"92ccfbb5a5cb1d46c62347d0a9934376e5934a11"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a828bf6e849fcf0d1f5f73462cce204d060708ed","unresolved":false,"context_lines":[{"line_number":397,"context_line":"                                                 filters\u003dfilters)"},{"line_number":398,"context_line":"        for (node_id, node_uuid, driver) in node_list:"},{"line_number":399,"context_line":"            # only sync power states for nodes mapped to this conductor"},{"line_number":400,"context_line":"            if self.hash_rings[driver].get_hosts(node_uuid)[0] !\u003d self.host:"},{"line_number":401,"context_line":"                continue"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9zI4%3D","line":400,"updated":"2013-12-05 19:40:48.000000000","message":"Why do you only look at the first host? Is it because regardless of the number of replicas, you only want the first conductor that the node maps to, to do the sync\u0027ing?","commit_id":"92ccfbb5a5cb1d46c62347d0a9934376e5934a11"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"c252a6a6e8e4d3f66d44d00b057c6986f6facac8","unresolved":false,"context_lines":[{"line_number":397,"context_line":"                                                 filters\u003dfilters)"},{"line_number":398,"context_line":"        for (node_id, node_uuid, driver) in node_list:"},{"line_number":399,"context_line":"            # only sync power states for nodes mapped to this conductor"},{"line_number":400,"context_line":"            if self.hash_rings[driver].get_hosts(node_uuid)[0] !\u003d self.host:"},{"line_number":401,"context_line":"                continue"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9Nno%3D","line":400,"in_reply_to":"AAAATn%2F9zI4%3D","updated":"2013-12-13 23:36:09.000000000","message":"Thanks. This isn\u0027t very clear here. Let me see if I can improve.","commit_id":"92ccfbb5a5cb1d46c62347d0a9934376e5934a11"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a828bf6e849fcf0d1f5f73462cce204d060708ed","unresolved":false,"context_lines":[{"line_number":423,"context_line":"                #             silently ignore it and continue"},{"line_number":424,"context_line":"                continue"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"            except exception.NodeLocked:"},{"line_number":427,"context_line":"                LOG.info(_(\"During sync_power_state, node %(node)s was \""},{"line_number":428,"context_line":"                           \"already locked by another process. Skip.\") %"},{"line_number":429,"context_line":"                           {\u0027node\u0027: node_uuid})"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9ztI%3D","line":426,"updated":"2013-12-05 19:40:48.000000000","message":"Did you mean to split up the except part above this (line 420?) to eg log different messages? \n\nAnd I think you are missing a \"continue\".","commit_id":"92ccfbb5a5cb1d46c62347d0a9934376e5934a11"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"91b3ae37d10b34a54f02a357b7dc31b68b5e4fbd","unresolved":false,"context_lines":[{"line_number":423,"context_line":"                #             silently ignore it and continue"},{"line_number":424,"context_line":"                continue"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"            except exception.NodeLocked:"},{"line_number":427,"context_line":"                LOG.info(_(\"During sync_power_state, node %(node)s was \""},{"line_number":428,"context_line":"                           \"already locked by another process. Skip.\") %"},{"line_number":429,"context_line":"                           {\u0027node\u0027: node_uuid})"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9NoM%3D","line":426,"in_reply_to":"AAAATn%2F9ztI%3D","updated":"2013-12-13 23:32:32.000000000","message":"woops - that\u0027s a merge/split error. Thanks!","commit_id":"92ccfbb5a5cb1d46c62347d0a9934376e5934a11"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"979b1dbfad8fe4eef96138d636e95f2902244ff8","unresolved":false,"context_lines":[{"line_number":433,"context_line":""},{"line_number":434,"context_line":"        ring \u003d {}"},{"line_number":435,"context_line":"        d2c \u003d self.dbapi.list_active_conductor_drivers("},{"line_number":436,"context_line":"                interval\u003d(CONF.conductor.heartbeat_interval * 2))"},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"        for driver in self.drivers:"},{"line_number":439,"context_line":"            ring[driver] \u003d hash.HashRing(d2c[driver])"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9cIc%3D","line":436,"updated":"2013-12-11 14:18:00.000000000","message":"IMO *2 too much here. What about int(interval * k), when k ~1.3-1.5 ?","commit_id":"92ccfbb5a5cb1d46c62347d0a9934376e5934a11"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"91b3ae37d10b34a54f02a357b7dc31b68b5e4fbd","unresolved":false,"context_lines":[{"line_number":433,"context_line":""},{"line_number":434,"context_line":"        ring \u003d {}"},{"line_number":435,"context_line":"        d2c \u003d self.dbapi.list_active_conductor_drivers("},{"line_number":436,"context_line":"                interval\u003d(CONF.conductor.heartbeat_interval * 2))"},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"        for driver in self.drivers:"},{"line_number":439,"context_line":"            ring[driver] \u003d hash.HashRing(d2c[driver])"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9Nn4%3D","line":436,"in_reply_to":"AAAATn%2F9cIc%3D","updated":"2013-12-13 23:32:32.000000000","message":"this is a left-over from previous testing, and should actually be heartbeat_timeout. Which I have set to default to 60 seconds. I think we should iterate / discuss what better defaults are later, once we are able to see this code in a production-like environment.","commit_id":"92ccfbb5a5cb1d46c62347d0a9934376e5934a11"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a3f0fe25e1a0d912a73951b2bf50f02b7b0ab4bc","unresolved":false,"context_lines":[{"line_number":86,"context_line":"class ConductorManager(service.PeriodicService):"},{"line_number":87,"context_line":"    \"\"\"Ironic Conductor service main class.\"\"\""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    RPC_API_VERSION \u003d \u00271.6\u0027"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def __init__(self, host, topic):"},{"line_number":92,"context_line":"        serializer \u003d objects_base.IronicObjectSerializer()"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2F31A%3D","line":89,"updated":"2014-01-07 11:58:34.000000000","message":"As rebalance_node_ring() is not implemented and not part of the rpcapi we don\u0027t bump this version it yet, correct?","commit_id":"88ed5c69c11a65ce62cb5eaf9522c3bcb59c06a1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9efa844a4362f1a75374f9f9c25f2828fca780c6","unresolved":false,"context_lines":[{"line_number":377,"context_line":"                        node.save(context)"},{"line_number":378,"context_line":""},{"line_number":379,"context_line":"            except exception.NodeNotFound:"},{"line_number":380,"context_line":"                LOG.info(_(\"During sync_power_state, node %(node)s was not \""},{"line_number":381,"context_line":"                           \"found and presumed deleted by another process.\") %"},{"line_number":382,"context_line":"                           {\u0027node\u0027: node_uuid})"},{"line_number":383,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2Fp%2F0%3D","line":380,"updated":"2014-01-10 02:20:52.000000000","message":"sync_power_states? not sure if it is meant to closely resemble the method name. Same thing in logging below.","commit_id":"a7cda1912e3f713b439657d607ec3ee4d88f1af2"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"9fbc535ccbc1dbb3e6484e2af0c397626dc35923","unresolved":false,"context_lines":[{"line_number":377,"context_line":"                        node.save(context)"},{"line_number":378,"context_line":""},{"line_number":379,"context_line":"            except exception.NodeNotFound:"},{"line_number":380,"context_line":"                LOG.info(_(\"During sync_power_state, node %(node)s was not \""},{"line_number":381,"context_line":"                           \"found and presumed deleted by another process.\") %"},{"line_number":382,"context_line":"                           {\u0027node\u0027: node_uuid})"},{"line_number":383,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FhQM%3D","line":380,"in_reply_to":"AAAAUH%2F%2Fp%2F0%3D","updated":"2014-01-12 23:50:38.000000000","message":"I\u0027m not sure what the feedback here is -- there is already a LOG.warning on :370 with a similar log message which, in my opinion, is sufficiently descriptive. This is also consistent with the nova.nova.compute.manager method of the same name.\n\n  4796     def _sync_power_states(self, context):\n  ...\n  4820                 LOG.info(_(\"During sync_power_state the instance has a \"\n  4821                            \"pending task. Skip.\"), instance\u003ddb_instance)","commit_id":"a7cda1912e3f713b439657d607ec3ee4d88f1af2"}],"ironic/conductor/rpcapi.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a3f0fe25e1a0d912a73951b2bf50f02b7b0ab4bc","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            dest \u003d ring.get_hosts(node.uuid)"},{"line_number":80,"context_line":"            return self.topic + \".\" + dest[0]"},{"line_number":81,"context_line":"        except KeyError:"},{"line_number":82,"context_line":"            return self.topic"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def get_node_power_state(self, context, node_id, topic\u003dNone):"},{"line_number":85,"context_line":"        \"\"\"Ask a conductor for the node power state."}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2F31c%3D","line":82,"updated":"2014-01-07 11:58:34.000000000","message":"Does we need to bump the RPC_API_VERSION because we added this new method here?\n\nA docstring would be great as well.","commit_id":"88ed5c69c11a65ce62cb5eaf9522c3bcb59c06a1"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a7383ecd4dc6c44e7878ed0a6f0c62a34025cb6a","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            dest \u003d ring.get_hosts(node.uuid)"},{"line_number":80,"context_line":"            return self.topic + \".\" + dest[0]"},{"line_number":81,"context_line":"        except KeyError:"},{"line_number":82,"context_line":"            return self.topic"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def get_node_power_state(self, context, node_id, topic\u003dNone):"},{"line_number":85,"context_line":"        \"\"\"Ask a conductor for the node power state."}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2FvJA%3D","line":82,"in_reply_to":"AAAAUH%2F%2F31c%3D","updated":"2014-01-09 01:56:44.000000000","message":"No, this doesn\u0027t affect RPC_API_VERSION because it isn\u0027t being sent across the RPC bus. It\u0027s a local helper method (but not a private one).","commit_id":"88ed5c69c11a65ce62cb5eaf9522c3bcb59c06a1"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a3f0fe25e1a0d912a73951b2bf50f02b7b0ab4bc","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        return self.call(context,"},{"line_number":116,"context_line":"                         self.make_msg(\u0027update_node\u0027,"},{"line_number":117,"context_line":"                                       node_obj\u003dnode_obj),"},{"line_number":118,"context_line":"                         topic\u003dtopic if topic else self.topic)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def change_node_power_state(self, context, node_id, new_state, topic\u003dNone):"},{"line_number":121,"context_line":"        \"\"\"Asynchronously change power state of a node."}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2F32Q%3D","line":118,"updated":"2014-01-07 11:58:34.000000000","message":"As you already have the node_obj (or node_id) does it make sense to do something like:\n\ntopic\u003dtopic if topic else self.get_topic_for(node_obj) ?","commit_id":"88ed5c69c11a65ce62cb5eaf9522c3bcb59c06a1"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a7383ecd4dc6c44e7878ed0a6f0c62a34025cb6a","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        return self.call(context,"},{"line_number":116,"context_line":"                         self.make_msg(\u0027update_node\u0027,"},{"line_number":117,"context_line":"                                       node_obj\u003dnode_obj),"},{"line_number":118,"context_line":"                         topic\u003dtopic if topic else self.topic)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def change_node_power_state(self, context, node_id, new_state, topic\u003dNone):"},{"line_number":121,"context_line":"        \"\"\"Asynchronously change power state of a node."}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2FvF4%3D","line":118,"in_reply_to":"AAAAUH%2F%2F32Q%3D","updated":"2014-01-09 01:56:44.000000000","message":"This is possible, but I think it\u0027s better to stick with a consistent set of parameters.","commit_id":"88ed5c69c11a65ce62cb5eaf9522c3bcb59c06a1"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a3f0fe25e1a0d912a73951b2bf50f02b7b0ab4bc","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        :param context: request context."},{"line_number":124,"context_line":"        :param node_id: node id or uuid."},{"line_number":125,"context_line":"        :param new_state: one of ironic.common.states power state values"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        \"\"\""},{"line_number":128,"context_line":"        self.cast(context,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2F32w%3D","line":125,"updated":"2014-01-07 11:58:34.000000000","message":"Missing docstring just like in the update_node() method. The change applies for other methods as well\n\n:param topic: RPC topic. Defaults to self.topic.","commit_id":"88ed5c69c11a65ce62cb5eaf9522c3bcb59c06a1"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a7383ecd4dc6c44e7878ed0a6f0c62a34025cb6a","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        :param context: request context."},{"line_number":124,"context_line":"        :param node_id: node id or uuid."},{"line_number":125,"context_line":"        :param new_state: one of ironic.common.states power state values"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        \"\"\""},{"line_number":128,"context_line":"        self.cast(context,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2FvGE%3D","line":125,"in_reply_to":"AAAAUH%2F%2F32w%3D","updated":"2014-01-09 01:56:44.000000000","message":"Done","commit_id":"88ed5c69c11a65ce62cb5eaf9522c3bcb59c06a1"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"094d2e05655ce44f49634f03e4bd7bbf3664cdb3","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        :raises: InvalidParameterValue for parameter errors."},{"line_number":143,"context_line":"        :raises: UnsupportedDriverExtension for unsupported extensions."},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        \"\"\""},{"line_number":146,"context_line":"        driver_data \u003d self.call(context,"},{"line_number":147,"context_line":"                                self.make_msg(\u0027validate_vendor_action\u0027,"},{"line_number":148,"context_line":"                                    node_id\u003dnode_id,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2FxDw%3D","line":145,"updated":"2014-01-08 18:04:45.000000000","message":"We could reuse topic for both calls here.\n\ntopic \u003d topic if topic else self.topic\n\ndriver_data \u003d self.call(context, ..., topic\u003dtopic)\nself.cast(context, ..., topic\u003dtopic)","commit_id":"88ed5c69c11a65ce62cb5eaf9522c3bcb59c06a1"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a7383ecd4dc6c44e7878ed0a6f0c62a34025cb6a","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        :raises: InvalidParameterValue for parameter errors."},{"line_number":143,"context_line":"        :raises: UnsupportedDriverExtension for unsupported extensions."},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        \"\"\""},{"line_number":146,"context_line":"        driver_data \u003d self.call(context,"},{"line_number":147,"context_line":"                                self.make_msg(\u0027validate_vendor_action\u0027,"},{"line_number":148,"context_line":"                                    node_id\u003dnode_id,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2FvF0%3D","line":145,"in_reply_to":"AAAAUH%2F%2FxDw%3D","updated":"2014-01-09 01:56:44.000000000","message":"Done","commit_id":"88ed5c69c11a65ce62cb5eaf9522c3bcb59c06a1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9efa844a4362f1a75374f9f9c25f2828fca780c6","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                     [\u0027ironic.common.exception\u0027,"},{"line_number":37,"context_line":"                      \u0027exceptions\u0027, ])"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"MANAGER_TOPIC \u003d \u0027ironic.conductor_manager\u0027"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ConductorAPI(ironic.openstack.common.rpc.proxy.RpcProxy):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FqGo%3D","line":39,"updated":"2014-01-10 02:20:52.000000000","message":"As an aside, this is also specified in manager.py. Are they meant to be the same?","commit_id":"a7cda1912e3f713b439657d607ec3ee4d88f1af2"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"9fbc535ccbc1dbb3e6484e2af0c397626dc35923","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                     [\u0027ironic.common.exception\u0027,"},{"line_number":37,"context_line":"                      \u0027exceptions\u0027, ])"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"MANAGER_TOPIC \u003d \u0027ironic.conductor_manager\u0027"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ConductorAPI(ironic.openstack.common.rpc.proxy.RpcProxy):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FhQ4%3D","line":39,"in_reply_to":"AAAAUH%2F%2FqGo%3D","updated":"2014-01-12 23:50:38.000000000","message":"Yes. They must be the same as this determines the rabbit topic name which they communicate over.","commit_id":"a7cda1912e3f713b439657d607ec3ee4d88f1af2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"57d20d78154ca0393c4988d08de15ac620f063d5","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        1.5 - Added validate_driver_interfaces."},{"line_number":54,"context_line":"        1.6 - change_node_power_state, do_node_deploy and do_node_tear_down"},{"line_number":55,"context_line":"              accept node id instead of node object."},{"line_number":56,"context_line":"        1.7 - add topic parameter to RPC methods."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    \"\"\""},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2Fn1o%3D","line":56,"updated":"2014-01-10 11:46:33.000000000","message":"Added?","commit_id":"a7cda1912e3f713b439657d607ec3ee4d88f1af2"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"9fbc535ccbc1dbb3e6484e2af0c397626dc35923","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        1.5 - Added validate_driver_interfaces."},{"line_number":54,"context_line":"        1.6 - change_node_power_state, do_node_deploy and do_node_tear_down"},{"line_number":55,"context_line":"              accept node id instead of node object."},{"line_number":56,"context_line":"        1.7 - add topic parameter to RPC methods."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    \"\"\""},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FhQ0%3D","line":56,"in_reply_to":"AAAAUH%2F%2Fn1o%3D","updated":"2014-01-12 23:50:38.000000000","message":"Done","commit_id":"a7cda1912e3f713b439657d607ec3ee4d88f1af2"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"64b0f00b5abc93f8459173c68ae0f8466cd7ead0","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        :param node: a node object."},{"line_number":82,"context_line":"        :returns: an RPC topic string."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        \"\"\""},{"line_number":85,"context_line":"        try:"},{"line_number":86,"context_line":"            ring \u003d self.hash_rings[node.driver]"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2Fttk%3D","line":83,"updated":"2014-01-09 09:46:57.000000000","message":"How do you think should we add \u0027raises\u0027 docstrings lines here?","commit_id":"a7cda1912e3f713b439657d607ec3ee4d88f1af2"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"85fce5e74cd7eaff567652b7e518c885452dc908","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        :param node: a node object."},{"line_number":82,"context_line":"        :returns: an RPC topic string."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        \"\"\""},{"line_number":85,"context_line":"        try:"},{"line_number":86,"context_line":"            ring \u003d self.hash_rings[node.driver]"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FttQ%3D","line":83,"in_reply_to":"AAAAUH%2F%2Fttk%3D","updated":"2014-01-09 09:50:15.000000000","message":"yes, we have caught the KeyError exception and dont raise, so ignore this one.","commit_id":"a7cda1912e3f713b439657d607ec3ee4d88f1af2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"57d20d78154ca0393c4988d08de15ac620f063d5","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        return self.call(context,"},{"line_number":102,"context_line":"                         self.make_msg(\u0027get_node_power_state\u0027,"},{"line_number":103,"context_line":"                                       node_id\u003dnode_id),"},{"line_number":104,"context_line":"                         topic\u003dtopic if topic else self.topic)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def update_node(self, context, node_obj, topic\u003dNone):"},{"line_number":107,"context_line":"        \"\"\"Synchronously, have a conductor update the node\u0027s information."}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2Fn2I%3D","line":104,"updated":"2014-01-10 11:46:33.000000000","message":"Hi deva, sorry I forgot to mention it on my previous review.\n\nNIT: I think that this conditional could be simplified:\n\ntopic\u003dtopic or self.topic\n\n\n** The comment applies for the rest of the file as well","commit_id":"a7cda1912e3f713b439657d607ec3ee4d88f1af2"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"9fbc535ccbc1dbb3e6484e2af0c397626dc35923","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        return self.call(context,"},{"line_number":102,"context_line":"                         self.make_msg(\u0027get_node_power_state\u0027,"},{"line_number":103,"context_line":"                                       node_id\u003dnode_id),"},{"line_number":104,"context_line":"                         topic\u003dtopic if topic else self.topic)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def update_node(self, context, node_obj, topic\u003dNone):"},{"line_number":107,"context_line":"        \"\"\"Synchronously, have a conductor update the node\u0027s information."}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FhQw%3D","line":104,"in_reply_to":"AAAAUH%2F%2Fn2I%3D","updated":"2014-01-12 23:50:38.000000000","message":"Done","commit_id":"a7cda1912e3f713b439657d607ec3ee4d88f1af2"}],"ironic/tests/conductor/test_manager.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a828bf6e849fcf0d1f5f73462cce204d060708ed","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            mock_touch.assert_called_once_with(\u0027test-host\u0027)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def test__sync_power_state_no_sync(self):"},{"line_number":83,"context_line":"        self.service.start()"},{"line_number":84,"context_line":"        n \u003d utils.get_test_node(driver\u003d\u0027fake\u0027, power_state\u003d\u0027fake-power\u0027)"},{"line_number":85,"context_line":"        self.dbapi.create_node(n)"},{"line_number":86,"context_line":"        with mock.patch.object(self.driver.power,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9zbc%3D","side":"PARENT","line":83,"updated":"2013-12-05 19:40:48.000000000","message":"did you still want this?","commit_id":"a346b7bc0893406e34208b71f705f58604853545"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"91b3ae37d10b34a54f02a357b7dc31b68b5e4fbd","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            mock_touch.assert_called_once_with(\u0027test-host\u0027)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def test__sync_power_state_no_sync(self):"},{"line_number":83,"context_line":"        self.service.start()"},{"line_number":84,"context_line":"        n \u003d utils.get_test_node(driver\u003d\u0027fake\u0027, power_state\u003d\u0027fake-power\u0027)"},{"line_number":85,"context_line":"        self.dbapi.create_node(n)"},{"line_number":86,"context_line":"        with mock.patch.object(self.driver.power,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9Nn0%3D","side":"PARENT","line":83,"in_reply_to":"AAAATn%2F9zbc%3D","updated":"2013-12-13 23:32:32.000000000","message":"this test? this line of code? I\u0027m not sure what you mean.","commit_id":"a346b7bc0893406e34208b71f705f58604853545"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a828bf6e849fcf0d1f5f73462cce204d060708ed","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        self.assertEqual(node[\u0027power_state\u0027], \u0027fake-power\u0027)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def test__sync_power_state_do_sync(self):"},{"line_number":95,"context_line":"        self.service.start()"},{"line_number":96,"context_line":"        n \u003d utils.get_test_node(driver\u003d\u0027fake\u0027, power_state\u003d\u0027fake-power\u0027)"},{"line_number":97,"context_line":"        self.dbapi.create_node(n)"},{"line_number":98,"context_line":"        with mock.patch.object(self.driver.power,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9zbY%3D","side":"PARENT","line":95,"updated":"2013-12-05 19:40:48.000000000","message":"ditto","commit_id":"a346b7bc0893406e34208b71f705f58604853545"}],"ironic/tests/conductor/test_rpcapi.py":[{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"64b0f00b5abc93f8459173c68ae0f8466cd7ead0","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"#            if \u0027topic\u0027 in self.fake_kwargs:"},{"line_number":74,"context_line":"#                del self.fake_kwargs[\u0027topic\u0027]"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"            if expected_retval:"},{"line_number":77,"context_line":"                return expected_retval"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2Fty8%3D","line":75,"updated":"2014-01-09 09:46:57.000000000","message":"Devananda, I understand these are not required now, right?","commit_id":"a7cda1912e3f713b439657d607ec3ee4d88f1af2"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"9fbc535ccbc1dbb3e6484e2af0c397626dc35923","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"#            if \u0027topic\u0027 in self.fake_kwargs:"},{"line_number":74,"context_line":"#                del self.fake_kwargs[\u0027topic\u0027]"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"            if expected_retval:"},{"line_number":77,"context_line":"                return expected_retval"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FhQg%3D","line":75,"in_reply_to":"AAAAUH%2F%2Fty8%3D","updated":"2014-01-12 23:50:38.000000000","message":"Done","commit_id":"a7cda1912e3f713b439657d607ec3ee4d88f1af2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9efa844a4362f1a75374f9f9c25f2828fca780c6","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        for arg, expected_arg in zip(self.fake_args, expected_args):"},{"line_number":88,"context_line":"            self.assertEqual(arg, expected_arg)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test__get_conductor_topic(self):"},{"line_number":91,"context_line":"        pass"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def test__get_conductor_topic_no_driver(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2Fp4U%3D","line":90,"updated":"2014-01-10 02:20:52.000000000","message":"are you going to do these in another patch?","commit_id":"a7cda1912e3f713b439657d607ec3ee4d88f1af2"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"9fbc535ccbc1dbb3e6484e2af0c397626dc35923","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        for arg, expected_arg in zip(self.fake_args, expected_args):"},{"line_number":88,"context_line":"            self.assertEqual(arg, expected_arg)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test__get_conductor_topic(self):"},{"line_number":91,"context_line":"        pass"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def test__get_conductor_topic_no_driver(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FhQk%3D","line":90,"in_reply_to":"AAAAUH%2F%2Fn2g%3D","updated":"2014-01-12 23:50:38.000000000","message":"Woops, yes, I meant to leave #TODO there... but now I\u0027ll just go implement them :)","commit_id":"a7cda1912e3f713b439657d607ec3ee4d88f1af2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"57d20d78154ca0393c4988d08de15ac620f063d5","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        for arg, expected_arg in zip(self.fake_args, expected_args):"},{"line_number":88,"context_line":"            self.assertEqual(arg, expected_arg)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test__get_conductor_topic(self):"},{"line_number":91,"context_line":"        pass"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def test__get_conductor_topic_no_driver(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2Fn2g%3D","line":90,"in_reply_to":"AAAAUH%2F%2Fp4U%3D","updated":"2014-01-10 11:46:33.000000000","message":"If so, maybe leaving a #TODO would be more informative","commit_id":"a7cda1912e3f713b439657d607ec3ee4d88f1af2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"18830a0fc753f33261a53cee8ae1e4bd1881fde6","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        self.assertEqual(expected_topic,"},{"line_number":61,"context_line":"                         rpcapi.get_topic_for(self.fake_node_obj))"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_get_topic_for_unknown_driver(self):"},{"line_number":64,"context_line":"        CONF.set_override(\u0027host\u0027, \u0027fake-host\u0027)"},{"line_number":65,"context_line":"        self.dbapi.register_conductor({\u0027hostname\u0027: \u0027fake-host\u0027,"},{"line_number":66,"context_line":"                                       \u0027drivers\u0027: [\u0027other-driver\u0027]})"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2Fdw0%3D","line":63,"updated":"2014-01-13 16:03:16.000000000","message":"Code (rpcapi.get_topic_for) will also handle a node with no driver specified. Don\u0027t know if you want to add a test for that or not.","commit_id":"230694793b7eebaece588d0565ee90c77aca8c78"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5122ca15958888c21ac699ccbfa96a89feba4383","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        self.assertEqual(expected_topic,"},{"line_number":61,"context_line":"                         rpcapi.get_topic_for(self.fake_node_obj))"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_get_topic_for_unknown_driver(self):"},{"line_number":64,"context_line":"        CONF.set_override(\u0027host\u0027, \u0027fake-host\u0027)"},{"line_number":65,"context_line":"        self.dbapi.register_conductor({\u0027hostname\u0027: \u0027fake-host\u0027,"},{"line_number":66,"context_line":"                                       \u0027drivers\u0027: [\u0027other-driver\u0027]})"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2FcbY%3D","line":63,"in_reply_to":"AAAAUH%2F%2FczU%3D","updated":"2014-01-13 20:31:20.000000000","message":"Oops. You\u0027re right! I got confused between \u0027driver\u0027 \u0026 \u0027driver_info\u0027.","commit_id":"230694793b7eebaece588d0565ee90c77aca8c78"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"715fae3919cd657455d3014a2f34ba577d3e3753","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        self.assertEqual(expected_topic,"},{"line_number":61,"context_line":"                         rpcapi.get_topic_for(self.fake_node_obj))"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_get_topic_for_unknown_driver(self):"},{"line_number":64,"context_line":"        CONF.set_override(\u0027host\u0027, \u0027fake-host\u0027)"},{"line_number":65,"context_line":"        self.dbapi.register_conductor({\u0027hostname\u0027: \u0027fake-host\u0027,"},{"line_number":66,"context_line":"                                       \u0027drivers\u0027: [\u0027other-driver\u0027]})"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2FczU%3D","line":63,"in_reply_to":"AAAAUH%2F%2FdXo%3D","updated":"2014-01-13 18:59:26.000000000","message":"I believe it\u0027s impossible for a node to exist with driver \u003d None.","commit_id":"230694793b7eebaece588d0565ee90c77aca8c78"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9823e5509c9c2b48bea3aea5902e7685299366c1","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        self.assertEqual(expected_topic,"},{"line_number":61,"context_line":"                         rpcapi.get_topic_for(self.fake_node_obj))"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_get_topic_for_unknown_driver(self):"},{"line_number":64,"context_line":"        CONF.set_override(\u0027host\u0027, \u0027fake-host\u0027)"},{"line_number":65,"context_line":"        self.dbapi.register_conductor({\u0027hostname\u0027: \u0027fake-host\u0027,"},{"line_number":66,"context_line":"                                       \u0027drivers\u0027: [\u0027other-driver\u0027]})"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2FdXo%3D","line":63,"in_reply_to":"AAAAUH%2F%2Fdw0%3D","updated":"2014-01-13 17:25:13.000000000","message":"NobodyCam thought it best if a test_get_topic_for_no_driver() is done in a separate review.","commit_id":"230694793b7eebaece588d0565ee90c77aca8c78"}]}
