)]}'
{"neutron/agent/ovn/metadata/agent.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"23b352cb29339b723cf4002cc37e02d377623a72","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            self.agent.sync()"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"class ChassisPrivateCreateEvent(row_event.RowEvent):"},{"line_number":130,"context_line":"    \"\"\"Row create event - Chassis name \u003d\u003d our_chassis."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    On connection, we get a dump of all chassis so if we catch a creation"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_1533c9c5","line":129,"updated":"2020-02-13 11:48:48.000000000","message":"This is duplicated, I will change it later!","commit_id":"56c6a65e338c558a1b254e12a7a30cab3b083015"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"66c5131bc0359380923191e43b7b1317e878fd84","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        self.event_name \u003d self.__class__.__name__"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def run(self, event, row, old):"},{"line_number":181,"context_line":"        table \u003d \u0027Chassis\u0027"},{"line_number":182,"context_line":"        if self.agent.has_chassis_private:"},{"line_number":183,"context_line":"            table \u003d \u0027Chassis_Private\u0027"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        self.agent.sb_idl.db_set("},{"line_number":186,"context_line":"            table, self.agent.chassis, (\u0027external_ids\u0027, {"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_1002030c","line":183,"range":{"start_line":181,"start_character":0,"end_line":183,"end_character":37},"updated":"2020-08-18 13:30:57.000000000","message":"Is it possible the has_chassis_private on the agent changes in the runtime? Perhaps we can set the table in __init__ and avoid this check on each update.","commit_id":"2340ec54cbe5e53861d64a6ad8cd8af8dad8f2c6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"17bf7a022fd84c23cf5ca10f95a19ddf6f5dfe7b","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        self.event_name \u003d self.__class__.__name__"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def run(self, event, row, old):"},{"line_number":181,"context_line":"        table \u003d \u0027Chassis\u0027"},{"line_number":182,"context_line":"        if self.agent.has_chassis_private:"},{"line_number":183,"context_line":"            table \u003d \u0027Chassis_Private\u0027"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        self.agent.sb_idl.db_set("},{"line_number":186,"context_line":"            table, self.agent.chassis, (\u0027external_ids\u0027, {"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_d3f3759e","line":183,"range":{"start_line":181,"start_character":0,"end_line":183,"end_character":37},"in_reply_to":"9f560f44_1002030c","updated":"2020-08-18 13:56:50.000000000","message":"Good point, yeah the has_chassis_private shouldn\u0027t change in runtime. I will move it to the constructor instead.","commit_id":"2340ec54cbe5e53861d64a6ad8cd8af8dad8f2c6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"aa6f7816692c13acf1bc6771a2fb10e372dcb05b","unresolved":false,"context_lines":[{"line_number":221,"context_line":"        proxy \u003d metadata_server.UnixDomainMetadataProxy(self.conf)"},{"line_number":222,"context_line":"        proxy.run()"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        tables \u003d (\u0027Encap\u0027, \u0027Port_Binding\u0027, \u0027Datapath_Binding\u0027, \u0027SB_Global\u0027)"},{"line_number":225,"context_line":"        events \u003d (PortBindingChassisCreatedEvent(self),"},{"line_number":226,"context_line":"                  PortBindingChassisDeletedEvent(self),"},{"line_number":227,"context_line":"                  SbGlobalUpdateEvent(self))"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_0e3024e8","line":224,"updated":"2020-08-18 15:22:53.000000000","message":"As an aside, I\u0027m not sure exactly what happens when one subscribes to updates from a table like Port_Binding, but not one of the refTable entries on that like Gateway_Chassis/HA_Chassis_Group. We\u0027ve been doing it for a while, so I\u0027m assuming it just leaves the value as a uuid or something. Just kind of leaving myself a note to check that out out of curiosity since I remember seeing those weird \u0027Atom\u0027 has no attribute \u0027external_ids\u0027 errors from a while back and always thought it could have something to do something showing up as a UUID instead of a Row in some case (though that was always Datapath_Binding which seemed like we always subscribed to--and we don\u0027t do anything with SB Gateway_Chassis that I\u0027m aware of).\n\n/ramble","commit_id":"2340ec54cbe5e53861d64a6ad8cd8af8dad8f2c6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"aa6f7816692c13acf1bc6771a2fb10e372dcb05b","unresolved":false,"context_lines":[{"line_number":233,"context_line":"        self.has_chassis_private \u003d False"},{"line_number":234,"context_line":"        try:"},{"line_number":235,"context_line":"            self.sb_idl \u003d ovsdb.MetadataAgentOvnSbIdl("},{"line_number":236,"context_line":"                chassis\u003dself.chassis, tables\u003dtables + (\u0027Chassis\u0027,"},{"line_number":237,"context_line":"                    \u0027Chassis_Private\u0027, ),"},{"line_number":238,"context_line":"                events\u003devents + (ChassisPrivateCreateEvent(self), )).start()"},{"line_number":239,"context_line":"            self.has_chassis_private \u003d True"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_f3267916","line":236,"range":{"start_line":236,"start_character":55,"end_line":236,"end_character":64},"updated":"2020-08-18 15:22:53.000000000","message":"nit:\nsince \u0027Chassis\u0027 is common, couldn\u0027t this go in the tables definition above?","commit_id":"2340ec54cbe5e53861d64a6ad8cd8af8dad8f2c6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"0ec7ef376e0f7d0f544f4c17cf62bdac88071520","unresolved":false,"context_lines":[{"line_number":233,"context_line":"        self.has_chassis_private \u003d False"},{"line_number":234,"context_line":"        try:"},{"line_number":235,"context_line":"            self.sb_idl \u003d ovsdb.MetadataAgentOvnSbIdl("},{"line_number":236,"context_line":"                chassis\u003dself.chassis, tables\u003dtables + (\u0027Chassis\u0027,"},{"line_number":237,"context_line":"                    \u0027Chassis_Private\u0027, ),"},{"line_number":238,"context_line":"                events\u003devents + (ChassisPrivateCreateEvent(self), )).start()"},{"line_number":239,"context_line":"            self.has_chassis_private \u003d True"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_69943ae9","line":236,"range":{"start_line":236,"start_character":55,"end_line":236,"end_character":64},"in_reply_to":"9f560f44_f3267916","updated":"2020-08-18 15:39:41.000000000","message":"Good point, it could indeed.","commit_id":"2340ec54cbe5e53861d64a6ad8cd8af8dad8f2c6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"9a1d01a6fd8c2488e1e4a5c01c9f2307b18e4ca7","unresolved":false,"context_lines":[{"line_number":231,"context_line":"        self.has_chassis_private \u003d False"},{"line_number":232,"context_line":"        try:"},{"line_number":233,"context_line":"            self.sb_idl \u003d ovsdb.MetadataAgentOvnSbIdl("},{"line_number":234,"context_line":"                chassis\u003dself.chassis, tables\u003dtables + (\u0027Chassis\u0027,"},{"line_number":235,"context_line":"                    \u0027Chassis_Private\u0027, ),"},{"line_number":236,"context_line":"                events\u003devents + (ChassisPrivateCreateEvent(self), )).start()"},{"line_number":237,"context_line":"            self.has_chassis_private \u003d True"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f560f44_651c3fc1","line":234,"range":{"start_line":234,"start_character":55,"end_line":234,"end_character":64},"updated":"2020-08-20 04:42:50.000000000","message":"Can go in tables definition since common ;)","commit_id":"894788f2db4d07fa08ed560bc3ace5ba6a6f7a6b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d8a6fbd13840c7e625745ebe0e776e4ebeac08ff","unresolved":false,"context_lines":[{"line_number":231,"context_line":"        self.has_chassis_private \u003d False"},{"line_number":232,"context_line":"        try:"},{"line_number":233,"context_line":"            self.sb_idl \u003d ovsdb.MetadataAgentOvnSbIdl("},{"line_number":234,"context_line":"                chassis\u003dself.chassis, tables\u003dtables + (\u0027Chassis\u0027,"},{"line_number":235,"context_line":"                    \u0027Chassis_Private\u0027, ),"},{"line_number":236,"context_line":"                events\u003devents + (ChassisPrivateCreateEvent(self), )).start()"},{"line_number":237,"context_line":"            self.has_chassis_private \u003d True"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f560f44_67b56232","line":234,"range":{"start_line":234,"start_character":55,"end_line":234,"end_character":64},"in_reply_to":"9f560f44_651c3fc1","updated":"2020-08-20 08:40:14.000000000","message":"Ops, forgot this one! I think I will upload a new patch set addressing all these nits/suggestions.","commit_id":"894788f2db4d07fa08ed560bc3ace5ba6a6f7a6b"},{"author":{"_account_id":11952,"name":"Flavio Fernandes","email":"flavio@flaviof.com","username":"ffernand"},"change_message_id":"639b627939d2ba1f9305955297b4772f54d83941","unresolved":false,"context_lines":[{"line_number":251,"context_line":"    def register_metadata_agent(self):"},{"line_number":252,"context_line":"        # NOTE(lucasagomes): db_add() will not overwrite the UUID if"},{"line_number":253,"context_line":"        # it\u0027s already set."},{"line_number":254,"context_line":"        table \u003d \u0027Chassis\u0027"},{"line_number":255,"context_line":"        if self.has_chassis_private:"},{"line_number":256,"context_line":"            table \u003d \u0027Chassis_Private\u0027"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        ext_ids \u003d {"},{"line_number":259,"context_line":"            ovn_const.OVN_AGENT_METADATA_ID_KEY: uuidutils.generate_uuid()}"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f560f44_ceac5a8e","line":256,"range":{"start_line":254,"start_character":0,"end_line":256,"end_character":37},"updated":"2020-08-19 13:18:07.000000000","message":"NIT: I wonder if being consistent with how you do it in line \n181 is a bit nicer:\n\ntable \u003d (\u0027Chassis_Private\u0027 if self.has_chassis_private\n         else \u0027Chassis\u0027)","commit_id":"894788f2db4d07fa08ed560bc3ace5ba6a6f7a6b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"455a250fe060716fa1fd60df724898a985c27272","unresolved":false,"context_lines":[{"line_number":251,"context_line":"    def register_metadata_agent(self):"},{"line_number":252,"context_line":"        # NOTE(lucasagomes): db_add() will not overwrite the UUID if"},{"line_number":253,"context_line":"        # it\u0027s already set."},{"line_number":254,"context_line":"        table \u003d \u0027Chassis\u0027"},{"line_number":255,"context_line":"        if self.has_chassis_private:"},{"line_number":256,"context_line":"            table \u003d \u0027Chassis_Private\u0027"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        ext_ids \u003d {"},{"line_number":259,"context_line":"            ovn_const.OVN_AGENT_METADATA_ID_KEY: uuidutils.generate_uuid()}"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f560f44_0e31320c","line":256,"range":{"start_line":254,"start_character":0,"end_line":256,"end_character":37},"in_reply_to":"9f560f44_ceac5a8e","updated":"2020-08-19 13:22:50.000000000","message":"Thanks, if I happen to send a new patch-set I will change it.","commit_id":"894788f2db4d07fa08ed560bc3ace5ba6a6f7a6b"},{"author":{"_account_id":11952,"name":"Flavio Fernandes","email":"flavio@flaviof.com","username":"ffernand"},"change_message_id":"8dcb65a467d0d31a82c68ad0bce9ae30abcc640a","unresolved":false,"context_lines":[{"line_number":251,"context_line":"    def register_metadata_agent(self):"},{"line_number":252,"context_line":"        # NOTE(lucasagomes): db_add() will not overwrite the UUID if"},{"line_number":253,"context_line":"        # it\u0027s already set."},{"line_number":254,"context_line":"        table \u003d (\u0027Chassis_Private\u0027 if self.agent.has_chassis_private"},{"line_number":255,"context_line":"                 else \u0027Chassis\u0027)"},{"line_number":256,"context_line":"        ext_ids \u003d {"},{"line_number":257,"context_line":"            ovn_const.OVN_AGENT_METADATA_ID_KEY: uuidutils.generate_uuid()}"}],"source_content_type":"text/x-python","patch_set":10,"id":"9f560f44_e6016b6c","line":254,"range":{"start_line":254,"start_character":43,"end_line":254,"end_character":48},"updated":"2020-08-20 17:38:44.000000000","message":"oops!","commit_id":"af12117f42f4e2484b1e8551c12e4299d37074e7"}],"neutron/plugins/ml2/drivers/ovn/agent/neutron_agent.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"9a1d01a6fd8c2488e1e4a5c01c9f2307b18e4ca7","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def __init__(self, chassis_private):"},{"line_number":32,"context_line":"        self.chassis_private \u003d chassis_private"},{"line_number":33,"context_line":"        try:"},{"line_number":34,"context_line":"            self.chassis \u003d self.chassis_private.chassis[0]"},{"line_number":35,"context_line":"        except (AttributeError, IndexError):"},{"line_number":36,"context_line":"            # No Chassis_Private support, just use Chassis"},{"line_number":37,"context_line":"            self.chassis \u003d self.chassis_private"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f560f44_0d177753","line":34,"range":{"start_line":34,"start_character":55,"end_line":34,"end_character":58},"updated":"2020-08-20 04:42:50.000000000","message":"Oh yeah, those silly optional values!","commit_id":"894788f2db4d07fa08ed560bc3ace5ba6a6f7a6b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"aed900f97d96a148699284ff0b35ac66d649d6b9","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def __init__(self, chassis_private):"},{"line_number":32,"context_line":"        self.chassis_private \u003d chassis_private"},{"line_number":33,"context_line":"        try:"},{"line_number":34,"context_line":"            self.chassis \u003d self.chassis_private.chassis[0]"},{"line_number":35,"context_line":"        except (AttributeError, IndexError):"},{"line_number":36,"context_line":"            # No Chassis_Private support, just use Chassis"},{"line_number":37,"context_line":"            self.chassis \u003d self.chassis_private"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f560f44_bbc67415","line":34,"range":{"start_line":34,"start_character":55,"end_line":34,"end_character":58},"in_reply_to":"9f560f44_0d177753","updated":"2020-08-20 08:17:19.000000000","message":"heh yeah it\u0027s a list \u003e.\u003c","commit_id":"894788f2db4d07fa08ed560bc3ace5ba6a6f7a6b"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/mech_driver.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"8672ec1e3a18469aef63ebb78f12867bcd7cf0e1","unresolved":false,"context_lines":[{"line_number":1013,"context_line":"            \u0027alive\u0027: alive,"},{"line_number":1014,"context_line":"            \u0027admin_state_up\u0027: True}"},{"line_number":1015,"context_line":""},{"line_number":1016,"context_line":"    def agents_from_chassis(self, chassis):"},{"line_number":1017,"context_line":"        agent_dict \u003d {}"},{"line_number":1018,"context_line":""},{"line_number":1019,"context_line":"        # Check for ovn-controller / ovn-controller gateway"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_6c48a6cb","line":1016,"updated":"2020-03-18 10:35:43.000000000","message":"This needs changes too","commit_id":"877a117349e74653d1384c339ae0053995d43fcb"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"66c5131bc0359380923191e43b7b1317e878fd84","unresolved":false,"context_lines":[{"line_number":1112,"context_line":"        table \u003d (\u0027Chassis_Private\u0027 if"},{"line_number":1113,"context_line":"                 self._sb_ovn.is_table_present(\u0027Chassis_Private\u0027) else"},{"line_number":1114,"context_line":"                 \u0027Chassis\u0027)"},{"line_number":1115,"context_line":"        self._sb_ovn.db_set(table, agent.chassis_private.uuid,"},{"line_number":1116,"context_line":"                            (\u0027external_ids\u0027, {agent.key: value})).execute("},{"line_number":1117,"context_line":"            check_error\u003dTrue)"},{"line_number":1118,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_135e8d11","line":1115,"range":{"start_line":1115,"start_character":28,"end_line":1115,"end_character":33},"updated":"2020-08-18 13:30:57.000000000","message":"Why can\u0027t we use self.agent_chassis_table here?","commit_id":"2340ec54cbe5e53861d64a6ad8cd8af8dad8f2c6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"17bf7a022fd84c23cf5ca10f95a19ddf6f5dfe7b","unresolved":false,"context_lines":[{"line_number":1112,"context_line":"        table \u003d (\u0027Chassis_Private\u0027 if"},{"line_number":1113,"context_line":"                 self._sb_ovn.is_table_present(\u0027Chassis_Private\u0027) else"},{"line_number":1114,"context_line":"                 \u0027Chassis\u0027)"},{"line_number":1115,"context_line":"        self._sb_ovn.db_set(table, agent.chassis_private.uuid,"},{"line_number":1116,"context_line":"                            (\u0027external_ids\u0027, {agent.key: value})).execute("},{"line_number":1117,"context_line":"            check_error\u003dTrue)"},{"line_number":1118,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_d338953c","line":1115,"range":{"start_line":1115,"start_character":28,"end_line":1115,"end_character":33},"in_reply_to":"9f560f44_135e8d11","updated":"2020-08-18 13:56:50.000000000","message":"Ops... I think we can! My bad :D","commit_id":"2340ec54cbe5e53861d64a6ad8cd8af8dad8f2c6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"aa6f7816692c13acf1bc6771a2fb10e372dcb05b","unresolved":false,"context_lines":[{"line_number":1117,"context_line":"            check_error\u003dTrue)"},{"line_number":1118,"context_line":""},{"line_number":1119,"context_line":"    def agents_from_chassis(self, chassis, update_db\u003dTrue):"},{"line_number":1120,"context_line":"        chassis_private \u003d chassis"},{"line_number":1121,"context_line":"        if self._sb_ovn.is_table_present(\u0027Chassis_Private\u0027):"},{"line_number":1122,"context_line":"            chassis \u003d self._sb_ovn.lookup(\u0027Chassis\u0027, chassis.name)"},{"line_number":1123,"context_line":"        agent_dict \u003d {}"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_ae5bf884","line":1120,"updated":"2020-08-18 15:22:53.000000000","message":"If populate_agents is already using \u0027agent_chassis_table\u0027, then won\u0027t chassis already be stored/passed as the proper chassis/chassis_private row based on whether Chassis_Private exists? And then would we need to pass both chassis/chassis_private to the NeutronAgent() below? Or is the agent API code confusing me again? :p","commit_id":"2340ec54cbe5e53861d64a6ad8cd8af8dad8f2c6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"ba5e74846149055bad0365d04c0eccffa22e6162","unresolved":false,"context_lines":[{"line_number":1117,"context_line":"            check_error\u003dTrue)"},{"line_number":1118,"context_line":""},{"line_number":1119,"context_line":"    def agents_from_chassis(self, chassis, update_db\u003dTrue):"},{"line_number":1120,"context_line":"        chassis_private \u003d chassis"},{"line_number":1121,"context_line":"        if self._sb_ovn.is_table_present(\u0027Chassis_Private\u0027):"},{"line_number":1122,"context_line":"            chassis \u003d self._sb_ovn.lookup(\u0027Chassis\u0027, chassis.name)"},{"line_number":1123,"context_line":"        agent_dict \u003d {}"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_beeb21da","line":1120,"in_reply_to":"9f560f44_294fe2bd","updated":"2020-08-18 18:55:09.000000000","message":"Ah, I get it. Thanks.\n\nSo, if we just pass in to the NeutronAgent a single object and it is the Chassis_Private if it exists, couldn\u0027t we then opportunistically try to access chassis_private-\u003echassis to get the related chassis info, or fall back to just grabbing it off the object itself as it would otherwise be a chassis? Or does that field not work for us for some reason (It\u0027s been a while since I actually read the Chassis_Private OVN patch).\n\nHaven\u0027t tried it, but it seems something like:\n\n class NeutronAgent(abc.ABC):\n     def __init__(self, chassis_private):\n         self.chassis_private \u003d chassis_private\n         try:\n             self.chassis \u003d chassis_private.chassis\n         except AttributeError:\n             # No Chassis_Private support, just use Chassis\n             self.chassis \u003d self.chassis_private\n\nmight work?","commit_id":"2340ec54cbe5e53861d64a6ad8cd8af8dad8f2c6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"0ec7ef376e0f7d0f544f4c17cf62bdac88071520","unresolved":false,"context_lines":[{"line_number":1117,"context_line":"            check_error\u003dTrue)"},{"line_number":1118,"context_line":""},{"line_number":1119,"context_line":"    def agents_from_chassis(self, chassis, update_db\u003dTrue):"},{"line_number":1120,"context_line":"        chassis_private \u003d chassis"},{"line_number":1121,"context_line":"        if self._sb_ovn.is_table_present(\u0027Chassis_Private\u0027):"},{"line_number":1122,"context_line":"            chassis \u003d self._sb_ovn.lookup(\u0027Chassis\u0027, chassis.name)"},{"line_number":1123,"context_line":"        agent_dict \u003d {}"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_294fe2bd","line":1120,"in_reply_to":"9f560f44_ae5bf884","updated":"2020-08-18 15:39:41.000000000","message":"Heh it is confusing indeed. There are two reason why we need to pass both row instances there:\n\n1) The Chassis_Private table only contains a subset of information from the Chassis table. For example, the hostname or other_config columns are not present in the Private_Chassis table.\n\n2) Now, the Chassis nb_cfg column is always 0 (zero). When we bump the nb_cfg value in the Global table the ovn-controller will bump the nb_cfg value in the Chassis_Private table only.\n\nSo, in order to satisfy the agents API we need information from both of these tables.","commit_id":"2340ec54cbe5e53861d64a6ad8cd8af8dad8f2c6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"688b4e36869aca1b93ef541d1c778b728f1e84d5","unresolved":false,"context_lines":[{"line_number":1117,"context_line":"            check_error\u003dTrue)"},{"line_number":1118,"context_line":""},{"line_number":1119,"context_line":"    def agents_from_chassis(self, chassis, update_db\u003dTrue):"},{"line_number":1120,"context_line":"        chassis_private \u003d chassis"},{"line_number":1121,"context_line":"        if self._sb_ovn.is_table_present(\u0027Chassis_Private\u0027):"},{"line_number":1122,"context_line":"            chassis \u003d self._sb_ovn.lookup(\u0027Chassis\u0027, chassis.name)"},{"line_number":1123,"context_line":"        agent_dict \u003d {}"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_8776cdd7","line":1120,"in_reply_to":"9f560f44_beeb21da","updated":"2020-08-19 10:00:22.000000000","message":"Nice one, let me give it a go!","commit_id":"2340ec54cbe5e53861d64a6ad8cd8af8dad8f2c6"},{"author":{"_account_id":11952,"name":"Flavio Fernandes","email":"flavio@flaviof.com","username":"ffernand"},"change_message_id":"639b627939d2ba1f9305955297b4772f54d83941","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        self.subscribe()"},{"line_number":121,"context_line":"        self.qos_driver \u003d qos_driver.OVNQosDriver.create(self)"},{"line_number":122,"context_line":"        self.trunk_driver \u003d trunk_driver.OVNTrunkDriver.create(self)"},{"line_number":123,"context_line":"        self.agent_chassis_table \u003d \u0027Chassis\u0027"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    @property"},{"line_number":126,"context_line":"    def _plugin(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f560f44_0e2bf2ea","line":123,"range":{"start_line":123,"start_character":8,"end_line":123,"end_character":44},"updated":"2020-08-19 13:18:07.000000000","message":"NIT: Maybe put a comment here saying that this gets changed if chassis_private table exists in IDL.","commit_id":"894788f2db4d07fa08ed560bc3ace5ba6a6f7a6b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"455a250fe060716fa1fd60df724898a985c27272","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        self.subscribe()"},{"line_number":121,"context_line":"        self.qos_driver \u003d qos_driver.OVNQosDriver.create(self)"},{"line_number":122,"context_line":"        self.trunk_driver \u003d trunk_driver.OVNTrunkDriver.create(self)"},{"line_number":123,"context_line":"        self.agent_chassis_table \u003d \u0027Chassis\u0027"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    @property"},{"line_number":126,"context_line":"    def _plugin(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f560f44_8eb1c292","line":123,"range":{"start_line":123,"start_character":8,"end_line":123,"end_character":44},"in_reply_to":"9f560f44_0e2bf2ea","updated":"2020-08-19 13:22:50.000000000","message":"++","commit_id":"894788f2db4d07fa08ed560bc3ace5ba6a6f7a6b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d8a6fbd13840c7e625745ebe0e776e4ebeac08ff","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        self.subscribe()"},{"line_number":121,"context_line":"        self.qos_driver \u003d qos_driver.OVNQosDriver.create(self)"},{"line_number":122,"context_line":"        self.trunk_driver \u003d trunk_driver.OVNTrunkDriver.create(self)"},{"line_number":123,"context_line":"        self.agent_chassis_table \u003d \u0027Chassis\u0027"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    @property"},{"line_number":126,"context_line":"    def _plugin(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f560f44_87899676","line":123,"range":{"start_line":123,"start_character":8,"end_line":123,"end_character":44},"in_reply_to":"9f560f44_33b29ae7","updated":"2020-08-20 08:40:14.000000000","message":"Oh that would be great! Having access to the parsed json schema pre-connection will be very useful I think.","commit_id":"894788f2db4d07fa08ed560bc3ace5ba6a6f7a6b"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"9a1d01a6fd8c2488e1e4a5c01c9f2307b18e4ca7","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        self.subscribe()"},{"line_number":121,"context_line":"        self.qos_driver \u003d qos_driver.OVNQosDriver.create(self)"},{"line_number":122,"context_line":"        self.trunk_driver \u003d trunk_driver.OVNTrunkDriver.create(self)"},{"line_number":123,"context_line":"        self.agent_chassis_table \u003d \u0027Chassis\u0027"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    @property"},{"line_number":126,"context_line":"    def _plugin(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f560f44_33b29ae7","line":123,"range":{"start_line":123,"start_character":8,"end_line":123,"end_character":44},"in_reply_to":"9f560f44_8eb1c292","updated":"2020-08-20 04:42:50.000000000","message":"Definitely not in this patch, but now I\u0027m wondering about making the connection/idl/schema helper objects available pre-fork, then just starting the connections post-fork so that we can make schema-based decisions earlier. Something to think about whenever we do the get_connection/get_ovn_idls refactor. :p","commit_id":"894788f2db4d07fa08ed560bc3ace5ba6a6f7a6b"},{"author":{"_account_id":11952,"name":"Flavio Fernandes","email":"flavio@flaviof.com","username":"ffernand"},"change_message_id":"639b627939d2ba1f9305955297b4772f54d83941","unresolved":false,"context_lines":[{"line_number":1122,"context_line":"                continue"},{"line_number":1123,"context_line":"            alive \u003d self.agent_alive(agent, update_db)"},{"line_number":1124,"context_line":"            agent_dict[agent.agent_id] \u003d agent.as_dict(alive)"},{"line_number":1125,"context_line":""},{"line_number":1126,"context_line":"        return agent_dict"},{"line_number":1127,"context_line":""},{"line_number":1128,"context_line":"    def patch_plugin_merge(self, method_name, new_fn, op\u003doperator.add):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f560f44_ee64be4b","line":1125,"updated":"2020-08-19 13:18:07.000000000","message":"SUPER NIT ALERT: did you mean to add this empty line?","commit_id":"894788f2db4d07fa08ed560bc3ace5ba6a6f7a6b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"455a250fe060716fa1fd60df724898a985c27272","unresolved":false,"context_lines":[{"line_number":1122,"context_line":"                continue"},{"line_number":1123,"context_line":"            alive \u003d self.agent_alive(agent, update_db)"},{"line_number":1124,"context_line":"            agent_dict[agent.agent_id] \u003d agent.as_dict(alive)"},{"line_number":1125,"context_line":""},{"line_number":1126,"context_line":"        return agent_dict"},{"line_number":1127,"context_line":""},{"line_number":1128,"context_line":"    def patch_plugin_merge(self, method_name, new_fn, op\u003doperator.add):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f560f44_2e7076dc","line":1125,"in_reply_to":"9f560f44_ee64be4b","updated":"2020-08-19 13:22:50.000000000","message":"Ops, not really","commit_id":"894788f2db4d07fa08ed560bc3ace5ba6a6f7a6b"},{"author":{"_account_id":11952,"name":"Flavio Fernandes","email":"flavio@flaviof.com","username":"ffernand"},"change_message_id":"639b627939d2ba1f9305955297b4772f54d83941","unresolved":false,"context_lines":[{"line_number":1213,"context_line":"def get_agent(self, context, id, fields\u003dNone, _driver\u003dNone):"},{"line_number":1214,"context_line":"    chassis \u003d None"},{"line_number":1215,"context_line":"    try:"},{"line_number":1216,"context_line":"        # look up Chassis by *name*, which the id attribte is"},{"line_number":1217,"context_line":"        chassis \u003d _driver._sb_ovn.lookup(_driver.agent_chassis_table, id)"},{"line_number":1218,"context_line":"    except idlutils.RowNotFound:"},{"line_number":1219,"context_line":"        # If the UUID is not found, check for the metadata agent ID"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f560f44_2ed4f6bc","line":1216,"range":{"start_line":1216,"start_character":51,"end_line":1216,"end_character":53},"updated":"2020-08-19 13:18:07.000000000","message":"SUPER NIT: since you are here, consider fixing this typo: attribute","commit_id":"894788f2db4d07fa08ed560bc3ace5ba6a6f7a6b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"455a250fe060716fa1fd60df724898a985c27272","unresolved":false,"context_lines":[{"line_number":1213,"context_line":"def get_agent(self, context, id, fields\u003dNone, _driver\u003dNone):"},{"line_number":1214,"context_line":"    chassis \u003d None"},{"line_number":1215,"context_line":"    try:"},{"line_number":1216,"context_line":"        # look up Chassis by *name*, which the id attribte is"},{"line_number":1217,"context_line":"        chassis \u003d _driver._sb_ovn.lookup(_driver.agent_chassis_table, id)"},{"line_number":1218,"context_line":"    except idlutils.RowNotFound:"},{"line_number":1219,"context_line":"        # If the UUID is not found, check for the metadata agent ID"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f560f44_8e76e2d7","line":1216,"range":{"start_line":1216,"start_character":51,"end_line":1216,"end_character":53},"in_reply_to":"9f560f44_2ed4f6bc","updated":"2020-08-19 13:22:50.000000000","message":"++","commit_id":"894788f2db4d07fa08ed560bc3ace5ba6a6f7a6b"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/impl_idl_ovn.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"aa6f7816692c13acf1bc6771a2fb10e372dcb05b","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    return tuple(get_ovn_idl_retry(c) for c in (OvsdbNbOvnIdl, OvsdbSbOvnIdl))"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"def get_connection(db_class, trigger\u003dNone, driver\u003dNone, binding_events\u003dFalse,"},{"line_number":151,"context_line":"                   chassis_private\u003dFalse):"},{"line_number":152,"context_line":"    if db_class \u003d\u003d OvsdbNbOvnIdl:"},{"line_number":153,"context_line":"        args \u003d (cfg.get_ovn_nb_connection(), \u0027OVN_Northbound\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_aeb77886","line":150,"range":{"start_line":150,"start_character":4,"end_line":150,"end_character":18},"updated":"2020-08-18 15:22:53.000000000","message":"Side note: I have grown to *hate* this function and get_ovn_idls. I can never actually follow what class is being instantiated where. I can say this, because I wrote the first version of it. :p","commit_id":"2340ec54cbe5e53861d64a6ad8cd8af8dad8f2c6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"0ec7ef376e0f7d0f544f4c17cf62bdac88071520","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    return tuple(get_ovn_idl_retry(c) for c in (OvsdbNbOvnIdl, OvsdbSbOvnIdl))"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"def get_connection(db_class, trigger\u003dNone, driver\u003dNone, binding_events\u003dFalse,"},{"line_number":151,"context_line":"                   chassis_private\u003dFalse):"},{"line_number":152,"context_line":"    if db_class \u003d\u003d OvsdbNbOvnIdl:"},{"line_number":153,"context_line":"        args \u003d (cfg.get_ovn_nb_connection(), \u0027OVN_Northbound\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_49085690","line":150,"range":{"start_line":150,"start_character":4,"end_line":150,"end_character":18},"in_reply_to":"9f560f44_aeb77886","updated":"2020-08-18 15:39:41.000000000","message":"lol at some point I understood these methods but it always confuses me as well, I need to look at it a couple of times before I start making sense of it. We need to refactor this part of the code.","commit_id":"2340ec54cbe5e53861d64a6ad8cd8af8dad8f2c6"},{"author":{"_account_id":11952,"name":"Flavio Fernandes","email":"flavio@flaviof.com","username":"ffernand"},"change_message_id":"639b627939d2ba1f9305955297b4772f54d83941","unresolved":false,"context_lines":[{"line_number":836,"context_line":"                if (r.mac and str(r.datapath.uuid) \u003d\u003d network) and"},{"line_number":837,"context_line":"                ip_address in r.mac[0].split(\u0027 \u0027)]"},{"line_number":838,"context_line":""},{"line_number":839,"context_line":"    def update_metadata_health_status(self, chassis, nb_cfg):"},{"line_number":840,"context_line":"        return cmd.UpdateChassisExtIdsCommand("},{"line_number":841,"context_line":"            self, chassis,"},{"line_number":842,"context_line":"            {ovn_const.OVN_AGENT_METADATA_SB_CFG_KEY: str(nb_cfg)},"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f560f44_2eed168b","side":"PARENT","line":839,"range":{"start_line":839,"start_character":8,"end_line":839,"end_character":37},"updated":"2020-08-19 13:18:07.000000000","message":"WOOT!","commit_id":"b4dad5bb3dbeb52c116b84a16f97ea6cb7d6abc2"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovsdb_monitor.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"aa6f7816692c13acf1bc6771a2fb10e372dcb05b","unresolved":false,"context_lines":[{"line_number":529,"context_line":"                    chassis_private\u003dFalse):"},{"line_number":530,"context_line":"        _check_and_set_ssl_files(schema_name)"},{"line_number":531,"context_line":"        helper \u003d idlutils.get_schema_helper(connection_string, schema_name)"},{"line_number":532,"context_line":"        if chassis_private:"},{"line_number":533,"context_line":"            helper.register_table(\u0027Chassis_Private\u0027)"},{"line_number":534,"context_line":"        helper.register_table(\u0027Chassis\u0027)"},{"line_number":535,"context_line":"        helper.register_table(\u0027Encap\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_09e13e2b","line":532,"range":{"start_line":532,"start_character":8,"end_line":532,"end_character":27},"updated":"2020-08-18 15:22:53.000000000","message":"I think we can make this a lot simpler by just inspecting the returned SchemaHelper object. It has a public schema_json attribute: https://github.com/openvswitch/ovs/blob/5601e86c4ec5268cf11b1b92308fd85a7b5cc0ab/python/ovs/db/idl.py#L1960\n\nwhich includes the tables in the schema. So we should just be able to do:\n\n if \u0027Chassis_Private\u0027 in helper.schema_json[\u0027tables\u0027]:\n     helper.register_table(\u0027Chassis_Private\u0027)\n\nand not deal with passing in chassis_private to the class, which I think will simplify things quite a bit (e.g., most impl_idl.py changes go away)","commit_id":"2340ec54cbe5e53861d64a6ad8cd8af8dad8f2c6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"0ec7ef376e0f7d0f544f4c17cf62bdac88071520","unresolved":false,"context_lines":[{"line_number":529,"context_line":"                    chassis_private\u003dFalse):"},{"line_number":530,"context_line":"        _check_and_set_ssl_files(schema_name)"},{"line_number":531,"context_line":"        helper \u003d idlutils.get_schema_helper(connection_string, schema_name)"},{"line_number":532,"context_line":"        if chassis_private:"},{"line_number":533,"context_line":"            helper.register_table(\u0027Chassis_Private\u0027)"},{"line_number":534,"context_line":"        helper.register_table(\u0027Chassis\u0027)"},{"line_number":535,"context_line":"        helper.register_table(\u0027Encap\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_69dc3a18","line":532,"range":{"start_line":532,"start_character":8,"end_line":532,"end_character":27},"in_reply_to":"9f560f44_09e13e2b","updated":"2020-08-18 15:39:41.000000000","message":"Oh that makes a lot of sense! Thanks, will do!","commit_id":"2340ec54cbe5e53861d64a6ad8cd8af8dad8f2c6"}],"neutron/tests/unit/fake_resources.py":[{"author":{"_account_id":11952,"name":"Flavio Fernandes","email":"flavio@flaviof.com","username":"ffernand"},"change_message_id":"639b627939d2ba1f9305955297b4772f54d83941","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        self.db_set \u003d mock.Mock()"},{"line_number":164,"context_line":"        self.lookup \u003d mock.MagicMock()"},{"line_number":165,"context_line":"        self.chassis_list \u003d mock.MagicMock()"},{"line_number":166,"context_line":"        self.is_table_present \u003d mock.Mock()"},{"line_number":167,"context_line":"        self.is_table_present.return_value \u003d False"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"class FakeOvsdbTransaction(object):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f560f44_6ee1cefc","line":167,"range":{"start_line":166,"start_character":32,"end_line":167,"end_character":50},"updated":"2020-08-19 13:18:07.000000000","message":"NIT: I know that is not the convention in this file but...\nI wonder if we should start saving a line by adding the return value in the Mock\u0027s init:\n\nself.is_table_present \u003d mock.Mock(return_value \u003d False)","commit_id":"894788f2db4d07fa08ed560bc3ace5ba6a6f7a6b"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"9a1d01a6fd8c2488e1e4a5c01c9f2307b18e4ca7","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        self.db_set \u003d mock.Mock()"},{"line_number":164,"context_line":"        self.lookup \u003d mock.MagicMock()"},{"line_number":165,"context_line":"        self.chassis_list \u003d mock.MagicMock()"},{"line_number":166,"context_line":"        self.is_table_present \u003d mock.Mock()"},{"line_number":167,"context_line":"        self.is_table_present.return_value \u003d False"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"class FakeOvsdbTransaction(object):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f560f44_d3d4fe49","line":167,"range":{"start_line":166,"start_character":32,"end_line":167,"end_character":50},"in_reply_to":"9f560f44_2e49968a","updated":"2020-08-20 04:42:50.000000000","message":"+++++++++++++++","commit_id":"894788f2db4d07fa08ed560bc3ace5ba6a6f7a6b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"455a250fe060716fa1fd60df724898a985c27272","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        self.db_set \u003d mock.Mock()"},{"line_number":164,"context_line":"        self.lookup \u003d mock.MagicMock()"},{"line_number":165,"context_line":"        self.chassis_list \u003d mock.MagicMock()"},{"line_number":166,"context_line":"        self.is_table_present \u003d mock.Mock()"},{"line_number":167,"context_line":"        self.is_table_present.return_value \u003d False"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"class FakeOvsdbTransaction(object):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f560f44_2e49968a","line":167,"range":{"start_line":166,"start_character":32,"end_line":167,"end_character":50},"in_reply_to":"9f560f44_6ee1cefc","updated":"2020-08-19 13:22:50.000000000","message":"Yeah we could, we actually should change this whole class IMHO.\n\nMaybe we should inherit from mock.Mock directly and just change the return value of some attribtues as needed (this would eliminate all the mock.Mock() instances without .return_values)","commit_id":"894788f2db4d07fa08ed560bc3ace5ba6a6f7a6b"}]}
