)]}'
{"doc/source/contributor/guides/providers.rst":[{"author":{"_account_id":6469,"name":"Carlos Gonçalves","display_name":"Carlos Goncalves","email":"cgoncalves@redhat.com","username":"cgoncalves"},"change_message_id":"8ec3b748d0e6671eac35fcf9d2e02d59a1715da6","unresolved":false,"context_lines":[{"line_number":1932,"context_line":"-------------------"},{"line_number":1933,"context_line":""},{"line_number":1934,"context_line":"The driver support API will include exceptions:"},{"line_number":1935,"context_line":"two API groups:"},{"line_number":1936,"context_line":""},{"line_number":1937,"context_line":"* UpdateStatusError"},{"line_number":1938,"context_line":"* UpdateStatisticsError"}],"source_content_type":"text/x-rst","patch_set":33,"id":"5faad753_aa7bf5bb","line":1935,"range":{"start_line":1935,"start_character":0,"end_line":1935,"end_character":15},"updated":"2019-09-10 19:02:11.000000000","message":"nit: remove this line","commit_id":"09efc2a423c6ab033f9a648549aff87590be5990"}],"octavia/api/drivers/driver_agent/driver_listener.py":[{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"f46a8f1ca73c4c20e9fddafdd9df743b34be1a86","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2018 Rackspace, US Inc."},{"line_number":2,"context_line":"# Copyright 2019 Red Hat, Inc. All rights reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_e7abdf84","line":1,"updated":"2019-08-05 14:34:27.000000000","message":"We potentially could not use those listeners in OVN functional tests because importing fails on: http://paste.openstack.org/show/755513/\n\noslo_config.cfg.DuplicateOptError: duplicate option: host\n\nAnd this is true, because both\nhttps://github.com/openstack/octavia/blob/master/octavia/common/config.py#L44\nand\nhttps://github.com/openstack/neutron/blob/master/neutron/conf/common.py#L94\n\nhave the \u0027host\u0027 configuration parameter set. Is it any option to move those to octavia-lib without this dependency?","commit_id":"a07fe0b379f647d2294fdd6e7fc061915d7dd8dd"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"56bbc67588b4bc326758df31b44ae5e028248b3b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2018 Rackspace, US Inc."},{"line_number":2,"context_line":"# Copyright 2019 Red Hat, Inc. All rights reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_7829d0e3","line":1,"in_reply_to":"7faddb67_e7abdf84","updated":"2019-08-05 17:16:58.000000000","message":"You should not be importing neutron in a way that brings neutron\u0027s config environment into the Octavia process space.\nThis is not an Octavia bug.","commit_id":"a07fe0b379f647d2294fdd6e7fc061915d7dd8dd"}],"octavia/api/drivers/utils.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"86d95c4c3ebc6c193fa633a556fba94c686a2964","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                                                       listener_obj)"},{"line_number":251,"context_line":"        if \u0027tls_cert\u0027 in cert_dict and cert_dict[\u0027tls_cert\u0027]:"},{"line_number":252,"context_line":"            new_listener_dict[\u0027default_tls_container_data\u0027] \u003d ("},{"line_number":253,"context_line":"                cert_dict[\u0027tls_cert\u0027].to_dict())"},{"line_number":254,"context_line":"        if \u0027sni_certs\u0027 in cert_dict and cert_dict[\u0027sni_certs\u0027]:"},{"line_number":255,"context_line":"            sni_data_list \u003d []"},{"line_number":256,"context_line":"            for sni in cert_dict[\u0027sni_certs\u0027]:"}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_54339114","line":253,"updated":"2019-08-03 13:28:31.000000000","message":"These need to recurse to get all the intermediates.","commit_id":"6c490c703c6d14d3233ce788e033d7bbf5706a6a"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"86d95c4c3ebc6c193fa633a556fba94c686a2964","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        if \u0027sni_certs\u0027 in cert_dict and cert_dict[\u0027sni_certs\u0027]:"},{"line_number":255,"context_line":"            sni_data_list \u003d []"},{"line_number":256,"context_line":"            for sni in cert_dict[\u0027sni_certs\u0027]:"},{"line_number":257,"context_line":"                sni_data_list.append(sni.to_dict())"},{"line_number":258,"context_line":"            new_listener_dict[\u0027sni_container_data\u0027] \u003d sni_data_list"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        if listener_obj.client_ca_tls_certificate_id:"}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_7436cd05","line":257,"updated":"2019-08-03 13:28:31.000000000","message":"These need to recurse to get all the intermediates.","commit_id":"6c490c703c6d14d3233ce788e033d7bbf5706a6a"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"86d95c4c3ebc6c193fa633a556fba94c686a2964","unresolved":false,"context_lines":[{"line_number":344,"context_line":"                                                       pool_obj)"},{"line_number":345,"context_line":"        if \u0027tls_cert\u0027 in cert_dict and cert_dict[\u0027tls_cert\u0027]:"},{"line_number":346,"context_line":"            new_pool_dict[\u0027tls_container_data\u0027] \u003d ("},{"line_number":347,"context_line":"                cert_dict[\u0027tls_cert\u0027].to_dict())"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"        if pool_obj.ca_tls_certificate_id:"},{"line_number":350,"context_line":"            cert \u003d _get_secret_data(cert_manager, pool_obj.project_id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_143999f0","line":347,"updated":"2019-08-03 13:28:31.000000000","message":"These need to recurse to get all the intermediates.","commit_id":"6c490c703c6d14d3233ce788e033d7bbf5706a6a"}],"octavia/common/data_models.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"86d95c4c3ebc6c193fa633a556fba94c686a2964","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                            else:"},{"line_number":50,"context_line":"                                ret[attr] \u003d None"},{"line_number":51,"context_line":"                        else:"},{"line_number":52,"context_line":"                            ret[attr] \u003d item"},{"line_number":53,"context_line":"                elif isinstance(getattr(self, attr), BaseDataModel):"},{"line_number":54,"context_line":"                    if type(self) not in calling_classes:"},{"line_number":55,"context_line":"                        ret[attr] \u003d value.to_dict("}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_d40f8134","line":52,"updated":"2019-08-03 13:28:31.000000000","message":"Need to actually add up all the items, not just take the last one. :/","commit_id":"6c490c703c6d14d3233ce788e033d7bbf5706a6a"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"86d95c4c3ebc6c193fa633a556fba94c686a2964","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                else:"},{"line_number":63,"context_line":"                    ret[attr] \u003d value"},{"line_number":64,"context_line":"            else:"},{"line_number":65,"context_line":"                if isinstance(getattr(self, attr), (BaseDataModel, list)):"},{"line_number":66,"context_line":"                    ret[attr] \u003d None"},{"line_number":67,"context_line":"                else:"},{"line_number":68,"context_line":"                    ret[attr] \u003d value"}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_f40abd23","line":65,"updated":"2019-08-03 13:28:31.000000000","message":"We shouldn\u0027t break things that are expecting a list, even if it\u0027s an empty one.","commit_id":"6c490c703c6d14d3233ce788e033d7bbf5706a6a"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"40f1fb3022581eb24e360fac50f07b7788d03d85","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                                #  are data models, and we may as well quit?"},{"line_number":53,"context_line":"                                #  Or, were we supposed to append a `None` for"},{"line_number":54,"context_line":"                                #  each one? I assume the former?"},{"line_number":55,"context_line":"                                ret[attr] \u003d None"},{"line_number":56,"context_line":"                                break"},{"line_number":57,"context_line":"                        else:"},{"line_number":58,"context_line":"                            ret[attr].append(item)"}],"source_content_type":"text/x-python","patch_set":19,"id":"7faddb67_e2cbca1a","line":55,"updated":"2019-08-05 18:16:51.000000000","message":"Hmm, we maybe shouldn\u0027t actually change it to a None though... maybe just do NOTHING and continue if it\u0027s a basemodel...","commit_id":"de3b5685554a7c62da3754c1dc0231c150b52f90"}],"octavia/common/tls_utils/cert_parser.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"86d95c4c3ebc6c193fa633a556fba94c686a2964","unresolved":false,"context_lines":[{"line_number":106,"context_line":"              X509 pem block surrounded by BEGIN CERTIFICATE,"},{"line_number":107,"context_line":"              END CERTIFICATE block tags"},{"line_number":108,"context_line":"    \"\"\""},{"line_number":109,"context_line":"    if type(intermediates) \u003d\u003d six.text_type:"},{"line_number":110,"context_line":"        intermediates \u003d intermediates.encode(\"utf-8\")"},{"line_number":111,"context_line":"    if X509_BEG in intermediates:"},{"line_number":112,"context_line":"        for x509Pem in _split_x509s(intermediates):"}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_94058916","line":109,"updated":"2019-08-03 13:28:31.000000000","message":"Whoops, this should be consistent with the one below.","commit_id":"e1ad467f345a0cdfce8e965312d285db859f6ae2"}],"octavia/tests/functional/amphorae/backend/agent/api_server/test_server.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"86d95c4c3ebc6c193fa633a556fba94c686a2964","unresolved":false,"context_lines":[{"line_number":2639,"context_line":"            self.assertEqual(500, rv.status_code)"},{"line_number":2640,"context_line":""},{"line_number":2641,"context_line":"    def test_version_discovery(self):"},{"line_number":2642,"context_line":"        with mock.patch(\u0027distro.id\u0027, return_value\u003d\u0027ubuntu\u0027):"},{"line_number":2643,"context_line":"            self.test_client \u003d server.Server().app.test_client()"},{"line_number":2644,"context_line":"        expected_dict \u003d {\u0027api_version\u0027: api_server.VERSION}"},{"line_number":2645,"context_line":"        rv \u003d self.test_client.get(\u0027/\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_d426a1ce","line":2642,"updated":"2019-08-03 13:28:31.000000000","message":"Testclient doesn\u0027t work on OSX if you don\u0027t fake another OS, and OS isn\u0027t relevant to this so just ubuntu is probably fine.","commit_id":"e1ad467f345a0cdfce8e965312d285db859f6ae2"}],"octavia/tests/functional/api/drivers/driver_agent/test_driver_agent.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"86d95c4c3ebc6c193fa633a556fba94c686a2964","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            name\u003dCONF.certificates.cert_manager,"},{"line_number":104,"context_line":"            invoke_on_load\u003dTrue,"},{"line_number":105,"context_line":"        ).driver"},{"line_number":106,"context_line":"        self.cert_ref \u003d cert_manager.store_cert("},{"line_number":107,"context_line":"            None,"},{"line_number":108,"context_line":"            sample_certs.X509_CERT,"},{"line_number":109,"context_line":"            sample_certs.X509_CERT_KEY_ENCRYPTED,"}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_942ca9ac","line":106,"updated":"2019-08-03 13:28:31.000000000","message":"The cert has to be stored earlier, because listener_proc.start() somehow requires it to exist already? I\u0027m not quite clear on *why*.","commit_id":"6c490c703c6d14d3233ce788e033d7bbf5706a6a"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"86d95c4c3ebc6c193fa633a556fba94c686a2964","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        self.tls_container_dict \u003d {"},{"line_number":115,"context_line":"            \u0027certificate\u0027: sample_certs.X509_CERT,"},{"line_number":116,"context_line":"            \u0027id\u0027: sample_certs.X509_CERT_SHA1,"},{"line_number":117,"context_line":"            \u0027intermediates\u0027: \u0027\u0027.join(sample_certs.X509_IMDS_LIST),"},{"line_number":118,"context_line":"            \u0027passphrase\u0027: None,"},{"line_number":119,"context_line":"            \u0027primary_cn\u0027: sample_certs.X509_CERT_CN,"},{"line_number":120,"context_line":"            \u0027private_key\u0027: sample_certs.X509_CERT_KEY}"}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_541cf176","line":117,"updated":"2019-08-03 13:28:31.000000000","message":"We have a thing for this.","commit_id":"6c490c703c6d14d3233ce788e033d7bbf5706a6a"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"86d95c4c3ebc6c193fa633a556fba94c686a2964","unresolved":false,"context_lines":[{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        # TODO(johnsom) Remove this once the listener ACLs patch merges"},{"line_number":236,"context_line":"        # https://review.opendev.org/#/c/659626/"},{"line_number":237,"context_line":"        # self.provider_listener_dict[\u0027allowed_cidrs\u0027] \u003d None"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        # ### Create L7 Policy"},{"line_number":240,"context_line":"        l7policy_dict \u003d copy.deepcopy(self.sample_data.test_l7policy1_dict)"}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_741fad6b","line":237,"updated":"2019-08-03 13:28:31.000000000","message":"Ah, I should remove this NOW, fixed it another way where it was used.","commit_id":"e1ad467f345a0cdfce8e965312d285db859f6ae2"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"a9863af6fa87f5e8f969e095ee4ede3f5f063a0b","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        self.exit_event \u003d multiprocessing.Event()"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        self.status_listener_proc \u003d multiprocessing.Process("},{"line_number":87,"context_line":"            name\u003d\u0027status_listener\u0027, target\u003ddriver_listener.status_listener,"},{"line_number":88,"context_line":"            args\u003d(self.exit_event,))"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        self.status_listener_proc.start()"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        self.stats_listener_proc \u003d multiprocessing.Process("},{"line_number":93,"context_line":"            name\u003d\u0027stats_listener\u0027, target\u003ddriver_listener.stats_listener,"},{"line_number":94,"context_line":"            args\u003d(self.exit_event,))"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        self.stats_listener_proc.start()"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        self.get_listener_proc \u003d multiprocessing.Process("},{"line_number":99,"context_line":"            name\u003d\u0027get_listener\u0027, target\u003ddriver_listener.get_listener,"},{"line_number":100,"context_line":"            args\u003d(self.exit_event,))"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        self.get_listener_proc.start()"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        self.addCleanup(self._process_cleanup)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        self.driver_lib \u003d octavia_driver_lib.DriverLibrary("},{"line_number":107,"context_line":"            status_socket\u003dself.STATUS_SOCKET_FILE,"},{"line_number":108,"context_line":"            stats_socket\u003dself.STATS_SOCKET_FILE,"},{"line_number":109,"context_line":"            get_socket\u003dself.GET_SOCKET_FILE)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        self.sample_data \u003d sample_data_models.SampleDriverDataModels()"},{"line_number":112,"context_line":"        self.repos \u003d repositories.Repositories()"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_2789f773","line":109,"range":{"start_line":86,"start_character":0,"end_line":109,"end_character":44},"updated":"2019-08-05 14:22:03.000000000","message":"Can we move it somewhere outside octavia? (octavia-lib?) In OVN we could use it in our functional tests, to spawn foo listeners in the same way you\u0027re doing.","commit_id":"a07fe0b379f647d2294fdd6e7fc061915d7dd8dd"}],"octavia/tests/unit/common/tls_utils/test_cert_parser.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"86d95c4c3ebc6c193fa633a556fba94c686a2964","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    def test_get_intermediates_pem_chain(self):"},{"line_number":111,"context_line":"        self.assertEqual("},{"line_number":112,"context_line":"            sample_certs.X509_IMDS_LIST,"},{"line_number":113,"context_line":"            [c for c in"},{"line_number":114,"context_line":"                cert_parser.get_intermediates_pems(sample_certs.X509_IMDS)])"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def test_get_intermediates_pkcs7_pem(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_1412f962","line":113,"updated":"2019-08-03 13:28:31.000000000","message":"I think this was from when I was obsessed with list comprehensions, and maybe wasn\u0027t thinking about the fact that I can just do a list() to iterate out a generator.","commit_id":"6c490c703c6d14d3233ce788e033d7bbf5706a6a"}],"tox.ini":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"86d95c4c3ebc6c193fa633a556fba94c686a2964","unresolved":false,"context_lines":[{"line_number":50,"context_line":"[testenv:functional]"},{"line_number":51,"context_line":"setenv \u003d OS_TEST_PATH\u003d{toxinidir}/octavia/tests/functional"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"[testenv:functional-py27]"},{"line_number":54,"context_line":"basepython \u003d python2.7"},{"line_number":55,"context_line":"setenv \u003d OS_TEST_PATH\u003d{toxinidir}/octavia/tests/functional"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-properties","patch_set":18,"id":"7faddb67_3415b549","line":53,"updated":"2019-08-03 13:28:31.000000000","message":"Somehow we didn\u0027t have this, but technically still have to provide compatibility with py27, right? I tried without this and it would create an environment using 2.7 somehow, but not actually pick the right tests.","commit_id":"e1ad467f345a0cdfce8e965312d285db859f6ae2"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"98388525f33745310a49ca5fdc32aa20f2152e85","unresolved":false,"context_lines":[{"line_number":50,"context_line":"[testenv:functional]"},{"line_number":51,"context_line":"setenv \u003d OS_TEST_PATH\u003d{toxinidir}/octavia/tests/functional"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"[testenv:functional-py27]"},{"line_number":54,"context_line":"basepython \u003d python2.7"},{"line_number":55,"context_line":"setenv \u003d OS_TEST_PATH\u003d{toxinidir}/octavia/tests/functional"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-properties","patch_set":18,"id":"7faddb67_78fb1078","line":53,"in_reply_to":"7faddb67_3415b549","updated":"2019-08-05 17:13:20.000000000","message":"The line 50 above is the py27 version.","commit_id":"e1ad467f345a0cdfce8e965312d285db859f6ae2"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"fb1fbe6bb2f106f817944fdd5c5a4a73f01eb18f","unresolved":false,"context_lines":[{"line_number":50,"context_line":"[testenv:functional]"},{"line_number":51,"context_line":"setenv \u003d OS_TEST_PATH\u003d{toxinidir}/octavia/tests/functional"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"[testenv:functional-py27]"},{"line_number":54,"context_line":"basepython \u003d python2.7"},{"line_number":55,"context_line":"setenv \u003d OS_TEST_PATH\u003d{toxinidir}/octavia/tests/functional"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-properties","patch_set":18,"id":"7faddb67_d86d6403","line":53,"in_reply_to":"7faddb67_78fb1078","updated":"2019-08-05 17:29:41.000000000","message":"No, it does not. The octavia JOB for \"functional\" uses py27, but that doesn\u0027t use our tox.ini\nIf you run `tox -e functional` you will not be guaranteed a py27 environment.","commit_id":"e1ad467f345a0cdfce8e965312d285db859f6ae2"}]}
