)]}'
{"ironic/conductor/rpcapi.py":[{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"3342ee4fa95c70a457c24c75dd0b4c5a80ba5fbd","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        self.ring_manager.reset()"},{"line_number":163,"context_line":"        ring \u003d self.ring_manager[driver_name]"},{"line_number":164,"context_line":"        host \u003d random.choice(list(ring.nodes))"},{"line_number":165,"context_line":"        return self.topic + \".\" + host"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def create_node(self, context, node_obj, topic\u003dNone):"},{"line_number":168,"context_line":"        \"\"\"Synchronously, have a conductor validate and create a node."}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_7923afa7","line":165,"updated":"2017-03-21 08:03:28.000000000","message":"I believe this place is completely wrong, why do we add host name to the topic here?\n\nFrom the client side it is correct to send to an abstract topic.\n\nAssume we have topic\u003d\u0027ironic\u0027\n\nand servers:\nhost1\nhost2\nhost3\netc.\n\nThen we need to register server targets like that (on the server side)\n\nTarget(topic\u003d\"ironic\", server\u003d\"host1\")\nTarget(topic\u003d\"ironic\", server\u003d\"host2\")\nTarget(topic\u003d\"ironic\", server\u003d\"host3\")\n\nand from the client side it\u0027s enough to send to Target(topic\u003d\"ironic\")\n\nIn such case we have round-robin between all those target servers and messaging with any backend will make it.\n\nIf we want to send to a specific server, then we need to specify it in the target as a server field e.g.\n\nTarget(topic\u003d\"ironic\", server\u003d\"host1\")\n\nhttps://github.com/openstack/oslo.messaging/blob/master/oslo_messaging/target.py#L58-L60","commit_id":"039847ecb745d9eaa66c997ffde6b45af6c6ed36"},{"author":{"_account_id":22724,"name":"Galyna Zholtkevych","email":"galynazholtkevych1991@gmail.com","username":"gzholtkevych"},"change_message_id":"40a0d1820ee3cf5a1019bc3ad8bdcffbfe8d8075","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        self.ring_manager.reset()"},{"line_number":163,"context_line":"        ring \u003d self.ring_manager[driver_name]"},{"line_number":164,"context_line":"        host \u003d random.choice(list(ring.nodes))"},{"line_number":165,"context_line":"        return self.topic + \".\" + host"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def create_node(self, context, node_obj, topic\u003dNone):"},{"line_number":168,"context_line":"        \"\"\"Synchronously, have a conductor validate and create a node."}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_2500bc65","line":165,"in_reply_to":"1a1ced50_7923afa7","updated":"2017-03-23 11:20:54.000000000","message":"Thanks, Oleksii\n\nThe testing is in progress. I want to make sure that round-robin will work. We are using hash ring to select the host.\nDid not want to mix implementations\n\nThank you for pointing me to this. I did not modify master code for get_topic_for_driver, the patch is WIP, I want to test at least one of rpc methods at multinode","commit_id":"039847ecb745d9eaa66c997ffde6b45af6c6ed36"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"3342ee4fa95c70a457c24c75dd0b4c5a80ba5fbd","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        server \u003d None"},{"line_number":182,"context_line":"        if CONF.rpc_backend \u003d\u003d \u0027zmq\u0027:"},{"line_number":183,"context_line":"            server \u003d self.get_server_for(node_obj)"},{"line_number":184,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, server\u003dserver,"},{"line_number":185,"context_line":"                                    version\u003d\u00271.36\u0027)"},{"line_number":186,"context_line":"        return cctxt.call(context, \u0027create_node\u0027, node_obj\u003dnode_obj)"},{"line_number":187,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_79448f1a","line":184,"updated":"2017-03-21 08:03:28.000000000","message":"Is it possible to make it for any backend not only for zmq?\n\nFirst of all it\u0027s not correct to hack the backend like that, because we break the abstraction of oslo.messaging layer and we tie to a specific backend.\n\nPlease see the IRC discussion and Mehdi\u0027s (sileht) argumentation here http://eavesdrop.openstack.org/irclogs/%23openstack-oslo/%23openstack-oslo.2016-10-06.log.html#t2016-10-06T12:42:18\n\nThe other thing is that oslo.messaging as the API doesn\u0027t guarantee that topic will be parsed and handled by parts (it\u0027s rabbitmq specifics).","commit_id":"039847ecb745d9eaa66c997ffde6b45af6c6ed36"},{"author":{"_account_id":22724,"name":"Galyna Zholtkevych","email":"galynazholtkevych1991@gmail.com","username":"gzholtkevych"},"change_message_id":"40a0d1820ee3cf5a1019bc3ad8bdcffbfe8d8075","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        server \u003d None"},{"line_number":182,"context_line":"        if CONF.rpc_backend \u003d\u003d \u0027zmq\u0027:"},{"line_number":183,"context_line":"            server \u003d self.get_server_for(node_obj)"},{"line_number":184,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, server\u003dserver,"},{"line_number":185,"context_line":"                                    version\u003d\u00271.36\u0027)"},{"line_number":186,"context_line":"        return cctxt.call(context, \u0027create_node\u0027, node_obj\u003dnode_obj)"},{"line_number":187,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_64bf43aa","line":184,"in_reply_to":"1a1ced50_79448f1a","updated":"2017-03-23 11:20:54.000000000","message":"In ironic for now we are not obliged to support zeromq, but we must support rabbit. I am just afraid to add problems to working rabbit part. This is exactly why I tie to specific backend to fix the problem where it exists. Anyway, I am going to test your solution also (why deny it right away if the solution is suitable though)\n\nFor the backend definition I thought about that and think it is better to make config option rather in ironic than take rpc config part, because, it will break if , e.g. rpc_backend option name will be changed or even erased. it is deprecated now as I know.\n(If it is that what you wanted to say about abstraction breaking)","commit_id":"039847ecb745d9eaa66c997ffde6b45af6c6ed36"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"8deed41af5be4a0821d8b4d45cce59493f92c187","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import random"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from oslo_log import log"},{"line_number":24,"context_line":"import oslo_messaging as messaging"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from ironic.common import exception"}],"source_content_type":"text/x-python","patch_set":5,"id":"bff0334d_f59cd36a","line":23,"updated":"2017-04-12 13:55:02.000000000","message":"I do not see any logging in new code.","commit_id":"748ad289f962a4a9c5af0743aa750529cba34ca3"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"8deed41af5be4a0821d8b4d45cce59493f92c187","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from ironic.objects import base as objects_base"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class ConductorAPI(object):"}],"source_content_type":"text/x-python","patch_set":5,"id":"bff0334d_3580fbf4","line":35,"updated":"2017-04-12 13:55:02.000000000","message":"ditto","commit_id":"748ad289f962a4a9c5af0743aa750529cba34ca3"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"1a4ce1d36e65242193ebdc5fee449c171ed7d64f","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        self.ring_manager \u003d hash_ring.HashRingManager()"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def _extract_host_from_topic(self, topic):"},{"line_number":117,"context_line":"        return tuple(topic.rsplit(sep\u003d\u0027.\u0027, maxsplit\u003d1))"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def get_topic_for(self, node):"},{"line_number":120,"context_line":"        \"\"\"Get the RPC topic for the conductor service the node is mapped to."}],"source_content_type":"text/x-python","patch_set":5,"id":"bff0334d_9abdb6b8","line":117,"updated":"2017-04-12 13:35:14.000000000","message":"Sorry, this is totally wrong. 1) rsplit() does not accept keyword arguments, at least in Python 2.7.12. 2) host and topic format is topic.host, but host name  can include \u0027.\u0027 symbols like host.domain.ltd. \"Host\" part can be trimmed and included into \"topic\". Please create unit tests for avoiding errors like these.","commit_id":"748ad289f962a4a9c5af0743aa750529cba34ca3"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5368e3a9fae63844cfd4ceb4c35fdf729f81a27d","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        :raises: NoValidDefaultForInterface if no default can be calculated"},{"line_number":168,"context_line":"                 for some interfaces, and explicit values must be provided."},{"line_number":169,"context_line":"        \"\"\""},{"line_number":170,"context_line":"        server \u003d None"},{"line_number":171,"context_line":"        if CONF.rpc_backend \u003d\u003d \u0027zmq\u0027 and topic:"},{"line_number":172,"context_line":"            topic, server \u003d self._extract_host_from_topic(topic)"},{"line_number":173,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic,"},{"line_number":174,"context_line":"                                    version\u003d\u00271.36\u0027, server\u003dserver)"},{"line_number":175,"context_line":"        return cctxt.call(context, \u0027create_node\u0027, node_obj\u003dnode_obj)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bff0334d_3afc6a6e","line":172,"range":{"start_line":170,"start_character":8,"end_line":172,"end_character":64},"updated":"2017-04-12 13:31:04.000000000","message":"ouch, please make this a common function.","commit_id":"748ad289f962a4a9c5af0743aa750529cba34ca3"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"1a4ce1d36e65242193ebdc5fee449c171ed7d64f","unresolved":false,"context_lines":[{"line_number":194,"context_line":"                 for some interfaces, and explicit values must be provided."},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        \"\"\""},{"line_number":197,"context_line":"        server \u003d None"},{"line_number":198,"context_line":"        if CONF.rpc_backend \u003d\u003d \u0027zmq\u0027 and topic:"},{"line_number":199,"context_line":"            topic, server \u003d self._extract_host_from_topic(topic)"},{"line_number":200,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic,"}],"source_content_type":"text/x-python","patch_set":5,"id":"bff0334d_dabe9eac","line":197,"updated":"2017-04-12 13:35:14.000000000","message":"Let\u0027s your method returns None if needed.","commit_id":"748ad289f962a4a9c5af0743aa750529cba34ca3"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"1a4ce1d36e65242193ebdc5fee449c171ed7d64f","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        \"\"\""},{"line_number":197,"context_line":"        server \u003d None"},{"line_number":198,"context_line":"        if CONF.rpc_backend \u003d\u003d \u0027zmq\u0027 and topic:"},{"line_number":199,"context_line":"            topic, server \u003d self._extract_host_from_topic(topic)"},{"line_number":200,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic,"},{"line_number":201,"context_line":"                                    version\u003d\u00271.1\u0027, server\u003dserver)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bff0334d_5aa04e42","line":198,"updated":"2017-04-12 13:35:14.000000000","message":"1) is not needed to include this check in each method, use your helper 2) rpc_backend option is deprecated for removal. Maybe we should support both old and new option for deprecation period.","commit_id":"748ad289f962a4a9c5af0743aa750529cba34ca3"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"22478e0198c6f5efc3e0e0a603ec091eaea25ec0","unresolved":false,"context_lines":[{"line_number":970,"context_line":"            VIF attach is wrong/missing."},{"line_number":971,"context_line":"        \"\"\""},{"line_number":972,"context_line":"        topic, server \u003d utils.split_host_and_topic(topic, self.topic)"},{"line_number":973,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.38\u0027,"},{"line_number":974,"context_line":"                                    server\u003dserver)"},{"line_number":975,"context_line":"        return cctxt.call(context, \u0027vif_attach\u0027, node_id\u003dnode_id,"},{"line_number":976,"context_line":"                          vif_info\u003dvif_info)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7ffa3b31_8a9505e7","line":973,"range":{"start_line":973,"start_character":36,"end_line":973,"end_character":61},"updated":"2017-04-18 11:02:19.000000000","message":"You can determine topic inside your helper function.","commit_id":"0cfc9e03df6c8b5d83c63a3703f29426ff04d980"},{"author":{"_account_id":22724,"name":"Galyna Zholtkevych","email":"galynazholtkevych1991@gmail.com","username":"gzholtkevych"},"change_message_id":"2f8297e506d7bbd72371cbd77a4f9a8ea8bb37b6","unresolved":false,"context_lines":[{"line_number":970,"context_line":"            VIF attach is wrong/missing."},{"line_number":971,"context_line":"        \"\"\""},{"line_number":972,"context_line":"        topic, server \u003d utils.split_host_and_topic(topic, self.topic)"},{"line_number":973,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.38\u0027,"},{"line_number":974,"context_line":"                                    server\u003dserver)"},{"line_number":975,"context_line":"        return cctxt.call(context, \u0027vif_attach\u0027, node_id\u003dnode_id,"},{"line_number":976,"context_line":"                          vif_info\u003dvif_info)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7ffa3b31_ded50fb9","line":973,"range":{"start_line":973,"start_character":36,"end_line":973,"end_character":61},"in_reply_to":"7ffa3b31_8a9505e7","updated":"2017-04-18 13:00:37.000000000","message":"Done","commit_id":"0cfc9e03df6c8b5d83c63a3703f29426ff04d980"}],"ironic/conductor/utils.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"22478e0198c6f5efc3e0e0a603ec091eaea25ec0","unresolved":false,"context_lines":[{"line_number":508,"context_line":"    return result"},{"line_number":509,"context_line":""},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"def split_host_and_topic(topic_and_host, primary_topic):"},{"line_number":512,"context_line":"    # NOTE (galyna): remove rpc_backend option when it is removed from"},{"line_number":513,"context_line":"    # oslo_messaging completely"},{"line_number":514,"context_line":"    if CONF.transport_url and CONF.transport_url.startswith(\u0027zmq\u0027):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7ffa3b31_4a6dbd02","line":511,"updated":"2017-04-18 11:02:19.000000000","message":"Why not make this function private for ConductorAPI class?","commit_id":"0cfc9e03df6c8b5d83c63a3703f29426ff04d980"},{"author":{"_account_id":22724,"name":"Galyna Zholtkevych","email":"galynazholtkevych1991@gmail.com","username":"gzholtkevych"},"change_message_id":"2f8297e506d7bbd72371cbd77a4f9a8ea8bb37b6","unresolved":false,"context_lines":[{"line_number":508,"context_line":"    return result"},{"line_number":509,"context_line":""},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"def split_host_and_topic(topic_and_host, primary_topic):"},{"line_number":512,"context_line":"    # NOTE (galyna): remove rpc_backend option when it is removed from"},{"line_number":513,"context_line":"    # oslo_messaging completely"},{"line_number":514,"context_line":"    if CONF.transport_url and CONF.transport_url.startswith(\u0027zmq\u0027):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7ffa3b31_bee483ad","line":511,"in_reply_to":"7ffa3b31_4a6dbd02","updated":"2017-04-18 13:00:37.000000000","message":"Done","commit_id":"0cfc9e03df6c8b5d83c63a3703f29426ff04d980"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"22478e0198c6f5efc3e0e0a603ec091eaea25ec0","unresolved":false,"context_lines":[{"line_number":509,"context_line":""},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"def split_host_and_topic(topic_and_host, primary_topic):"},{"line_number":512,"context_line":"    # NOTE (galyna): remove rpc_backend option when it is removed from"},{"line_number":513,"context_line":"    # oslo_messaging completely"},{"line_number":514,"context_line":"    if CONF.transport_url and CONF.transport_url.startswith(\u0027zmq\u0027):"},{"line_number":515,"context_line":"        # NOTE (galyna): topic format is : topic.server"}],"source_content_type":"text/x-python","patch_set":8,"id":"7ffa3b31_6a34f9fb","line":512,"range":{"start_line":512,"start_character":28,"end_line":512,"end_character":39},"updated":"2017-04-18 11:02:19.000000000","message":"This deprecated option is not supported in the code.","commit_id":"0cfc9e03df6c8b5d83c63a3703f29426ff04d980"},{"author":{"_account_id":22724,"name":"Galyna Zholtkevych","email":"galynazholtkevych1991@gmail.com","username":"gzholtkevych"},"change_message_id":"2f8297e506d7bbd72371cbd77a4f9a8ea8bb37b6","unresolved":false,"context_lines":[{"line_number":509,"context_line":""},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"def split_host_and_topic(topic_and_host, primary_topic):"},{"line_number":512,"context_line":"    # NOTE (galyna): remove rpc_backend option when it is removed from"},{"line_number":513,"context_line":"    # oslo_messaging completely"},{"line_number":514,"context_line":"    if CONF.transport_url and CONF.transport_url.startswith(\u0027zmq\u0027):"},{"line_number":515,"context_line":"        # NOTE (galyna): topic format is : topic.server"}],"source_content_type":"text/x-python","patch_set":8,"id":"7ffa3b31_9edf87d5","line":512,"range":{"start_line":512,"start_character":28,"end_line":512,"end_character":39},"in_reply_to":"7ffa3b31_6a34f9fb","updated":"2017-04-18 13:00:37.000000000","message":"Done","commit_id":"0cfc9e03df6c8b5d83c63a3703f29426ff04d980"}]}
