)]}'
{"ironic/common/exception.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"de6406c8ede0a5f87999064603d4a6709091b99f","unresolved":false,"context_lines":[{"line_number":834,"context_line":""},{"line_number":835,"context_line":""},{"line_number":836,"context_line":"class EventHandlerMethodNotImplemented(NotFound):"},{"line_number":837,"context_line":"    _msg_fmt \u003d _(\"Event handler method %(method)s for driver intreface \u0027\""},{"line_number":838,"context_line":"                 \"%(interface)s not implemented.\")"},{"line_number":839,"context_line":""},{"line_number":840,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_00b9f0ea","line":837,"updated":"2019-03-04 23:19:22.000000000","message":"nit s/intreface/interface/","commit_id":"2158787362a39bab3edb1e8ceaed6f65d5a3340e"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"3cdd15a295a3b06e79f91bc9f609c19f7ec17671","unresolved":false,"context_lines":[{"line_number":834,"context_line":""},{"line_number":835,"context_line":""},{"line_number":836,"context_line":"class EventHandlerMethodNotImplemented(NotFound):"},{"line_number":837,"context_line":"    _msg_fmt \u003d _(\"Event handler method %(method)s for driver intreface \u0027\""},{"line_number":838,"context_line":"                 \"%(interface)s not implemented.\")"},{"line_number":839,"context_line":""},{"line_number":840,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_ac21f1b7","line":837,"in_reply_to":"9fdfeff1_00b9f0ea","updated":"2019-03-05 16:58:15.000000000","message":"Done","commit_id":"2158787362a39bab3edb1e8ceaed6f65d5a3340e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"de6406c8ede0a5f87999064603d4a6709091b99f","unresolved":false,"context_lines":[{"line_number":835,"context_line":""},{"line_number":836,"context_line":"class EventHandlerMethodNotImplemented(NotFound):"},{"line_number":837,"context_line":"    _msg_fmt \u003d _(\"Event handler method %(method)s for driver intreface \u0027\""},{"line_number":838,"context_line":"                 \"%(interface)s not implemented.\")"},{"line_number":839,"context_line":""},{"line_number":840,"context_line":""},{"line_number":841,"context_line":"class EventHandlerMethodNotDefined(IronicException):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_a08ee42f","line":838,"updated":"2019-03-04 23:19:22.000000000","message":"nit s/not implemented/does not exist/\n\nWould it be useful to include the actual event?","commit_id":"2158787362a39bab3edb1e8ceaed6f65d5a3340e"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"3cdd15a295a3b06e79f91bc9f609c19f7ec17671","unresolved":false,"context_lines":[{"line_number":835,"context_line":""},{"line_number":836,"context_line":"class EventHandlerMethodNotImplemented(NotFound):"},{"line_number":837,"context_line":"    _msg_fmt \u003d _(\"Event handler method %(method)s for driver intreface \u0027\""},{"line_number":838,"context_line":"                 \"%(interface)s not implemented.\")"},{"line_number":839,"context_line":""},{"line_number":840,"context_line":""},{"line_number":841,"context_line":"class EventHandlerMethodNotDefined(IronicException):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_cc1eb573","line":838,"in_reply_to":"9fdfeff1_a08ee42f","updated":"2019-03-05 16:58:15.000000000","message":"Done\n\nCurrently we don\u0027t pass the event to the method that would raise this.","commit_id":"2158787362a39bab3edb1e8ceaed6f65d5a3340e"}],"ironic/conductor/events.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"de6406c8ede0a5f87999064603d4a6709091b99f","unresolved":false,"context_lines":[{"line_number":26,"context_line":"METRICS \u003d metrics_utils.get_metrics_logger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def get_interface_driver(task, event_type):"},{"line_number":30,"context_line":"    \"\"\"Get task interface driver for event"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    :param task: a TaskManager instance with an exclusive lock"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_208c3434","line":29,"updated":"2019-03-04 23:19:22.000000000","message":"is it \u0027interface_driver\u0027 or \u0027driver_interface\u0027?\n\nActually, our docs [1] seem to indicate it is a \u0027hardware interface\u0027, so lets stick with that? \n\nBoth \u0027driver\u0027 and \u0027interface\u0027 are overloaded.\n\n[1] https://docs.openstack.org/ironic/latest/install/enabling-drivers.html#enabling-hardware-interfaces","commit_id":"2158787362a39bab3edb1e8ceaed6f65d5a3340e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"de6406c8ede0a5f87999064603d4a6709091b99f","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    :param task: a TaskManager instance with an exclusive lock"},{"line_number":33,"context_line":"    :param event_type: Event driver interface type"},{"line_number":34,"context_line":"    :returns Driver interface"},{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":"    try:"},{"line_number":37,"context_line":"        return getattr(task.driver, event_type)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_c080c8fa","line":34,"updated":"2019-03-04 23:19:22.000000000","message":"lets be more specific here. What is this?","commit_id":"2158787362a39bab3edb1e8ceaed6f65d5a3340e"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"3cdd15a295a3b06e79f91bc9f609c19f7ec17671","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    :param task: a TaskManager instance with an exclusive lock"},{"line_number":33,"context_line":"    :param event_type: Event driver interface type"},{"line_number":34,"context_line":"    :returns Driver interface"},{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":"    try:"},{"line_number":37,"context_line":"        return getattr(task.driver, event_type)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_179b6666","line":34,"in_reply_to":"9fdfeff1_c080c8fa","updated":"2019-03-05 16:58:15.000000000","message":"Done","commit_id":"2158787362a39bab3edb1e8ceaed6f65d5a3340e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"de6406c8ede0a5f87999064603d4a6709091b99f","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    driver \u003d get_interface_driver(task, event_type)"},{"line_number":54,"context_line":"    try:"},{"line_number":55,"context_line":"        method_name \u003d task.node.driver_internal_info[\u0027waiting_for\u0027][event_type]"},{"line_number":56,"context_line":"    except KeyError:"},{"line_number":57,"context_line":"        raise exception.EventHandlerMethodNotDefined(node\u003dnode.uuid,"},{"line_number":58,"context_line":"                                                     event_type\u003devent_type)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_746d1d98","line":55,"updated":"2019-03-04 23:19:22.000000000","message":"if i understand this code, if event_type \u003d\u003d \u0027network\u0027 (which it will be in our case cuz that\u0027s the only event type), the value in task.node.driver_internal_info[\u0027waiting_for\u0027] is a dictionary with eg {\u0027network\u0027: configure_tenant_networks} ?","commit_id":"2158787362a39bab3edb1e8ceaed6f65d5a3340e"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"3cdd15a295a3b06e79f91bc9f609c19f7ec17671","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    driver \u003d get_interface_driver(task, event_type)"},{"line_number":54,"context_line":"    try:"},{"line_number":55,"context_line":"        method_name \u003d task.node.driver_internal_info[\u0027waiting_for\u0027][event_type]"},{"line_number":56,"context_line":"    except KeyError:"},{"line_number":57,"context_line":"        raise exception.EventHandlerMethodNotDefined(node\u003dnode.uuid,"},{"line_number":58,"context_line":"                                                     event_type\u003devent_type)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_f7e342d7","line":55,"in_reply_to":"9fdfeff1_746d1d98","updated":"2019-03-05 16:58:15.000000000","message":"Yes, this is correct.","commit_id":"2158787362a39bab3edb1e8ceaed6f65d5a3340e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"de6406c8ede0a5f87999064603d4a6709091b99f","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        method_name \u003d task.node.driver_internal_info[\u0027waiting_for\u0027][event_type]"},{"line_number":56,"context_line":"    except KeyError:"},{"line_number":57,"context_line":"        raise exception.EventHandlerMethodNotDefined(node\u003dnode.uuid,"},{"line_number":58,"context_line":"                                                     event_type\u003devent_type)"},{"line_number":59,"context_line":"    try:"},{"line_number":60,"context_line":"        return getattr(driver.event_handler, method_name)"},{"line_number":61,"context_line":"    except AttributeError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_743afdc4","line":58,"updated":"2019-03-04 23:19:22.000000000","message":"this could be due to 2? things:\n1. driver_internal_info[\u0027waiting_for\u0027] doesn\u0027t actually exist\n2. driver_internal_info[\u0027waiting_for\u0027][event_type] doesn\u0027t exist.\nwe should have different exceptions/messages.","commit_id":"2158787362a39bab3edb1e8ceaed6f65d5a3340e"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"3cdd15a295a3b06e79f91bc9f609c19f7ec17671","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        method_name \u003d task.node.driver_internal_info[\u0027waiting_for\u0027][event_type]"},{"line_number":56,"context_line":"    except KeyError:"},{"line_number":57,"context_line":"        raise exception.EventHandlerMethodNotDefined(node\u003dnode.uuid,"},{"line_number":58,"context_line":"                                                     event_type\u003devent_type)"},{"line_number":59,"context_line":"    try:"},{"line_number":60,"context_line":"        return getattr(driver.event_handler, method_name)"},{"line_number":61,"context_line":"    except AttributeError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_1785a6cf","line":58,"in_reply_to":"9fdfeff1_743afdc4","updated":"2019-03-05 16:58:15.000000000","message":"Done","commit_id":"2158787362a39bab3edb1e8ceaed6f65d5a3340e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"de6406c8ede0a5f87999064603d4a6709091b99f","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    try:"},{"line_number":135,"context_line":"        LOG.debug(\u0027Calling event handler for node %(node)s event \u0027"},{"line_number":136,"context_line":"                  \u0027%(event)s.\u0027, {\u0027node\u0027: node.uuid, \u0027event\u0027: event[\u0027event\u0027]})"},{"line_number":137,"context_line":"        if event_handler(task):"},{"line_number":138,"context_line":"            do_callback(obj, task.context, node.uuid)"},{"line_number":139,"context_line":"    # NOTE(hjensas): Using general Exception here, as this is generic for any"},{"line_number":140,"context_line":"    # event type."}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_54f579cb","line":137,"updated":"2019-03-04 23:19:22.000000000","message":"this is invoking the eg network interface method. why aren\u0027t we passing the event information to it?","commit_id":"2158787362a39bab3edb1e8ceaed6f65d5a3340e"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"3cdd15a295a3b06e79f91bc9f609c19f7ec17671","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    try:"},{"line_number":135,"context_line":"        LOG.debug(\u0027Calling event handler for node %(node)s event \u0027"},{"line_number":136,"context_line":"                  \u0027%(event)s.\u0027, {\u0027node\u0027: node.uuid, \u0027event\u0027: event[\u0027event\u0027]})"},{"line_number":137,"context_line":"        if event_handler(task):"},{"line_number":138,"context_line":"            do_callback(obj, task.context, node.uuid)"},{"line_number":139,"context_line":"    # NOTE(hjensas): Using general Exception here, as this is generic for any"},{"line_number":140,"context_line":"    # event type."}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_86164949","line":137,"in_reply_to":"9fdfeff1_54f579cb","updated":"2019-03-05 16:58:15.000000000","message":"The example event handler in the spec does not take the event. And for network port events I don\u0027t think we need it.\n\nBut other hardware interface drivers may need it.\n\nShould we move the code that stores \u0027network_status\u0027 to the event handler?","commit_id":"2158787362a39bab3edb1e8ceaed6f65d5a3340e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"de6406c8ede0a5f87999064603d4a6709091b99f","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    wait_exponential_multiplier\u003d(CONF.conductor.node_locked_retry_interval *"},{"line_number":153,"context_line":"                                 1000),"},{"line_number":154,"context_line":"    wait_exponential_max\u003dCONF.conductor.node_locked_retry_interval * 10000)"},{"line_number":155,"context_line":"def process_network_port_event(obj, context, node_id, event):"},{"line_number":156,"context_line":"    \"\"\"Process network port event"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    :param context: request context."}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_6071dc44","line":155,"updated":"2019-03-04 23:19:22.000000000","message":"what is this \u0027obj\u0027?","commit_id":"2158787362a39bab3edb1e8ceaed6f65d5a3340e"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"3cdd15a295a3b06e79f91bc9f609c19f7ec17671","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    wait_exponential_multiplier\u003d(CONF.conductor.node_locked_retry_interval *"},{"line_number":153,"context_line":"                                 1000),"},{"line_number":154,"context_line":"    wait_exponential_max\u003dCONF.conductor.node_locked_retry_interval * 10000)"},{"line_number":155,"context_line":"def process_network_port_event(obj, context, node_id, event):"},{"line_number":156,"context_line":"    \"\"\"Process network port event"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    :param context: request context."}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_f27fd0dc","line":155,"in_reply_to":"9fdfeff1_6071dc44","updated":"2019-03-05 16:58:15.000000000","message":"it is the conductor manager class. This is why I passed self.\n\nI switched to use importutils instead.","commit_id":"2158787362a39bab3edb1e8ceaed6f65d5a3340e"}],"ironic/conductor/manager.py":[{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9777bad75dc88eda0eee46001b8eba81a349d615","unresolved":false,"context_lines":[{"line_number":3532,"context_line":""},{"line_number":3533,"context_line":"    @METRICS.timer(\u0027ConductorManager.process_event\u0027)"},{"line_number":3534,"context_line":"    def process_event(self, context, node_id, event):"},{"line_number":3535,"context_line":"        with task_manager.acquire(context, node_id, shared\u003dTrue,"},{"line_number":3536,"context_line":"                                  purpose\u003d\u0027processing event\u0027) as task:"},{"line_number":3537,"context_line":""},{"line_number":3538,"context_line":"            node \u003d task.node"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_02cc3c33","line":3535,"range":{"start_line":3535,"start_character":52,"end_line":3535,"end_character":63},"updated":"2019-02-25 11:20:15.000000000","message":"As in the other review, should be shared?","commit_id":"51ca38ec7922d17015cb85c4a65648941261f0af"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0566f9e80e10bb61aecc10d0a2a3f4fbd7e3f19f","unresolved":false,"context_lines":[{"line_number":3554,"context_line":"                          {\u0027node\u0027: node.uuid, \u0027driver\u0027: interface})"},{"line_number":3555,"context_line":"                return"},{"line_number":3556,"context_line":""},{"line_number":3557,"context_line":"            LOG.info(\u0027Calling event handler for node %(node)s event\u0027"},{"line_number":3558,"context_line":"                     \u0027%(event)s.\u0027, {\u0027node\u0027: node.uuid,"},{"line_number":3559,"context_line":"                                    \u0027event\u0027: event[\u0027event\u0027]})"},{"line_number":3560,"context_line":"            event_handler \u003d getattr(interface_driver.event_handler,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_b1106a51","line":3557,"updated":"2019-02-20 15:14:02.000000000","message":"nit: missing space after \"event\"","commit_id":"51ca38ec7922d17015cb85c4a65648941261f0af"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9777bad75dc88eda0eee46001b8eba81a349d615","unresolved":false,"context_lines":[{"line_number":3557,"context_line":"            LOG.info(\u0027Calling event handler for node %(node)s event\u0027"},{"line_number":3558,"context_line":"                     \u0027%(event)s.\u0027, {\u0027node\u0027: node.uuid,"},{"line_number":3559,"context_line":"                                    \u0027event\u0027: event[\u0027event\u0027]})"},{"line_number":3560,"context_line":"            event_handler \u003d getattr(interface_driver.event_handler,"},{"line_number":3561,"context_line":"                                    event_handler_method)"},{"line_number":3562,"context_line":"            callback_data \u003d self.callbacks.get(node.uuid)"},{"line_number":3563,"context_line":""},{"line_number":3564,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_42a4844b","line":3561,"range":{"start_line":3560,"start_character":12,"end_line":3561,"end_character":57},"updated":"2019-02-25 11:20:15.000000000","message":"It\u0027s not inconceivable that this could go wrong, maybe catch AttributeErrors and raise something more helpful?","commit_id":"51ca38ec7922d17015cb85c4a65648941261f0af"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0566f9e80e10bb61aecc10d0a2a3f4fbd7e3f19f","unresolved":false,"context_lines":[{"line_number":3572,"context_line":""},{"line_number":3573,"context_line":"            if result and callback_data is not None:"},{"line_number":3574,"context_line":"                callback \u003d getattr(self, callback_data[\u0027callback\u0027])"},{"line_number":3575,"context_line":"                callback(task.context, node.uuid, *callback_data.get(\u0027args\u0027))"},{"line_number":3576,"context_line":""},{"line_number":3577,"context_line":""},{"line_number":3578,"context_line":"@METRICS.timer(\u0027get_vendor_passthru_metadata\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_d10dee35","line":3575,"updated":"2019-02-20 15:14:02.000000000","message":"I must admit I\u0027m already confused by the number of getattrs.. Maybe split out a few helper methods with clearer purpose?","commit_id":"51ca38ec7922d17015cb85c4a65648941261f0af"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9777bad75dc88eda0eee46001b8eba81a349d615","unresolved":false,"context_lines":[{"line_number":3572,"context_line":""},{"line_number":3573,"context_line":"            if result and callback_data is not None:"},{"line_number":3574,"context_line":"                callback \u003d getattr(self, callback_data[\u0027callback\u0027])"},{"line_number":3575,"context_line":"                callback(task.context, node.uuid, *callback_data.get(\u0027args\u0027))"},{"line_number":3576,"context_line":""},{"line_number":3577,"context_line":""},{"line_number":3578,"context_line":"@METRICS.timer(\u0027get_vendor_passthru_metadata\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_42dd64db","line":3575,"in_reply_to":"9fdfeff1_d10dee35","updated":"2019-02-25 11:20:15.000000000","message":"+1. I\u0027d say it wouldn\u0027t hurt to start a new file here - conductor/events.py? It could contain a class that abstracts away some of the callback handling logic and state, then the conductor could own an instance of the class.","commit_id":"51ca38ec7922d17015cb85c4a65648941261f0af"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"de6406c8ede0a5f87999064603d4a6709091b99f","unresolved":false,"context_lines":[{"line_number":3586,"context_line":"            raise exception.EventProcessorNotImplemtented(event\u003de)"},{"line_number":3587,"context_line":""},{"line_number":3588,"context_line":"        # Spawn an asynchronous worker to process the event."},{"line_number":3589,"context_line":"        self._spawn_worker(event_processor, self, context, node_id, event)"},{"line_number":3590,"context_line":""},{"line_number":3591,"context_line":""},{"line_number":3592,"context_line":"@METRICS.timer(\u0027get_vendor_passthru_metadata\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_40a8581f","line":3589,"updated":"2019-03-04 23:19:22.000000000","message":"hmm, not sure it makes sense to pass self, given that we are spawning a NEW worker","commit_id":"2158787362a39bab3edb1e8ceaed6f65d5a3340e"}],"ironic/drivers/base.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"de6406c8ede0a5f87999064603d4a6709091b99f","unresolved":false,"context_lines":[{"line_number":1224,"context_line":""},{"line_number":1225,"context_line":"    interface_type \u003d \u0027network\u0027"},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":"    event_handler \u003d None"},{"line_number":1228,"context_line":""},{"line_number":1229,"context_line":"    def get_properties(self):"},{"line_number":1230,"context_line":"        \"\"\"Return the properties of the interface."}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_60ed5cb6","line":1227,"updated":"2019-03-04 23:19:22.000000000","message":"I wonder if this should be s/None/BaseNetworkEventHandler/\n\nAnd if it is... hmm, do we want calls to that event handler to pass or fail.\n\nAlso wondering how/if we need to deal with backwards compatibility (when eg upgrading) and out-of-tree drivers.","commit_id":"2158787362a39bab3edb1e8ceaed6f65d5a3340e"}]}
