)]}'
{"networking_generic_switch/devices/__init__.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"641a1716d387f28eb7f7f61949085ca706102d6f","unresolved":true,"context_lines":[{"line_number":82,"context_line":"    # Rollback timeout (seconds) for the tentative confirmed commit."},{"line_number":83,"context_line":"    {\u0027name\u0027: \u0027ngs_netconf_confirmed_commit_timeout\u0027, \u0027default\u0027: 5},"},{"line_number":84,"context_line":"    # TLS certificate verification for HTTP-based transports"},{"line_number":85,"context_line":"    {\u0027name\u0027: \u0027ngs_verify_ssl\u0027, \u0027default\u0027: True},"},{"line_number":86,"context_line":"    # RESTCONF transport settings"},{"line_number":87,"context_line":"    {\u0027name\u0027: \u0027ngs_restconf_scheme\u0027, \u0027default\u0027: \u0027https\u0027},"},{"line_number":88,"context_line":"    {\u0027name\u0027: \u0027ngs_restconf_content_type\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"535bbdde_8a30aeb0","line":85,"updated":"2026-09-09 11:06:27.000000000","message":"s/ssl/tls/ maybe?","commit_id":"81d117f9feee9884ccb86cabfbd885f79c87b905"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"2a86670f0609accd2b84c7af8f74fcd0d9227fc1","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    # Rollback timeout (seconds) for the tentative confirmed commit."},{"line_number":83,"context_line":"    {\u0027name\u0027: \u0027ngs_netconf_confirmed_commit_timeout\u0027, \u0027default\u0027: 5},"},{"line_number":84,"context_line":"    # TLS certificate verification for HTTP-based transports"},{"line_number":85,"context_line":"    {\u0027name\u0027: \u0027ngs_verify_ssl\u0027, \u0027default\u0027: True},"},{"line_number":86,"context_line":"    # RESTCONF transport settings"},{"line_number":87,"context_line":"    {\u0027name\u0027: \u0027ngs_restconf_scheme\u0027, \u0027default\u0027: \u0027https\u0027},"},{"line_number":88,"context_line":"    {\u0027name\u0027: \u0027ngs_restconf_content_type\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"0ae5b9f3_dd339e48","line":85,"in_reply_to":"535bbdde_8a30aeb0","updated":"2026-09-09 12:25:34.000000000","message":"Done","commit_id":"81d117f9feee9884ccb86cabfbd885f79c87b905"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"0d461a726ae1cc3378a73be6cb6b74aafb7398cc","unresolved":true,"context_lines":[{"line_number":106,"context_line":"    # TLS certificate verification for HTTP-based transports"},{"line_number":107,"context_line":"    {\u0027name\u0027: \u0027ngs_verify_tls\u0027, \u0027default\u0027: True},"},{"line_number":108,"context_line":"    # RESTCONF transport settings"},{"line_number":109,"context_line":"    {\u0027name\u0027: \u0027ngs_restconf_scheme\u0027, \u0027default\u0027: \u0027https\u0027},"},{"line_number":110,"context_line":"    {\u0027name\u0027: \u0027ngs_restconf_content_type\u0027,"},{"line_number":111,"context_line":"     \u0027default\u0027: \u0027application/yang-data+json\u0027},"},{"line_number":112,"context_line":"    {\u0027name\u0027: \u0027ngs_restconf_base_path\u0027, \u0027default\u0027: \u0027/restconf/data\u0027},"}],"source_content_type":"text/x-python","patch_set":7,"id":"4195e90e_96a08229","line":109,"updated":"2026-09-18 15:35:34.000000000","message":"We really need a whole help text. :(","commit_id":"bd023a6da34192b7b232d9ffd8dd0bd576c12749"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"62b846bab14db8408ee31bc2bd0e5624f554a822","unresolved":true,"context_lines":[{"line_number":106,"context_line":"    # TLS certificate verification for HTTP-based transports"},{"line_number":107,"context_line":"    {\u0027name\u0027: \u0027ngs_verify_tls\u0027, \u0027default\u0027: True},"},{"line_number":108,"context_line":"    # RESTCONF transport settings"},{"line_number":109,"context_line":"    {\u0027name\u0027: \u0027ngs_restconf_scheme\u0027, \u0027default\u0027: \u0027https\u0027},"},{"line_number":110,"context_line":"    {\u0027name\u0027: \u0027ngs_restconf_content_type\u0027,"},{"line_number":111,"context_line":"     \u0027default\u0027: \u0027application/yang-data+json\u0027},"},{"line_number":112,"context_line":"    {\u0027name\u0027: \u0027ngs_restconf_base_path\u0027, \u0027default\u0027: \u0027/restconf/data\u0027},"}],"source_content_type":"text/x-python","patch_set":7,"id":"36845484_052a6087","line":109,"in_reply_to":"4195e90e_96a08229","updated":"2026-09-18 15:43:41.000000000","message":"JFYI, the intent here is that this is ultimately *class* overridable, but that is later on beyond the base foundational default standards based approach. i.e. if cisco-magical-switch needs a separate device, and we need to go make a separate driver. To sort of try and avoid the need to know the configuraiton and the models inherently.","commit_id":"bd023a6da34192b7b232d9ffd8dd0bd576c12749"}],"networking_generic_switch/devices/restconf_devices/restconf_switch.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"641a1716d387f28eb7f7f61949085ca706102d6f","unresolved":true,"context_lines":[{"line_number":96,"context_line":"        :returns: Base URL string (e.g. ``https://switch:443``)."},{"line_number":97,"context_line":"        \"\"\""},{"line_number":98,"context_line":"        netloc \u003d \u0027{}:{}\u0027.format("},{"line_number":99,"context_line":"            self.config.get(\u0027host\u0027), self._restconf_port)"},{"line_number":100,"context_line":"        return urlunsplit((self._restconf_scheme, netloc, \u0027\u0027, \u0027\u0027, \u0027\u0027))"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _resource_url(self, path\u003d\u0027\u0027):"}],"source_content_type":"text/x-python","patch_set":4,"id":"4f7f43e3_f2826f7d","line":99,"updated":"2026-09-09 11:06:27.000000000","message":"Does this account for IPv6?","commit_id":"81d117f9feee9884ccb86cabfbd885f79c87b905"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"2a86670f0609accd2b84c7af8f74fcd0d9227fc1","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        :returns: Base URL string (e.g. ``https://switch:443``)."},{"line_number":97,"context_line":"        \"\"\""},{"line_number":98,"context_line":"        netloc \u003d \u0027{}:{}\u0027.format("},{"line_number":99,"context_line":"            self.config.get(\u0027host\u0027), self._restconf_port)"},{"line_number":100,"context_line":"        return urlunsplit((self._restconf_scheme, netloc, \u0027\u0027, \u0027\u0027, \u0027\u0027))"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _resource_url(self, path\u003d\u0027\u0027):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5d902120_bf7078f6","line":99,"in_reply_to":"4f7f43e3_f2826f7d","updated":"2026-09-09 12:25:34.000000000","message":"Good catch! Updated to use oslo.utils netutils.escape_ipv6() to wrap IPv6 addresses in brackets!","commit_id":"81d117f9feee9884ccb86cabfbd885f79c87b905"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"641a1716d387f28eb7f7f61949085ca706102d6f","unresolved":true,"context_lines":[{"line_number":117,"context_line":"        :returns: A ``requests.Session`` with auth, headers, and TLS"},{"line_number":118,"context_line":"            verification configured from the device settings."},{"line_number":119,"context_line":"        \"\"\""},{"line_number":120,"context_line":"        session \u003d requests.Session()"},{"line_number":121,"context_line":"        username \u003d self.config.get(\u0027username\u0027)"},{"line_number":122,"context_line":"        password \u003d self.config.get(\u0027password\u0027)"},{"line_number":123,"context_line":"        if username:"}],"source_content_type":"text/x-python","patch_set":4,"id":"4d726c82_fb2b1154","line":120,"updated":"2026-09-09 11:06:27.000000000","message":"Sessions are designed to be cached between requests. If you don\u0027t cache sessions, why create them?","commit_id":"81d117f9feee9884ccb86cabfbd885f79c87b905"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"2a86670f0609accd2b84c7af8f74fcd0d9227fc1","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        :returns: A ``requests.Session`` with auth, headers, and TLS"},{"line_number":118,"context_line":"            verification configured from the device settings."},{"line_number":119,"context_line":"        \"\"\""},{"line_number":120,"context_line":"        session \u003d requests.Session()"},{"line_number":121,"context_line":"        username \u003d self.config.get(\u0027username\u0027)"},{"line_number":122,"context_line":"        password \u003d self.config.get(\u0027password\u0027)"},{"line_number":123,"context_line":"        if username:"}],"source_content_type":"text/x-python","patch_set":4,"id":"c2fce6cb_306f4ae6","line":120,"in_reply_to":"4d726c82_fb2b1154","updated":"2026-09-09 12:25:34.000000000","message":"Thanks! Updated to create session during initialization and re-use for all requests.","commit_id":"81d117f9feee9884ccb86cabfbd885f79c87b905"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"0d461a726ae1cc3378a73be6cb6b74aafb7398cc","unresolved":true,"context_lines":[{"line_number":79,"context_line":"            \u0027timeout\u0027: CONF.ngs_coordination.acquire_timeout,"},{"line_number":80,"context_line":"        }"},{"line_number":81,"context_line":"        self.locker \u003d None"},{"line_number":82,"context_line":"        if CONF.ngs_coordination.backend_url:"},{"line_number":83,"context_line":"            self.locker \u003d coordination.get_coordinator("},{"line_number":84,"context_line":"                CONF.ngs_coordination.backend_url,"},{"line_number":85,"context_line":"                (\u0027ngs-\u0027 + device_utils.get_hostname()).encode(\u0027ascii\u0027))"}],"source_content_type":"text/x-python","patch_set":7,"id":"1596af6f_6222966d","line":82,"updated":"2026-09-18 15:35:34.000000000","message":"One ask, follow-up is fine: Lets add some explaination that restconf\u0027s configuration model is intended, as we understand it, to be more atomic, so it sort of lends it self to needing to avoid concurrent configurators.\n\nwhere as netconf is more concurrent declared desired configuration. 😭","commit_id":"bd023a6da34192b7b232d9ffd8dd0bd576c12749"}]}
