)]}'
{"doc/source/contributor/api/haproxy-amphora-api.rst":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"978cc796c04a68c3f6c9b72c7393419f3f1d2c17","unresolved":false,"context_lines":[{"line_number":278,"context_line":"::"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"  GET URL:"},{"line_number":281,"context_line":"  https://octavia-haproxy-img-00328.local/0.5/interface/10.0.0.1"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"  JSON Response:"},{"line_number":284,"context_line":"      {"}],"source_content_type":"text/x-rst","patch_set":25,"id":"7faddb67_ce0f2235","line":281,"updated":"2019-07-14 07:55:10.000000000","message":"IMO we should upgrade this whole doc to 100% explicitly version 1.0, if anyone needs references to 0.5 (which will no longer exist in this release) they can go look at the docs from the last release).\nI\u0027ll take care of it in the next PS.","commit_id":"e59de49c19c5fc75faf072818e78e13009bdc2d2"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a8d920d5866d5a6112dfa5de2c6d68a1c9077116","unresolved":false,"context_lines":[{"line_number":809,"context_line":"Upload listener haproxy configuration"},{"line_number":810,"context_line":"-------------------------------------"},{"line_number":811,"context_line":""},{"line_number":812,"context_line":"* **URL:** /1.0/listeners/*:amphora_id*/*:listener*/haproxy"},{"line_number":813,"context_line":"* **Method:** PUT"},{"line_number":814,"context_line":"* **URL params:**"},{"line_number":815,"context_line":""}],"source_content_type":"text/x-rst","patch_set":32,"id":"7faddb67_0e5e1d45","line":812,"range":{"start_line":812,"start_character":11,"end_line":812,"end_character":59},"updated":"2019-07-23 05:06:35.000000000","message":"This doesn\u0027t exist anymore -- this section was only relevant to 0.5 and should go away. The correct section is right below this.","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b8116391abfd426907711186b3f9f882f66027ae","unresolved":false,"context_lines":[{"line_number":809,"context_line":"Upload listener haproxy configuration"},{"line_number":810,"context_line":"-------------------------------------"},{"line_number":811,"context_line":""},{"line_number":812,"context_line":"* **URL:** /1.0/listeners/*:amphora_id*/*:listener*/haproxy"},{"line_number":813,"context_line":"* **Method:** PUT"},{"line_number":814,"context_line":"* **URL params:**"},{"line_number":815,"context_line":""}],"source_content_type":"text/x-rst","patch_set":32,"id":"7faddb67_f0827452","line":812,"range":{"start_line":812,"start_character":11,"end_line":812,"end_character":59},"in_reply_to":"7faddb67_0e5e1d45","updated":"2019-07-23 20:58:53.000000000","message":"Done","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a8d920d5866d5a6112dfa5de2c6d68a1c9077116","unresolved":false,"context_lines":[{"line_number":968,"context_line":"    \u0027message\u0027: \u0027Topology transition in progress\u0027,"},{"line_number":969,"context_line":"  }"},{"line_number":970,"context_line":""},{"line_number":971,"context_line":"Get listener haproxy configuration"},{"line_number":972,"context_line":"----------------------------------"},{"line_number":973,"context_line":""},{"line_number":974,"context_line":"* **URL:** /1.0/loadbalancer/*:loadbalancer_id*/haproxy"}],"source_content_type":"text/x-rst","patch_set":32,"id":"7faddb67_2e5bd954","line":971,"range":{"start_line":971,"start_character":4,"end_line":971,"end_character":12},"updated":"2019-07-23 05:06:35.000000000","message":"loadbalancer?","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b8116391abfd426907711186b3f9f882f66027ae","unresolved":false,"context_lines":[{"line_number":968,"context_line":"    \u0027message\u0027: \u0027Topology transition in progress\u0027,"},{"line_number":969,"context_line":"  }"},{"line_number":970,"context_line":""},{"line_number":971,"context_line":"Get listener haproxy configuration"},{"line_number":972,"context_line":"----------------------------------"},{"line_number":973,"context_line":""},{"line_number":974,"context_line":"* **URL:** /1.0/loadbalancer/*:loadbalancer_id*/haproxy"}],"source_content_type":"text/x-rst","patch_set":32,"id":"7faddb67_d081784c","line":971,"range":{"start_line":971,"start_character":4,"end_line":971,"end_character":12},"in_reply_to":"7faddb67_2e5bd954","updated":"2019-07-23 20:58:53.000000000","message":"Done","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"}],"octavia/amphorae/backends/agent/api_server/amphora_info.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a8d920d5866d5a6112dfa5de2c6d68a1c9077116","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        return webob.Response(json\u003dbody)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def compile_amphora_details(self, extend_udp_driver\u003dNone):"},{"line_number":49,"context_line":"        # TODO(rm_work): need to fix this"},{"line_number":50,"context_line":"        haproxy_listener_list \u003d sorted(util.get_listeners())"},{"line_number":51,"context_line":"        extend_body \u003d {}"},{"line_number":52,"context_line":"        udp_listener_list \u003d []"}],"source_content_type":"text/x-python","patch_set":32,"id":"7faddb67_ee54e123","line":49,"updated":"2019-07-23 05:06:35.000000000","message":"Did I/you fix this? Maybe this comment needs to be removed?","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b8116391abfd426907711186b3f9f882f66027ae","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        return webob.Response(json\u003dbody)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def compile_amphora_details(self, extend_udp_driver\u003dNone):"},{"line_number":49,"context_line":"        # TODO(rm_work): need to fix this"},{"line_number":50,"context_line":"        haproxy_listener_list \u003d sorted(util.get_listeners())"},{"line_number":51,"context_line":"        extend_body \u003d {}"},{"line_number":52,"context_line":"        udp_listener_list \u003d []"}],"source_content_type":"text/x-python","patch_set":32,"id":"7faddb67_5ea7d950","line":49,"in_reply_to":"7faddb67_ee54e123","updated":"2019-07-23 20:58:53.000000000","message":"Yes, I fixed this by implementing a \"get_listeners()\"","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a8d920d5866d5a6112dfa5de2c6d68a1c9077116","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def compile_amphora_details(self, extend_udp_driver\u003dNone):"},{"line_number":49,"context_line":"        # TODO(rm_work): need to fix this"},{"line_number":50,"context_line":"        haproxy_listener_list \u003d sorted(util.get_listeners())"},{"line_number":51,"context_line":"        extend_body \u003d {}"},{"line_number":52,"context_line":"        udp_listener_list \u003d []"},{"line_number":53,"context_line":"        if extend_udp_driver:"}],"source_content_type":"text/x-python","patch_set":32,"id":"7faddb67_4e3975f0","line":50,"updated":"2019-07-23 05:06:35.000000000","message":"This was probably unnecessary, as the whole merged list is sorted again later, but whatever.","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a8d920d5866d5a6112dfa5de2c6d68a1c9077116","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                \u0027topology\u0027: consts.TOPOLOGY_SINGLE,"},{"line_number":90,"context_line":"                \u0027topology_status\u0027: consts.TOPOLOGY_STATUS_OK,"},{"line_number":91,"context_line":"                \u0027listeners\u0027: sorted(list("},{"line_number":92,"context_line":"                    set(haproxy_listener_list + udp_listener_list)))"},{"line_number":93,"context_line":"                if udp_listener_list else haproxy_listener_list,"},{"line_number":94,"context_line":"                \u0027packages\u0027: {}}"},{"line_number":95,"context_line":"        if extend_body:"}],"source_content_type":"text/x-python","patch_set":32,"id":"7faddb67_8e2f6da6","line":92,"updated":"2019-07-23 05:06:35.000000000","message":"Is this necessary? It\u0027s probably fine, but... In what case would we really need to make this a set and convert back, these lists should be completely unable to intersect.","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b8116391abfd426907711186b3f9f882f66027ae","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                \u0027topology\u0027: consts.TOPOLOGY_SINGLE,"},{"line_number":90,"context_line":"                \u0027topology_status\u0027: consts.TOPOLOGY_STATUS_OK,"},{"line_number":91,"context_line":"                \u0027listeners\u0027: sorted(list("},{"line_number":92,"context_line":"                    set(haproxy_listener_list + udp_listener_list)))"},{"line_number":93,"context_line":"                if udp_listener_list else haproxy_listener_list,"},{"line_number":94,"context_line":"                \u0027packages\u0027: {}}"},{"line_number":95,"context_line":"        if extend_body:"}],"source_content_type":"text/x-python","patch_set":32,"id":"7faddb67_be6b6def","line":92,"in_reply_to":"7faddb67_8e2f6da6","updated":"2019-07-23 20:58:53.000000000","message":"Yeah, I don\u0027t know either as they should be uuids.\nI\u0027m not going to change that here as it was this way before, but this could probably be changed in a future patch.","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"}],"octavia/amphorae/backends/agent/api_server/listener.py":[{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"acfbd103d2313955792dfe8f6cbce18d2c301243","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    def get_haproxy_config(self, lb_id):"},{"line_number":86,"context_line":"        \"\"\"Gets the haproxy config"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        :param listener_id: the id of the listener"},{"line_number":89,"context_line":"        \"\"\""},{"line_number":90,"context_line":"        self._check_lb_exists(lb_id)"},{"line_number":91,"context_line":"        with open(util.config_path(lb_id), \u0027r\u0027) as file:"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_8695b842","line":88,"range":{"start_line":88,"start_character":15,"end_line":88,"end_character":50},"updated":"2019-07-11 13:03:56.000000000","message":"need to update docstring.","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"d27748770cf058a55085da8f27bc084cd9d3bbb6","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    def get_haproxy_config(self, lb_id):"},{"line_number":86,"context_line":"        \"\"\"Gets the haproxy config"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        :param listener_id: the id of the listener"},{"line_number":89,"context_line":"        \"\"\""},{"line_number":90,"context_line":"        self._check_lb_exists(lb_id)"},{"line_number":91,"context_line":"        with open(util.config_path(lb_id), \u0027r\u0027) as file:"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_702940e4","line":88,"range":{"start_line":88,"start_character":15,"end_line":88,"end_character":50},"in_reply_to":"7faddb67_8695b842","updated":"2019-07-12 07:38:06.000000000","message":"Yeah, we have to go through and re-do a ton of these docstrings, probably i\u0027ll do a complete runthrough of all the changed files looking for these once they\u0027ve solidified a bit more. Right now everything is in flux.","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a8d920d5866d5a6112dfa5de2c6d68a1c9077116","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        return getattr(self.stream, attr)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"class Listener(object):"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def __init__(self):"},{"line_number":78,"context_line":"        self._osutils \u003d osutils.BaseOS.get_os_util()"}],"source_content_type":"text/x-python","patch_set":32,"id":"7faddb67_ee29419b","line":75,"updated":"2019-07-23 05:06:35.000000000","message":"This still being named Listener is funny, but not really functionally relevant I guess. In fact, the whole file is now using an obsolete name.","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b8116391abfd426907711186b3f9f882f66027ae","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        return getattr(self.stream, attr)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"class Listener(object):"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def __init__(self):"},{"line_number":78,"context_line":"        self._osutils \u003d osutils.BaseOS.get_os_util()"}],"source_content_type":"text/x-python","patch_set":32,"id":"7faddb67_044cae74","line":75,"in_reply_to":"7faddb67_ee29419b","updated":"2019-07-23 20:58:53.000000000","message":"Done","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a8d920d5866d5a6112dfa5de2c6d68a1c9077116","unresolved":false,"context_lines":[{"line_number":478,"context_line":"                return consts.ACTIVE"},{"line_number":479,"context_line":"        return consts.OFFLINE"},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"    def _check_listener_status(self, listener_id):"},{"line_number":482,"context_line":"        # TODO(rm_work): Is ACTIVE/OFFLINE a valid pair?"},{"line_number":483,"context_line":"        #   Will this even be used? I just wrote it to make a test pass..."},{"line_number":484,"context_line":"        if listener_id in util.get_listeners():"}],"source_content_type":"text/x-python","patch_set":32,"id":"7faddb67_4e12d564","line":481,"updated":"2019-07-23 05:06:35.000000000","message":"I think this needs to be removed. I don\u0027t see usages except in tests, which would need to be removed also.","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b8116391abfd426907711186b3f9f882f66027ae","unresolved":false,"context_lines":[{"line_number":478,"context_line":"                return consts.ACTIVE"},{"line_number":479,"context_line":"        return consts.OFFLINE"},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"    def _check_listener_status(self, listener_id):"},{"line_number":482,"context_line":"        # TODO(rm_work): Is ACTIVE/OFFLINE a valid pair?"},{"line_number":483,"context_line":"        #   Will this even be used? I just wrote it to make a test pass..."},{"line_number":484,"context_line":"        if listener_id in util.get_listeners():"}],"source_content_type":"text/x-python","patch_set":32,"id":"7faddb67_fe180585","line":481,"in_reply_to":"7faddb67_4e12d564","updated":"2019-07-23 20:58:53.000000000","message":"Done","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"}],"octavia/amphorae/backends/agent/api_server/loadbalancer.py":[{"author":{"_account_id":6469,"name":"Carlos Gonçalves","display_name":"Carlos Goncalves","email":"cgoncalves@redhat.com","username":"cgoncalves"},"change_message_id":"d5c02d0962a754b7eaaf4b184ba40bcbede98a23","unresolved":false,"context_lines":[{"line_number":475,"context_line":"        if os.path.exists(util.pid_path(lb_id)):"},{"line_number":476,"context_line":"            if os.path.exists("},{"line_number":477,"context_line":"                    os.path.join(\u0027/proc\u0027, util.get_haproxy_pid(lb_id))):"},{"line_number":478,"context_line":"                return consts.ACTIVE"},{"line_number":479,"context_line":"        return consts.OFFLINE"}],"source_content_type":"text/x-python","patch_set":33,"id":"7faddb67_52879062","line":478,"updated":"2019-07-26 21:46:49.000000000","message":"The return OFFLINE was removed, this method will now return None if one of the conditions fails. The return OFFLINE is used in L248, which now will never assert. Was this changed on purpose?","commit_id":"06ce4777c3bad2868e906101bcd2cd7c753b4859"},{"author":{"_account_id":6469,"name":"Carlos Gonçalves","display_name":"Carlos Goncalves","email":"cgoncalves@redhat.com","username":"cgoncalves"},"change_message_id":"9e5463a42df25c372dc35284f7ea3d8373be4757","unresolved":false,"context_lines":[{"line_number":475,"context_line":"        if os.path.exists(util.pid_path(lb_id)):"},{"line_number":476,"context_line":"            if os.path.exists("},{"line_number":477,"context_line":"                    os.path.join(\u0027/proc\u0027, util.get_haproxy_pid(lb_id))):"},{"line_number":478,"context_line":"                return consts.ACTIVE"},{"line_number":479,"context_line":"        return consts.OFFLINE"}],"source_content_type":"text/x-python","patch_set":33,"id":"7faddb67_a7e9cb80","line":478,"in_reply_to":"7faddb67_52879062","updated":"2019-07-29 20:21:34.000000000","message":"D\u0027oh! It on L479","commit_id":"06ce4777c3bad2868e906101bcd2cd7c753b4859"}],"octavia/amphorae/backends/agent/api_server/util.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2b858a330e0d4b3cb91f6da7ce415e2b5195d2ba","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    return os.path.join(CONF.haproxy_amphora.base_path, \u0027lvs\u0027)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def keepalived_lvs_init_path(init_system, listener_id):"},{"line_number":54,"context_line":"    if init_system \u003d\u003d consts.INIT_SYSTEMD:"},{"line_number":55,"context_line":"        return os.path.join(consts.SYSTEMD_DIR,"},{"line_number":56,"context_line":"                            consts.KEEPALIVED_SYSTEMD_PREFIX %"}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_657692a7","line":53,"updated":"2019-07-10 03:56:08.000000000","message":"Should update this","commit_id":"4b8adb5a3dbd5dd980f0eac7b5c047b6a8e7202a"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"51b7f0e4715cdbabc69fa62d1de0503db44cd641","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    return os.path.join(CONF.haproxy_amphora.base_path, \u0027lvs\u0027)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def keepalived_lvs_init_path(init_system, listener_id):"},{"line_number":54,"context_line":"    if init_system \u003d\u003d consts.INIT_SYSTEMD:"},{"line_number":55,"context_line":"        return os.path.join(consts.SYSTEMD_DIR,"},{"line_number":56,"context_line":"                            consts.KEEPALIVED_SYSTEMD_PREFIX %"}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_26ff3d35","line":53,"in_reply_to":"7faddb67_657692a7","updated":"2019-07-10 04:08:20.000000000","message":"This one isn\u0027t yet","commit_id":"4b8adb5a3dbd5dd980f0eac7b5c047b6a8e7202a"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2b858a330e0d4b3cb91f6da7ce415e2b5195d2ba","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    return []"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"def is_listener_running(listener_id):"},{"line_number":179,"context_line":"    return os.path.exists(pid_path(listener_id)) and os.path.exists("},{"line_number":180,"context_line":"        os.path.join(\u0027/proc\u0027, get_haproxy_pid(listener_id)))"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_25573a05","line":178,"updated":"2019-07-10 03:56:08.000000000","message":"Should update this","commit_id":"4b8adb5a3dbd5dd980f0eac7b5c047b6a8e7202a"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"51b7f0e4715cdbabc69fa62d1de0503db44cd641","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    return []"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"def is_listener_running(listener_id):"},{"line_number":179,"context_line":"    return os.path.exists(pid_path(listener_id)) and os.path.exists("},{"line_number":180,"context_line":"        os.path.join(\u0027/proc\u0027, get_haproxy_pid(listener_id)))"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_46ea7975","line":178,"in_reply_to":"7faddb67_25573a05","updated":"2019-07-10 04:08:20.000000000","message":"I think you ... did?","commit_id":"4b8adb5a3dbd5dd980f0eac7b5c047b6a8e7202a"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"acfbd103d2313955792dfe8f6cbce18d2c301243","unresolved":false,"context_lines":[{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"def get_protocol_for_lb_object(object_id):"},{"line_number":254,"context_line":"    \"\"\"Returns the L4 protocol for a listener."},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"    If the listener is a TCP based listener (haproxy) return TCP."},{"line_number":257,"context_line":"    If the listener is a UDP based listener (lvs) return UDP."},{"line_number":258,"context_line":"    If the listener is not identifiable, return None."},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    :param listener_id: The ID of the listener to identify."},{"line_number":261,"context_line":"    :returns: TCP, UDP, or None"},{"line_number":262,"context_line":"    \"\"\""},{"line_number":263,"context_line":"    if os.path.exists(config_path(object_id)):"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_260ac489","line":260,"range":{"start_line":254,"start_character":7,"end_line":260,"end_character":59},"updated":"2019-07-11 13:03:56.000000000","message":"same","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"d27748770cf058a55085da8f27bc084cd9d3bbb6","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    \"\"\""},{"line_number":175,"context_line":"    for lb_id in get_loadbalancers():"},{"line_number":176,"context_line":"        listeners_on_lb \u003d parse_haproxy_file(lb_id)[1]"},{"line_number":177,"context_line":"        return list(listeners_on_lb.keys())"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"def get_loadbalancers():"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_b06a58ea","line":177,"updated":"2019-07-12 07:38:06.000000000","message":"I ... guess technically now we know for sure we only have one LB? But, this is a little dirty. If we\u0027re willing to continue the \"there could be multiple LBs\" sham here by having a \"get_loadbalancers()\" function that we use everywhere, we should probably at least stick with that and compile the list in the loop and return after.\n\nAlso, is this supposed to return UDP listeners as well, or just TCP listeners? Maybe it should be \"get_haproxy_listeners\"?","commit_id":"0a375af40691b5034272cb87c5562974f9893a15"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"c1b0d5015bc2145fa9cb1be6700fdf32445b3609","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    \"\"\""},{"line_number":175,"context_line":"    for lb_id in get_loadbalancers():"},{"line_number":176,"context_line":"        listeners_on_lb \u003d parse_haproxy_file(lb_id)[1]"},{"line_number":177,"context_line":"        return list(listeners_on_lb.keys())"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"def get_loadbalancers():"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_eb9c61c1","line":177,"in_reply_to":"7faddb67_b06a58ea","updated":"2019-07-12 09:10:25.000000000","message":"Done","commit_id":"0a375af40691b5034272cb87c5562974f9893a15"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"d27748770cf058a55085da8f27bc084cd9d3bbb6","unresolved":false,"context_lines":[{"line_number":312,"context_line":"                }"},{"line_number":313,"context_line":"                # Now see if this is a TLS frontend"},{"line_number":314,"context_line":"                tls_matcher \u003d re.search("},{"line_number":315,"context_line":"                    r\u0027^\\s+bind\\s+\\S+\\s+ssl crt\\s+(.*)$\u0027, section,"},{"line_number":316,"context_line":"                    re.MULTILINE)"},{"line_number":317,"context_line":"                if tls_matcher:"},{"line_number":318,"context_line":"                    # TODO(rm_work): Can\u0027t we have terminated tcp?"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_9075dccd","line":315,"updated":"2019-07-12 07:38:06.000000000","message":"Note to self: meant to compile these somewhere static for optimization when I was finished tweaking them.","commit_id":"0a375af40691b5034272cb87c5562974f9893a15"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"c1b0d5015bc2145fa9cb1be6700fdf32445b3609","unresolved":false,"context_lines":[{"line_number":312,"context_line":"                }"},{"line_number":313,"context_line":"                # Now see if this is a TLS frontend"},{"line_number":314,"context_line":"                tls_matcher \u003d re.search("},{"line_number":315,"context_line":"                    r\u0027^\\s+bind\\s+\\S+\\s+ssl crt\\s+(.*)$\u0027, section,"},{"line_number":316,"context_line":"                    re.MULTILINE)"},{"line_number":317,"context_line":"                if tls_matcher:"},{"line_number":318,"context_line":"                    # TODO(rm_work): Can\u0027t we have terminated tcp?"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_cbf5e5ee","line":315,"in_reply_to":"7faddb67_9075dccd","updated":"2019-07-12 09:10:25.000000000","message":"Done","commit_id":"0a375af40691b5034272cb87c5562974f9893a15"}],"octavia/amphorae/drivers/driver_base.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a8d920d5866d5a6112dfa5de2c6d68a1c9077116","unresolved":false,"context_lines":[{"line_number":22,"context_line":"class AmphoraLoadBalancerDriver(object):"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    @abc.abstractmethod"},{"line_number":25,"context_line":"    def update_amphora_listeners(self, loadbalancer, amphora,"},{"line_number":26,"context_line":"                                 timeout_dict):"},{"line_number":27,"context_line":"        \"\"\"Update the amphora with a new configuration."},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"7faddb67_290e7332","line":25,"updated":"2019-07-23 05:06:35.000000000","message":"This maybe could have used an update. Not sure exactly... It\u0027s not really the same function anymore, but maybe the name is still fine.","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b8116391abfd426907711186b3f9f882f66027ae","unresolved":false,"context_lines":[{"line_number":22,"context_line":"class AmphoraLoadBalancerDriver(object):"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    @abc.abstractmethod"},{"line_number":25,"context_line":"    def update_amphora_listeners(self, loadbalancer, amphora,"},{"line_number":26,"context_line":"                                 timeout_dict):"},{"line_number":27,"context_line":"        \"\"\"Update the amphora with a new configuration."},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"7faddb67_84689eba","line":25,"in_reply_to":"7faddb67_290e7332","updated":"2019-07-23 20:58:53.000000000","message":"I think the spirit of the name is still valid, so not changing this.","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a8d920d5866d5a6112dfa5de2c6d68a1c9077116","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @abc.abstractmethod"},{"line_number":45,"context_line":"    def update(self, loadbalancer):"},{"line_number":46,"context_line":"        \"\"\"Update the amphora with a new configuration."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        :param loadbalancer: loadbalancer object, need to use its"}],"source_content_type":"text/x-python","patch_set":32,"id":"7faddb67_892687ba","line":45,"updated":"2019-07-23 05:06:35.000000000","message":"I wonder why we don\u0027t use a timeout dict here? It\u0027s doing the same thing as the above method, but with all amps instead of just one...","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b8116391abfd426907711186b3f9f882f66027ae","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @abc.abstractmethod"},{"line_number":45,"context_line":"    def update(self, loadbalancer):"},{"line_number":46,"context_line":"        \"\"\"Update the amphora with a new configuration."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        :param loadbalancer: loadbalancer object, need to use its"}],"source_content_type":"text/x-python","patch_set":32,"id":"7faddb67_049a6ec4","line":45,"in_reply_to":"7faddb67_892687ba","updated":"2019-07-23 20:58:53.000000000","message":"Don\u0027t know. I think the timeout_dict is only used for some cases in the flows.\nI\u0027m not going to change that here, as it\u0027s an un-related issue.","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"}],"octavia/amphorae/drivers/haproxy/rest_api_driver.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"0a5161515349408493cf23d12c1a1061b61280fd","unresolved":false,"context_lines":[{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        has_tcp \u003d False"},{"line_number":109,"context_line":"        for listener in listeners:"},{"line_number":110,"context_line":"            LOG.error(\u0027list: %s\u0027, listener)"},{"line_number":111,"context_line":"            LOG.error(\u0027amp: %s\u0027, amp.id)"},{"line_number":112,"context_line":"            LOG.debug(\"%s updating listener %s on amphora %s\","},{"line_number":113,"context_line":"                      self.__class__.__name__, listener.id, amp.id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_7e48f05a","line":110,"updated":"2019-06-27 23:19:22.000000000","message":"This can get deleted","commit_id":"1102d81067119f919fbd87e7b9d02153f2b8447d"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"06469b1fc0c8fce2ce92806c0323593dfbdbdfb2","unresolved":false,"context_lines":[{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        has_tcp \u003d False"},{"line_number":109,"context_line":"        for listener in listeners:"},{"line_number":110,"context_line":"            LOG.error(\u0027list: %s\u0027, listener)"},{"line_number":111,"context_line":"            LOG.error(\u0027amp: %s\u0027, amp.id)"},{"line_number":112,"context_line":"            LOG.debug(\"%s updating listener %s on amphora %s\","},{"line_number":113,"context_line":"                      self.__class__.__name__, listener.id, amp.id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_4bd3e301","line":110,"in_reply_to":"9fb8cfa7_7e48f05a","updated":"2019-06-28 16:22:59.000000000","message":"Done","commit_id":"1102d81067119f919fbd87e7b9d02153f2b8447d"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"0a5161515349408493cf23d12c1a1061b61280fd","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        has_tcp \u003d False"},{"line_number":109,"context_line":"        for listener in listeners:"},{"line_number":110,"context_line":"            LOG.error(\u0027list: %s\u0027, listener)"},{"line_number":111,"context_line":"            LOG.error(\u0027amp: %s\u0027, amp.id)"},{"line_number":112,"context_line":"            LOG.debug(\"%s updating listener %s on amphora %s\","},{"line_number":113,"context_line":"                      self.__class__.__name__, listener.id, amp.id)"},{"line_number":114,"context_line":"            if listener.protocol \u003d\u003d \u0027UDP\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_9e43643f","line":111,"updated":"2019-06-27 23:19:22.000000000","message":"This can get deleted","commit_id":"1102d81067119f919fbd87e7b9d02153f2b8447d"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"06469b1fc0c8fce2ce92806c0323593dfbdbdfb2","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        has_tcp \u003d False"},{"line_number":109,"context_line":"        for listener in listeners:"},{"line_number":110,"context_line":"            LOG.error(\u0027list: %s\u0027, listener)"},{"line_number":111,"context_line":"            LOG.error(\u0027amp: %s\u0027, amp.id)"},{"line_number":112,"context_line":"            LOG.debug(\"%s updating listener %s on amphora %s\","},{"line_number":113,"context_line":"                      self.__class__.__name__, listener.id, amp.id)"},{"line_number":114,"context_line":"            if listener.protocol \u003d\u003d \u0027UDP\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_eb073781","line":111,"in_reply_to":"9fb8cfa7_9e43643f","updated":"2019-06-28 16:22:59.000000000","message":"Done","commit_id":"1102d81067119f919fbd87e7b9d02153f2b8447d"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"eb54330c0cbd50babb4ff68290e12e9019534992","unresolved":false,"context_lines":[{"line_number":556,"context_line":"        LOG.warning(\u0027Upgrading load balancer %s to single process mode.\u0027,"},{"line_number":557,"context_line":"                    amp.load_balancer.id)"},{"line_number":558,"context_line":"        for listener in listeners:"},{"line_number":559,"context_line":"            self.delete_listener(amp, listener[\u0027id\u0027])"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"    def upload_config(self, amp, listener_id, config, timeout_dict\u003dNone):"},{"line_number":562,"context_line":"        r \u003d self.put("}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_1584c95d","line":559,"range":{"start_line":559,"start_character":48,"end_line":559,"end_character":50},"updated":"2019-07-08 15:27:27.000000000","message":"it should be \u0027uuid\u0027 here","commit_id":"eb41bbe340d1347b2ec13489c98cefc8e417d70b"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b1237e8ae29fb87681d114d34bea36a41ad12483","unresolved":false,"context_lines":[{"line_number":556,"context_line":"        LOG.warning(\u0027Upgrading load balancer %s to single process mode.\u0027,"},{"line_number":557,"context_line":"                    amp.load_balancer.id)"},{"line_number":558,"context_line":"        for listener in listeners:"},{"line_number":559,"context_line":"            self.delete_listener(amp, listener[\u0027id\u0027])"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"    def upload_config(self, amp, listener_id, config, timeout_dict\u003dNone):"},{"line_number":562,"context_line":"        r \u003d self.put("}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_d1ab9e1a","line":559,"range":{"start_line":559,"start_character":48,"end_line":559,"end_character":50},"in_reply_to":"7faddb67_1584c95d","updated":"2019-07-08 23:24:24.000000000","message":"Correct","commit_id":"eb41bbe340d1347b2ec13489c98cefc8e417d70b"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"fc6876f25218fb99120722de9f0323582dd39b49","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        the api_version string attribute on the amphora object."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        :returns: None"},{"line_number":96,"context_line":"        \"\"\""},{"line_number":97,"context_line":"        api_version \u003d \u00270.5\u0027"},{"line_number":98,"context_line":"        try:"},{"line_number":99,"context_line":"            api_version \u003d self.client.get_api_version(amphora)[\u0027api_version\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_e6992579","line":96,"updated":"2019-07-10 03:45:40.000000000","message":"I think this function could be cacheing? So check if it\u0027s already populated and not do the call again if it is? That might prevent a lot of unnecessary calls out to the amp. \nAre we persisting this to the DB? It doesn\u0027t look like it, but maybe we should?","commit_id":"5da549fa4519d9059f412dd14119509cd3a666f9"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"51b7f0e4715cdbabc69fa62d1de0503db44cd641","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        the api_version string attribute on the amphora object."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        :returns: None"},{"line_number":96,"context_line":"        \"\"\""},{"line_number":97,"context_line":"        api_version \u003d \u00270.5\u0027"},{"line_number":98,"context_line":"        try:"},{"line_number":99,"context_line":"            api_version \u003d self.client.get_api_version(amphora)[\u0027api_version\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_0689e1c8","line":96,"in_reply_to":"7faddb67_6638d53c","updated":"2019-07-10 04:08:20.000000000","message":"I just meant, literally on this \"amp\" object, just in case they aren\u0027t all unique calls per run (which I don\u0027t think they are? *quite*? but maybe)\n\nif not amphora.api_version:\n   # do stuff to fill it\n\nBut if it\u0027s persisted to the DB, then this would be filled already in most cases.","commit_id":"5da549fa4519d9059f412dd14119509cd3a666f9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2b858a330e0d4b3cb91f6da7ce415e2b5195d2ba","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        the api_version string attribute on the amphora object."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        :returns: None"},{"line_number":96,"context_line":"        \"\"\""},{"line_number":97,"context_line":"        api_version \u003d \u00270.5\u0027"},{"line_number":98,"context_line":"        try:"},{"line_number":99,"context_line":"            api_version \u003d self.client.get_api_version(amphora)[\u0027api_version\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_6638d53c","line":96,"in_reply_to":"7faddb67_e6992579","updated":"2019-07-10 03:56:08.000000000","message":"I didn\u0027t do it caching as I\u0027m pretty sure all of the calls into this are unique. I thought about trying to do something in the init, but wasn\u0027t sure given that some of these functions iterate of amphora.\nI guess there is no issue if it\u0027s cached by amphora ID as typically the amphora ID will change when the agent is updated. Unless someone has implemented an alternative agent update procedure, which is possible.","commit_id":"5da549fa4519d9059f412dd14119509cd3a666f9"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"fc6876f25218fb99120722de9f0323582dd39b49","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        for amp in loadbalancer.amphorae:"},{"line_number":281,"context_line":"            if amp.status !\u003d consts.DELETED:"},{"line_number":282,"context_line":"                self._populate_amphora_api_version(amp)"},{"line_number":283,"context_line":"                api_version \u003d list(map(int, amp.api_version.split(\u0027.\u0027)))"},{"line_number":284,"context_line":"                # Check which config style to use"},{"line_number":285,"context_line":"                if api_version[0] \u003d\u003d 0 and api_version[1] \u003c\u003d 5:"},{"line_number":286,"context_line":"                    # 0.5 or earlier"}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_067ec118","line":283,"updated":"2019-07-10 03:45:40.000000000","message":"Seems like we very often do this immediately after the populate -- could we just have it *return* this value?","commit_id":"5da549fa4519d9059f412dd14119509cd3a666f9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2b858a330e0d4b3cb91f6da7ce415e2b5195d2ba","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        for amp in loadbalancer.amphorae:"},{"line_number":281,"context_line":"            if amp.status !\u003d consts.DELETED:"},{"line_number":282,"context_line":"                self._populate_amphora_api_version(amp)"},{"line_number":283,"context_line":"                api_version \u003d list(map(int, amp.api_version.split(\u0027.\u0027)))"},{"line_number":284,"context_line":"                # Check which config style to use"},{"line_number":285,"context_line":"                if api_version[0] \u003d\u003d 0 and api_version[1] \u003c\u003d 5:"},{"line_number":286,"context_line":"                    # 0.5 or earlier"}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_460ef98d","line":283,"in_reply_to":"7faddb67_067ec118","updated":"2019-07-10 03:56:08.000000000","message":"Yeah, maybe? I left the string as that is what the rest driver uses for all of the agent API calls.  The main reason I\u0027m \"populating\" or \"injecting\" this version is so that all of the REST requests calls use the correct API version in the URL path.","commit_id":"5da549fa4519d9059f412dd14119509cd3a666f9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"1ae93a9f8bba7e8914b81019126658d58f239fa8","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        :returns: None"},{"line_number":96,"context_line":"        \"\"\""},{"line_number":97,"context_line":"        if not amphora.api_version:"},{"line_number":98,"context_line":"            try:"},{"line_number":99,"context_line":"                amphora.api_version \u003d self.client.get_api_version("},{"line_number":100,"context_line":"                    amphora)[\u0027api_version\u0027]"}],"source_content_type":"text/x-python","patch_set":19,"id":"7faddb67_4c64cf22","line":97,"updated":"2019-07-10 16:56:26.000000000","message":"This fails if that attribute doesn\u0027t exist.\nAttributeError: \u0027Amphora\u0027 object has no attribute \u0027api_version\u0027","commit_id":"2cdecf5fa91215c99f939d95db90d963912a420b"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"d27748770cf058a55085da8f27bc084cd9d3bbb6","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        :returns: None"},{"line_number":96,"context_line":"        \"\"\""},{"line_number":97,"context_line":"        if not amphora.api_version:"},{"line_number":98,"context_line":"            try:"},{"line_number":99,"context_line":"                amphora.api_version \u003d self.client.get_api_version("},{"line_number":100,"context_line":"                    amphora)[\u0027api_version\u0027]"}],"source_content_type":"text/x-python","patch_set":19,"id":"7faddb67_d086f413","line":97,"in_reply_to":"7faddb67_4c64cf22","updated":"2019-07-12 07:38:06.000000000","message":"Wait, are we setting an attribute that wasn\u0027t added to the model!? I didn\u0027t check, I just assumed you actually added it to the model. We should absolutely do that.","commit_id":"2cdecf5fa91215c99f939d95db90d963912a420b"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"d27748770cf058a55085da8f27bc084cd9d3bbb6","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        :returns: None"},{"line_number":96,"context_line":"        \"\"\""},{"line_number":97,"context_line":"        if not getattr(amphora, \u0027api_version\u0027, None):"},{"line_number":98,"context_line":"            try:"},{"line_number":99,"context_line":"                amphora.api_version \u003d self.client.get_api_version("},{"line_number":100,"context_line":"                    amphora)[\u0027api_version\u0027]"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_f090d045","line":97,"updated":"2019-07-12 07:38:06.000000000","message":"I guess this works, but why don\u0027t we just fix the model to actually include it? :/\nIs this is a db.models.Amphora object, or a common.data_models.Amphora object? I guess I assumed the latter, which we can modify.","commit_id":"0a375af40691b5034272cb87c5562974f9893a15"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"c1b0d5015bc2145fa9cb1be6700fdf32445b3609","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        :returns: None"},{"line_number":96,"context_line":"        \"\"\""},{"line_number":97,"context_line":"        if not getattr(amphora, \u0027api_version\u0027, None):"},{"line_number":98,"context_line":"            try:"},{"line_number":99,"context_line":"                amphora.api_version \u003d self.client.get_api_version("},{"line_number":100,"context_line":"                    amphora)[\u0027api_version\u0027]"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_eb77819f","line":97,"in_reply_to":"7faddb67_f090d045","updated":"2019-07-12 09:10:25.000000000","message":"Ah, it\u0027s the db object. I\u0027m not sure how I feel about this -- it seems really dirty to add fields to a SQLAlchemy model object that aren\u0027t persistent.","commit_id":"0a375af40691b5034272cb87c5562974f9893a15"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"d55fb0d9f0a3d4d1086755605355f3bdf870a1fe","unresolved":false,"context_lines":[{"line_number":613,"context_line":"        self.ssl_adapter.uuid \u003d amp.id"},{"line_number":614,"context_line":"        exception \u003d None"},{"line_number":615,"context_line":"        # Keep retrying"},{"line_number":616,"context_line":"        for _ in six.moves.xrange(conn_max_retries):"},{"line_number":617,"context_line":"            try:"},{"line_number":618,"context_line":"                with warnings.catch_warnings():"},{"line_number":619,"context_line":"                    warnings.filterwarnings("}],"source_content_type":"text/x-python","patch_set":24,"id":"7faddb67_4da81f8c","line":616,"updated":"2019-07-12 21:34:51.000000000","message":"It is a bad practice to use _ for throwaway variables. It can cause issues with the i18n module.\nhttps://github.com/openstack/octavia/blob/master/octavia/i18n.py#L20\nPyLint likes \"dummy\" as an alternative.","commit_id":"74d0421421353c148ecba30ca2b64aae54567685"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a1d06f275af10b9fafb7b89148bcfa8e244a9557","unresolved":false,"context_lines":[{"line_number":613,"context_line":"        self.ssl_adapter.uuid \u003d amp.id"},{"line_number":614,"context_line":"        exception \u003d None"},{"line_number":615,"context_line":"        # Keep retrying"},{"line_number":616,"context_line":"        for _ in six.moves.xrange(conn_max_retries):"},{"line_number":617,"context_line":"            try:"},{"line_number":618,"context_line":"                with warnings.catch_warnings():"},{"line_number":619,"context_line":"                    warnings.filterwarnings("}],"source_content_type":"text/x-python","patch_set":24,"id":"7faddb67_ad051348","line":616,"in_reply_to":"7faddb67_4da81f8c","updated":"2019-07-12 21:53:23.000000000","message":"Interesting! Last I read it was the recommended thing (and it makes PyCharm happy) but this makes sense.","commit_id":"74d0421421353c148ecba30ca2b64aae54567685"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a8d920d5866d5a6112dfa5de2c6d68a1c9077116","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                                 timeout_dict\u003dNone):"},{"line_number":112,"context_line":"        \"\"\"Update the amphora with a new configuration."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        :param listeners: List of listeners to update."},{"line_number":115,"context_line":"        :type listener: list"},{"line_number":116,"context_line":"        :param amphora_index: The index of the amphora to update"},{"line_number":117,"context_line":"        :type amphora_index: integer"}],"source_content_type":"text/x-python","patch_set":32,"id":"7faddb67_093a97cc","line":114,"updated":"2019-07-23 05:06:35.000000000","message":"These params are all wrong now :/\nWish we had a linter rule to look for docstrings that are not in sync with their function\u0027s real signature.","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b8116391abfd426907711186b3f9f882f66027ae","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                                 timeout_dict\u003dNone):"},{"line_number":112,"context_line":"        \"\"\"Update the amphora with a new configuration."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        :param listeners: List of listeners to update."},{"line_number":115,"context_line":"        :type listener: list"},{"line_number":116,"context_line":"        :param amphora_index: The index of the amphora to update"},{"line_number":117,"context_line":"        :type amphora_index: integer"}],"source_content_type":"text/x-python","patch_set":32,"id":"7faddb67_84265e16","line":114,"in_reply_to":"7faddb67_093a97cc","updated":"2019-07-23 20:58:53.000000000","message":"Done","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a8d920d5866d5a6112dfa5de2c6d68a1c9077116","unresolved":false,"context_lines":[{"line_number":264,"context_line":"                        getattr(self.clients[amp.api_version], func_name)("},{"line_number":265,"context_line":"                            amp, loadbalancer.id, *args)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    def stop(self, loadbalancer, amphora\u003dNone):"},{"line_number":268,"context_line":"        self._apply(\u0027stop_listener\u0027, loadbalancer, amphora)"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    def start(self, loadbalancer, amphora\u003dNone):"}],"source_content_type":"text/x-python","patch_set":32,"id":"7faddb67_695a2b2b","line":267,"updated":"2019-07-23 05:06:35.000000000","message":"I believe we removed \"stop\" from the interface. Can this possibly be used anymore? I don\u0027t think so? Probably should remove it (and the \"stop\" stub in the 1.0 client below -- and maybe from 0.5 too if we don\u0027t call it?).","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b8116391abfd426907711186b3f9f882f66027ae","unresolved":false,"context_lines":[{"line_number":264,"context_line":"                        getattr(self.clients[amp.api_version], func_name)("},{"line_number":265,"context_line":"                            amp, loadbalancer.id, *args)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    def stop(self, loadbalancer, amphora\u003dNone):"},{"line_number":268,"context_line":"        self._apply(\u0027stop_listener\u0027, loadbalancer, amphora)"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    def start(self, loadbalancer, amphora\u003dNone):"}],"source_content_type":"text/x-python","patch_set":32,"id":"7faddb67_04626e17","line":267,"in_reply_to":"7faddb67_695a2b2b","updated":"2019-07-23 20:58:53.000000000","message":"Done","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"}],"octavia/amphorae/drivers/noop_driver/driver.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"f218d59a0a608df388f5b6127961c11d6d7a762a","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        LOG.debug(\"Amphora %s no-op, start listeners, lb %s, amp %s\","},{"line_number":62,"context_line":"                  self.__class__.__name__, loadbalancer.id, amphora)"},{"line_number":63,"context_line":"        self.amphoraconfig["},{"line_number":64,"context_line":"            (loadbalancer.id, amphora.id)] \u003d (loadbalancer, amphora.id,"},{"line_number":65,"context_line":"                                              \u0027start\u0027)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def delete(self, listener):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_8e13edb8","line":64,"range":{"start_line":64,"start_character":60,"end_line":64,"end_character":70},"updated":"2019-07-04 17:37:58.000000000","message":"Why did this need to change to only the id? I get it on the key part, but I thought it\u0027d be the object on the right side","commit_id":"eb41bbe340d1347b2ec13489c98cefc8e417d70b"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b1237e8ae29fb87681d114d34bea36a41ad12483","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        LOG.debug(\"Amphora %s no-op, start listeners, lb %s, amp %s\","},{"line_number":62,"context_line":"                  self.__class__.__name__, loadbalancer.id, amphora)"},{"line_number":63,"context_line":"        self.amphoraconfig["},{"line_number":64,"context_line":"            (loadbalancer.id, amphora.id)] \u003d (loadbalancer, amphora.id,"},{"line_number":65,"context_line":"                                              \u0027start\u0027)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def delete(self, listener):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_31ff9235","line":64,"range":{"start_line":64,"start_character":60,"end_line":64,"end_character":70},"in_reply_to":"7faddb67_8e13edb8","updated":"2019-07-08 23:24:24.000000000","message":"I guess technically it doesn\u0027t have to be the ID, we could store the amphora object.","commit_id":"eb41bbe340d1347b2ec13489c98cefc8e417d70b"}],"octavia/common/jinja/haproxy/combined_listeners/jinja_cfg.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"d27748770cf058a55085da8f27bc084cd9d3bbb6","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                                          listeners[0].load_balancer.id)"},{"line_number":173,"context_line":"        return self._get_template().render("},{"line_number":174,"context_line":"            {\u0027loadbalancer\u0027: loadbalancer,"},{"line_number":175,"context_line":"             \u0027amphorae\u0027: listeners[0].load_balancer.amphorae,"},{"line_number":176,"context_line":"             \u0027stats_sock\u0027: socket_path,"},{"line_number":177,"context_line":"             \u0027log_http\u0027: self.log_http,"},{"line_number":178,"context_line":"             \u0027log_server\u0027: self.log_server,"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_b0ced82a","line":175,"updated":"2019-07-12 07:38:06.000000000","message":"literally have the loadbalancer object already, don\u0027t have to go from listeners[0] or pass this in, can just use loadbalancer.amphorae to get this...","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"c1b0d5015bc2145fa9cb1be6700fdf32445b3609","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                                          listeners[0].load_balancer.id)"},{"line_number":173,"context_line":"        return self._get_template().render("},{"line_number":174,"context_line":"            {\u0027loadbalancer\u0027: loadbalancer,"},{"line_number":175,"context_line":"             \u0027amphorae\u0027: listeners[0].load_balancer.amphorae,"},{"line_number":176,"context_line":"             \u0027stats_sock\u0027: socket_path,"},{"line_number":177,"context_line":"             \u0027log_http\u0027: self.log_http,"},{"line_number":178,"context_line":"             \u0027log_server\u0027: self.log_server,"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_ab6d09cd","line":175,"in_reply_to":"7faddb67_b0ced82a","updated":"2019-07-12 09:10:25.000000000","message":"Done","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"d55fb0d9f0a3d4d1086755605355f3bdf870a1fe","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                                          listeners[0].load_balancer.id)"},{"line_number":173,"context_line":"        return self._get_template().render("},{"line_number":174,"context_line":"            {\u0027loadbalancer\u0027: loadbalancer,"},{"line_number":175,"context_line":"             \u0027amphorae\u0027: listeners[0].load_balancer.amphorae,"},{"line_number":176,"context_line":"             \u0027stats_sock\u0027: socket_path,"},{"line_number":177,"context_line":"             \u0027log_http\u0027: self.log_http,"},{"line_number":178,"context_line":"             \u0027log_server\u0027: self.log_server,"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_02a3d7b3","line":175,"in_reply_to":"7faddb67_b0ced82a","updated":"2019-07-12 21:34:51.000000000","message":"loadbalancer in the line above is not a data model object, it\u0027s the result of the transform call.","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"}],"octavia/common/jinja/haproxy/combined_listeners/templates/haproxy.cfg.j2":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"d27748770cf058a55085da8f27bc084cd9d3bbb6","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"{% block peers %}"},{"line_number":28,"context_line":"{{ peers_macro(constants, loadbalancer, amphorae) }}"},{"line_number":29,"context_line":"{% endblock peers %}"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"{% block proxies %}"}],"source_content_type":"text/x-jinja2","patch_set":20,"id":"7faddb67_50df64d5","line":28,"updated":"2019-07-12 07:38:06.000000000","message":"don\u0027t need to add amphorae here","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"c1b0d5015bc2145fa9cb1be6700fdf32445b3609","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"{% block peers %}"},{"line_number":28,"context_line":"{{ peers_macro(constants, loadbalancer, amphorae) }}"},{"line_number":29,"context_line":"{% endblock peers %}"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"{% block proxies %}"}],"source_content_type":"text/x-jinja2","patch_set":20,"id":"7faddb67_6b6b91b6","line":28,"in_reply_to":"7faddb67_50df64d5","updated":"2019-07-12 09:10:25.000000000","message":"Done","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"}],"octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"d27748770cf058a55085da8f27bc084cd9d3bbb6","unresolved":false,"context_lines":[{"line_number":16,"context_line":"{% macro peers_macro(constants, loadbalancer, amphorae) %}"},{"line_number":17,"context_line":"    {% if loadbalancer.topology \u003d\u003d constants.TOPOLOGY_ACTIVE_STANDBY %}"},{"line_number":18,"context_line":"peers {{ \"%s_peers\"|format(loadbalancer.id.replace(\"-\", \"\"))|trim() }}"},{"line_number":19,"context_line":"        {% for amp in amphorae if ("},{"line_number":20,"context_line":"            amp.status \u003d\u003d constants.AMPHORA_ALLOCATED) %}"},{"line_number":21,"context_line":"            {# HAProxy has peer name limitations, thus the hash filter #}"},{"line_number":22,"context_line":"    peer {{ amp.id|hash_amp_id|replace(\u0027\u003d\u0027, \u0027\u0027) }} {{"}],"source_content_type":"text/x-jinja2","patch_set":20,"id":"7faddb67_b0e7b8ac","line":19,"updated":"2019-07-12 07:38:06.000000000","message":"just use loadbalancer.amphorae","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"c1b0d5015bc2145fa9cb1be6700fdf32445b3609","unresolved":false,"context_lines":[{"line_number":16,"context_line":"{% macro peers_macro(constants, loadbalancer, amphorae) %}"},{"line_number":17,"context_line":"    {% if loadbalancer.topology \u003d\u003d constants.TOPOLOGY_ACTIVE_STANDBY %}"},{"line_number":18,"context_line":"peers {{ \"%s_peers\"|format(loadbalancer.id.replace(\"-\", \"\"))|trim() }}"},{"line_number":19,"context_line":"        {% for amp in amphorae if ("},{"line_number":20,"context_line":"            amp.status \u003d\u003d constants.AMPHORA_ALLOCATED) %}"},{"line_number":21,"context_line":"            {# HAProxy has peer name limitations, thus the hash filter #}"},{"line_number":22,"context_line":"    peer {{ amp.id|hash_amp_id|replace(\u0027\u003d\u0027, \u0027\u0027) }} {{"}],"source_content_type":"text/x-jinja2","patch_set":20,"id":"7faddb67_8b684db9","line":19,"in_reply_to":"7faddb67_b0e7b8ac","updated":"2019-07-12 09:10:25.000000000","message":"Done","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"bc91202a367fa1df90788ef359e0e536f4a7485f","unresolved":false,"context_lines":[{"line_number":16,"context_line":"{% macro peers_macro(constants, loadbalancer) %}"},{"line_number":17,"context_line":"    {% if loadbalancer.topology \u003d\u003d constants.TOPOLOGY_ACTIVE_STANDBY %}"},{"line_number":18,"context_line":"peers {{ \"%s_peers\"|format(loadbalancer.id.replace(\"-\", \"\"))|trim() }}"},{"line_number":19,"context_line":"        {% for amp in loadbalancer.amphorae if ("},{"line_number":20,"context_line":"            amp.status \u003d\u003d constants.AMPHORA_ALLOCATED) %}"},{"line_number":21,"context_line":"            {# HAProxy has peer name limitations, thus the hash filter #}"},{"line_number":22,"context_line":"    peer {{ amp.id|hash_amp_id|replace(\u0027\u003d\u0027, \u0027\u0027) }} {{"}],"source_content_type":"text/x-jinja2","patch_set":22,"id":"7faddb67_22a293fe","line":19,"updated":"2019-07-12 16:02:25.000000000","message":"Funny, I thought I tried that and it didn\u0027t work. I will re-run the test for this.","commit_id":"382aa98c0a07c95b0fa40c40cc8af32f91488a98"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"bcfae399a50e5c06330688cecc679d1fe7685494","unresolved":false,"context_lines":[{"line_number":16,"context_line":"{% macro peers_macro(constants, loadbalancer) %}"},{"line_number":17,"context_line":"    {% if loadbalancer.topology \u003d\u003d constants.TOPOLOGY_ACTIVE_STANDBY %}"},{"line_number":18,"context_line":"peers {{ \"%s_peers\"|format(loadbalancer.id.replace(\"-\", \"\"))|trim() }}"},{"line_number":19,"context_line":"        {% for amp in loadbalancer.amphorae if ("},{"line_number":20,"context_line":"            amp.status \u003d\u003d constants.AMPHORA_ALLOCATED) %}"},{"line_number":21,"context_line":"            {# HAProxy has peer name limitations, thus the hash filter #}"},{"line_number":22,"context_line":"    peer {{ amp.id|hash_amp_id|replace(\u0027\u003d\u0027, \u0027\u0027) }} {{"}],"source_content_type":"text/x-jinja2","patch_set":22,"id":"7faddb67_42522fe0","line":19,"in_reply_to":"7faddb67_22a293fe","updated":"2019-07-12 16:12:05.000000000","message":"Yeah, this doesn\u0027t work. It\u0027s empty.","commit_id":"382aa98c0a07c95b0fa40c40cc8af32f91488a98"}],"octavia/common/jinja/haproxy/jinja_cfg.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"b704f7c12805a0aedf86b30ccb538bc20075361e","unresolved":false,"context_lines":[{"line_number":205,"context_line":"            \u0027host_amphora\u0027: self._transform_amphora("},{"line_number":206,"context_line":"                host_amphora, feature_compatibility)"},{"line_number":207,"context_line":"        }"},{"line_number":208,"context_line":"        # TODO(johnsom) Fix this for single process"},{"line_number":209,"context_line":"        # NOTE(sbalukoff): Global connection limit should be a sum of all"},{"line_number":210,"context_line":"        # listeners\u0027 connection limits. Since Octavia presently supports"},{"line_number":211,"context_line":"        # just one listener per haproxy process, this makes determining"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_fe0ce0ec","line":208,"updated":"2019-06-28 06:32:18.000000000","message":"Done.","commit_id":"1102d81067119f919fbd87e7b9d02153f2b8447d"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"b028bf91088a7576ad610fe05cc944a10dce81b2","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            # TODO(rm_work): Technically this is a bit early -- we could do"},{"line_number":225,"context_line":"            # this *after* we split into multiple pools for PROXY mode and it"},{"line_number":226,"context_line":"            # would be slightly more accurate, but that\u0027s hopefully rare and"},{"line_number":227,"context_line":"            # I don\u0027t know if it\u0027s worth the effort for a first draft"},{"line_number":228,"context_line":"            for listener in pool_listeners:"},{"line_number":229,"context_line":"                # Use either the MAX or the running total, whatever is lower"},{"line_number":230,"context_line":"                transformed_pool[\u0027connection_limit\u0027] \u003d min("}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_572dcffb","line":227,"updated":"2019-06-28 06:36:53.000000000","message":"Not ideal, but works for now.","commit_id":"7f7eacd3879976f5dc79a9cfab18be3bec0d941e"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"b028bf91088a7576ad610fe05cc944a10dce81b2","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                    val1 \u003d strutils.bool_from_string("},{"line_number":241,"context_line":"                        transformed_pool[\u0027insert_headers\u0027].get(key, \"false\"))"},{"line_number":242,"context_line":"                    val2 \u003d strutils.bool_from_string(val2)"},{"line_number":243,"context_line":"                    # TODO(rm_work): If any listener wants it, insert it"},{"line_number":244,"context_line":"                    transformed_pool[\u0027insert_headers\u0027][key] \u003d val1 or val2"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"            # Account for member timeouts"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_77301357","line":243,"updated":"2019-06-28 06:36:53.000000000","message":"This assumption is maybe a bit wonky","commit_id":"7f7eacd3879976f5dc79a9cfab18be3bec0d941e"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"b028bf91088a7576ad610fe05cc944a10dce81b2","unresolved":false,"context_lines":[{"line_number":244,"context_line":"                    transformed_pool[\u0027insert_headers\u0027][key] \u003d val1 or val2"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"            # Account for member timeouts"},{"line_number":247,"context_line":"            # TODO(rm_work): Use the longest specified timeout? right?"},{"line_number":248,"context_line":"            for listener in pool_listeners:"},{"line_number":249,"context_line":"                transformed_pool[\u0027timeout_member_connect\u0027] \u003d max("},{"line_number":250,"context_line":"                    transformed_pool.get(\u0027timeout_member_connect\u0027, 0),"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_9746e7bf","line":247,"updated":"2019-06-28 06:36:53.000000000","message":"This assumption is maybe a bit wonky also, but not sure a way around it","commit_id":"7f7eacd3879976f5dc79a9cfab18be3bec0d941e"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"b028bf91088a7576ad610fe05cc944a10dce81b2","unresolved":false,"context_lines":[{"line_number":256,"context_line":"            # Account for PROXY protocol"},{"line_number":257,"context_line":"            # TODO(rm_work): So, this has the possibility to split one pool"},{"line_number":258,"context_line":"            # into multiple (theoretically just two now, but it\u0027s generic) to"},{"line_number":259,"context_line":"            # handle incompatible protocol settings on listeners that use them"},{"line_number":260,"context_line":"            if pool.protocol.lower() \u003d\u003d constants.PROTOCOL_PROXY.lower():"},{"line_number":261,"context_line":"                # TODO(rm_work): So, this assumes a single LB won\u0027t have both"},{"line_number":262,"context_line":"                # HTTPS and TCP type listeners sharing a pool, because *why*?"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_d729bfe5","line":259,"updated":"2019-06-28 06:36:53.000000000","message":"Doing it this way is hilariously gross","commit_id":"7f7eacd3879976f5dc79a9cfab18be3bec0d941e"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"b028bf91088a7576ad610fe05cc944a10dce81b2","unresolved":false,"context_lines":[{"line_number":261,"context_line":"                # TODO(rm_work): So, this assumes a single LB won\u0027t have both"},{"line_number":262,"context_line":"                # HTTPS and TCP type listeners sharing a pool, because *why*?"},{"line_number":263,"context_line":"                # Even if someone does that, the only effect will be the insert"},{"line_number":264,"context_line":"                # headers possibly not working correctly for one of them."},{"line_number":265,"context_line":"                listener_protocols \u003d {"},{"line_number":266,"context_line":"                    l[\u0027protocol_mode\u0027]: l[\u0027protocol\u0027] for l in pool_listeners}"},{"line_number":267,"context_line":"                if len(listener_protocols) \u003e 1:  # both tcp and http are used"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_971fc7b5","line":264,"updated":"2019-06-28 06:36:53.000000000","message":"This assumption is maybe a bit wonky also, but the alternative is ????","commit_id":"7f7eacd3879976f5dc79a9cfab18be3bec0d941e"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"e0259ca7330dbda110de3c5c72928e9888cd8c64","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        \"\"\""},{"line_number":192,"context_line":"        listener_transforms \u003d []"},{"line_number":193,"context_line":"        for listener in listeners:"},{"line_number":194,"context_line":"            listener_transforms.append(self._transform_listener("},{"line_number":195,"context_line":"                listener, tls_cert, feature_compatibility, loadbalancer,"},{"line_number":196,"context_line":"                client_ca_filename\u003dclient_ca_filename, client_crl\u003dclient_crl,"},{"line_number":197,"context_line":"                pool_tls_certs\u003dpool_tls_certs))"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_23f980c7","line":194,"range":{"start_line":194,"start_character":39,"end_line":194,"end_character":63},"updated":"2019-07-09 08:12:10.000000000","message":"\u0027listeners\u0027 might contain listeners for any protocols (including UDP). UDP listeners should be skipped/excluded here.","commit_id":"dd234b19a4aa90a63787d6ada5e188b0b499c0f0"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"18a279dd2a84a230c3d9835a5d98729900e1b6d4","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        \"\"\""},{"line_number":192,"context_line":"        listener_transforms \u003d []"},{"line_number":193,"context_line":"        for listener in listeners:"},{"line_number":194,"context_line":"            listener_transforms.append(self._transform_listener("},{"line_number":195,"context_line":"                listener, tls_cert, feature_compatibility, loadbalancer,"},{"line_number":196,"context_line":"                client_ca_filename\u003dclient_ca_filename, client_crl\u003dclient_crl,"},{"line_number":197,"context_line":"                pool_tls_certs\u003dpool_tls_certs))"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_3ce0bbfa","line":194,"range":{"start_line":194,"start_character":39,"end_line":194,"end_character":63},"in_reply_to":"7faddb67_23f980c7","updated":"2019-07-09 16:09:51.000000000","message":"Done","commit_id":"dd234b19a4aa90a63787d6ada5e188b0b499c0f0"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"e0259ca7330dbda110de3c5c72928e9888cd8c64","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        # NOTE(sbalukoff): Global connection limit should be a sum of all"},{"line_number":210,"context_line":"        # listeners\u0027 connection limits."},{"line_number":211,"context_line":"        connection_limit_sum \u003d 0"},{"line_number":212,"context_line":"        for listener in listeners:"},{"line_number":213,"context_line":"            if listener.connection_limit and listener.connection_limit \u003e -1:"},{"line_number":214,"context_line":"                connection_limit_sum +\u003d listener.connection_limit"},{"line_number":215,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_e30288b4","line":212,"range":{"start_line":212,"start_character":8,"end_line":212,"end_character":33},"updated":"2019-07-09 08:12:10.000000000","message":"same here","commit_id":"dd234b19a4aa90a63787d6ada5e188b0b499c0f0"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"18a279dd2a84a230c3d9835a5d98729900e1b6d4","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        # NOTE(sbalukoff): Global connection limit should be a sum of all"},{"line_number":210,"context_line":"        # listeners\u0027 connection limits."},{"line_number":211,"context_line":"        connection_limit_sum \u003d 0"},{"line_number":212,"context_line":"        for listener in listeners:"},{"line_number":213,"context_line":"            if listener.connection_limit and listener.connection_limit \u003e -1:"},{"line_number":214,"context_line":"                connection_limit_sum +\u003d listener.connection_limit"},{"line_number":215,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_dce64717","line":212,"range":{"start_line":212,"start_character":8,"end_line":212,"end_character":33},"in_reply_to":"7faddb67_e30288b4","updated":"2019-07-09 16:09:51.000000000","message":"Done","commit_id":"dd234b19a4aa90a63787d6ada5e188b0b499c0f0"}],"octavia/common/jinja/haproxy/templates/base.j2":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"b704f7c12805a0aedf86b30ccb538bc20075361e","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    maxconn {{ loadbalancer.global_connection_limit }}"},{"line_number":25,"context_line":"    {% endif %}"},{"line_number":26,"context_line":"    {% set found_ns \u003d namespace(found\u003dfalse) %}"},{"line_number":27,"context_line":"    {# TODO (johnsom) fix this #}"},{"line_number":28,"context_line":"    {% for pool in loadbalancer.listeners[0].pools if pool.enabled %}"},{"line_number":29,"context_line":"        {% if pool.health_monitor and pool.health_monitor.enabled and"},{"line_number":30,"context_line":"              pool.health_monitor.type \u003d\u003d constants.HEALTH_MONITOR_PING and"}],"source_content_type":"text/x-jinja2","patch_set":1,"id":"9fb8cfa7_de1ebc0a","line":27,"updated":"2019-06-28 06:32:18.000000000","message":"Done","commit_id":"1102d81067119f919fbd87e7b9d02153f2b8447d"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"e898f2d32b4b3cf1daa2dab2d6b822549c1ff1f9","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    maxconn {{ loadbalancer.global_connection_limit }}"},{"line_number":25,"context_line":"    {% endif %}"},{"line_number":26,"context_line":"    {% set found_ns \u003d namespace(found\u003dfalse) %}"},{"line_number":27,"context_line":"    {% for pool in loadbalancer.pools if pool.enabled %}"},{"line_number":28,"context_line":"        {% if pool.health_monitor and pool.health_monitor.enabled and"},{"line_number":29,"context_line":"              pool.health_monitor.type \u003d\u003d constants.HEALTH_MONITOR_PING and"},{"line_number":30,"context_line":"              found_ns.found \u003d\u003d false %}"}],"source_content_type":"text/x-jinja2","patch_set":9,"id":"9fb8cfa7_3c9c970c","line":27,"updated":"2019-07-02 00:27:29.000000000","message":"Probably should move this up to the jinja.py to make it easier, probably can be a simple repository query. We don\u0027t just set it as haproxy 1.5 doesn\u0027t have this.","commit_id":"f59bc3e4ddd329f8544611d6becc344066747e74"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"305774db14ff3d9fa4e8b7a8c36bb8a68706a730","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    maxconn {{ loadbalancer.global_connection_limit }}"},{"line_number":25,"context_line":"    {% endif %}"},{"line_number":26,"context_line":"    {% set found_ns \u003d namespace(found\u003dfalse) %}"},{"line_number":27,"context_line":"    {% for pool in loadbalancer.pools if pool.enabled %}"},{"line_number":28,"context_line":"        {% if pool.health_monitor and pool.health_monitor.enabled and"},{"line_number":29,"context_line":"              pool.health_monitor.type \u003d\u003d constants.HEALTH_MONITOR_PING and"},{"line_number":30,"context_line":"              found_ns.found \u003d\u003d false %}"}],"source_content_type":"text/x-jinja2","patch_set":9,"id":"9fb8cfa7_9b7d80b3","line":27,"in_reply_to":"9fb8cfa7_3c9c970c","updated":"2019-07-02 14:10:03.000000000","message":"eh, pretty low on my priority list, as this is working fine right now","commit_id":"f59bc3e4ddd329f8544611d6becc344066747e74"}],"octavia/common/jinja/haproxy/templates/haproxy.cfg.j2":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"e898f2d32b4b3cf1daa2dab2d6b822549c1ff1f9","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"{% block proxies %}"},{"line_number":33,"context_line":"    {% if loadbalancer.enabled %}"},{"line_number":34,"context_line":"         {% for listener in loadbalancer.listeners if listener.enabled %}"},{"line_number":35,"context_line":"             {{- frontend_macro(constants, listener, loadbalancer.vip_address) }}"},{"line_number":36,"context_line":"         {% endfor %}"},{"line_number":37,"context_line":"         {% for pool in loadbalancer.pools if pool.enabled %}"}],"source_content_type":"text/x-jinja2","patch_set":9,"id":"9fb8cfa7_1c8513ad","line":34,"updated":"2019-07-02 00:27:29.000000000","message":"Put this back to the old way","commit_id":"f59bc3e4ddd329f8544611d6becc344066747e74"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"305774db14ff3d9fa4e8b7a8c36bb8a68706a730","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"{% block proxies %}"},{"line_number":33,"context_line":"    {% if loadbalancer.enabled %}"},{"line_number":34,"context_line":"         {% for listener in loadbalancer.listeners if listener.enabled %}"},{"line_number":35,"context_line":"             {{- frontend_macro(constants, listener, loadbalancer.vip_address) }}"},{"line_number":36,"context_line":"         {% endfor %}"},{"line_number":37,"context_line":"         {% for pool in loadbalancer.pools if pool.enabled %}"}],"source_content_type":"text/x-jinja2","patch_set":9,"id":"9fb8cfa7_bb516432","line":34,"in_reply_to":"9fb8cfa7_1c8513ad","updated":"2019-07-02 14:10:03.000000000","message":"yep will get to it","commit_id":"f59bc3e4ddd329f8544611d6becc344066747e74"}],"octavia/common/jinja/haproxy/templates/macros.j2":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"e3693c97553ebd2f09ef24e8bff9d0e1cd82d984","unresolved":false,"context_lines":[{"line_number":153,"context_line":"                                               l7policy.l7rules|length \u003e 0) %}"},{"line_number":154,"context_line":"        {{- l7policy_macro(constants, l7policy) -}}"},{"line_number":155,"context_line":"    {% endfor %}"},{"line_number":156,"context_line":"    {% if listener.default_pool and listener.default_pool.enabled %}"},{"line_number":157,"context_line":"    default_backend {{ listener.default_pool.id }}"},{"line_number":158,"context_line":"    {% endif %}"},{"line_number":159,"context_line":"    timeout client {{ listener.timeout_client_data }}"}],"source_content_type":"text/x-jinja2","patch_set":3,"id":"9fb8cfa7_a9e38204","line":156,"updated":"2019-06-29 01:30:34.000000000","message":"There is no such thing as \"default_pool\" on a listener anymore. Only \"default_pool_id\". And, it\u0027s only there if it\u0027s enabled. So the check I had is correct.","commit_id":"70558b8050e306f75c54274f933915e2e16a0397"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"e3693c97553ebd2f09ef24e8bff9d0e1cd82d984","unresolved":false,"context_lines":[{"line_number":244,"context_line":"backend {{ pool.id }}"},{"line_number":245,"context_line":"    mode {{ pool.protocol_mode }}"},{"line_number":246,"context_line":"    {% if pool.get(constants.HTTP_REUSE, False) and ("},{"line_number":247,"context_line":"          pool.protocol_mode.lower() \u003d\u003d constants.PROTOCOL_HTTP.lower()) %}"},{"line_number":248,"context_line":"    http-reuse safe"},{"line_number":249,"context_line":"    {% endif %}"},{"line_number":250,"context_line":"    balance {{ pool.lb_algorithm }}"}],"source_content_type":"text/x-jinja2","patch_set":3,"id":"9fb8cfa7_49ee86ed","line":247,"updated":"2019-06-29 01:30:34.000000000","message":"This makes sense maybe? But it is a divergence from the original code, which used the listener protocol (*not* the protocol_mode, which was also available). Is this a bug currently, or is it a bug introduced here?","commit_id":"70558b8050e306f75c54274f933915e2e16a0397"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"e3693c97553ebd2f09ef24e8bff9d0e1cd82d984","unresolved":false,"context_lines":[{"line_number":251,"context_line":"    {% if pool.session_persistence %}"},{"line_number":252,"context_line":"        {% if (pool.session_persistence.type \u003d\u003d"},{"line_number":253,"context_line":"               constants.SESSION_PERSISTENCE_SOURCE_IP) %}"},{"line_number":254,"context_line":"            {% if loadbalancer.topology \u003d\u003d constants.TOPOLOGY_ACTIVE_STANDBY %}"},{"line_number":255,"context_line":"    stick-table type ip size {{ pool.stick_size }} peers {{"},{"line_number":256,"context_line":"    \"%s_peers\"|format(pool.lb_id.replace(\"-\", \"\"))|trim() }}"},{"line_number":257,"context_line":"            {% else %}"}],"source_content_type":"text/x-jinja2","patch_set":3,"id":"9fb8cfa7_a9cce288","line":254,"updated":"2019-06-29 01:30:34.000000000","message":"Yeah this makes sense. :D But you need to remove it from where I added it to the pool.","commit_id":"70558b8050e306f75c54274f933915e2e16a0397"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"6d6d45ea3a2dc1b9659e16f3b0e1742aeabf1634","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    {% elif l7policy.action \u003d\u003d constants.L7POLICY_ACTION_REDIRECT_TO_URL %}"},{"line_number":128,"context_line":"    redirect {{- redirect_http_code_opt }} location {{ l7policy.redirect_url }} if{{ l7rule_list_macro("},{"line_number":129,"context_line":"        l7policy) }}"},{"line_number":130,"context_line":"    {% elif l7policy.action \u003d\u003d constants.L7POLICY_ACTION_REDIRECT_TO_POOL and l7policy.redirect_pool.id %}"},{"line_number":131,"context_line":"    use_backend {{ l7policy.redirect_pool_id }} if{{ l7rule_list_macro("},{"line_number":132,"context_line":"        l7policy) }}"},{"line_number":133,"context_line":"    {% elif l7policy.action \u003d\u003d constants.L7POLICY_ACTION_REDIRECT_PREFIX %}"}],"source_content_type":"text/x-jinja2","patch_set":11,"id":"9fb8cfa7_6d855fcf","line":130,"updated":"2019-07-03 13:34:11.000000000","message":"You keep flipping these back without actually changing the part where it actually *is* just an ID. :D\nAlso, you missed the one below. T_T\nAlso, originally this checked \"enabled\" not \"id\".","commit_id":"cbaffd26ca2c6a5adb3ef73b8c3b3d89cedf58ff"}],"octavia/controller/healthmanager/health_drivers/update_db.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"e898f2d32b4b3cf1daa2dab2d6b822549c1ff1f9","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        listeners \u003d health[\u0027listeners\u0027]"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        NEWSTYLE_CONFIG \u003d (len(listeners) \u003d\u003d 1 and"},{"line_number":186,"context_line":"                           list(listeners.keys())[0] \u003d\u003d db_lb[\u0027id\u0027])"},{"line_number":187,"context_line":"        LISTENER_COUNT_MATCHES \u003d (len(listeners) \u003d\u003d expected_listener_count or"},{"line_number":188,"context_line":"                                  ignore_listener_count)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_fcb27f93","line":185,"updated":"2019-07-02 00:27:29.000000000","message":"I don\u0027t think this is necessary as the listener ID should still be accurate in the haproxy.conf \"frontend\" configuration. We are only squishing this for the file paths and rest driver, etc. We still control the haproxy.conf content that provides the labels.","commit_id":"f59bc3e4ddd329f8544611d6becc344066747e74"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"305774db14ff3d9fa4e8b7a8c36bb8a68706a730","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        listeners \u003d health[\u0027listeners\u0027]"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        NEWSTYLE_CONFIG \u003d (len(listeners) \u003d\u003d 1 and"},{"line_number":186,"context_line":"                           list(listeners.keys())[0] \u003d\u003d db_lb[\u0027id\u0027])"},{"line_number":187,"context_line":"        LISTENER_COUNT_MATCHES \u003d (len(listeners) \u003d\u003d expected_listener_count or"},{"line_number":188,"context_line":"                                  ignore_listener_count)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_7b676c26","line":185,"in_reply_to":"9fb8cfa7_fcb27f93","updated":"2019-07-02 14:10:03.000000000","message":"Yes, but that\u0027s not what comes back from the UDP Sender. It packages it up like this: http://paste.openstack.org/show/753761/\nIn that example, the \"57ce7c8e\" is actually the LB_ID. So, without changing the amphora side code, we really can\u0027t know the listener IDs. :(\nAnd in fact, it\u0027s going to only ever give us the one, even though there will be multiple listeners in the file, because of how it\u0027s getting the data.","commit_id":"f59bc3e4ddd329f8544611d6becc344066747e74"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"6d6d45ea3a2dc1b9659e16f3b0e1742aeabf1634","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        # Do not update amphora health if the reporting listener count"},{"line_number":186,"context_line":"        # does not match the expected listener count"},{"line_number":187,"context_line":"        if len(listeners) \u003d\u003d expected_listener_count or ignore_listener_count:"},{"line_number":188,"context_line":"            lock_session \u003d db_api.get_session(autocommit\u003dFalse)"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"            # if we\u0027re running too far behind, warn and bail"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fb8cfa7_6d6f9ffc","line":187,"updated":"2019-07-03 13:34:11.000000000","message":"Uhh, so, pretty sure this is always going to break with more than one configured listener, because the thing that the health reports is based on the haproxy instance, which is now 1-per-amp. The ID of the \"listener\" is actually the lb_id. I tested this...","commit_id":"cbaffd26ca2c6a5adb3ef73b8c3b3d89cedf58ff"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"a9f61b7d3ce613c221f2815355e7e7a2ffbbff25","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                for key, listener in db_lb.get(\u0027listeners\u0027, {}).items():"},{"line_number":169,"context_line":"                    # disabled listeners don\u0027t report from the amphora"},{"line_number":170,"context_line":"                    if (listener[\u0027enabled\u0027] and"},{"line_number":171,"context_line":"                            listener[\u0027protocol\u0027] !\u003d constants.PROTOCOL_UDP):"},{"line_number":172,"context_line":"                        expected_listener_count +\u003d 1"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"                # If this is a heartbeat older than versioning, handle"}],"source_content_type":"text/x-python","patch_set":19,"id":"7faddb67_6893b0fb","line":171,"updated":"2019-07-10 22:01:54.000000000","message":"Why are you excluding UDP here? UDP should be in this health message for version 1 and newer agents. This would be a change from the previous functionality.","commit_id":"2cdecf5fa91215c99f939d95db90d963912a420b"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"bc91202a367fa1df90788ef359e0e536f4a7485f","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                for key, listener in db_lb.get(\u0027listeners\u0027, {}).items():"},{"line_number":169,"context_line":"                    # disabled listeners don\u0027t report from the amphora"},{"line_number":170,"context_line":"                    if (listener[\u0027enabled\u0027] and"},{"line_number":171,"context_line":"                            listener[\u0027protocol\u0027] !\u003d constants.PROTOCOL_UDP):"},{"line_number":172,"context_line":"                        expected_listener_count +\u003d 1"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"                # If this is a heartbeat older than versioning, handle"}],"source_content_type":"text/x-python","patch_set":19,"id":"7faddb67_47056113","line":171,"in_reply_to":"7faddb67_50a764a8","updated":"2019-07-12 16:02:25.000000000","message":"This should account for *ALL* listeners.\nThe part that is probably tricking you is there are now three heartbeat message versions, the first two handle UDP differently. There are different tests for the different formats. In a previous patch you changed the message version for some tests from \"none/0\" to \"1\", which changed the way UDP was handled and caused the tests to fail.  I reverted those changes.","commit_id":"2cdecf5fa91215c99f939d95db90d963912a420b"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"d27748770cf058a55085da8f27bc084cd9d3bbb6","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                for key, listener in db_lb.get(\u0027listeners\u0027, {}).items():"},{"line_number":169,"context_line":"                    # disabled listeners don\u0027t report from the amphora"},{"line_number":170,"context_line":"                    if (listener[\u0027enabled\u0027] and"},{"line_number":171,"context_line":"                            listener[\u0027protocol\u0027] !\u003d constants.PROTOCOL_UDP):"},{"line_number":172,"context_line":"                        expected_listener_count +\u003d 1"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"                # If this is a heartbeat older than versioning, handle"}],"source_content_type":"text/x-python","patch_set":19,"id":"7faddb67_50a764a8","line":171,"in_reply_to":"7faddb67_6893b0fb","updated":"2019-07-12 07:38:06.000000000","message":"The \"expected listener count\" is for things in the haproxy stats message, isn\u0027t it? Or is this *all* of them joined together I guess?\nI assumed the former because all of our existing tests started failing because of a listener count mismatch, because they were not expecting UDP listeners to be included in this count. I guess this could be a case of really badly coded tests, but I\u0027m not sure how they were passing before.","commit_id":"2cdecf5fa91215c99f939d95db90d963912a420b"}],"octavia/controller/worker/v1/controller_worker.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"b704f7c12805a0aedf86b30ccb538bc20075361e","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                        \u002760 seconds.\u0027, \u0027listener\u0027, listener_id)"},{"line_number":235,"context_line":"            raise db_exceptions.NoResultFound"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        # TODO(johnsom) Fix this to not be dumb"},{"line_number":238,"context_line":"        listeners \u003d self._listener_repo.get_all("},{"line_number":239,"context_line":"            db_apis.get_session(),"},{"line_number":240,"context_line":"            load_balancer_id\u003dlistener.load_balancer_id)[0]"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_decc7c8a","line":237,"updated":"2019-06-28 06:32:18.000000000","message":"Done?","commit_id":"1102d81067119f919fbd87e7b9d02153f2b8447d"}],"octavia/controller/worker/v1/tasks/amphora_driver_tasks.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"e898f2d32b4b3cf1daa2dab2d6b822549c1ff1f9","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def execute(self, loadbalancer, listener):"},{"line_number":149,"context_line":"        \"\"\"Execute listener delete routines for an amphora.\"\"\""},{"line_number":150,"context_line":"        # TODO(rm_work): This may be irrelevant in new flows? Everything is"},{"line_number":151,"context_line":"        # just an update now."},{"line_number":152,"context_line":"        self.amphora_driver.delete(listener, loadbalancer.vip)"},{"line_number":153,"context_line":"        LOG.debug(\"Deleted the listener on the vip\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_9c67c325","line":150,"updated":"2019-07-02 00:27:29.000000000","message":"What about the certificate content?","commit_id":"f59bc3e4ddd329f8544611d6becc344066747e74"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"305774db14ff3d9fa4e8b7a8c36bb8a68706a730","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def execute(self, loadbalancer, listener):"},{"line_number":149,"context_line":"        \"\"\"Execute listener delete routines for an amphora.\"\"\""},{"line_number":150,"context_line":"        # TODO(rm_work): This may be irrelevant in new flows? Everything is"},{"line_number":151,"context_line":"        # just an update now."},{"line_number":152,"context_line":"        self.amphora_driver.delete(listener, loadbalancer.vip)"},{"line_number":153,"context_line":"        LOG.debug(\"Deleted the listener on the vip\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_db60d803","line":150,"in_reply_to":"9fb8cfa7_9c67c325","updated":"2019-07-02 14:10:03.000000000","message":"Yeah I put this back actually","commit_id":"f59bc3e4ddd329f8544611d6becc344066747e74"}],"octavia/tests/functional/amphorae/backend/agent/api_server/test_server.py":[{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"acfbd103d2313955792dfe8f6cbce18d2c301243","unresolved":false,"context_lines":[{"line_number":709,"context_line":"        self._test_get_all_listeners(consts.CENTOS)"},{"line_number":710,"context_line":""},{"line_number":711,"context_line":"    @mock.patch(\u0027octavia.amphorae.backends.agent.api_server.util.\u0027"},{"line_number":712,"context_line":"                \u0027get_listeners\u0027)"},{"line_number":713,"context_line":"    @mock.patch(\u0027octavia.amphorae.backends.agent.api_server.listener.Listener.\u0027"},{"line_number":714,"context_line":"                \u0027_check_haproxy_status\u0027)"},{"line_number":715,"context_line":"    @mock.patch(\u0027octavia.amphorae.backends.agent.api_server.listener.Listener.\u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_15648cb8","line":712,"range":{"start_line":712,"start_character":17,"end_line":712,"end_character":30},"updated":"2019-07-11 13:03:56.000000000","message":"get_listeners no longer exists","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"782624c1811f2c0672bc29342a4390b92c3a507a","unresolved":false,"context_lines":[{"line_number":709,"context_line":"        self._test_get_all_listeners(consts.CENTOS)"},{"line_number":710,"context_line":""},{"line_number":711,"context_line":"    @mock.patch(\u0027octavia.amphorae.backends.agent.api_server.util.\u0027"},{"line_number":712,"context_line":"                \u0027get_listeners\u0027)"},{"line_number":713,"context_line":"    @mock.patch(\u0027octavia.amphorae.backends.agent.api_server.listener.Listener.\u0027"},{"line_number":714,"context_line":"                \u0027_check_haproxy_status\u0027)"},{"line_number":715,"context_line":"    @mock.patch(\u0027octavia.amphorae.backends.agent.api_server.listener.Listener.\u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_dcbff55e","line":712,"range":{"start_line":712,"start_character":17,"end_line":712,"end_character":30},"in_reply_to":"7faddb67_15648cb8","updated":"2019-07-11 23:57:23.000000000","message":"Done","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"}],"octavia/tests/unit/amphorae/backends/agent/api_server/test_listener.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"1ae93a9f8bba7e8914b81019126658d58f239fa8","unresolved":false,"context_lines":[{"line_number":311,"context_line":"        mock_check_output.side_effect \u003d subprocess.CalledProcessError("},{"line_number":312,"context_line":"            output\u003db\u0027Job is already running\u0027, returncode\u003d-2, cmd\u003d\u0027sit\u0027)"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"        result \u003d self.test_listener.start_stop_lbb("},{"line_number":315,"context_line":"            listener_id, consts.AMP_ACTION_START)"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        mock_check_output.assert_called_once_with(ref_command_split,"}],"source_content_type":"text/x-python","patch_set":19,"id":"7faddb67_2cbcf367","line":314,"updated":"2019-07-10 16:56:26.000000000","message":"lb","commit_id":"2cdecf5fa91215c99f939d95db90d963912a420b"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"d27748770cf058a55085da8f27bc084cd9d3bbb6","unresolved":false,"context_lines":[{"line_number":311,"context_line":"        mock_check_output.side_effect \u003d subprocess.CalledProcessError("},{"line_number":312,"context_line":"            output\u003db\u0027Job is already running\u0027, returncode\u003d-2, cmd\u003d\u0027sit\u0027)"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"        result \u003d self.test_listener.start_stop_lbb("},{"line_number":315,"context_line":"            listener_id, consts.AMP_ACTION_START)"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        mock_check_output.assert_called_once_with(ref_command_split,"}],"source_content_type":"text/x-python","patch_set":19,"id":"7faddb67_309c2869","line":314,"in_reply_to":"7faddb67_2cbcf367","updated":"2019-07-12 07:38:06.000000000","message":"freaking macbbook keybboard makes me want to stab someone sometimes.","commit_id":"2cdecf5fa91215c99f939d95db90d963912a420b"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"acfbd103d2313955792dfe8f6cbce18d2c301243","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.useFixture(test_utils.OpenFixture(path, rendered_obj))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        res \u003d self.test_listener._parse_haproxy_file(LISTENER_ID1)"},{"line_number":60,"context_line":"        self.assertEqual(\u0027TERMINATED_HTTPS\u0027, res[\u0027mode\u0027])"},{"line_number":61,"context_line":"        self.assertEqual(\u0027/var/lib/octavia/sample_loadbalancer_id_1.sock\u0027,"},{"line_number":62,"context_line":"                         res[\u0027stats_socket\u0027])"},{"line_number":63,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_3503c8ba","line":60,"range":{"start_line":60,"start_character":45,"end_line":60,"end_character":48},"updated":"2019-07-11 13:03:56.000000000","message":"_parse_haproxy now returns a tuple (stats_socket, listeners) so it should be stats_socket, res \u003d self.test_listener._parse_haproxy_file...","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"782624c1811f2c0672bc29342a4390b92c3a507a","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.useFixture(test_utils.OpenFixture(path, rendered_obj))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        res \u003d self.test_listener._parse_haproxy_file(LISTENER_ID1)"},{"line_number":60,"context_line":"        self.assertEqual(\u0027TERMINATED_HTTPS\u0027, res[\u0027mode\u0027])"},{"line_number":61,"context_line":"        self.assertEqual(\u0027/var/lib/octavia/sample_loadbalancer_id_1.sock\u0027,"},{"line_number":62,"context_line":"                         res[\u0027stats_socket\u0027])"},{"line_number":63,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_1cfb4d47","line":60,"range":{"start_line":60,"start_character":45,"end_line":60,"end_character":48},"in_reply_to":"7faddb67_3503c8ba","updated":"2019-07-11 23:57:23.000000000","message":"Done","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"acfbd103d2313955792dfe8f6cbce18d2c301243","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        self.useFixture(test_utils.OpenFixture(path, rendered_obj))"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        res \u003d self.test_listener._parse_haproxy_file(LISTENER_ID1)"},{"line_number":82,"context_line":"        self.assertEqual(\u0027TERMINATED_HTTPS\u0027, res[\u0027mode\u0027])"},{"line_number":83,"context_line":"        self.assertEqual(BASE_AMP_PATH + \u0027/sample_loadbalancer_id_1.sock\u0027,"},{"line_number":84,"context_line":"                         res[\u0027stats_socket\u0027])"},{"line_number":85,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_55fe84ae","line":82,"range":{"start_line":82,"start_character":45,"end_line":82,"end_character":48},"updated":"2019-07-11 13:03:56.000000000","message":"same here","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"782624c1811f2c0672bc29342a4390b92c3a507a","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        self.useFixture(test_utils.OpenFixture(path, rendered_obj))"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        res \u003d self.test_listener._parse_haproxy_file(LISTENER_ID1)"},{"line_number":82,"context_line":"        self.assertEqual(\u0027TERMINATED_HTTPS\u0027, res[\u0027mode\u0027])"},{"line_number":83,"context_line":"        self.assertEqual(BASE_AMP_PATH + \u0027/sample_loadbalancer_id_1.sock\u0027,"},{"line_number":84,"context_line":"                         res[\u0027stats_socket\u0027])"},{"line_number":85,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_3cf88947","line":82,"range":{"start_line":82,"start_character":45,"end_line":82,"end_character":48},"in_reply_to":"7faddb67_55fe84ae","updated":"2019-07-11 23:57:23.000000000","message":"Done","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"acfbd103d2313955792dfe8f6cbce18d2c301243","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.useFixture(test_utils.OpenFixture(path, rendered_obj))"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        res \u003d self.test_listener._parse_haproxy_file(LISTENER_ID1)"},{"line_number":97,"context_line":"        self.assertEqual(\u0027HTTP\u0027, res[\u0027mode\u0027])"},{"line_number":98,"context_line":"        self.assertEqual(BASE_AMP_PATH + \u0027/sample_loadbalancer_id_1.sock\u0027,"},{"line_number":99,"context_line":"                         res[\u0027stats_socket\u0027])"},{"line_number":100,"context_line":"        self.assertIsNone(res[\u0027ssl_crt\u0027])"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_15324ca8","line":97,"range":{"start_line":97,"start_character":33,"end_line":97,"end_character":36},"updated":"2019-07-11 13:03:56.000000000","message":"same","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"782624c1811f2c0672bc29342a4390b92c3a507a","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.useFixture(test_utils.OpenFixture(path, rendered_obj))"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        res \u003d self.test_listener._parse_haproxy_file(LISTENER_ID1)"},{"line_number":97,"context_line":"        self.assertEqual(\u0027HTTP\u0027, res[\u0027mode\u0027])"},{"line_number":98,"context_line":"        self.assertEqual(BASE_AMP_PATH + \u0027/sample_loadbalancer_id_1.sock\u0027,"},{"line_number":99,"context_line":"                         res[\u0027stats_socket\u0027])"},{"line_number":100,"context_line":"        self.assertIsNone(res[\u0027ssl_crt\u0027])"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_dc9615f1","line":97,"range":{"start_line":97,"start_character":33,"end_line":97,"end_character":36},"in_reply_to":"7faddb67_15324ca8","updated":"2019-07-11 23:57:23.000000000","message":"Done","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"acfbd103d2313955792dfe8f6cbce18d2c301243","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        self.useFixture(test_utils.OpenFixture(path, rendered_obj))"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        res \u003d self.test_listener._parse_haproxy_file(LISTENER_ID1)"},{"line_number":109,"context_line":"        self.assertEqual(\u0027TCP\u0027, res[\u0027mode\u0027])"},{"line_number":110,"context_line":"        self.assertEqual(BASE_AMP_PATH + \u0027/sample_loadbalancer_id_1.sock\u0027,"},{"line_number":111,"context_line":"                         res[\u0027stats_socket\u0027])"},{"line_number":112,"context_line":"        self.assertIsNone(res[\u0027ssl_crt\u0027])"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_95cb9c70","line":109,"range":{"start_line":109,"start_character":32,"end_line":109,"end_character":35},"updated":"2019-07-11 13:03:56.000000000","message":"same","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"782624c1811f2c0672bc29342a4390b92c3a507a","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        self.useFixture(test_utils.OpenFixture(path, rendered_obj))"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        res \u003d self.test_listener._parse_haproxy_file(LISTENER_ID1)"},{"line_number":109,"context_line":"        self.assertEqual(\u0027TCP\u0027, res[\u0027mode\u0027])"},{"line_number":110,"context_line":"        self.assertEqual(BASE_AMP_PATH + \u0027/sample_loadbalancer_id_1.sock\u0027,"},{"line_number":111,"context_line":"                         res[\u0027stats_socket\u0027])"},{"line_number":112,"context_line":"        self.assertIsNone(res[\u0027ssl_crt\u0027])"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_9c9c1d0f","line":109,"range":{"start_line":109,"start_character":32,"end_line":109,"end_character":35},"in_reply_to":"7faddb67_95cb9c70","updated":"2019-07-11 23:57:23.000000000","message":"Done","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"acfbd103d2313955792dfe8f6cbce18d2c301243","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    @mock.patch(\u0027os.path.exists\u0027)"},{"line_number":123,"context_line":"    @mock.patch(\u0027octavia.amphorae.backends.agent.api_server\u0027 +"},{"line_number":124,"context_line":"                \u0027.util.get_haproxy_pid\u0027)"},{"line_number":125,"context_line":"    def test_check_listener_status(self, mock_pid, mock_exists):"},{"line_number":126,"context_line":"        mock_pid.return_value \u003d \u00271245\u0027"},{"line_number":127,"context_line":"        mock_exists.side_effect \u003d [True, True]"},{"line_number":128,"context_line":"        config_path \u003d agent_util.config_path(LISTENER_ID1)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_558d2479","line":125,"range":{"start_line":125,"start_character":8,"end_line":125,"end_character":34},"updated":"2019-07-11 13:03:56.000000000","message":"_check_listener_status function no longer exists","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"}],"octavia/tests/unit/amphorae/backends/health_daemon/test_health_daemon.py":[{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"acfbd103d2313955792dfe8f6cbce18d2c301243","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        conf.config(group\u003d\"haproxy_amphora\", base_path\u003dBASE_PATH)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    @mock.patch(\u0027octavia.amphorae.backends.agent.\u0027"},{"line_number":135,"context_line":"                \u0027api_server.util.get_listeners\u0027)"},{"line_number":136,"context_line":"    def test_list_sock_stat_files(self, mock_get_listener):"},{"line_number":137,"context_line":"        mock_get_listener.return_value \u003d LISTENER_IDS"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_956f1c91","line":135,"range":{"start_line":135,"start_character":33,"end_line":135,"end_character":46},"updated":"2019-07-11 13:03:56.000000000","message":"get_listeners no longer exists","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"782624c1811f2c0672bc29342a4390b92c3a507a","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        conf.config(group\u003d\"haproxy_amphora\", base_path\u003dBASE_PATH)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    @mock.patch(\u0027octavia.amphorae.backends.agent.\u0027"},{"line_number":135,"context_line":"                \u0027api_server.util.get_listeners\u0027)"},{"line_number":136,"context_line":"    def test_list_sock_stat_files(self, mock_get_listener):"},{"line_number":137,"context_line":"        mock_get_listener.return_value \u003d LISTENER_IDS"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_3c8de9d2","line":135,"range":{"start_line":135,"start_character":33,"end_line":135,"end_character":46},"in_reply_to":"7faddb67_956f1c91","updated":"2019-07-11 23:57:23.000000000","message":"Done","commit_id":"f47ca9e9e22f0f9f2b130dcd10145ab99499d0b9"}],"octavia/tests/unit/certificates/manager/test_barbican.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"99e05ca19639b5144ef9cf96a8ce5ab4919c047e","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        self.assertIsInstance(data, cert.Cert)"},{"line_number":135,"context_line":"        self.assertEqual(sample.X509_CERT_KEY, data.get_private_key())"},{"line_number":136,"context_line":"        self.assertEqual(sample.X509_CERT, data.get_certificate())"},{"line_number":137,"context_line":"        self.assertEqual(sorted(sample.X509_IMDS_LIST),"},{"line_number":138,"context_line":"                         sorted(data.get_intermediates()))"},{"line_number":139,"context_line":"        self.assertIsNone(data.get_private_key_passphrase())"},{"line_number":140,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_a9c86254","line":137,"updated":"2019-06-29 01:57:48.000000000","message":"This is ... a unittest / unittest2 compat issue. I suppose we could fix it in another patch, but it came up while i was running my tests and i figured we may as well fix it.","commit_id":"c7b651589de9fb22ed5ab8125a17d8db2da0713c"}],"octavia/tests/unit/controller/healthmanager/health_drivers/test_update_db.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"abd7a202611de15a1805005ca99a5007b3c3bc23","unresolved":false,"context_lines":[{"line_number":1097,"context_line":"    def test_update_health_forbid_to_stale_udp_listener_amphora(self):"},{"line_number":1098,"context_line":"        health \u003d {"},{"line_number":1099,"context_line":"            \"id\": self.FAKE_UUID_1,"},{"line_number":1100,"context_line":"            \"ver\": 1,"},{"line_number":1101,"context_line":"            \"listeners\": {},"},{"line_number":1102,"context_line":"            \"recv_time\": time.time()"},{"line_number":1103,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":19,"id":"7faddb67_4303350e","line":1100,"updated":"2019-07-11 00:35:27.000000000","message":"You can\u0027t do this. These tests are written for pre-versioned heart beat messages.","commit_id":"2cdecf5fa91215c99f939d95db90d963912a420b"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"d27748770cf058a55085da8f27bc084cd9d3bbb6","unresolved":false,"context_lines":[{"line_number":1097,"context_line":"    def test_update_health_forbid_to_stale_udp_listener_amphora(self):"},{"line_number":1098,"context_line":"        health \u003d {"},{"line_number":1099,"context_line":"            \"id\": self.FAKE_UUID_1,"},{"line_number":1100,"context_line":"            \"ver\": 1,"},{"line_number":1101,"context_line":"            \"listeners\": {},"},{"line_number":1102,"context_line":"            \"recv_time\": time.time()"},{"line_number":1103,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":19,"id":"7faddb67_70cdc064","line":1100,"in_reply_to":"7faddb67_4303350e","updated":"2019-07-12 07:38:06.000000000","message":"Ahh, I thought version was always there, but it was added in Stein as part of UDP support! Ok. Bleh. I thought we were really forward thinking. :D","commit_id":"2cdecf5fa91215c99f939d95db90d963912a420b"}],"releasenotes/notes/haproxy-single-process-b17a3af3a97accea.yaml":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a8d920d5866d5a6112dfa5de2c6d68a1c9077116","unresolved":false,"context_lines":[{"line_number":7,"context_line":"fixes:"},{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    Fixed an issue with load balancers that have multiple listeners when using"},{"line_number":10,"context_line":"    an amphora image that contains HAProxy 1.8 or newer. A updated amphora"},{"line_number":11,"context_line":"    image is required to apply this fix."}],"source_content_type":"text/x-yaml","patch_set":32,"id":"7faddb67_496e4fca","line":10,"range":{"start_line":10,"start_character":57,"end_line":10,"end_character":58},"updated":"2019-07-23 05:06:35.000000000","message":"*An\n\n:D","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b8116391abfd426907711186b3f9f882f66027ae","unresolved":false,"context_lines":[{"line_number":7,"context_line":"fixes:"},{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    Fixed an issue with load balancers that have multiple listeners when using"},{"line_number":10,"context_line":"    an amphora image that contains HAProxy 1.8 or newer. A updated amphora"},{"line_number":11,"context_line":"    image is required to apply this fix."}],"source_content_type":"text/x-yaml","patch_set":32,"id":"7faddb67_a43cbabf","line":10,"range":{"start_line":10,"start_character":57,"end_line":10,"end_character":58},"in_reply_to":"7faddb67_496e4fca","updated":"2019-07-23 20:58:53.000000000","message":"Done","commit_id":"cf9b14f9b3b5bd35d1b70d5e2a9c74d1c0f7af0e"}]}
