)]}'
{"networking_ovn/common/config.py":[{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"8b64ec3d301b8d30ff7a479a79580cb1923c7228","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                       \"field is empty. If both subnet\u0027s dns_nameservers and \""},{"line_number":155,"context_line":"                       \"this option is empty, then the DNS resolvers on the \""},{"line_number":156,"context_line":"                       \"host running the neutron server will be used.\")),"},{"line_number":157,"context_line":"    cfg.DictOpt(\u0027ovn_dhcp4_global_options\u0027,"},{"line_number":158,"context_line":"                default\u003d{},"},{"line_number":159,"context_line":"                help\u003d_(\"Dictionary of extra DHCPv4 options which will be \""},{"line_number":160,"context_line":"                       \"automatically added to each subnet upon creation. \""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_2ec4b85f","line":157,"range":{"start_line":157,"start_character":17,"end_line":157,"end_character":41},"updated":"2018-09-17 10:00:19.000000000","message":"Is this how dhcp options are consumed in neutron ml2/ovs agents? seems weird to me that you need to define global dhcp options as a config option and to change it you need to restart neutron server.\nDoes this match ml2ovs behavior?","commit_id":"0d85c5fd74349f0eff698cc9363a6db0fa0528d1"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"da8d9f17e38933028a4491a4fcbf7b3dbf5f3899","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                       \"field is empty. If both subnet\u0027s dns_nameservers and \""},{"line_number":155,"context_line":"                       \"this option is empty, then the DNS resolvers on the \""},{"line_number":156,"context_line":"                       \"host running the neutron server will be used.\")),"},{"line_number":157,"context_line":"    cfg.DictOpt(\u0027ovn_dhcp4_global_options\u0027,"},{"line_number":158,"context_line":"                default\u003d{},"},{"line_number":159,"context_line":"                help\u003d_(\"Dictionary of extra DHCPv4 options which will be \""},{"line_number":160,"context_line":"                       \"automatically added to each subnet upon creation. \""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_ee29e0f1","line":157,"range":{"start_line":157,"start_character":17,"end_line":157,"end_character":41},"in_reply_to":"3f79a3b5_2ec4b85f","updated":"2018-09-17 10:07:18.000000000","message":"The DHCP agent for neutron has similar config options [0], for example:\n\ndnsmasq_config_file\n    Type:\tstring\n    Default:\tu\u0027\u0027\n    Override the default dnsmasq settings with this file.\n\nWhere in OVN we don\u0027t really have a way to customize the DHCP server at all prior to this patch. So I believe it brings a bit of flexibility to it.\n\nLet\u0027s see what the author of the patch thinks.\n\n[0] https://docs.openstack.org/neutron/rocky/configuration/dhcp-agent.html","commit_id":"0d85c5fd74349f0eff698cc9363a6db0fa0528d1"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9b9cd16060906370de97312a113dd7990fd2bb88","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                       \"field is empty. If both subnet\u0027s dns_nameservers and \""},{"line_number":155,"context_line":"                       \"this option is empty, then the DNS resolvers on the \""},{"line_number":156,"context_line":"                       \"host running the neutron server will be used.\")),"},{"line_number":157,"context_line":"    cfg.DictOpt(\u0027ovn_dhcp4_global_options\u0027,"},{"line_number":158,"context_line":"                default\u003d{},"},{"line_number":159,"context_line":"                help\u003d_(\"Dictionary of extra DHCPv4 options which will be \""},{"line_number":160,"context_line":"                       \"automatically added to each subnet upon creation. \""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_fa1bb3c7","line":157,"range":{"start_line":157,"start_character":17,"end_line":157,"end_character":41},"in_reply_to":"3f79a3b5_5043c2b0","updated":"2018-09-18 19:20:48.000000000","message":"++ agreed","commit_id":"0d85c5fd74349f0eff698cc9363a6db0fa0528d1"},{"author":{"_account_id":26359,"name":"Andrew Austin","email":"aaustin@redhat.com","username":"aaustin"},"change_message_id":"eade94c52ffaa62295cb663ea83ad2b6105dd6f4","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                       \"field is empty. If both subnet\u0027s dns_nameservers and \""},{"line_number":155,"context_line":"                       \"this option is empty, then the DNS resolvers on the \""},{"line_number":156,"context_line":"                       \"host running the neutron server will be used.\")),"},{"line_number":157,"context_line":"    cfg.DictOpt(\u0027ovn_dhcp4_global_options\u0027,"},{"line_number":158,"context_line":"                default\u003d{},"},{"line_number":159,"context_line":"                help\u003d_(\"Dictionary of extra DHCPv4 options which will be \""},{"line_number":160,"context_line":"                       \"automatically added to each subnet upon creation. \""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_5043c2b0","line":157,"range":{"start_line":157,"start_character":17,"end_line":157,"end_character":41},"in_reply_to":"3f79a3b5_506509ae","updated":"2018-09-17 19:34:26.000000000","message":"If we were to make the DHCP override behavior the same between OVN and the regular DHCP agent, I would prefer to add support for this configuration method to the regular DHCP agent rather than adopt the dnsmasq config file workaround they use. \n\nIt is much easier from the perspective of an operator or deployment toolset developer to handle yet another config entry than to lay down a whole file, particularly in containerized installations.","commit_id":"0d85c5fd74349f0eff698cc9363a6db0fa0528d1"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"96e8b3c548e0ee544b2778b3db1c9877dda19174","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                       \"field is empty. If both subnet\u0027s dns_nameservers and \""},{"line_number":155,"context_line":"                       \"this option is empty, then the DNS resolvers on the \""},{"line_number":156,"context_line":"                       \"host running the neutron server will be used.\")),"},{"line_number":157,"context_line":"    cfg.DictOpt(\u0027ovn_dhcp4_global_options\u0027,"},{"line_number":158,"context_line":"                default\u003d{},"},{"line_number":159,"context_line":"                help\u003d_(\"Dictionary of extra DHCPv4 options which will be \""},{"line_number":160,"context_line":"                       \"automatically added to each subnet upon creation. \""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_506509ae","line":157,"range":{"start_line":157,"start_character":17,"end_line":157,"end_character":41},"in_reply_to":"3f79a3b5_dff28c05","updated":"2018-09-17 14:19:05.000000000","message":"It\u0027s interesting but, that would be rather confusing in my opinion.\n\nWe don\u0027t support the same number of features that dnsmasq supports. The OVN DHCP server is rather simplistic compared with a full-featured DHCP server implementation like dnsmasq and we would need to document these differences.\n\nI would rather have a config option in the OpenStack way like this patch proposes because operators are already familiar with it.\n\nMy 0.2 cents.","commit_id":"0d85c5fd74349f0eff698cc9363a6db0fa0528d1"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"20280c2271c8f862b1825293b4d8a5433d8fa196","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                       \"field is empty. If both subnet\u0027s dns_nameservers and \""},{"line_number":155,"context_line":"                       \"this option is empty, then the DNS resolvers on the \""},{"line_number":156,"context_line":"                       \"host running the neutron server will be used.\")),"},{"line_number":157,"context_line":"    cfg.DictOpt(\u0027ovn_dhcp4_global_options\u0027,"},{"line_number":158,"context_line":"                default\u003d{},"},{"line_number":159,"context_line":"                help\u003d_(\"Dictionary of extra DHCPv4 options which will be \""},{"line_number":160,"context_line":"                       \"automatically added to each subnet upon creation. \""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_dff28c05","line":157,"range":{"start_line":157,"start_character":17,"end_line":157,"end_character":41},"in_reply_to":"3f79a3b5_ee29e0f1","updated":"2018-09-17 12:22:07.000000000","message":"Makes sense to me. \n\nIt\u0027d be ideal to use the same format as ml2/ovs, but that one was also dnsmasq specific, we´d need to parse it, etc. not sure if it\u0027s worth the pain, but that could make deployment tools life easier. \n\nAny thoughts on this?","commit_id":"0d85c5fd74349f0eff698cc9363a6db0fa0528d1"},{"author":{"_account_id":17776,"name":"Reedip","email":"reedip.banerjee@gmail.com","username":"Reedip"},"change_message_id":"430ba655c293787aef88cff67de05cbe83bda1c9","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                       \"host running the neutron server will be used.\")),"},{"line_number":157,"context_line":"    cfg.DictOpt(\u0027ovn_dhcp4_global_options\u0027,"},{"line_number":158,"context_line":"                default\u003d{},"},{"line_number":159,"context_line":"                help\u003d_(\"Dictionary of extra DHCPv4 options which will be \""},{"line_number":160,"context_line":"                       \"automatically added to each subnet upon creation and \""},{"line_number":161,"context_line":"                       \"set on all existing subnets.\\n\""},{"line_number":162,"context_line":"                       \"An empty value for a DHCP option will cause that \""}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_c592a1a0","line":159,"range":{"start_line":159,"start_character":38,"end_line":159,"end_character":43},"updated":"2018-10-25 06:04:33.000000000","message":"lets add \u0027global\u0027 here","commit_id":"bf1620091ad2d4aaecb2c404cd1fcc3db6c82dbb"},{"author":{"_account_id":26359,"name":"Andrew Austin","email":"aaustin@redhat.com","username":"aaustin"},"change_message_id":"73d9252a87a4b20c2a4a78530525084d583f5b55","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                       \"host running the neutron server will be used.\")),"},{"line_number":157,"context_line":"    cfg.DictOpt(\u0027ovn_dhcp4_global_options\u0027,"},{"line_number":158,"context_line":"                default\u003d{},"},{"line_number":159,"context_line":"                help\u003d_(\"Dictionary of extra DHCPv4 options which will be \""},{"line_number":160,"context_line":"                       \"automatically added to each subnet upon creation and \""},{"line_number":161,"context_line":"                       \"set on all existing subnets.\\n\""},{"line_number":162,"context_line":"                       \"An empty value for a DHCP option will cause that \""}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_ce31590c","line":159,"range":{"start_line":159,"start_character":38,"end_line":159,"end_character":43},"in_reply_to":"3f79a3b5_c592a1a0","updated":"2018-10-25 13:56:40.000000000","message":"Done","commit_id":"bf1620091ad2d4aaecb2c404cd1fcc3db6c82dbb"}],"networking_ovn/common/maintenance.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"5de9a8fcda48c09e36a606fc7787db283e67989a","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        if (not ovn_conf.get_global_dhcpv4_opts() and"},{"line_number":346,"context_line":"                not ovn_conf.get_global_dhcpv6_opts()):"},{"line_number":347,"context_line":"            # No need to scan the subnets if the settings are unset."},{"line_number":348,"context_line":"            return"},{"line_number":349,"context_line":"        LOG.debug(\u0027Maintenance task: Checking DHCP options on subnets\u0027)"},{"line_number":350,"context_line":"        self._sync_timer.restart()"},{"line_number":351,"context_line":"        fix_subnets \u003d self._check_subnet_global_dhcp_opts()"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_6f9cbfbd","line":348,"updated":"2018-10-25 14:42:29.000000000","message":"It\u0027s mostly a nit since it will run every hour, but, if there\u0027s no config we can also raise NeverAgain() here and avoid it to run again after 1 hour.","commit_id":"f275078eb0c792297514aa380ad9fda2b17904c9"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"aae7fa20afa78872f3c7fc0a718876cf25d70971","unresolved":false,"context_lines":[{"line_number":343,"context_line":"        if not self.has_lock:"},{"line_number":344,"context_line":"            # Assuming some other worker has run the method, no need to"},{"line_number":345,"context_line":"            # keep having it poll every hour for the lock"},{"line_number":346,"context_line":"            raise periodics.NeverAgain()"},{"line_number":347,"context_line":"        if (not ovn_conf.get_global_dhcpv4_opts() and"},{"line_number":348,"context_line":"                not ovn_conf.get_global_dhcpv6_opts()):"},{"line_number":349,"context_line":"            # No need to scan the subnets if the settings are unset."}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_016cff68","line":346,"updated":"2018-10-25 15:27:02.000000000","message":"I feel like we want to just invoke return in this condition checking for the lock instead of raising NeverAgain().\n\nI don\u0027t know if that\u0027s how we envision people updating the configuration file but, for example, let\u0027s say we have 3 neutron-servers and we want to update their configuration files to include new DHCP options. We will be doing it in a rolling fashion (turning down, updating and bringing up again one neutron-server each time):\n\nThe first one gets turned down. If it has the lock, it will move to another neutron-server that is running. The config is updated and the neutron-server is started again. This method will be executed but it will raise NeverAgain() because the lock now belongs to another instance.\n\nNow the second neutron-server gets turned down. If it has the lock, it will move to another neutron-server that is running... At start up time this method will be executed but it will raise NeverAgain() because the lock now belongs to another instance.\n\nSame for the third one... \n\nAt the end this method never ran on any of the instances.\n\nIf that scenario is true, we may even want to lower the spacing for this method so we make sure that the DHCP options are sync\u0027ed as soon as possible.","commit_id":"edb022e55aac3b27a68f9ad6eeac0d3ea5732a7f"}],"networking_ovn/common/ovn_client.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a597990e6c2a6ab3003fa11d96f60af92bce4e28","unresolved":false,"context_lines":[{"line_number":1321,"context_line":"        global_options \u003d config.get_global_dhcpv4_opts()"},{"line_number":1322,"context_line":""},{"line_number":1323,"context_line":"        for option, value in global_options.items():"},{"line_number":1324,"context_line":"            # Do not replace options already defined"},{"line_number":1325,"context_line":"            if option not in options:"},{"line_number":1326,"context_line":"                options[option] \u003d value"},{"line_number":1327,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_14d250d3","line":1324,"range":{"start_line":1324,"start_character":12,"end_line":1324,"end_character":52},"updated":"2018-08-09 08:45:39.000000000","message":"Can we add a warning log here in case of conflict to let the administrator knows that his DHCP options are being overwritten by the internal ones ? That would easy debugging","commit_id":"556684b422eb5697642170990a096caf16359029"},{"author":{"_account_id":17776,"name":"Reedip","email":"reedip.banerjee@gmail.com","username":"Reedip"},"change_message_id":"e85b5304bca562fab349e9d397517089c7c8128d","unresolved":false,"context_lines":[{"line_number":1321,"context_line":"        global_options \u003d config.get_global_dhcpv4_opts()"},{"line_number":1322,"context_line":""},{"line_number":1323,"context_line":"        for option, value in global_options.items():"},{"line_number":1324,"context_line":"            # Do not replace options already defined"},{"line_number":1325,"context_line":"            if option not in options:"},{"line_number":1326,"context_line":"                options[option] \u003d value"},{"line_number":1327,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_7e620c0c","line":1324,"range":{"start_line":1324,"start_character":12,"end_line":1324,"end_character":52},"in_reply_to":"3f79a3b5_14d250d3","updated":"2018-08-15 08:34:47.000000000","message":"+1\n\nCan we add some test cases as well ?","commit_id":"556684b422eb5697642170990a096caf16359029"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a597990e6c2a6ab3003fa11d96f60af92bce4e28","unresolved":false,"context_lines":[{"line_number":1345,"context_line":"        global_options \u003d config.get_global_dhcpv6_opts()"},{"line_number":1346,"context_line":""},{"line_number":1347,"context_line":"        for option, value in global_options.items():"},{"line_number":1348,"context_line":"            # Do not replace options already defined"},{"line_number":1349,"context_line":"            if option not in dhcpv6_opts:"},{"line_number":1350,"context_line":"                dhcpv6_opts[option] \u003d value"},{"line_number":1351,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_d4db78ea","line":1348,"range":{"start_line":1348,"start_character":11,"end_line":1348,"end_character":52},"updated":"2018-08-09 08:45:39.000000000","message":"ditto","commit_id":"556684b422eb5697642170990a096caf16359029"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a597990e6c2a6ab3003fa11d96f60af92bce4e28","unresolved":false,"context_lines":[{"line_number":1349,"context_line":"            if option not in dhcpv6_opts:"},{"line_number":1350,"context_line":"                dhcpv6_opts[option] \u003d value"},{"line_number":1351,"context_line":""},{"line_number":1352,"context_line":"        return dhcpv6_opts"},{"line_number":1353,"context_line":""},{"line_number":1354,"context_line":"    def _remove_subnet_dhcp_options(self, subnet_id, txn):"},{"line_number":1355,"context_line":"        dhcp_options \u003d self._nb_idl.get_subnet_dhcp_options("}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_146ed000","line":1352,"updated":"2018-08-09 08:45:39.000000000","message":"Let\u0027s extent/add a unittests for these changes as well.","commit_id":"556684b422eb5697642170990a096caf16359029"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"20280c2271c8f862b1825293b4d8a5433d8fa196","unresolved":false,"context_lines":[{"line_number":1325,"context_line":"            if option not in options:"},{"line_number":1326,"context_line":"                options[option] \u003d value"},{"line_number":1327,"context_line":"            else:"},{"line_number":1328,"context_line":"                LOG.warning(\"Global DHCPv4 option %s was not used as it is \""},{"line_number":1329,"context_line":"                            \"already defined for subnet %s.\","},{"line_number":1330,"context_line":"                            option, subnet[\u0027id\u0027])"},{"line_number":1331,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_5fb75c22","line":1328,"updated":"2018-09-17 12:22:07.000000000","message":"I\u0027m not sure we even need that.\n\nI\u0027d demote the LOG level to \"debug\" here, otherwise we\u0027re going to be filling logs with this once there\u0027s any subnet override.","commit_id":"0d85c5fd74349f0eff698cc9363a6db0fa0528d1"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"96e8b3c548e0ee544b2778b3db1c9877dda19174","unresolved":false,"context_lines":[{"line_number":1325,"context_line":"            if option not in options:"},{"line_number":1326,"context_line":"                options[option] \u003d value"},{"line_number":1327,"context_line":"            else:"},{"line_number":1328,"context_line":"                LOG.warning(\"Global DHCPv4 option %s was not used as it is \""},{"line_number":1329,"context_line":"                            \"already defined for subnet %s.\","},{"line_number":1330,"context_line":"                            option, subnet[\u0027id\u0027])"},{"line_number":1331,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_d027d962","line":1328,"in_reply_to":"3f79a3b5_5fb75c22","updated":"2018-09-17 14:19:05.000000000","message":"Good point, perhaps debug would be right level here. I suggested warning before but thinking more about it I think you are correct we will get a lot of duplicated messages.","commit_id":"0d85c5fd74349f0eff698cc9363a6db0fa0528d1"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"133a0e7c682e2585adcf453d19377ebdda7e2793","unresolved":false,"context_lines":[{"line_number":1355,"context_line":"            else:"},{"line_number":1356,"context_line":"                LOG.warning(\"Global DHCPv6 option %s was not used as it is \""},{"line_number":1357,"context_line":"                            \"already defined for subnet %s.\","},{"line_number":1358,"context_line":"                            option, subnet[\u0027id\u0027])"},{"line_number":1359,"context_line":""},{"line_number":1360,"context_line":"        return dhcpv6_opts"},{"line_number":1361,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_a43547f8","line":1358,"updated":"2018-09-17 12:06:13.000000000","message":"Just making an inline comment from Daniel\u0027s observation in the patch:\n\nThis code will only affect new entries, we should provide a way to apply these new options to existing subnets/dhcp_options.\n\nI would suggest having something at the post_fork() method for ml2 [0]\n\n[0] https://github.com/openstack/networking-ovn/blob/91a892407a10251c9726fe019cd38d5114f031ed/networking_ovn/ml2/mech_driver.py#L194","commit_id":"0d85c5fd74349f0eff698cc9363a6db0fa0528d1"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"20280c2271c8f862b1825293b4d8a5433d8fa196","unresolved":false,"context_lines":[{"line_number":1355,"context_line":"            else:"},{"line_number":1356,"context_line":"                LOG.warning(\"Global DHCPv6 option %s was not used as it is \""},{"line_number":1357,"context_line":"                            \"already defined for subnet %s.\","},{"line_number":1358,"context_line":"                            option, subnet[\u0027id\u0027])"},{"line_number":1359,"context_line":""},{"line_number":1360,"context_line":"        return dhcpv6_opts"},{"line_number":1361,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_3f686086","line":1358,"in_reply_to":"3f79a3b5_3f45c044","updated":"2018-09-17 12:22:07.000000000","message":"post_Fork? what\u0027s that?\n\nDo we have any way of handling this on the periodic task checker?\n\nI don\u0027t like the idea of fixing old objects based on API requests, because then we slow down the api requests.","commit_id":"0d85c5fd74349f0eff698cc9363a6db0fa0528d1"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"96e8b3c548e0ee544b2778b3db1c9877dda19174","unresolved":false,"context_lines":[{"line_number":1355,"context_line":"            else:"},{"line_number":1356,"context_line":"                LOG.warning(\"Global DHCPv6 option %s was not used as it is \""},{"line_number":1357,"context_line":"                            \"already defined for subnet %s.\","},{"line_number":1358,"context_line":"                            option, subnet[\u0027id\u0027])"},{"line_number":1359,"context_line":""},{"line_number":1360,"context_line":"        return dhcpv6_opts"},{"line_number":1361,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_d0b599ee","line":1358,"in_reply_to":"3f79a3b5_3f686086","updated":"2018-09-17 14:19:05.000000000","message":"The post_fork() daniel means here is part of the ml2 driver initialization (see [0]).\n\n@Daniels, yeah I think it\u0027s also possible to have a method in the maintenance task that would take care of updating the existing subnets.\n\n[0] https://github.com/openstack/networking-ovn/blob/91a892407a10251c9726fe019cd38d5114f031ed/networking_ovn/ml2/mech_driver.py#L177","commit_id":"0d85c5fd74349f0eff698cc9363a6db0fa0528d1"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9b9cd16060906370de97312a113dd7990fd2bb88","unresolved":false,"context_lines":[{"line_number":1355,"context_line":"            else:"},{"line_number":1356,"context_line":"                LOG.warning(\"Global DHCPv6 option %s was not used as it is \""},{"line_number":1357,"context_line":"                            \"already defined for subnet %s.\","},{"line_number":1358,"context_line":"                            option, subnet[\u0027id\u0027])"},{"line_number":1359,"context_line":""},{"line_number":1360,"context_line":"        return dhcpv6_opts"},{"line_number":1361,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_3a028b3f","line":1358,"in_reply_to":"3f79a3b5_50298299","updated":"2018-09-18 19:20:48.000000000","message":"Good point, we can blacklist the DHCP options that are currently used by networking-ovn and allow the cloud operator set/update the rest of it.\n\nAs a note, daniel\u0027s mentioned in his previous review about adding a release note to this change. If you can do that it would be great. You can create a new release note by running:\n\n$ tox -e venv -- reno new add-support-for-global-dhcp-options\n\nThen editing the resulting file by adding a brief description of the feature under the \"features\" topic (and deleting the remaining topics).\n\nHere\u0027s an example: https://github.com/openstack/networking-ovn/blob/master/releasenotes/notes/distributed-fip-0f5915ef9fd00626.yaml","commit_id":"0d85c5fd74349f0eff698cc9363a6db0fa0528d1"},{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"b3662aae5d77cec0262def016a5ecadb8d9b6d31","unresolved":false,"context_lines":[{"line_number":1355,"context_line":"            else:"},{"line_number":1356,"context_line":"                LOG.warning(\"Global DHCPv6 option %s was not used as it is \""},{"line_number":1357,"context_line":"                            \"already defined for subnet %s.\","},{"line_number":1358,"context_line":"                            option, subnet[\u0027id\u0027])"},{"line_number":1359,"context_line":""},{"line_number":1360,"context_line":"        return dhcpv6_opts"},{"line_number":1361,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_3f45c044","line":1358,"in_reply_to":"3f79a3b5_a43547f8","updated":"2018-09-17 12:13:18.000000000","message":"Having it at the post_fork() perhaps requires some sort of sync between threads so that they don\u0027t attempt to update all existing subnets at the same time? Perhaps it\u0027s not too bad though. I\u0027m attempting the migrate to port groups task in the maint worker which holds a distributed lock... not sure if we can do it there better. Thoughts?","commit_id":"0d85c5fd74349f0eff698cc9363a6db0fa0528d1"},{"author":{"_account_id":26359,"name":"Andrew Austin","email":"aaustin@redhat.com","username":"aaustin"},"change_message_id":"eade94c52ffaa62295cb663ea83ad2b6105dd6f4","unresolved":false,"context_lines":[{"line_number":1355,"context_line":"            else:"},{"line_number":1356,"context_line":"                LOG.warning(\"Global DHCPv6 option %s was not used as it is \""},{"line_number":1357,"context_line":"                            \"already defined for subnet %s.\","},{"line_number":1358,"context_line":"                            option, subnet[\u0027id\u0027])"},{"line_number":1359,"context_line":""},{"line_number":1360,"context_line":"        return dhcpv6_opts"},{"line_number":1361,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_50298299","line":1358,"in_reply_to":"3f79a3b5_d0b599ee","updated":"2018-09-17 19:34:26.000000000","message":"I think the maintenance task is more appropriate. This should also handle cases where an operator changes the configured value. \n\nTo do this well, I think the behavior needs to change from not overriding existing values to having a blacklist of options that will not be allowed to be set in the global options configuration (i.e. subnet mask, MTU, static routes) to avoid creating the chance for an operator to mistakenly break all of their subnets.","commit_id":"0d85c5fd74349f0eff698cc9363a6db0fa0528d1"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"1ace0bb2e3446cd9d433a94655bad90dce6aed76","unresolved":false,"context_lines":[{"line_number":1486,"context_line":"            # a request to remove the option"},{"line_number":1487,"context_line":"            if value:"},{"line_number":1488,"context_line":"                options[option] \u003d value"},{"line_number":1489,"context_line":"            elif option in options:"},{"line_number":1490,"context_line":"                del(options[option])"},{"line_number":1491,"context_line":""},{"line_number":1492,"context_line":"        return options"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f79a3b5_f9952be4","line":1489,"updated":"2018-10-23 21:02:06.000000000","message":"nit: better Pythonic style would be else: try:... except KeyError: pass ala https://docs.python.org/3/glossary.html?highlight\u003deafp#term-eafp","commit_id":"f0c044fcfc6b601820a29f3df79fc736c7328247"},{"author":{"_account_id":26359,"name":"Andrew Austin","email":"aaustin@redhat.com","username":"aaustin"},"change_message_id":"d6f58017ccf70c6d859df0448a1445d62ceba0d2","unresolved":false,"context_lines":[{"line_number":1486,"context_line":"            # a request to remove the option"},{"line_number":1487,"context_line":"            if value:"},{"line_number":1488,"context_line":"                options[option] \u003d value"},{"line_number":1489,"context_line":"            elif option in options:"},{"line_number":1490,"context_line":"                del(options[option])"},{"line_number":1491,"context_line":""},{"line_number":1492,"context_line":"        return options"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f79a3b5_2e4cb83e","line":1489,"in_reply_to":"3f79a3b5_f9952be4","updated":"2018-10-23 21:33:22.000000000","message":"Done","commit_id":"f0c044fcfc6b601820a29f3df79fc736c7328247"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"1ace0bb2e3446cd9d433a94655bad90dce6aed76","unresolved":false,"context_lines":[{"line_number":1506,"context_line":"        if subnet.get(\u0027ipv6_address_mode\u0027) \u003d\u003d const.DHCPV6_STATELESS:"},{"line_number":1507,"context_line":"            dhcpv6_opts[ovn_const.DHCPV6_STATELESS_OPT] \u003d \u0027true\u0027"},{"line_number":1508,"context_line":""},{"line_number":1509,"context_line":"        global_options \u003d config.get_global_dhcpv6_opts()"},{"line_number":1510,"context_line":""},{"line_number":1511,"context_line":"        for option, value in global_options.items():"},{"line_number":1512,"context_line":"            if option in ovn_const.GLOBAL_DHCP_OPTS_BLACKLIST[6]:"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f79a3b5_4b2a4678","line":1509,"updated":"2018-10-23 21:02:06.000000000","message":"Both of these are essentially copy/paste code that could just be a function that takes a list of options, global options and blacklist and returns the processed options. e.g. return process_opts(options, config.get_global_dhcp4_opts(), ovn_const.GLOBAL_DHCP_OPTS_BLACKLIST[4]) or, if you create a mapping between OPT_IPV4/6 and the opts/blacklist, just process_opts(options, OPT_IPV4) etc.","commit_id":"f0c044fcfc6b601820a29f3df79fc736c7328247"},{"author":{"_account_id":26359,"name":"Andrew Austin","email":"aaustin@redhat.com","username":"aaustin"},"change_message_id":"d6f58017ccf70c6d859df0448a1445d62ceba0d2","unresolved":false,"context_lines":[{"line_number":1506,"context_line":"        if subnet.get(\u0027ipv6_address_mode\u0027) \u003d\u003d const.DHCPV6_STATELESS:"},{"line_number":1507,"context_line":"            dhcpv6_opts[ovn_const.DHCPV6_STATELESS_OPT] \u003d \u0027true\u0027"},{"line_number":1508,"context_line":""},{"line_number":1509,"context_line":"        global_options \u003d config.get_global_dhcpv6_opts()"},{"line_number":1510,"context_line":""},{"line_number":1511,"context_line":"        for option, value in global_options.items():"},{"line_number":1512,"context_line":"            if option in ovn_const.GLOBAL_DHCP_OPTS_BLACKLIST[6]:"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f79a3b5_ee5b20f6","line":1509,"in_reply_to":"3f79a3b5_4b2a4678","updated":"2018-10-23 21:33:22.000000000","message":"Done","commit_id":"f0c044fcfc6b601820a29f3df79fc736c7328247"},{"author":{"_account_id":17776,"name":"Reedip","email":"reedip.banerjee@gmail.com","username":"Reedip"},"change_message_id":"430ba655c293787aef88cff67de05cbe83bda1c9","unresolved":false,"context_lines":[{"line_number":1427,"context_line":"            if option in ovn_const.GLOBAL_DHCP_OPTS_BLACKLIST[ip_version]:"},{"line_number":1428,"context_line":"                # This option is not allowed to be set with a global setting"},{"line_number":1429,"context_line":"                LOG.debug(\u0027DHCP option %s is not permitted to be set in \u0027"},{"line_number":1430,"context_line":"                          \u0027global options. The setting will be ignored.\u0027)"},{"line_number":1431,"context_line":"                continue"},{"line_number":1432,"context_line":"            # If the value is null (i.e. config ntp_server:), treat it as"},{"line_number":1433,"context_line":"            # a request to remove the option"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_45cd31b8","line":1430,"range":{"start_line":1430,"start_character":43,"end_line":1430,"end_character":46},"updated":"2018-10-25 06:04:33.000000000","message":"nit: \"This\" might work better, wont it?","commit_id":"bf1620091ad2d4aaecb2c404cd1fcc3db6c82dbb"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"8ea529b8414c25f943d05f24cc27a7417b17b446","unresolved":false,"context_lines":[{"line_number":1427,"context_line":"            if option in ovn_const.GLOBAL_DHCP_OPTS_BLACKLIST[ip_version]:"},{"line_number":1428,"context_line":"                # This option is not allowed to be set with a global setting"},{"line_number":1429,"context_line":"                LOG.debug(\u0027DHCP option %s is not permitted to be set in \u0027"},{"line_number":1430,"context_line":"                          \u0027global options. The setting will be ignored.\u0027)"},{"line_number":1431,"context_line":"                continue"},{"line_number":1432,"context_line":"            # If the value is null (i.e. config ntp_server:), treat it as"},{"line_number":1433,"context_line":"            # a request to remove the option"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_59cd18b8","line":1430,"range":{"start_line":1430,"start_character":43,"end_line":1430,"end_character":46},"in_reply_to":"3f79a3b5_45cd31b8","updated":"2018-10-25 09:05:47.000000000","message":"Both ways sounds fine I think. I couldn\u0027t argue one in favor of the other","commit_id":"bf1620091ad2d4aaecb2c404cd1fcc3db6c82dbb"},{"author":{"_account_id":26359,"name":"Andrew Austin","email":"aaustin@redhat.com","username":"aaustin"},"change_message_id":"73d9252a87a4b20c2a4a78530525084d583f5b55","unresolved":false,"context_lines":[{"line_number":1427,"context_line":"            if option in ovn_const.GLOBAL_DHCP_OPTS_BLACKLIST[ip_version]:"},{"line_number":1428,"context_line":"                # This option is not allowed to be set with a global setting"},{"line_number":1429,"context_line":"                LOG.debug(\u0027DHCP option %s is not permitted to be set in \u0027"},{"line_number":1430,"context_line":"                          \u0027global options. The setting will be ignored.\u0027)"},{"line_number":1431,"context_line":"                continue"},{"line_number":1432,"context_line":"            # If the value is null (i.e. config ntp_server:), treat it as"},{"line_number":1433,"context_line":"            # a request to remove the option"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_8e10415a","line":1430,"range":{"start_line":1430,"start_character":43,"end_line":1430,"end_character":46},"in_reply_to":"3f79a3b5_45cd31b8","updated":"2018-10-25 13:56:40.000000000","message":"Done","commit_id":"bf1620091ad2d4aaecb2c404cd1fcc3db6c82dbb"}],"networking_ovn/tests/functional/test_maintenance.py":[{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"f0d5630fc599af09a23d453dde4bee9fe6759ed6","unresolved":false,"context_lines":[{"line_number":425,"context_line":"        self._set_global_dhcp_opts(ip_version\u003d6, opts\u003doptions)"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"        # Run the maintenance task to add the new options"},{"line_number":428,"context_line":"        try:"},{"line_number":429,"context_line":"            self.maint.check_global_dhcp_opts()"},{"line_number":430,"context_line":"        except periodics.NeverAgain:"},{"line_number":431,"context_line":"            pass"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        # Assert that the option was added"},{"line_number":434,"context_line":"        ovn_obj \u003d self._find_subnet_row_by_id(neutron_sub[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f79a3b5_33cca931","line":431,"range":{"start_line":428,"start_character":0,"end_line":431,"end_character":16},"updated":"2018-10-30 09:46:08.000000000","message":"Perhaps we wanted here self.assertRaises but it\u0027s fine","commit_id":"d26fc191878837bce4de0d525195bbcad4e45d58"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7a2114b650e9ea5cfb00d35ff297fde4ee872c97","unresolved":false,"context_lines":[{"line_number":425,"context_line":"        self._set_global_dhcp_opts(ip_version\u003d6, opts\u003doptions)"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"        # Run the maintenance task to add the new options"},{"line_number":428,"context_line":"        try:"},{"line_number":429,"context_line":"            self.maint.check_global_dhcp_opts()"},{"line_number":430,"context_line":"        except periodics.NeverAgain:"},{"line_number":431,"context_line":"            pass"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        # Assert that the option was added"},{"line_number":434,"context_line":"        ovn_obj \u003d self._find_subnet_row_by_id(neutron_sub[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f79a3b5_539125f6","line":431,"range":{"start_line":428,"start_character":0,"end_line":431,"end_character":16},"in_reply_to":"3f79a3b5_13e2cd9c","updated":"2018-10-30 09:48:40.000000000","message":"Oh right, yeah it sounds like a better way indeed","commit_id":"d26fc191878837bce4de0d525195bbcad4e45d58"},{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"b48b2942d456c8a7bc894b3b2731f8b1b3cc1274","unresolved":false,"context_lines":[{"line_number":425,"context_line":"        self._set_global_dhcp_opts(ip_version\u003d6, opts\u003doptions)"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"        # Run the maintenance task to add the new options"},{"line_number":428,"context_line":"        try:"},{"line_number":429,"context_line":"            self.maint.check_global_dhcp_opts()"},{"line_number":430,"context_line":"        except periodics.NeverAgain:"},{"line_number":431,"context_line":"            pass"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        # Assert that the option was added"},{"line_number":434,"context_line":"        ovn_obj \u003d self._find_subnet_row_by_id(neutron_sub[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f79a3b5_13e2cd9c","line":431,"range":{"start_line":428,"start_character":0,"end_line":431,"end_character":16},"in_reply_to":"3f79a3b5_33cca931","updated":"2018-10-30 09:47:00.000000000","message":"Actually we do want it right? We want to make sure that this only runs once (and the test is assumed to have only one worker so it\u0027ll have the lock). What do you say?","commit_id":"d26fc191878837bce4de0d525195bbcad4e45d58"}],"releasenotes/notes/ovn-global-dhcp-options-6a23e6a3619bba78.yaml":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"1ace0bb2e3446cd9d433a94655bad90dce6aed76","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added config options ovn_dhcp4_global_option and ovn_dhcp6_global_options. "},{"line_number":5,"context_line":"    These options allow configuring DHCP options that will be enforced on all"},{"line_number":6,"context_line":"    subnets controlled by networking_ovn."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"3f79a3b5_ab675aec","line":4,"updated":"2018-10-23 21:02:06.000000000","message":"trailing whitespace","commit_id":"f0c044fcfc6b601820a29f3df79fc736c7328247"},{"author":{"_account_id":26359,"name":"Andrew Austin","email":"aaustin@redhat.com","username":"aaustin"},"change_message_id":"d6f58017ccf70c6d859df0448a1445d62ceba0d2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added config options ovn_dhcp4_global_option and ovn_dhcp6_global_options. "},{"line_number":5,"context_line":"    These options allow configuring DHCP options that will be enforced on all"},{"line_number":6,"context_line":"    subnets controlled by networking_ovn."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"3f79a3b5_ce5664ce","line":4,"in_reply_to":"3f79a3b5_ab675aec","updated":"2018-10-23 21:33:22.000000000","message":"Done","commit_id":"f0c044fcfc6b601820a29f3df79fc736c7328247"},{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"df327b773312cc10d55df0814d9b89d0abee61d5","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added config options ovn_dhcp4_global_option and ovn_dhcp6_global_options."},{"line_number":5,"context_line":"    These options allow configuring DHCP options that will be enforced on all"},{"line_number":6,"context_line":"    subnets controlled by networking_ovn."}],"source_content_type":"text/x-yaml","patch_set":13,"id":"3f79a3b5_54d87d22","line":6,"updated":"2018-10-25 10:07:15.000000000","message":"I\u0027d perhaps add to the upgrade section that existing networks will catch up with the new option after max 1hour. This is important for operators, what do you say?","commit_id":"bf1620091ad2d4aaecb2c404cd1fcc3db6c82dbb"},{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"24b678848d29c199238de0b34e5618e6eb309d22","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added config options ovn_dhcp4_global_option and ovn_dhcp6_global_options."},{"line_number":5,"context_line":"    These options allow configuring DHCP options that will be enforced on all"},{"line_number":6,"context_line":"    subnets controlled by networking_ovn."}],"source_content_type":"text/x-yaml","patch_set":13,"id":"3f79a3b5_f436694f","line":6,"in_reply_to":"3f79a3b5_54d87d22","updated":"2018-10-25 10:12:17.000000000","message":"Ok rethinking this:\n\n1. The options can only be change through cfg file.\n2. Changes will only get applied after restarting neutron-server\n3. Maint task will run immediately after neutron-server starts so the config will be applied to all the networks\n4. Maint task don\u0027t need to run anymore.\n\nWe don\u0027t need the 1h periodic run, right?","commit_id":"bf1620091ad2d4aaecb2c404cd1fcc3db6c82dbb"},{"author":{"_account_id":26359,"name":"Andrew Austin","email":"aaustin@redhat.com","username":"aaustin"},"change_message_id":"73d9252a87a4b20c2a4a78530525084d583f5b55","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added config options ovn_dhcp4_global_option and ovn_dhcp6_global_options."},{"line_number":5,"context_line":"    These options allow configuring DHCP options that will be enforced on all"},{"line_number":6,"context_line":"    subnets controlled by networking_ovn."}],"source_content_type":"text/x-yaml","patch_set":13,"id":"3f79a3b5_a9fad70d","line":6,"in_reply_to":"3f79a3b5_ba23fba9","updated":"2018-10-25 13:56:40.000000000","message":"I didn\u0027t know about NeverAgain(), that will accomplish what we need nicely. The only reason to have that method in the periodics is for locking.","commit_id":"bf1620091ad2d4aaecb2c404cd1fcc3db6c82dbb"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e966f7d12a1c725d916c688c6eccd7c932e3bd47","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added config options ovn_dhcp4_global_option and ovn_dhcp6_global_options."},{"line_number":5,"context_line":"    These options allow configuring DHCP options that will be enforced on all"},{"line_number":6,"context_line":"    subnets controlled by networking_ovn."}],"source_content_type":"text/x-yaml","patch_set":13,"id":"3f79a3b5_ba23fba9","line":6,"in_reply_to":"3f79a3b5_f436694f","updated":"2018-10-25 10:29:20.000000000","message":"That\u0027s a very good point.\n\nI\u0027m not sure neutron-server can reload the config via SIGHUP that wouldn\u0027t require a restart.\n\nBut, yeah, if it can\u0027t I think it would be nice to just run that maintenance task once. That can be accomplished very easily by just raising a periodics.NeverAgain() exception at the end of the execution body of the method.\n\nAndrew, what you think about it ?","commit_id":"bf1620091ad2d4aaecb2c404cd1fcc3db6c82dbb"}]}
