)]}'
{"neutron/plugins/ml2/drivers/ovn/mech_driver/mech_driver.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"54582dd2c726b9468c3ebb2298e7fa9f81629555","unresolved":true,"context_lines":[{"line_number":785,"context_line":"            # will fail that OVN has port with bigger revision."},{"line_number":786,"context_line":"            return"},{"line_number":787,"context_line":""},{"line_number":788,"context_line":"        self._ovn_client.update_port(context._plugin_context, port)"},{"line_number":789,"context_line":"        self._notify_dhcp_updated(port[\u0027id\u0027])"},{"line_number":790,"context_line":""},{"line_number":791,"context_line":"    def delete_port_postcommit(self, context):"}],"source_content_type":"text/x-python","patch_set":3,"id":"982c6765_199cfc8f","line":788,"updated":"2021-02-08 16:18:00.000000000","message":"I\u0027m ok with this change but that will break any existing deployment with a previous version.\n\nYou should create a DBInconsistenciesPeriodics method to be executed only once (see for example \"check_metadata_ports\") to pass the Neutron DB information about QoS to the OVN DB ports (qos_policy_id and qos_network_policy_id).","commit_id":"b63473a0d850b5cdd06a40c7cda06ac1a58a1fa8"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"82a7457f11e03fd9cc588a0092abe4c0f249b7a9","unresolved":true,"context_lines":[{"line_number":785,"context_line":"            # will fail that OVN has port with bigger revision."},{"line_number":786,"context_line":"            return"},{"line_number":787,"context_line":""},{"line_number":788,"context_line":"        self._ovn_client.update_port(context._plugin_context, port)"},{"line_number":789,"context_line":"        self._notify_dhcp_updated(port[\u0027id\u0027])"},{"line_number":790,"context_line":""},{"line_number":791,"context_line":"    def delete_port_postcommit(self, context):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1c43f55b_39be307d","line":788,"in_reply_to":"982c6765_199cfc8f","updated":"2021-02-09 11:55:07.000000000","message":"Thanks for the review! I\u0027ve seen the check_metadata_port function and I understand why is it needed as there should always be a metadata_port for every created network. However I\u0027m still not sure in which way that would apply to this case. Why isn\u0027t the modification in ovn_client.py (L328 - L335, counting the changes) enough?","commit_id":"b63473a0d850b5cdd06a40c7cda06ac1a58a1fa8"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/extensions/qos.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"269c828ed005baed5f8ec6b1397894443f8d690f","unresolved":true,"context_lines":[{"line_number":172,"context_line":"        device, then return None."},{"line_number":173,"context_line":"        \"\"\""},{"line_number":174,"context_line":"        policy_exists \u003d bool(port.get(ovn_const.OVN_QOS_POLICY_EXT_ID_KEY) or"},{"line_number":175,"context_line":"                port.get(ovn_const.OVN_QOS_NETWORK_POLICY_EXT_ID_KEY))"},{"line_number":176,"context_line":"        if not policy_exists or utils.is_network_device_port(port):"},{"line_number":177,"context_line":"            return None, None"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"f02f5ca8_a94222d6","line":175,"updated":"2020-12-24 15:18:29.000000000","message":"That means we need to store first this info the the OVN register (Logical_Switch_Port) when the QoS is applied or deleted.","commit_id":"145dbe241284cb129e107e2dbc2a2de12fccf57f"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"8c32f5e27de97f0f838fe1e9baaa61d28c766e7a","unresolved":true,"context_lines":[{"line_number":172,"context_line":"        device, then return None."},{"line_number":173,"context_line":"        \"\"\""},{"line_number":174,"context_line":"        policy_exists \u003d bool(port.get(ovn_const.OVN_QOS_POLICY_EXT_ID_KEY) or"},{"line_number":175,"context_line":"                port.get(ovn_const.OVN_QOS_NETWORK_POLICY_EXT_ID_KEY))"},{"line_number":176,"context_line":"        if not policy_exists or utils.is_network_device_port(port):"},{"line_number":177,"context_line":"            return None, None"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ce4402a0_da7ad147","line":175,"in_reply_to":"f02f5ca8_a94222d6","updated":"2020-12-24 16:52:36.000000000","message":"Maybe I\u0027m wrong, but I thought I was considering that since I\u0027m changing update_port in ovn_client.py (Line 328 - 335). I added it as external IDS. \n\nAnyway, the port.get(..) here are wrong because an LSP is not a dictionary. I need to update this WIP with my latest changes. \n\nThanks for the review!","commit_id":"145dbe241284cb129e107e2dbc2a2de12fccf57f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"77372a1ea2789301ffa17abb20c6e7d034b2ac5b","unresolved":true,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def _port_effective_qos_policy_id(self, port):"},{"line_number":169,"context_line":"        \"\"\"Return port effective QoS policy"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        If the port does not have any QoS policy reference or is a network"},{"line_number":172,"context_line":"        device, then return None."},{"line_number":173,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"40319190_4470c570","side":"PARENT","line":170,"updated":"2021-02-12 17:15:29.000000000","message":"unrelated","commit_id":"871c717f5c55978d04b458a617658e6e3fa3e5a7"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"19aa33ec9cb9a823b354ea2cf4ada8dc4b2c0b67","unresolved":true,"context_lines":[{"line_number":198,"context_line":"                external_ids.get(ovn_const.OVN_QOS_NETWORK_POLICY_EXT_ID_KEY)"},{"line_number":199,"context_line":"        )"},{"line_number":200,"context_line":"        if not policy_exists:"},{"line_number":201,"context_line":"            return None, None"},{"line_number":202,"context_line":"        if external_ids.get(ovn_const.OVN_QOS_POLICY_EXT_ID_KEY):"},{"line_number":203,"context_line":"            return external_ids[ovn_const.OVN_QOS_POLICY_EXT_ID_KEY], \u0027port\u0027"},{"line_number":204,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3003d8fa_52caf30f","line":201,"updated":"2021-03-09 10:27:57.000000000","message":"No need to test if the values exists before. This method can be an if..elif..else bloc:\n\n if external_ids.get(ovn_const.OVN_QOS_POLICY_EXT_ID_KEY):\n     return external_ids[...], \u0027port\u0027\n elif external_ids.get(ovn_const.OVN_QOS_NETWORK_POLICY_EXT_ID_KEY):\n     return external_ids[...], \u0027network\u0027\n else:\n     return None, None","commit_id":"dfe625e92c3f167ea5afca0cd4b57178716ef913"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/maintenance.py":[{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"2c6f29b881e76bc3f563d928c5773c04d56cd35c","unresolved":true,"context_lines":[{"line_number":500,"context_line":""},{"line_number":501,"context_line":"        raise periodics.NeverAgain()"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"    @periodics.periodic(spacing\u003d1800, run_immediately\u003dTrue)"},{"line_number":504,"context_line":"    def check_qos_options_in_ovn_nb(self):"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"        # If there is no QoS table do not run this again"}],"source_content_type":"text/x-python","patch_set":9,"id":"18020150_08c9735d","line":503,"range":{"start_line":503,"start_character":1,"end_line":503,"end_character":59},"updated":"2021-02-19 14:10:19.000000000","message":"Probably worth adding similar comments than in L523 stating that this is to be removed at some point plus this is mean to run just once.","commit_id":"fc13885bad59daece9d296fa9b70598639ef337b"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"7ce952b7110784fce66b9dc6733a8e44cad2eee6","unresolved":true,"context_lines":[{"line_number":500,"context_line":""},{"line_number":501,"context_line":"        raise periodics.NeverAgain()"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"    @periodics.periodic(spacing\u003d1800, run_immediately\u003dTrue)"},{"line_number":504,"context_line":"    def check_qos_options_in_ovn_nb(self):"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"        # If there is no QoS table do not run this again"}],"source_content_type":"text/x-python","patch_set":9,"id":"6fa2802e_5e1d6513","line":503,"range":{"start_line":503,"start_character":1,"end_line":503,"end_character":59},"in_reply_to":"18020150_08c9735d","updated":"2021-02-19 14:58:15.000000000","message":"You are right,thanks!!","commit_id":"fc13885bad59daece9d296fa9b70598639ef337b"},{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"2c6f29b881e76bc3f563d928c5773c04d56cd35c","unresolved":true,"context_lines":[{"line_number":503,"context_line":"    @periodics.periodic(spacing\u003d1800, run_immediately\u003dTrue)"},{"line_number":504,"context_line":"    def check_qos_options_in_ovn_nb(self):"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"        # If there is no QoS table do not run this again"},{"line_number":507,"context_line":"        if not self._nb_idl.is_table_present(\u0027QOS\u0027):"},{"line_number":508,"context_line":"            raise periodics.NeverAgain()"},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"        # Make sure that only one worker is executing this"},{"line_number":511,"context_line":"        if not self.has_lock:"}],"source_content_type":"text/x-python","patch_set":9,"id":"75ddefc6_f748c6b4","line":508,"range":{"start_line":506,"start_character":0,"end_line":508,"end_character":40},"updated":"2021-02-19 14:10:19.000000000","message":"I think this should be moved down, if the worker doesn\u0027t have the lock, this check is useless right?","commit_id":"fc13885bad59daece9d296fa9b70598639ef337b"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"7ce952b7110784fce66b9dc6733a8e44cad2eee6","unresolved":false,"context_lines":[{"line_number":503,"context_line":"    @periodics.periodic(spacing\u003d1800, run_immediately\u003dTrue)"},{"line_number":504,"context_line":"    def check_qos_options_in_ovn_nb(self):"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"        # If there is no QoS table do not run this again"},{"line_number":507,"context_line":"        if not self._nb_idl.is_table_present(\u0027QOS\u0027):"},{"line_number":508,"context_line":"            raise periodics.NeverAgain()"},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"        # Make sure that only one worker is executing this"},{"line_number":511,"context_line":"        if not self.has_lock:"}],"source_content_type":"text/x-python","patch_set":9,"id":"a79cfcf3_383a241e","line":508,"range":{"start_line":506,"start_character":0,"end_line":508,"end_character":40},"in_reply_to":"59bc06cf_08545f30","updated":"2021-02-19 14:58:15.000000000","message":"Ack","commit_id":"fc13885bad59daece9d296fa9b70598639ef337b"},{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"44565779c44ef3ae50a732e4df7b45c2f23d2039","unresolved":true,"context_lines":[{"line_number":503,"context_line":"    @periodics.periodic(spacing\u003d1800, run_immediately\u003dTrue)"},{"line_number":504,"context_line":"    def check_qos_options_in_ovn_nb(self):"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"        # If there is no QoS table do not run this again"},{"line_number":507,"context_line":"        if not self._nb_idl.is_table_present(\u0027QOS\u0027):"},{"line_number":508,"context_line":"            raise periodics.NeverAgain()"},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"        # Make sure that only one worker is executing this"},{"line_number":511,"context_line":"        if not self.has_lock:"}],"source_content_type":"text/x-python","patch_set":9,"id":"59bc06cf_08545f30","line":508,"range":{"start_line":506,"start_character":0,"end_line":508,"end_character":40},"in_reply_to":"75ddefc6_f748c6b4","updated":"2021-02-19 14:14:09.000000000","message":"Disregard this, I think it\u0027s fine to do it here then it won\u0027t attempt to run with spacing! Sorry about that :)","commit_id":"fc13885bad59daece9d296fa9b70598639ef337b"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"48791910ac891d5d097cd660039d352a75281a83","unresolved":true,"context_lines":[{"line_number":586,"context_line":"            self._qos_driver.delete_port(txn, p_object)"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"            if port_object and self.is_dns_required_for_port(port_object):"},{"line_number":589,"context_line":"                self.add_txns_to_remove_port_dns_records(txn, port_object)"},{"line_number":590,"context_line":""},{"line_number":591,"context_line":"            # Check if the port being deleted is a virtual parent"},{"line_number":592,"context_line":"            if (ovn_port.type !\u003d ovn_const.LSP_TYPE_VIRTUAL and"}],"source_content_type":"text/x-python","patch_set":5,"id":"b39c606a_d2cbdc49","side":"PARENT","line":589,"updated":"2021-02-15 10:14:49.000000000","message":"I am a bit concerned about removing this block of code here as I do not see add_txns_to_remove_port_dns_records() being called anywhere else now.","commit_id":"871c717f5c55978d04b458a617658e6e3fa3e5a7"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"7ce952b7110784fce66b9dc6733a8e44cad2eee6","unresolved":false,"context_lines":[{"line_number":586,"context_line":"            self._qos_driver.delete_port(txn, p_object)"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"            if port_object and self.is_dns_required_for_port(port_object):"},{"line_number":589,"context_line":"                self.add_txns_to_remove_port_dns_records(txn, port_object)"},{"line_number":590,"context_line":""},{"line_number":591,"context_line":"            # Check if the port being deleted is a virtual parent"},{"line_number":592,"context_line":"            if (ovn_port.type !\u003d ovn_const.LSP_TYPE_VIRTUAL and"}],"source_content_type":"text/x-python","patch_set":5,"id":"ee0fc21f_bdfff2bd","side":"PARENT","line":589,"in_reply_to":"b39c606a_d2cbdc49","updated":"2021-02-19 14:58:15.000000000","message":"Done","commit_id":"871c717f5c55978d04b458a617658e6e3fa3e5a7"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"48791910ac891d5d097cd660039d352a75281a83","unresolved":true,"context_lines":[{"line_number":330,"context_line":"        if qos_policy_id:"},{"line_number":331,"context_line":"            external_ids[ovn_const.OVN_QOS_POLICY_EXT_ID_KEY] \u003d qos_policy_id"},{"line_number":332,"context_line":"        elif qos_npid:"},{"line_number":333,"context_line":"            qos_network_policy_id \u003d ovn_const.OVN_QOS_NETWORK_POLICY_EXT_ID_KEY"},{"line_number":334,"context_line":"            external_ids[qos_network_policy_id] \u003d qos_npid"},{"line_number":335,"context_line":"        return external_ids"},{"line_number":336,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"89264c37_93b6866c","line":333,"range":{"start_line":333,"start_character":12,"end_line":333,"end_character":33},"updated":"2021-02-15 10:14:49.000000000","message":"nit: we probably do not need this variable here, we can use () to break the value to a new line\n\nexternal_ids[ovn_const.OVN_QOS_NETWORK_POLICY_EXT_ID_KEY] \u003d (\n    qos_npid)","commit_id":"c4f48f75d7e6759e0e5376f254f57dd00c31d5e4"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"7ce952b7110784fce66b9dc6733a8e44cad2eee6","unresolved":false,"context_lines":[{"line_number":330,"context_line":"        if qos_policy_id:"},{"line_number":331,"context_line":"            external_ids[ovn_const.OVN_QOS_POLICY_EXT_ID_KEY] \u003d qos_policy_id"},{"line_number":332,"context_line":"        elif qos_npid:"},{"line_number":333,"context_line":"            qos_network_policy_id \u003d ovn_const.OVN_QOS_NETWORK_POLICY_EXT_ID_KEY"},{"line_number":334,"context_line":"            external_ids[qos_network_policy_id] \u003d qos_npid"},{"line_number":335,"context_line":"        return external_ids"},{"line_number":336,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"05775073_3621e392","line":333,"range":{"start_line":333,"start_character":12,"end_line":333,"end_character":33},"in_reply_to":"89264c37_93b6866c","updated":"2021-02-19 14:58:15.000000000","message":"Done","commit_id":"c4f48f75d7e6759e0e5376f254f57dd00c31d5e4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"77372a1ea2789301ffa17abb20c6e7d034b2ac5b","unresolved":true,"context_lines":[{"line_number":339,"context_line":"            return"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        port_info \u003d self._get_port_options(port)"},{"line_number":342,"context_line":"        external_ids \u003d self._get_external_ids(port)"},{"line_number":343,"context_line":"        lswitch_name \u003d utils.ovn_name(port[\u0027network_id\u0027])"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        # It\u0027s possible to have a network created on one controller and then a"}],"source_content_type":"text/x-python","patch_set":5,"id":"03d70335_fe515cff","line":342,"updated":"2021-02-12 17:15:29.000000000","message":"Referring to [1] (but this part of the code is better to understand this): if you update the Neutron server code, now the OVN QoS extension will retrieve the QoS information from the OVN port register, instead the Neutron port DB register.\n\nThat is fine because we can use the OVN DB to store this info. The problem is that someone upgrading to this new version won\u0027t have any data of QoS in the OVN DB ports, for those ports created before the update.\n\nThis is why I said we need a method to update this info once, in the DBInconsistenciesPeriodics class.\n\nBTW, another question: where are you writing those values? Because \"_get_external_ids\" is retrieving this info. But where do you write the QoS info into the OVN DB ports?\n\n[1]https://review.opendev.org/c/openstack/neutron/+/767186/3/neutron/plugins/ml2/drivers/ovn/mech_driver/mech_driver.py#788","commit_id":"c4f48f75d7e6759e0e5376f254f57dd00c31d5e4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"48791910ac891d5d097cd660039d352a75281a83","unresolved":true,"context_lines":[{"line_number":339,"context_line":"            return"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        port_info \u003d self._get_port_options(port)"},{"line_number":342,"context_line":"        external_ids \u003d self._get_external_ids(port)"},{"line_number":343,"context_line":"        lswitch_name \u003d utils.ovn_name(port[\u0027network_id\u0027])"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        # It\u0027s possible to have a network created on one controller and then a"}],"source_content_type":"text/x-python","patch_set":5,"id":"2c113413_3af46657","line":342,"in_reply_to":"03d70335_fe515cff","updated":"2021-02-15 10:14:49.000000000","message":"Good point on the maintenance task, I think that is needed indeed!\n\nRegarding the other question. I think it\u0027s been written just like any other external id ? The arguments dict is built at L375 and the commit L409.","commit_id":"c4f48f75d7e6759e0e5376f254f57dd00c31d5e4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"48791910ac891d5d097cd660039d352a75281a83","unresolved":true,"context_lines":[{"line_number":560,"context_line":"                self.add_txns_to_sync_port_dns_records(txn, port)"},{"line_number":561,"context_line":"#            elif port_object and self.is_dns_required_for_port(port_object):"},{"line_number":562,"context_line":"#                # We need to remove the old entries"},{"line_number":563,"context_line":"#                self.add_txns_to_remove_port_dns_records(txn, port_object)"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"        if check_rev_cmd.result \u003d\u003d ovn_const.TXN_COMMITTED:"},{"line_number":566,"context_line":"            db_rev.bump_revision(context, port, ovn_const.TYPE_PORTS)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fbea30fc_27853577","line":563,"updated":"2021-02-15 10:14:49.000000000","message":"I am a bit concerned about this block being commented out here as I do not see add_txns_to_remove_port_dns_records() being called anywhere else now.","commit_id":"c4f48f75d7e6759e0e5376f254f57dd00c31d5e4"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"7ce952b7110784fce66b9dc6733a8e44cad2eee6","unresolved":false,"context_lines":[{"line_number":560,"context_line":"                self.add_txns_to_sync_port_dns_records(txn, port)"},{"line_number":561,"context_line":"#            elif port_object and self.is_dns_required_for_port(port_object):"},{"line_number":562,"context_line":"#                # We need to remove the old entries"},{"line_number":563,"context_line":"#                self.add_txns_to_remove_port_dns_records(txn, port_object)"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"        if check_rev_cmd.result \u003d\u003d ovn_const.TXN_COMMITTED:"},{"line_number":566,"context_line":"            db_rev.bump_revision(context, port, ovn_const.TYPE_PORTS)"}],"source_content_type":"text/x-python","patch_set":5,"id":"953364d8_a2fec181","line":563,"in_reply_to":"fbea30fc_27853577","updated":"2021-02-19 14:58:15.000000000","message":"Done","commit_id":"c4f48f75d7e6759e0e5376f254f57dd00c31d5e4"},{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"3900eadfe53fe3af26d5a8ab7d0a73480f39b000","unresolved":true,"context_lines":[{"line_number":326,"context_line":"                                port, ovn_const.TYPE_PORTS))}"},{"line_number":327,"context_line":"        qos_policy_id \u003d port.get(\u0027qos_policy_id\u0027)"},{"line_number":328,"context_line":"        qos_npid \u003d port.get(\u0027qos_network_policy_id\u0027)"},{"line_number":329,"context_line":"        if qos_policy_id:"},{"line_number":330,"context_line":"            external_ids[ovn_const.OVN_QOS_POLICY_EXT_ID_KEY] \u003d qos_policy_id"},{"line_number":331,"context_line":"        elif qos_npid:"},{"line_number":332,"context_line":"            external_ids[ovn_const.OVN_QOS_NETWORK_POLICY_EXT_ID_KEY] \u003d ("},{"line_number":333,"context_line":"                qos_npid)"},{"line_number":334,"context_line":"        net \u003d port.get(\u0027network\u0027)"},{"line_number":335,"context_line":"        if net:"},{"line_number":336,"context_line":"            external_ids[ovn_const.OVN_NETWORK_EXT_ID_KEY] \u003d net"},{"line_number":337,"context_line":"        dns_assignment \u003d port.get(\u0027dns_assignment\u0027)"},{"line_number":338,"context_line":"        if dns_assignment:"},{"line_number":339,"context_line":"            dns_assignment_key \u003d ovn_const.OVN_DNS_ASSIGNMENT_EXT_ID_KEY"},{"line_number":340,"context_line":"            external_ids[dns_assignment_key] \u003d dns_assignment"},{"line_number":341,"context_line":"        dns_name \u003d port.get(\u0027dns_name\u0027)"},{"line_number":342,"context_line":"        if dns_name:"},{"line_number":343,"context_line":"            external_ids[ovn_const.OVN_DNS_NAME_EXT_ID_KEY] \u003d dns_name"},{"line_number":344,"context_line":"        return external_ids"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def create_port(self, context, port):"}],"source_content_type":"text/x-python","patch_set":6,"id":"dcbcd547_aed3e8af","line":343,"range":{"start_line":329,"start_character":3,"end_line":343,"end_character":70},"updated":"2021-02-17 09:20:32.000000000","message":"I\u0027m concerned about adding so many things to the external_ids of every port. IIRC northd will propagate all this to the SB database and this will go to all connected clients. Maybe it\u0027s not a big deal but wanted to point it out here.","commit_id":"668fd4fe28bd776780d538af03f06c481c7d4c61"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"0b4ede6116bbb4a843f086330585a18e6b4cdbae","unresolved":true,"context_lines":[{"line_number":333,"context_line":"                qos_npid)"},{"line_number":334,"context_line":"        net \u003d port.get(\u0027network\u0027)"},{"line_number":335,"context_line":"        if net:"},{"line_number":336,"context_line":"            external_ids[ovn_const.OVN_NETWORK_EXT_ID_KEY] \u003d net"},{"line_number":337,"context_line":"        dns_assignment \u003d port.get(\u0027dns_assignment\u0027)"},{"line_number":338,"context_line":"        if dns_assignment:"},{"line_number":339,"context_line":"            dns_assignment_key \u003d ovn_const.OVN_DNS_ASSIGNMENT_EXT_ID_KEY"}],"source_content_type":"text/x-python","patch_set":10,"id":"7b9f0ae8_42305f82","line":336,"updated":"2021-03-02 11:50:17.000000000","message":"Saving the whole network object inside the port object is not ideal. Also this may not work since external_ids in OVSDB requires both keys and values to be a string.","commit_id":"1cb17c64caea90b8c6aca1078489ec9f5a3c1e32"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"0b4ede6116bbb4a843f086330585a18e6b4cdbae","unresolved":true,"context_lines":[{"line_number":2174,"context_line":"        external_ids \u003d ovn_port.external_ids"},{"line_number":2175,"context_line":"        port_dns_records \u003d {}"},{"line_number":2176,"context_line":"        net \u003d external_ids.get(ovn_const.OVN_NETWORK_EXT_ID_KEY, {})"},{"line_number":2177,"context_line":"        net_dns_domain \u003d net.get(\u0027dns_domain\u0027, \u0027\u0027).rstrip(\u0027.\u0027)"},{"line_number":2178,"context_line":""},{"line_number":2179,"context_line":"        for dns_assignment in external_ids.get("},{"line_number":2180,"context_line":"                ovn_const.OVN_DNS_ASSIGNMENT_EXT_ID_KEY, []):"}],"source_content_type":"text/x-python","patch_set":10,"id":"6d69a990_87e64202","line":2177,"range":{"start_line":2177,"start_character":35,"end_line":2177,"end_character":36},"updated":"2021-03-02 11:50:17.000000000","message":"We only need the \"dns_domain\" from the network object here. We could save the \"dns_domain\" in the logical_switch object in OVSDB and fetch that from here.","commit_id":"1cb17c64caea90b8c6aca1078489ec9f5a3c1e32"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"0b4ede6116bbb4a843f086330585a18e6b4cdbae","unresolved":true,"context_lines":[{"line_number":2242,"context_line":"            return"},{"line_number":2243,"context_line":""},{"line_number":2244,"context_line":"        net \u003d ovn_port.external_ids.get(ovn_const.OVN_NETWORK_EXT_ID_KEY, {})"},{"line_number":2245,"context_line":"        net_dns_domain \u003d net.get(\u0027dns_domain\u0027, \u0027\u0027).rstrip(\u0027.\u0027)"},{"line_number":2246,"context_line":""},{"line_number":2247,"context_line":"        hostnames \u003d []"},{"line_number":2248,"context_line":"        for dns_assignment in ovn_port.external_ids.get("}],"source_content_type":"text/x-python","patch_set":10,"id":"859c8435_77174b91","line":2245,"updated":"2021-03-02 11:50:17.000000000","message":"ditto re:dns_domain, we could have it saved in the logical_switch entry (aka network) and fetch it from here","commit_id":"1cb17c64caea90b8c6aca1078489ec9f5a3c1e32"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"c484c2783723440e073973af34de1a2865a0c99e","unresolved":true,"context_lines":[{"line_number":334,"context_line":"                qos_npid)"},{"line_number":335,"context_line":"        dns_domain \u003d port.get(\u0027network\u0027, {}).get(\u0027dns_domain\u0027)"},{"line_number":336,"context_line":"        if dns_domain:"},{"line_number":337,"context_line":"            external_ids[ovn_const.OVN_DNS_DOMAIN_EXT_ID_KEY] \u003d dns_domain"},{"line_number":338,"context_line":"        dns_assignment \u003d port.get(\u0027dns_assignment\u0027)"},{"line_number":339,"context_line":"        if dns_assignment:"},{"line_number":340,"context_line":"            external_ids[ovn_const.OVN_DNS_ASSIGNMENT_EXT_ID_KEY] \u003d ("}],"source_content_type":"text/x-python","patch_set":11,"id":"7abb87bf_5fedea0c","line":337,"updated":"2021-03-03 16:43:38.000000000","message":"I feel like this DNS domain should be save in the LS entry (a.k.a network) since that\u0027s where it is in Neutron.\n\nOtherwise, if we update the dns_domain in Neutron we will need to update the LSPs (a.k.a ports) and that\u0027s not ideal.","commit_id":"2ab5056e9a18a01da3779b747102775833e91a53"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"9fbc791fd6f5c7f4521bbcdc1607e6c6f7a81732","unresolved":false,"context_lines":[{"line_number":334,"context_line":"                qos_npid)"},{"line_number":335,"context_line":"        dns_domain \u003d port.get(\u0027network\u0027, {}).get(\u0027dns_domain\u0027)"},{"line_number":336,"context_line":"        if dns_domain:"},{"line_number":337,"context_line":"            external_ids[ovn_const.OVN_DNS_DOMAIN_EXT_ID_KEY] \u003d dns_domain"},{"line_number":338,"context_line":"        dns_assignment \u003d port.get(\u0027dns_assignment\u0027)"},{"line_number":339,"context_line":"        if dns_assignment:"},{"line_number":340,"context_line":"            external_ids[ovn_const.OVN_DNS_ASSIGNMENT_EXT_ID_KEY] \u003d ("}],"source_content_type":"text/x-python","patch_set":11,"id":"715262ec_5bf23e1d","line":337,"in_reply_to":"7abb87bf_5fedea0c","updated":"2021-03-05 10:38:01.000000000","message":"Done","commit_id":"2ab5056e9a18a01da3779b747102775833e91a53"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"9fbc791fd6f5c7f4521bbcdc1607e6c6f7a81732","unresolved":false,"context_lines":[{"line_number":334,"context_line":"                qos_npid)"},{"line_number":335,"context_line":"        dns_domain \u003d port.get(\u0027network\u0027, {}).get(\u0027dns_domain\u0027)"},{"line_number":336,"context_line":"        if dns_domain:"},{"line_number":337,"context_line":"            external_ids[ovn_const.OVN_DNS_DOMAIN_EXT_ID_KEY] \u003d dns_domain"},{"line_number":338,"context_line":"        dns_assignment \u003d port.get(\u0027dns_assignment\u0027)"},{"line_number":339,"context_line":"        if dns_assignment:"},{"line_number":340,"context_line":"            external_ids[ovn_const.OVN_DNS_ASSIGNMENT_EXT_ID_KEY] \u003d ("}],"source_content_type":"text/x-python","patch_set":11,"id":"0d951ee8_be783d18","line":337,"in_reply_to":"7abb87bf_5fedea0c","updated":"2021-03-05 10:38:01.000000000","message":"Thanks for the reviews! I agree with them and I they\u0027ve been fixed on the new version of the patch.","commit_id":"2ab5056e9a18a01da3779b747102775833e91a53"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"c484c2783723440e073973af34de1a2865a0c99e","unresolved":true,"context_lines":[{"line_number":2176,"context_line":"        external_ids \u003d ovn_port.external_ids"},{"line_number":2177,"context_line":"        port_dns_records \u003d {}"},{"line_number":2178,"context_line":"        net_dns_domain \u003d external_ids.get("},{"line_number":2179,"context_line":"                ovn_const.OVN_DNS_DOMAIN_EXT_ID_KEY, \u0027\u0027).rstrip(\u0027.\u0027)"},{"line_number":2180,"context_line":""},{"line_number":2181,"context_line":"        for dns_assignment in jsonutils.loads(external_ids.get("},{"line_number":2182,"context_line":"                ovn_const.OVN_DNS_ASSIGNMENT_EXT_ID_KEY, [])):"}],"source_content_type":"text/x-python","patch_set":11,"id":"2a73e89b_da81e439","line":2179,"updated":"2021-03-03 16:43:38.000000000","message":"ditto re getting this value from the LS object instead of LSP","commit_id":"2ab5056e9a18a01da3779b747102775833e91a53"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"9fbc791fd6f5c7f4521bbcdc1607e6c6f7a81732","unresolved":false,"context_lines":[{"line_number":2176,"context_line":"        external_ids \u003d ovn_port.external_ids"},{"line_number":2177,"context_line":"        port_dns_records \u003d {}"},{"line_number":2178,"context_line":"        net_dns_domain \u003d external_ids.get("},{"line_number":2179,"context_line":"                ovn_const.OVN_DNS_DOMAIN_EXT_ID_KEY, \u0027\u0027).rstrip(\u0027.\u0027)"},{"line_number":2180,"context_line":""},{"line_number":2181,"context_line":"        for dns_assignment in jsonutils.loads(external_ids.get("},{"line_number":2182,"context_line":"                ovn_const.OVN_DNS_ASSIGNMENT_EXT_ID_KEY, [])):"}],"source_content_type":"text/x-python","patch_set":11,"id":"b55b6e57_046819c8","line":2179,"in_reply_to":"2a73e89b_da81e439","updated":"2021-03-05 10:38:01.000000000","message":"Done","commit_id":"2ab5056e9a18a01da3779b747102775833e91a53"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"c484c2783723440e073973af34de1a2865a0c99e","unresolved":true,"context_lines":[{"line_number":2198,"context_line":"            if fqdn not in port_dns_records:"},{"line_number":2199,"context_line":"                port_dns_records[fqdn] \u003d dns_assignment[\u0027ip_address\u0027]"},{"line_number":2200,"context_line":"            else:"},{"line_number":2201,"context_line":"                port_dns_records[fqdn] +\u003d \" \" + dns_assignment[\u0027ip_address\u0027]"},{"line_number":2202,"context_line":""},{"line_number":2203,"context_line":"        return port_dns_records"},{"line_number":2204,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"59dad086_452e39c3","line":2201,"updated":"2021-03-03 16:43:38.000000000","message":"Can we create a helper function in between get_port_dns_records() and get_lsp_dns_records(). The code inside the \"for loop\" is essentially the same, would be good to not duplicate it.","commit_id":"2ab5056e9a18a01da3779b747102775833e91a53"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"9fbc791fd6f5c7f4521bbcdc1607e6c6f7a81732","unresolved":false,"context_lines":[{"line_number":2198,"context_line":"            if fqdn not in port_dns_records:"},{"line_number":2199,"context_line":"                port_dns_records[fqdn] \u003d dns_assignment[\u0027ip_address\u0027]"},{"line_number":2200,"context_line":"            else:"},{"line_number":2201,"context_line":"                port_dns_records[fqdn] +\u003d \" \" + dns_assignment[\u0027ip_address\u0027]"},{"line_number":2202,"context_line":""},{"line_number":2203,"context_line":"        return port_dns_records"},{"line_number":2204,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"00c6e699_f4fb83bd","line":2201,"in_reply_to":"59dad086_452e39c3","updated":"2021-03-05 10:38:01.000000000","message":"Done","commit_id":"2ab5056e9a18a01da3779b747102775833e91a53"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"c484c2783723440e073973af34de1a2865a0c99e","unresolved":true,"context_lines":[{"line_number":2243,"context_line":"            return"},{"line_number":2244,"context_line":""},{"line_number":2245,"context_line":"        net_dns_domain \u003d external_ids.get("},{"line_number":2246,"context_line":"                ovn_const.OVN_DNS_DOMAIN_EXT_ID_KEY, \u0027\u0027).rstrip(\u0027.\u0027)"},{"line_number":2247,"context_line":""},{"line_number":2248,"context_line":"        hostnames \u003d []"},{"line_number":2249,"context_line":"        for dns_assignment in jsonutils.loads(external_ids.get("}],"source_content_type":"text/x-python","patch_set":11,"id":"03ea8843_afcb619e","line":2246,"updated":"2021-03-03 16:43:38.000000000","message":"ditto re: getting this value from the LS object not the LSP","commit_id":"2ab5056e9a18a01da3779b747102775833e91a53"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"9fbc791fd6f5c7f4521bbcdc1607e6c6f7a81732","unresolved":false,"context_lines":[{"line_number":2243,"context_line":"            return"},{"line_number":2244,"context_line":""},{"line_number":2245,"context_line":"        net_dns_domain \u003d external_ids.get("},{"line_number":2246,"context_line":"                ovn_const.OVN_DNS_DOMAIN_EXT_ID_KEY, \u0027\u0027).rstrip(\u0027.\u0027)"},{"line_number":2247,"context_line":""},{"line_number":2248,"context_line":"        hostnames \u003d []"},{"line_number":2249,"context_line":"        for dns_assignment in jsonutils.loads(external_ids.get("}],"source_content_type":"text/x-python","patch_set":11,"id":"35d6077f_ccffd06d","line":2246,"in_reply_to":"03ea8843_afcb619e","updated":"2021-03-05 10:38:01.000000000","message":"Done","commit_id":"2ab5056e9a18a01da3779b747102775833e91a53"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"c484c2783723440e073973af34de1a2865a0c99e","unresolved":true,"context_lines":[{"line_number":2247,"context_line":""},{"line_number":2248,"context_line":"        hostnames \u003d []"},{"line_number":2249,"context_line":"        for dns_assignment in jsonutils.loads(external_ids.get("},{"line_number":2250,"context_line":"                ovn_const.OVN_DNS_ASSIGNMENT_EXT_ID_KEY)):"},{"line_number":2251,"context_line":"            hostname \u003d dns_assignment[\u0027hostname\u0027]"},{"line_number":2252,"context_line":"            fqdn \u003d dns_assignment[\u0027fqdn\u0027].rstrip(\u0027.\u0027)"},{"line_number":2253,"context_line":"            if hostname not in hostnames:"}],"source_content_type":"text/x-python","patch_set":11,"id":"245f52e3_9cf7e660","line":2250,"updated":"2021-03-03 16:43:38.000000000","message":"We may need a default value for this external_ids.get() otherwise, if it returns None (the default value) jsonutils.loads() will complain","commit_id":"2ab5056e9a18a01da3779b747102775833e91a53"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"9fbc791fd6f5c7f4521bbcdc1607e6c6f7a81732","unresolved":false,"context_lines":[{"line_number":2247,"context_line":""},{"line_number":2248,"context_line":"        hostnames \u003d []"},{"line_number":2249,"context_line":"        for dns_assignment in jsonutils.loads(external_ids.get("},{"line_number":2250,"context_line":"                ovn_const.OVN_DNS_ASSIGNMENT_EXT_ID_KEY)):"},{"line_number":2251,"context_line":"            hostname \u003d dns_assignment[\u0027hostname\u0027]"},{"line_number":2252,"context_line":"            fqdn \u003d dns_assignment[\u0027fqdn\u0027].rstrip(\u0027.\u0027)"},{"line_number":2253,"context_line":"            if hostname not in hostnames:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7b31ff86_a0f57811","line":2250,"in_reply_to":"245f52e3_9cf7e660","updated":"2021-03-05 10:38:01.000000000","message":"Done","commit_id":"2ab5056e9a18a01da3779b747102775833e91a53"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"19aa33ec9cb9a823b354ea2cf4ada8dc4b2c0b67","unresolved":true,"context_lines":[{"line_number":338,"context_line":"                    jsonutils.dumps(dns_assignment))"},{"line_number":339,"context_line":"        dns_name \u003d port.get(\u0027dns_name\u0027)"},{"line_number":340,"context_line":"        if dns_name:"},{"line_number":341,"context_line":"            external_ids[ovn_const.OVN_DNS_NAME_EXT_ID_KEY] \u003d dns_name"},{"line_number":342,"context_line":"        return external_ids"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"    def create_port(self, context, port):"}],"source_content_type":"text/x-python","patch_set":15,"id":"2909b46c_19552b5a","line":341,"updated":"2021-03-09 10:27:57.000000000","message":"I think it would be safer to always include the keys in external_ids and an empty string (for cases where it\u0027s not present). Otherwise we can get some weird behaviors when it comes to updates, for example:\n\n1. Port had a dns_name set to it\n2. We then wrote that dns_name to the external_ids in OVN NBDB\n3. Port gets an update that deletes the dns_name\n4. Now, port.get(\u0027dns_name\u0027) will return None and the old dns_name won\u0027t be deleted from OVN NBDB\n\nThis could lead to old values being still present in the OVN NBDB.\n\nI would change this to:\n\nexternal_ids \u003d {...\n    ovn_const.OVN_DNS_NAME_EXT_ID_KEY: port.get(\u0027dns_name\u0027, \u0027\u0027),\n    ovn_const.OVN_QOS_POLICY_EXT_ID_KEY: port.get(\u0027qos_policy_id\u0027, \u0027\u0027)\n    ...\n}","commit_id":"dfe625e92c3f167ea5afca0cd4b57178716ef913"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"19aa33ec9cb9a823b354ea2cf4ada8dc4b2c0b67","unresolved":true,"context_lines":[{"line_number":2143,"context_line":"        if not self._nb_idl.is_table_present(\u0027DNS\u0027):"},{"line_number":2144,"context_line":"            return False"},{"line_number":2145,"context_line":""},{"line_number":2146,"context_line":"        return True"},{"line_number":2147,"context_line":""},{"line_number":2148,"context_line":"    def get_lsp_dns_records(self, ovn_port):"},{"line_number":2149,"context_line":"        lswitch_name \u003d ("}],"source_content_type":"text/x-python","patch_set":15,"id":"453a646f_270e2984","line":2146,"updated":"2021-03-09 10:27:57.000000000","message":"nit: \n\nreturn self._nb_idl.is_table_present(\u0027DNS\u0027)","commit_id":"dfe625e92c3f167ea5afca0cd4b57178716ef913"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"eded329f0b13f4cf7e3a4e75371cafb445c7def1","unresolved":true,"context_lines":[{"line_number":318,"context_line":"            ovn_const.HA_CHASSIS_GROUP_DEFAULT_NAME).execute("},{"line_number":319,"context_line":"            check_error\u003dTrue).uuid"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    def _get_external_ids(self, port):"},{"line_number":322,"context_line":"        port_info \u003d self._get_port_options(port)"},{"line_number":323,"context_line":"        external_ids \u003d {ovn_const.OVN_PORT_NAME_EXT_ID_KEY: port[\u0027name\u0027],"},{"line_number":324,"context_line":"                        ovn_const.OVN_DEVID_EXT_ID_KEY: port[\u0027device_id\u0027],"}],"source_content_type":"text/x-python","patch_set":17,"id":"900764ac_915d8113","line":321,"updated":"2021-03-15 15:27:41.000000000","message":"May I suggest: _get_port_external_ids() to be more specific what external_ids this method is generating.","commit_id":"4c6f93db3b66337ca0dfdc1c0dca2d582f5c199b"}]}
