)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"9ea3c7ff1bd480e4b1f69aac90896cee630f5df1","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"protect DHCP agent cache out of sync"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If DHCP agent port cache is out of sync with neutron server, dnmasq"},{"line_number":10,"context_line":"entries are wrong and VMs may not acquire an IP."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"When DHCP agent execute port_create_end method, port\u0027s"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3f79a3b5_5a8c1c2b","line":9,"range":{"start_line":9,"start_character":61,"end_line":9,"end_character":67},"updated":"2018-12-20 19:02:26.000000000","message":"dnsmasq","commit_id":"04da171f737141971a84c328aff0b2a48f84ef3e"},{"author":{"_account_id":19307,"name":"Antonio Ojea","email":"antonio.ojea.garcia@gmail.com","username":"itsuugo"},"change_message_id":"7fddae35a73f0f47aa8568e825465b74a3793190","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"protect DHCP agent cache out of sync"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If DHCP agent port cache is out of sync with neutron server, dnmasq"},{"line_number":10,"context_line":"entries are wrong and VMs may not acquire an IP."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"When DHCP agent execute port_create_end method, port\u0027s"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3f79a3b5_06c88d4b","line":9,"range":{"start_line":9,"start_character":61,"end_line":9,"end_character":67},"in_reply_to":"3f79a3b5_5a8c1c2b","updated":"2018-12-20 22:19:52.000000000","message":"Done","commit_id":"04da171f737141971a84c328aff0b2a48f84ef3e"}],"neutron/agent/dhcp/agent.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"07d6b71fdebf5caf083becf26a44a9c8eeaf15fa","unresolved":false,"context_lines":[{"line_number":481,"context_line":"                    LOG.debug(\"Agent IPs on network %s changed from %s to %s\","},{"line_number":482,"context_line":"                              network.id, old_ips, new_ips)"},{"line_number":483,"context_line":"                    driver_action \u003d \u0027restart\u0027"},{"line_number":484,"context_line":"            for port in network.ports:"},{"line_number":485,"context_line":"                if port.id !\u003d updated_port.id:"},{"line_number":486,"context_line":"                    port_ips \u003d {i[\u0027ip_address\u0027] for i in port[\u0027fixed_ips\u0027]}"},{"line_number":487,"context_line":"                    if new_ips.intersection(port_ips):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_e108d430","line":484,"updated":"2018-12-21 09:40:24.000000000","message":"My only concern with this is the amount of time spent in this loop, in case of thousands of ports.\n\nIt is possible to use self.cache \u003cNetworkCache\u003e to store the network ports information with the fixed_ip information too?","commit_id":"16a5f4ad76a22ea60c47a1d63685426058085fd1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"773e1be3ff6b36c4abb45680470a9c8725c397a9","unresolved":false,"context_lines":[{"line_number":481,"context_line":"                    LOG.debug(\"Agent IPs on network %s changed from %s to %s\","},{"line_number":482,"context_line":"                              network.id, old_ips, new_ips)"},{"line_number":483,"context_line":"                    driver_action \u003d \u0027restart\u0027"},{"line_number":484,"context_line":"            for port in network.ports:"},{"line_number":485,"context_line":"                if port.id !\u003d updated_port.id:"},{"line_number":486,"context_line":"                    port_ips \u003d {i[\u0027ip_address\u0027] for i in port[\u0027fixed_ips\u0027]}"},{"line_number":487,"context_line":"                    if new_ips.intersection(port_ips):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f769fc5_92356dfa","line":484,"in_reply_to":"1f769fc5_797d1fe6","updated":"2018-12-24 08:25:18.000000000","message":"Yes, what I meant was because we can have a lot of ports in a network, this loop and the set comprehension could be a lot of time every time we update a port.\n\nBut we\u0027ll see this in a real environment. I tested manually iterating over a 10000 list with 100 elements, and is not so time expensive.","commit_id":"16a5f4ad76a22ea60c47a1d63685426058085fd1"},{"author":{"_account_id":19307,"name":"Antonio Ojea","email":"antonio.ojea.garcia@gmail.com","username":"itsuugo"},"change_message_id":"d91a3b970c680a477ac05951449aa41b10a4dfd0","unresolved":false,"context_lines":[{"line_number":481,"context_line":"                    LOG.debug(\"Agent IPs on network %s changed from %s to %s\","},{"line_number":482,"context_line":"                              network.id, old_ips, new_ips)"},{"line_number":483,"context_line":"                    driver_action \u003d \u0027restart\u0027"},{"line_number":484,"context_line":"            for port in network.ports:"},{"line_number":485,"context_line":"                if port.id !\u003d updated_port.id:"},{"line_number":486,"context_line":"                    port_ips \u003d {i[\u0027ip_address\u0027] for i in port[\u0027fixed_ips\u0027]}"},{"line_number":487,"context_line":"                    if new_ips.intersection(port_ips):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f769fc5_0bf9287f","line":484,"in_reply_to":"1f769fc5_92356dfa","updated":"2018-12-24 14:45:50.000000000","message":"Thanks for checking, there are several places in the code that iterates over the ports in the network, the _iter_hosts() function per example, so I assumed that this will be an \"assumable penalty\" :)","commit_id":"16a5f4ad76a22ea60c47a1d63685426058085fd1"},{"author":{"_account_id":19307,"name":"Antonio Ojea","email":"antonio.ojea.garcia@gmail.com","username":"itsuugo"},"change_message_id":"308c3ea222ffa6a44a5a16bd82d6fb96c7111694","unresolved":false,"context_lines":[{"line_number":481,"context_line":"                    LOG.debug(\"Agent IPs on network %s changed from %s to %s\","},{"line_number":482,"context_line":"                              network.id, old_ips, new_ips)"},{"line_number":483,"context_line":"                    driver_action \u003d \u0027restart\u0027"},{"line_number":484,"context_line":"            for port in network.ports:"},{"line_number":485,"context_line":"                if port.id !\u003d updated_port.id:"},{"line_number":486,"context_line":"                    port_ips \u003d {i[\u0027ip_address\u0027] for i in port[\u0027fixed_ips\u0027]}"},{"line_number":487,"context_line":"                    if new_ips.intersection(port_ips):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f769fc5_797d1fe6","line":484,"in_reply_to":"3f79a3b5_e108d430","updated":"2018-12-22 10:38:37.000000000","message":"I think I got your question.\nI think that the for loop is already iterating over the cache per L457","commit_id":"16a5f4ad76a22ea60c47a1d63685426058085fd1"},{"author":{"_account_id":19307,"name":"Antonio Ojea","email":"antonio.ojea.garcia@gmail.com","username":"itsuugo"},"change_message_id":"fb381b65cf13b6587980fa2e88db9780c4edb56c","unresolved":false,"context_lines":[{"line_number":481,"context_line":"                    LOG.debug(\"Agent IPs on network %s changed from %s to %s\","},{"line_number":482,"context_line":"                              network.id, old_ips, new_ips)"},{"line_number":483,"context_line":"                    driver_action \u003d \u0027restart\u0027"},{"line_number":484,"context_line":"            for port in network.ports:"},{"line_number":485,"context_line":"                if port.id !\u003d updated_port.id:"},{"line_number":486,"context_line":"                    port_ips \u003d {i[\u0027ip_address\u0027] for i in port[\u0027fixed_ips\u0027]}"},{"line_number":487,"context_line":"                    if new_ips.intersection(port_ips):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_3394df97","line":484,"in_reply_to":"3f79a3b5_e108d430","updated":"2018-12-21 15:24:49.000000000","message":"well, that\u0027s exactly the problem, that the cache is out of sync and the ports information stored in the cache is wrong as explained in the bug. Honestly, I don\u0027t see other alternative but maybe I\u0027m missing something","commit_id":"16a5f4ad76a22ea60c47a1d63685426058085fd1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"07d6b71fdebf5caf083becf26a44a9c8eeaf15fa","unresolved":false,"context_lines":[{"line_number":485,"context_line":"                if port.id !\u003d updated_port.id:"},{"line_number":486,"context_line":"                    port_ips \u003d {i[\u0027ip_address\u0027] for i in port[\u0027fixed_ips\u0027]}"},{"line_number":487,"context_line":"                    if new_ips.intersection(port_ips):"},{"line_number":488,"context_line":"                        self.schedule_resync(\"Duplicate ip addresses,\\"},{"line_number":489,"context_line":"                                             dhcp cache inconsistency\","},{"line_number":490,"context_line":"                                             updated_port.network_id)"},{"line_number":491,"context_line":"                        return"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_c1cef828","line":488,"range":{"start_line":488,"start_character":69,"end_line":488,"end_character":70},"updated":"2018-12-21 09:40:24.000000000","message":"This is not how a string line should be broken [1].\n\nself.schedule_resync(\u0027Duplicate ip addresses, \u0027\n                     \u0027dhcp cache inconsistency\u0027,\n                     updated_port.network_id)","commit_id":"16a5f4ad76a22ea60c47a1d63685426058085fd1"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f997eed3522cb8ac292d8b4740beef48eed83263","unresolved":false,"context_lines":[{"line_number":493,"context_line":""},{"line_number":494,"context_line":"    def port_create_end(self, context, payload):"},{"line_number":495,"context_line":"        created_port \u003d dhcp.DictModel(payload[\u0027port\u0027])"},{"line_number":496,"context_line":"        network \u003d self.cache.get_network_by_id(created_port.network_id)"},{"line_number":497,"context_line":"        if not network:"},{"line_number":498,"context_line":"            return"},{"line_number":499,"context_line":"        new_ips \u003d {i[\u0027ip_address\u0027] for i in created_port[\u0027fixed_ips\u0027]}"}],"source_content_type":"text/x-python","patch_set":15,"id":"ffd0ebdf_52893424","line":496,"updated":"2019-01-02 22:56:44.000000000","message":"This doesn\u0027t take the lock as port_update_end does, so things might change.","commit_id":"14d14d5396ffed370a2b5a1fa483f4636edcd843"},{"author":{"_account_id":19307,"name":"Antonio Ojea","email":"antonio.ojea.garcia@gmail.com","username":"itsuugo"},"change_message_id":"e20e886b38c8ca28f70c636bd7e4cf59cb48eee5","unresolved":false,"context_lines":[{"line_number":493,"context_line":""},{"line_number":494,"context_line":"    def port_create_end(self, context, payload):"},{"line_number":495,"context_line":"        created_port \u003d dhcp.DictModel(payload[\u0027port\u0027])"},{"line_number":496,"context_line":"        network \u003d self.cache.get_network_by_id(created_port.network_id)"},{"line_number":497,"context_line":"        if not network:"},{"line_number":498,"context_line":"            return"},{"line_number":499,"context_line":"        new_ips \u003d {i[\u0027ip_address\u0027] for i in created_port[\u0027fixed_ips\u0027]}"}],"source_content_type":"text/x-python","patch_set":15,"id":"ffd0ebdf_c7febcad","line":496,"in_reply_to":"ffd0ebdf_52893424","updated":"2019-01-03 10:26:58.000000000","message":"yeah, I thought about it, but I discarded the lock here because this is only a sanity check for duplicate ip addressed in the cache and I don\u0027t see a problem with network changes until we call port_update_end() in L509. The port_update_end takes the lock and I guess that\u0027s not necessary to take the lock twice","commit_id":"14d14d5396ffed370a2b5a1fa483f4636edcd843"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"773e1be3ff6b36c4abb45680470a9c8725c397a9","unresolved":false,"context_lines":[{"line_number":497,"context_line":"        if not network:"},{"line_number":498,"context_line":"            return"},{"line_number":499,"context_line":"        new_ips \u003d {i[\u0027ip_address\u0027] for i in created_port[\u0027fixed_ips\u0027]}"},{"line_number":500,"context_line":"        for port_cached in network.ports:"},{"line_number":501,"context_line":"            # if there are other ports cached with the same ip address in"},{"line_number":502,"context_line":"            # the same network this indicate that the cache is out of sync"},{"line_number":503,"context_line":"            cached_ips \u003d {i[\u0027ip_address\u0027] for i in port_cached[\u0027fixed_ips\u0027]}"}],"source_content_type":"text/x-python","patch_set":15,"id":"1f769fc5_323a59e7","line":500,"updated":"2018-12-24 08:25:18.000000000","message":"Let me ask you: why are you testing this only during the creation? The IP can change also during the update process. Why don\u0027t you check this during the update like in the first patches?","commit_id":"14d14d5396ffed370a2b5a1fa483f4636edcd843"},{"author":{"_account_id":19307,"name":"Antonio Ojea","email":"antonio.ojea.garcia@gmail.com","username":"itsuugo"},"change_message_id":"d91a3b970c680a477ac05951449aa41b10a4dfd0","unresolved":false,"context_lines":[{"line_number":497,"context_line":"        if not network:"},{"line_number":498,"context_line":"            return"},{"line_number":499,"context_line":"        new_ips \u003d {i[\u0027ip_address\u0027] for i in created_port[\u0027fixed_ips\u0027]}"},{"line_number":500,"context_line":"        for port_cached in network.ports:"},{"line_number":501,"context_line":"            # if there are other ports cached with the same ip address in"},{"line_number":502,"context_line":"            # the same network this indicate that the cache is out of sync"},{"line_number":503,"context_line":"            cached_ips \u003d {i[\u0027ip_address\u0027] for i in port_cached[\u0027fixed_ips\u0027]}"}],"source_content_type":"text/x-python","patch_set":15,"id":"1f769fc5_ab93544f","line":500,"in_reply_to":"1f769fc5_323a59e7","updated":"2018-12-24 14:45:50.000000000","message":"The main motivation was to be able to do safe backports, we need to patch this bug until Ocata, and changing the logic during the update port can be too risky. In this patch, we only add a sanity check during the port_creation to solve the problem described in https://bugs.launchpad.net/neutron/+bug/1645835 , and the port_update_end code remains the same, reducing the risks on regressions.\n\nAlso, as you can see in the bug report, this behavior was only reported during the port_creation, don\u0027t know if this can happen with a port_update because of different reasons: the IPAM logic, the port ID has already been registered in the cache, ... or it is a really unlikely corner case.\n\nIn the other hand, having worked with neutron-midonet before and other distributed dhcp agents I think that the port_update_end function and the other ones should be part of a major refactor that address better these scenarios, the fact that the cache is updated with cast RPC calls makes very difficult to avoid these problems. I think that having the cache in a key-value store like zookeeper or etcd will simplify the agent logic, improve the scalability and avoid this kind of bugs","commit_id":"14d14d5396ffed370a2b5a1fa483f4636edcd843"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f997eed3522cb8ac292d8b4740beef48eed83263","unresolved":false,"context_lines":[{"line_number":502,"context_line":"            # the same network this indicate that the cache is out of sync"},{"line_number":503,"context_line":"            cached_ips \u003d {i[\u0027ip_address\u0027] for i in port_cached[\u0027fixed_ips\u0027]}"},{"line_number":504,"context_line":"            if new_ips.intersection(cached_ips):"},{"line_number":505,"context_line":"                self.schedule_resync(\"Duplicate ip addresses found, \""},{"line_number":506,"context_line":"                                     \"dhcp cache is out of sync\","},{"line_number":507,"context_line":"                                     created_port.network_id)"},{"line_number":508,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":15,"id":"ffd0ebdf_723238aa","line":505,"range":{"start_line":505,"start_character":48,"end_line":505,"end_character":50},"updated":"2019-01-02 22:56:44.000000000","message":"nit: s/IP","commit_id":"14d14d5396ffed370a2b5a1fa483f4636edcd843"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f997eed3522cb8ac292d8b4740beef48eed83263","unresolved":false,"context_lines":[{"line_number":503,"context_line":"            cached_ips \u003d {i[\u0027ip_address\u0027] for i in port_cached[\u0027fixed_ips\u0027]}"},{"line_number":504,"context_line":"            if new_ips.intersection(cached_ips):"},{"line_number":505,"context_line":"                self.schedule_resync(\"Duplicate ip addresses found, \""},{"line_number":506,"context_line":"                                     \"dhcp cache is out of sync\","},{"line_number":507,"context_line":"                                     created_port.network_id)"},{"line_number":508,"context_line":"                return"},{"line_number":509,"context_line":"        self.port_update_end(context, payload)"}],"source_content_type":"text/x-python","patch_set":15,"id":"ffd0ebdf_12272c67","line":506,"range":{"start_line":506,"start_character":38,"end_line":506,"end_character":42},"updated":"2019-01-02 22:56:44.000000000","message":"nit: s/DHCP","commit_id":"14d14d5396ffed370a2b5a1fa483f4636edcd843"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"de015f25cccf6845a8ce8787eb2a75b6627142f7","unresolved":false,"context_lines":[{"line_number":505,"context_line":"                self.schedule_resync(\"Duplicate IP addresses found, \""},{"line_number":506,"context_line":"                                     \"DHCP cache is out of sync\","},{"line_number":507,"context_line":"                                     created_port.network_id)"},{"line_number":508,"context_line":"                return"},{"line_number":509,"context_line":"        self.port_update_end(context, payload)"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"    @_wait_if_syncing"}],"source_content_type":"text/x-python","patch_set":16,"id":"ffd0ebdf_a604d0c7","line":508,"updated":"2019-01-03 19:35:53.000000000","message":"I still think we should be taking the lock, even for checking.  And to not drop and re-acquire it the code can be tweaked like so:\n\n1) move the code inside the lock in port_update_end, around L460-487 into it\u0027s own private method\n\n2) have this code take the lock, do it\u0027s checks, then call that new private method\n\n3) change port_update_end() to call that new method as well of course","commit_id":"e0b44ce1ad518dc4566391f79c9f32569adefcb5"},{"author":{"_account_id":19307,"name":"Antonio Ojea","email":"antonio.ojea.garcia@gmail.com","username":"itsuugo"},"change_message_id":"6333cc4e7f2b2da01711fbc5bc5cff91037e267f","unresolved":false,"context_lines":[{"line_number":505,"context_line":"                self.schedule_resync(\"Duplicate IP addresses found, \""},{"line_number":506,"context_line":"                                     \"DHCP cache is out of sync\","},{"line_number":507,"context_line":"                                     created_port.network_id)"},{"line_number":508,"context_line":"                return"},{"line_number":509,"context_line":"        self.port_update_end(context, payload)"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"    @_wait_if_syncing"}],"source_content_type":"text/x-python","patch_set":16,"id":"ffd0ebdf_71cf767f","line":508,"in_reply_to":"ffd0ebdf_7418d280","updated":"2019-01-04 15:17:57.000000000","message":"My point is about the need to hold the lock if we are only going to read the ports of some network in the cache to check if there are duplicate ips.  All the operations needed to update the ports in the cache are done later when we call the port_update_end(), that\u0027s already holding the lock. \nAdding this check that iterates over all ports in a network can cause performance issues in networks with lots of ports and high rate of port creation if we hold the lock, the time to create a port will increase proportionally to the number of ports in the network.\nI guess that the worst case can be that we have 2 simultaneous port_create_end with duplicate ips, but the port_update_end function will handle that scenario.","commit_id":"e0b44ce1ad518dc4566391f79c9f32569adefcb5"},{"author":{"_account_id":19307,"name":"Antonio Ojea","email":"antonio.ojea.garcia@gmail.com","username":"itsuugo"},"change_message_id":"ee36eb0337fab39addbbbc7f49dad09e72e985c8","unresolved":false,"context_lines":[{"line_number":505,"context_line":"                self.schedule_resync(\"Duplicate IP addresses found, \""},{"line_number":506,"context_line":"                                     \"DHCP cache is out of sync\","},{"line_number":507,"context_line":"                                     created_port.network_id)"},{"line_number":508,"context_line":"                return"},{"line_number":509,"context_line":"        self.port_update_end(context, payload)"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"    @_wait_if_syncing"}],"source_content_type":"text/x-python","patch_set":16,"id":"ffd0ebdf_f45042d7","line":508,"in_reply_to":"ffd0ebdf_a604d0c7","updated":"2019-01-03 21:15:54.000000000","message":"I started the patch with the approach that you mention but had to change my mind to reduce the regression risks when backporting. We need it in ocata and newton.\nThe other option, holding the lock in port_create_end() will add a new bottleneck as explained in https://bugs.launchpad.net/neutron/+bug/1760047\nPlease let me know if holding the lock or moving the code inside of port_update_end() are the only options, then I will need to create a new patch based in that code https://review.openstack.org/#/c/626830 that seems ready to be merged","commit_id":"e0b44ce1ad518dc4566391f79c9f32569adefcb5"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"36c5e9e61d8d456a1e6a56fea5a715b540c9828f","unresolved":false,"context_lines":[{"line_number":505,"context_line":"                self.schedule_resync(\"Duplicate IP addresses found, \""},{"line_number":506,"context_line":"                                     \"DHCP cache is out of sync\","},{"line_number":507,"context_line":"                                     created_port.network_id)"},{"line_number":508,"context_line":"                return"},{"line_number":509,"context_line":"        self.port_update_end(context, payload)"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"    @_wait_if_syncing"}],"source_content_type":"text/x-python","patch_set":16,"id":"ffd0ebdf_7418d280","line":508,"in_reply_to":"ffd0ebdf_f45042d7","updated":"2019-01-03 21:47:17.000000000","message":"From what I can tell we hold the lock when doing other operations on the cache, but I could be wrong.  I\u0027m not sure I see this as a bottleneck as we\u0027ll only be holding the lock a little longer, and to shorten it you can pre-compute new_ips before taking it.  Is there a specific comment in the bug that explains otherwise?\n\nI think the only place we don\u0027t hold the lock is in get_state() where we pull the number of items in the cache out to send to the server.","commit_id":"e0b44ce1ad518dc4566391f79c9f32569adefcb5"}],"neutron/tests/unit/agent/dhcp/test_agent.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"88ad763b18bf60839df8c8b394eb9296586c665b","unresolved":false,"context_lines":[{"line_number":1107,"context_line":"            mock.call.put(fake_network)])"},{"line_number":1108,"context_line":"        self.call_driver.assert_called_once_with(\u0027restart\u0027,"},{"line_number":1109,"context_line":"                                                 fake_network)"},{"line_number":1110,"context_line":""},{"line_number":1111,"context_line":"    def test_port_update_end(self):"},{"line_number":1112,"context_line":"        self.reload_allocations_p \u003d mock.patch.object(self.dhcp,"},{"line_number":1113,"context_line":"                                                      \u0027reload_allocations\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"dfd5e7cf_aa21daa1","line":1110,"updated":"2019-01-08 14:38:29.000000000","message":"I think you should also test the condition (both in create and update) when self.schedule_resync needs to be called.","commit_id":"b05bfe917a282fa56ad4f6abbf700865d0d6b665"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"8fcdf1434b3dee283154a8d21703b9d379383b4e","unresolved":false,"context_lines":[{"line_number":1107,"context_line":"            mock.call.put(fake_network)])"},{"line_number":1108,"context_line":"        self.call_driver.assert_called_once_with(\u0027restart\u0027,"},{"line_number":1109,"context_line":"                                                 fake_network)"},{"line_number":1110,"context_line":""},{"line_number":1111,"context_line":"    def test_port_update_end(self):"},{"line_number":1112,"context_line":"        self.reload_allocations_p \u003d mock.patch.object(self.dhcp,"},{"line_number":1113,"context_line":"                                                      \u0027reload_allocations\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"dfd5e7cf_db05127c","line":1110,"in_reply_to":"dfd5e7cf_aa21daa1","updated":"2019-01-08 16:32:54.000000000","message":"Are these tests done om L1197 and L1206?","commit_id":"b05bfe917a282fa56ad4f6abbf700865d0d6b665"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"28569f58ea32cca7474507392274631435e9fad0","unresolved":false,"context_lines":[{"line_number":1107,"context_line":"            mock.call.put(fake_network)])"},{"line_number":1108,"context_line":"        self.call_driver.assert_called_once_with(\u0027restart\u0027,"},{"line_number":1109,"context_line":"                                                 fake_network)"},{"line_number":1110,"context_line":""},{"line_number":1111,"context_line":"    def test_port_update_end(self):"},{"line_number":1112,"context_line":"        self.reload_allocations_p \u003d mock.patch.object(self.dhcp,"},{"line_number":1113,"context_line":"                                                      \u0027reload_allocations\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"dfd5e7cf_8f7971fd","line":1110,"in_reply_to":"dfd5e7cf_db05127c","updated":"2019-01-09 11:16:10.000000000","message":"Yes, I missed that, thanks!","commit_id":"b05bfe917a282fa56ad4f6abbf700865d0d6b665"}]}
