)]}'
{"doc/source/contributor/drivers_architecture.rst":[{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":55,"context_line":"that in case of a commit failure the journal entry gets aborted along with the"},{"line_number":56,"context_line":"original operation, and there\u0027s nothing extra needed."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"*get_resources* method is defined in the BaseDriver class, which"},{"line_number":59,"context_line":"fetches all the resources of single type for full sync, based on resource"},{"line_number":60,"context_line":"type. To override default behaviour of *get_resources*, for providing"},{"line_number":61,"context_line":"customization(pre/post processing etc) specific to a resource,"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_30fe8dae","line":58,"range":{"start_line":58,"start_character":0,"end_line":58,"end_character":15},"updated":"2017-11-22 12:41:08.000000000","message":"The ...","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":55,"context_line":"that in case of a commit failure the journal entry gets aborted along with the"},{"line_number":56,"context_line":"original operation, and there\u0027s nothing extra needed."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"*get_resources* method is defined in the BaseDriver class, which"},{"line_number":59,"context_line":"fetches all the resources of single type for full sync, based on resource"},{"line_number":60,"context_line":"type. To override default behaviour of *get_resources*, for providing"},{"line_number":61,"context_line":"customization(pre/post processing etc) specific to a resource,"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_50223154","line":58,"range":{"start_line":58,"start_character":59,"end_line":58,"end_character":64},"updated":"2017-11-22 12:41:08.000000000","message":"it","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"c4a9ea6021ce5c5cf0c394a7c1bd7a0330285aa0","unresolved":false,"context_lines":[{"line_number":55,"context_line":"that in case of a commit failure the journal entry gets aborted along with the"},{"line_number":56,"context_line":"original operation, and there\u0027s nothing extra needed."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"*get_resources* method is defined in the BaseDriver class, which"},{"line_number":59,"context_line":"fetches all the resources of single type for full sync, based on resource"},{"line_number":60,"context_line":"type. To override default behaviour of *get_resources*, for providing"},{"line_number":61,"context_line":"customization(pre/post processing etc) specific to a resource,"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_bc3033ea","line":58,"range":{"start_line":58,"start_character":0,"end_line":58,"end_character":15},"in_reply_to":"ff82abbf_30fe8dae","updated":"2017-11-24 06:53:55.000000000","message":"Done","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"c4a9ea6021ce5c5cf0c394a7c1bd7a0330285aa0","unresolved":false,"context_lines":[{"line_number":55,"context_line":"that in case of a commit failure the journal entry gets aborted along with the"},{"line_number":56,"context_line":"original operation, and there\u0027s nothing extra needed."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"*get_resources* method is defined in the BaseDriver class, which"},{"line_number":59,"context_line":"fetches all the resources of single type for full sync, based on resource"},{"line_number":60,"context_line":"type. To override default behaviour of *get_resources*, for providing"},{"line_number":61,"context_line":"customization(pre/post processing etc) specific to a resource,"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_5c4d6770","line":58,"range":{"start_line":58,"start_character":59,"end_line":58,"end_character":64},"in_reply_to":"ff82abbf_50223154","updated":"2017-11-24 06:53:55.000000000","message":"Done","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":56,"context_line":"original operation, and there\u0027s nothing extra needed."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"*get_resources* method is defined in the BaseDriver class, which"},{"line_number":59,"context_line":"fetches all the resources of single type for full sync, based on resource"},{"line_number":60,"context_line":"type. To override default behaviour of *get_resources*, for providing"},{"line_number":61,"context_line":"customization(pre/post processing etc) specific to a resource,"},{"line_number":62,"context_line":"*get_resources* method is overriden in driver class. For examples"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_10ca696c","line":60,"range":{"start_line":59,"start_character":8,"end_line":60,"end_character":5},"updated":"2017-11-22 12:41:08.000000000","message":"all resources needed for a full sync, based on the resource type.","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"*get_resources* method is defined in the BaseDriver class, which"},{"line_number":59,"context_line":"fetches all the resources of single type for full sync, based on resource"},{"line_number":60,"context_line":"type. To override default behaviour of *get_resources*, for providing"},{"line_number":61,"context_line":"customization(pre/post processing etc) specific to a resource,"},{"line_number":62,"context_line":"*get_resources* method is overriden in driver class. For examples"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_d0a161ab","line":60,"range":{"start_line":60,"start_character":17,"end_line":60,"end_character":18},"updated":"2017-11-22 12:41:08.000000000","message":"the","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"c4a9ea6021ce5c5cf0c394a7c1bd7a0330285aa0","unresolved":false,"context_lines":[{"line_number":56,"context_line":"original operation, and there\u0027s nothing extra needed."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"*get_resources* method is defined in the BaseDriver class, which"},{"line_number":59,"context_line":"fetches all the resources of single type for full sync, based on resource"},{"line_number":60,"context_line":"type. To override default behaviour of *get_resources*, for providing"},{"line_number":61,"context_line":"customization(pre/post processing etc) specific to a resource,"},{"line_number":62,"context_line":"*get_resources* method is overriden in driver class. For examples"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_7c506b0b","line":60,"range":{"start_line":59,"start_character":8,"end_line":60,"end_character":5},"in_reply_to":"ff82abbf_10ca696c","updated":"2017-11-24 06:53:55.000000000","message":"Done","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"c4a9ea6021ce5c5cf0c394a7c1bd7a0330285aa0","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"*get_resources* method is defined in the BaseDriver class, which"},{"line_number":59,"context_line":"fetches all the resources of single type for full sync, based on resource"},{"line_number":60,"context_line":"type. To override default behaviour of *get_resources*, for providing"},{"line_number":61,"context_line":"customization(pre/post processing etc) specific to a resource,"},{"line_number":62,"context_line":"*get_resources* method is overriden in driver class. For examples"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_3c5ae329","line":60,"range":{"start_line":60,"start_character":17,"end_line":60,"end_character":18},"in_reply_to":"ff82abbf_d0a161ab","updated":"2017-11-24 06:53:55.000000000","message":"Done","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"*get_resources* method is defined in the BaseDriver class, which"},{"line_number":59,"context_line":"fetches all the resources of single type for full sync, based on resource"},{"line_number":60,"context_line":"type. To override default behaviour of *get_resources*, for providing"},{"line_number":61,"context_line":"customization(pre/post processing etc) specific to a resource,"},{"line_number":62,"context_line":"*get_resources* method is overriden in driver class. For examples"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"  #. L2 gateway driver needs to provide customized method for filtering of"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_5095513f","line":61,"range":{"start_line":60,"start_character":56,"end_line":61,"end_character":62},"updated":"2017-11-22 12:41:08.000000000","message":"irrelevant to have this","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"c4a9ea6021ce5c5cf0c394a7c1bd7a0330285aa0","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"*get_resources* method is defined in the BaseDriver class, which"},{"line_number":59,"context_line":"fetches all the resources of single type for full sync, based on resource"},{"line_number":60,"context_line":"type. To override default behaviour of *get_resources*, for providing"},{"line_number":61,"context_line":"customization(pre/post processing etc) specific to a resource,"},{"line_number":62,"context_line":"*get_resources* method is overriden in driver class. For examples"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"  #. L2 gateway driver needs to provide customized method for filtering of"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_dc409738","line":61,"range":{"start_line":60,"start_character":56,"end_line":61,"end_character":62},"in_reply_to":"ff82abbf_5095513f","updated":"2017-11-24 06:53:55.000000000","message":"Done","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":59,"context_line":"fetches all the resources of single type for full sync, based on resource"},{"line_number":60,"context_line":"type. To override default behaviour of *get_resources*, for providing"},{"line_number":61,"context_line":"customization(pre/post processing etc) specific to a resource,"},{"line_number":62,"context_line":"*get_resources* method is overriden in driver class. For examples"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"  #. L2 gateway driver needs to provide customized method for filtering of"},{"line_number":65,"context_line":"     fetched gateway connection information from database. Neutron"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_d08f2121","line":62,"range":{"start_line":62,"start_character":57,"end_line":62,"end_character":65},"updated":"2017-11-22 12:41:08.000000000","message":"example,","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":59,"context_line":"fetches all the resources of single type for full sync, based on resource"},{"line_number":60,"context_line":"type. To override default behaviour of *get_resources*, for providing"},{"line_number":61,"context_line":"customization(pre/post processing etc) specific to a resource,"},{"line_number":62,"context_line":"*get_resources* method is overriden in driver class. For examples"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"  #. L2 gateway driver needs to provide customized method for filtering of"},{"line_number":65,"context_line":"     fetched gateway connection information from database. Neutron"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_3073ed4f","line":62,"range":{"start_line":62,"start_character":0,"end_line":62,"end_character":51},"updated":"2017-11-22 12:41:08.000000000","message":"it is expected the method to be overriden in the driver class that inherits from BaseDriver","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"c4a9ea6021ce5c5cf0c394a7c1bd7a0330285aa0","unresolved":false,"context_lines":[{"line_number":59,"context_line":"fetches all the resources of single type for full sync, based on resource"},{"line_number":60,"context_line":"type. To override default behaviour of *get_resources*, for providing"},{"line_number":61,"context_line":"customization(pre/post processing etc) specific to a resource,"},{"line_number":62,"context_line":"*get_resources* method is overriden in driver class. For examples"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"  #. L2 gateway driver needs to provide customized method for filtering of"},{"line_number":65,"context_line":"     fetched gateway connection information from database. Neutron"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_9c4a0f53","line":62,"range":{"start_line":62,"start_character":0,"end_line":62,"end_character":51},"in_reply_to":"ff82abbf_3073ed4f","updated":"2017-11-24 06:53:55.000000000","message":"Done","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"c4a9ea6021ce5c5cf0c394a7c1bd7a0330285aa0","unresolved":false,"context_lines":[{"line_number":59,"context_line":"fetches all the resources of single type for full sync, based on resource"},{"line_number":60,"context_line":"type. To override default behaviour of *get_resources*, for providing"},{"line_number":61,"context_line":"customization(pre/post processing etc) specific to a resource,"},{"line_number":62,"context_line":"*get_resources* method is overriden in driver class. For examples"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"  #. L2 gateway driver needs to provide customized method for filtering of"},{"line_number":65,"context_line":"     fetched gateway connection information from database. Neutron"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_bc459345","line":62,"range":{"start_line":62,"start_character":57,"end_line":62,"end_character":65},"in_reply_to":"ff82abbf_d08f2121","updated":"2017-11-24 06:53:55.000000000","message":"Done","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":65,"context_line":"     fetched gateway connection information from database. Neutron"},{"line_number":66,"context_line":"     defines *l2_gateway_id* for a l2 gateway connection but ODL expects"},{"line_number":67,"context_line":"     *gateway_id*, these kind of pre or post processing can be done in this"},{"line_number":68,"context_line":"     method"},{"line_number":69,"context_line":"  #. For lbaas driver, as per default resource fetching mechanism, it looks for"},{"line_number":70,"context_line":"     *get_member* but *get_pool_member* is defined in lbaas plugin, these"},{"line_number":71,"context_line":"     kind of inconsistencies can be handled in *get_resources* method."}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_9099996f","line":68,"updated":"2017-11-22 12:41:08.000000000","message":"missing .","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"c4a9ea6021ce5c5cf0c394a7c1bd7a0330285aa0","unresolved":false,"context_lines":[{"line_number":65,"context_line":"     fetched gateway connection information from database. Neutron"},{"line_number":66,"context_line":"     defines *l2_gateway_id* for a l2 gateway connection but ODL expects"},{"line_number":67,"context_line":"     *gateway_id*, these kind of pre or post processing can be done in this"},{"line_number":68,"context_line":"     method"},{"line_number":69,"context_line":"  #. For lbaas driver, as per default resource fetching mechanism, it looks for"},{"line_number":70,"context_line":"     *get_member* but *get_pool_member* is defined in lbaas plugin, these"},{"line_number":71,"context_line":"     kind of inconsistencies can be handled in *get_resources* method."}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_1c703fa5","line":68,"in_reply_to":"ff82abbf_9099996f","updated":"2017-11-24 06:53:55.000000000","message":"Done","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":67,"context_line":"     *gateway_id*, these kind of pre or post processing can be done in this"},{"line_number":68,"context_line":"     method"},{"line_number":69,"context_line":"  #. For lbaas driver, as per default resource fetching mechanism, it looks for"},{"line_number":70,"context_line":"     *get_member* but *get_pool_member* is defined in lbaas plugin, these"},{"line_number":71,"context_line":"     kind of inconsistencies can be handled in *get_resources* method."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"Journal Entry Lifecycle"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_90e759e5","line":70,"range":{"start_line":70,"start_character":22,"end_line":70,"end_character":66},"updated":"2017-11-22 12:41:08.000000000","message":"instead the lbaas plugin defines *get_pool_member*","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"c4a9ea6021ce5c5cf0c394a7c1bd7a0330285aa0","unresolved":false,"context_lines":[{"line_number":67,"context_line":"     *gateway_id*, these kind of pre or post processing can be done in this"},{"line_number":68,"context_line":"     method"},{"line_number":69,"context_line":"  #. For lbaas driver, as per default resource fetching mechanism, it looks for"},{"line_number":70,"context_line":"     *get_member* but *get_pool_member* is defined in lbaas plugin, these"},{"line_number":71,"context_line":"     kind of inconsistencies can be handled in *get_resources* method."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"Journal Entry Lifecycle"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_3ccf43b1","line":70,"range":{"start_line":70,"start_character":22,"end_line":70,"end_character":66},"in_reply_to":"ff82abbf_90e759e5","updated":"2017-11-24 06:53:55.000000000","message":"Done","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":67,"context_line":"     *gateway_id*, these kind of pre or post processing can be done in this"},{"line_number":68,"context_line":"     method"},{"line_number":69,"context_line":"  #. For lbaas driver, as per default resource fetching mechanism, it looks for"},{"line_number":70,"context_line":"     *get_member* but *get_pool_member* is defined in lbaas plugin, these"},{"line_number":71,"context_line":"     kind of inconsistencies can be handled in *get_resources* method."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"Journal Entry Lifecycle"},{"line_number":74,"context_line":"-----------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_d0064187","line":71,"range":{"start_line":70,"start_character":68,"end_line":71,"end_character":69},"updated":"2017-11-22 12:41:08.000000000","message":"by overriding the *get_resources* method it is possible to solve this inconsistency.","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"c4a9ea6021ce5c5cf0c394a7c1bd7a0330285aa0","unresolved":false,"context_lines":[{"line_number":67,"context_line":"     *gateway_id*, these kind of pre or post processing can be done in this"},{"line_number":68,"context_line":"     method"},{"line_number":69,"context_line":"  #. For lbaas driver, as per default resource fetching mechanism, it looks for"},{"line_number":70,"context_line":"     *get_member* but *get_pool_member* is defined in lbaas plugin, these"},{"line_number":71,"context_line":"     kind of inconsistencies can be handled in *get_resources* method."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"Journal Entry Lifecycle"},{"line_number":74,"context_line":"-----------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ff82abbf_dcc5f78f","line":71,"range":{"start_line":70,"start_character":68,"end_line":71,"end_character":69},"in_reply_to":"ff82abbf_d0064187","updated":"2017-11-24 06:53:55.000000000","message":"Done","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"8a59461dc45359f00d37bcfb6e3cc196ace905e4","unresolved":false,"context_lines":[{"line_number":55,"context_line":"that in case of a commit failure the journal entry gets aborted along with the"},{"line_number":56,"context_line":"original operation, and there\u0027s nothing extra needed."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"The *get_resources* method is defined in the ResourceBaseDriver class, it"},{"line_number":59,"context_line":"fetches all the resources needed for full sync, based on resource type."},{"line_number":60,"context_line":"To override the default behaviour of *get_resources*. For example"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"df87a7cf_0d680b1f","line":58,"range":{"start_line":58,"start_character":4,"end_line":58,"end_character":19},"updated":"2017-12-05 15:16:29.000000000","message":"needs to update it.","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"}],"networking_odl/common/exceptions.py":[{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"504058bb8798ea473277100a82d48ccbadac30c3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"df87a7cf_2f098830","updated":"2017-12-13 09:41:02.000000000","message":"I would add a small docstring in each exception.","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"51ba6a29439fccf883a4d4d6aee1fdd5a3861891","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"df87a7cf_bc3e1cd8","in_reply_to":"df87a7cf_2f098830","updated":"2017-12-14 06:15:20.000000000","message":"I think, exceptions are self explanatory. Could you please give one example?","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"e31aceea4180bfe84d003225a813c735564e5844","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"df87a7cf_dc228eb9","in_reply_to":"df87a7cf_ba829cff","updated":"2017-12-19 07:10:55.000000000","message":"I think, they(neutron_lib) follow that convention. I still think, exceptions are self explanatory see neutron code https://github.com/openstack/neutron/blob/master/neutron/common/exceptions.py .","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"f94419330f6f921c2b9eeaf3840c8cfe1b8f7cf0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"df87a7cf_ba829cff","in_reply_to":"df87a7cf_bc3e1cd8","updated":"2017-12-18 09:36:04.000000000","message":"See how they document them\n\nhttps://github.com/openstack/neutron-lib/blob/master/neutron_lib/exceptions/__init__.py","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"504058bb8798ea473277100a82d48ccbadac30c3","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class NetworkingODLException(exceptions.NeutronException):"},{"line_number":21,"context_line":"    message \u003d _(\"Unknown exception ocurred in networking-odl\")"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class FullSyncError(NetworkingODLException):"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_af1d9874","line":21,"range":{"start_line":21,"start_character":4,"end_line":21,"end_character":62},"updated":"2017-12-13 09:41:02.000000000","message":"I wouldn\u0027t put a message here.","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"51ba6a29439fccf883a4d4d6aee1fdd5a3861891","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class NetworkingODLException(exceptions.NeutronException):"},{"line_number":21,"context_line":"    message \u003d _(\"Unknown exception ocurred in networking-odl\")"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class FullSyncError(NetworkingODLException):"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_1c2dc8a7","line":21,"range":{"start_line":21,"start_character":4,"end_line":21,"end_character":62},"in_reply_to":"df87a7cf_af1d9874","updated":"2017-12-14 06:15:20.000000000","message":"Done","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"504058bb8798ea473277100a82d48ccbadac30c3","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    pass"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class PluginMethodNotFound(exceptions.NotFound):"},{"line_number":33,"context_line":"    message \u003d _(\"%(method)s not found in %(plugin)s\")"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_ef29609b","line":32,"range":{"start_line":32,"start_character":6,"end_line":32,"end_character":47},"updated":"2017-12-13 09:41:02.000000000","message":"AttributeError ?\n\nEither use that or inherit from that.","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"51ba6a29439fccf883a4d4d6aee1fdd5a3861891","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    pass"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class PluginMethodNotFound(exceptions.NotFound):"},{"line_number":33,"context_line":"    message \u003d _(\"%(method)s not found in %(plugin)s\")"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_dc18c085","line":32,"range":{"start_line":32,"start_character":6,"end_line":32,"end_character":47},"in_reply_to":"df87a7cf_ef29609b","updated":"2017-12-14 06:15:20.000000000","message":"Done","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"}],"networking_odl/journal/base_driver.py":[{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"\"\"\"Base class for all the drivers to support full sync"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"   This class acts as base class for all the drivers and provides default"},{"line_number":18,"context_line":"   behaviour for full sync functionality."},{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from neutron_lib.plugins import directory"},{"line_number":22,"context_line":"from oslo_log import log as logging"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_50fa3175","line":19,"range":{"start_line":15,"start_character":0,"end_line":19,"end_character":3},"updated":"2017-11-22 12:41:08.000000000","message":"What Base class is this docstring referring to?","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"c4a9ea6021ce5c5cf0c394a7c1bd7a0330285aa0","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"\"\"\"Base class for all the drivers to support full sync"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"   This class acts as base class for all the drivers and provides default"},{"line_number":18,"context_line":"   behaviour for full sync functionality."},{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from neutron_lib.plugins import directory"},{"line_number":22,"context_line":"from oslo_log import log as logging"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_7cbb8bc3","line":19,"range":{"start_line":15,"start_character":0,"end_line":19,"end_character":3},"in_reply_to":"ff82abbf_50fa3175","updated":"2017-11-24 06:53:55.000000000","message":"Done","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class SyncResource(object):"},{"line_number":28,"context_line":"    def __init__(self, plugin_type, driver, resource_suffix):"},{"line_number":29,"context_line":"        self._plugin_type \u003d plugin_type"},{"line_number":30,"context_line":"        self.driver \u003d driver"},{"line_number":31,"context_line":"        self.resource_suffix \u003d resource_suffix"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @property"},{"line_number":34,"context_line":"    def plugin(self):"},{"line_number":35,"context_line":"        return directory.get_plugin(self._plugin_type)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class ResourceBaseDriver(object):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_c63767b0","line":35,"range":{"start_line":27,"start_character":1,"end_line":35,"end_character":54},"updated":"2017-11-22 12:41:08.000000000","message":"I don\u0027t see the logic of having this...","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"c4a9ea6021ce5c5cf0c394a7c1bd7a0330285aa0","unresolved":false,"context_lines":[{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class SyncResource(object):"},{"line_number":28,"context_line":"    def __init__(self, plugin_type, driver, resource_suffix):"},{"line_number":29,"context_line":"        self._plugin_type \u003d plugin_type"},{"line_number":30,"context_line":"        self.driver \u003d driver"},{"line_number":31,"context_line":"        self.resource_suffix \u003d resource_suffix"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @property"},{"line_number":34,"context_line":"    def plugin(self):"},{"line_number":35,"context_line":"        return directory.get_plugin(self._plugin_type)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class ResourceBaseDriver(object):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_1c003f67","line":35,"range":{"start_line":27,"start_character":1,"end_line":35,"end_character":54},"in_reply_to":"ff82abbf_c63767b0","updated":"2017-11-24 06:53:55.000000000","message":"It is being used for storing plugin, driver and resource suffix. It is being stored in ALL_RESOURCES.","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        return directory.get_plugin(self._plugin_type)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class ResourceBaseDriver(object):"},{"line_number":39,"context_line":"    ALL_RESOURCES \u003d {}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, plugin_type, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_10f4a985","line":38,"range":{"start_line":38,"start_character":6,"end_line":38,"end_character":24},"updated":"2017-11-22 12:41:08.000000000","message":"in the documentation it was referred as BaseDriver, you might want to match them","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"c4a9ea6021ce5c5cf0c394a7c1bd7a0330285aa0","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        return directory.get_plugin(self._plugin_type)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class ResourceBaseDriver(object):"},{"line_number":39,"context_line":"    ALL_RESOURCES \u003d {}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, plugin_type, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_3c03c375","line":38,"range":{"start_line":38,"start_character":6,"end_line":38,"end_character":24},"in_reply_to":"ff82abbf_10f4a985","updated":"2017-11-24 06:53:55.000000000","message":"Done","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class ResourceBaseDriver(object):"},{"line_number":39,"context_line":"    ALL_RESOURCES \u003d {}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, plugin_type, *args, **kwargs):"},{"line_number":42,"context_line":"        super(ResourceBaseDriver, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_b0edbd8c","line":39,"range":{"start_line":39,"start_character":4,"end_line":39,"end_character":17},"updated":"2017-11-22 12:41:08.000000000","message":"Do you want ALL_RESOURCES to be shared by all classes that inherit this one? Why?","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"c4a9ea6021ce5c5cf0c394a7c1bd7a0330285aa0","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class ResourceBaseDriver(object):"},{"line_number":39,"context_line":"    ALL_RESOURCES \u003d {}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, plugin_type, *args, **kwargs):"},{"line_number":42,"context_line":"        super(ResourceBaseDriver, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_dcf97780","line":39,"range":{"start_line":39,"start_character":4,"end_line":39,"end_character":17},"in_reply_to":"ff82abbf_b0edbd8c","updated":"2017-11-24 06:53:55.000000000","message":"Done","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"2e68e472e3f95bffb27d5e80696fa62e52852a14","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, plugin_type, *args, **kwargs):"},{"line_number":42,"context_line":"        super(ResourceBaseDriver, self).__init__(*args, **kwargs)"},{"line_number":43,"context_line":"        for resource, resource_suffix in self.RESOURCES.items():"},{"line_number":44,"context_line":"            resource_details \u003d SyncResource(plugin_type, self, resource_suffix)"},{"line_number":45,"context_line":"            ResourceBaseDriver.ALL_RESOURCES[resource] \u003d resource_details"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_6791cb99","line":43,"range":{"start_line":43,"start_character":41,"end_line":43,"end_character":55},"updated":"2017-11-28 01:31:46.000000000","message":"this can be passed as argument.","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, plugin_type, *args, **kwargs):"},{"line_number":42,"context_line":"        super(ResourceBaseDriver, self).__init__(*args, **kwargs)"},{"line_number":43,"context_line":"        for resource, resource_suffix in self.RESOURCES.items():"},{"line_number":44,"context_line":"            resource_details \u003d SyncResource(plugin_type, self, resource_suffix)"},{"line_number":45,"context_line":"            ResourceBaseDriver.ALL_RESOURCES[resource] \u003d resource_details"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_9083d9cc","line":43,"range":{"start_line":43,"start_character":46,"end_line":43,"end_character":55},"updated":"2017-11-22 12:41:08.000000000","message":"where is this defined in this class? This will break if the inherited class don\u0027t define RESOURCES and that is not even documented.","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"c4a9ea6021ce5c5cf0c394a7c1bd7a0330285aa0","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, plugin_type, *args, **kwargs):"},{"line_number":42,"context_line":"        super(ResourceBaseDriver, self).__init__(*args, **kwargs)"},{"line_number":43,"context_line":"        for resource, resource_suffix in self.RESOURCES.items():"},{"line_number":44,"context_line":"            resource_details \u003d SyncResource(plugin_type, self, resource_suffix)"},{"line_number":45,"context_line":"            ResourceBaseDriver.ALL_RESOURCES[resource] \u003d resource_details"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_fc679b50","line":43,"range":{"start_line":43,"start_character":46,"end_line":43,"end_character":55},"in_reply_to":"ff82abbf_9083d9cc","updated":"2017-11-24 06:53:55.000000000","message":"yes, It is specified in the design patch. I think, we should document it, where?","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            ResourceBaseDriver.ALL_RESOURCES[resource] \u003d resource_details"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @staticmethod"},{"line_number":48,"context_line":"    def _get_method_name_by_resource_suffix(method_suffix):"},{"line_number":49,"context_line":"        return \u0027get_%s\u0027 % method_suffix"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_c6d2075d","line":48,"range":{"start_line":48,"start_character":4,"end_line":48,"end_character":59},"updated":"2017-11-22 12:41:08.000000000","message":"a method just to do a string expression doesn\u0027t make much sense to me.","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"504058bb8798ea473277100a82d48ccbadac30c3","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            ResourceBaseDriver.ALL_RESOURCES[resource] \u003d resource_details"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @staticmethod"},{"line_number":48,"context_line":"    def _get_method_name_by_resource_suffix(method_suffix):"},{"line_number":49,"context_line":"        return \u0027get_%s\u0027 % method_suffix"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"df87a7cf_8f3e93d8","line":48,"range":{"start_line":48,"start_character":4,"end_line":48,"end_character":59},"in_reply_to":"ff82abbf_7798841a","updated":"2017-12-13 09:41:02.000000000","message":"Why not just get_method_by_resource_suffix and make get_resources_for_full_sync easier?","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"c4a9ea6021ce5c5cf0c394a7c1bd7a0330285aa0","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            ResourceBaseDriver.ALL_RESOURCES[resource] \u003d resource_details"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @staticmethod"},{"line_number":48,"context_line":"    def _get_method_name_by_resource_suffix(method_suffix):"},{"line_number":49,"context_line":"        return \u0027get_%s\u0027 % method_suffix"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_7798841a","line":48,"range":{"start_line":48,"start_character":4,"end_line":48,"end_character":59},"in_reply_to":"ff82abbf_c6d2075d","updated":"2017-11-24 06:53:55.000000000","message":"It standardize method name creation, so we don\u0027t have to manipulate string in driver classes, providing their specific method. So they should be able t reuse it.","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        return \u0027get_%s\u0027 % method_suffix"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @staticmethod"},{"line_number":52,"context_line":"    def _get_method(plugin, method_name):"},{"line_number":53,"context_line":"        obj_getter \u003d getattr(plugin, method_name, None)"},{"line_number":54,"context_line":"        if obj_getter is None:"},{"line_number":55,"context_line":"            LOG.error(\"Plugin does not have %s method\", method_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_469837bf","line":52,"range":{"start_line":52,"start_character":4,"end_line":52,"end_character":41},"updated":"2017-11-22 12:41:08.000000000","message":"who is using this private method? If no one is using it here and you expect the siblings to use it then it\u0027s not a very nice thing to do. Then it should not be private.","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"c4a9ea6021ce5c5cf0c394a7c1bd7a0330285aa0","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        return \u0027get_%s\u0027 % method_suffix"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @staticmethod"},{"line_number":52,"context_line":"    def _get_method(plugin, method_name):"},{"line_number":53,"context_line":"        obj_getter \u003d getattr(plugin, method_name, None)"},{"line_number":54,"context_line":"        if obj_getter is None:"},{"line_number":55,"context_line":"            LOG.error(\"Plugin does not have %s method\", method_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_37a2fc4c","line":52,"range":{"start_line":52,"start_character":4,"end_line":52,"end_character":41},"in_reply_to":"ff82abbf_469837bf","updated":"2017-11-24 06:53:55.000000000","message":"Done","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @staticmethod"},{"line_number":52,"context_line":"    def _get_method(plugin, method_name):"},{"line_number":53,"context_line":"        obj_getter \u003d getattr(plugin, method_name, None)"},{"line_number":54,"context_line":"        if obj_getter is None:"},{"line_number":55,"context_line":"            LOG.error(\"Plugin does not have %s method\", method_name)"},{"line_number":56,"context_line":"            return"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_66c1bb80","line":54,"range":{"start_line":53,"start_character":8,"end_line":54,"end_character":30},"updated":"2017-11-22 12:41:08.000000000","message":"not pythonic, the pythonic way is to use handle it through exceptions.","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"c4a9ea6021ce5c5cf0c394a7c1bd7a0330285aa0","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @staticmethod"},{"line_number":52,"context_line":"    def _get_method(plugin, method_name):"},{"line_number":53,"context_line":"        obj_getter \u003d getattr(plugin, method_name, None)"},{"line_number":54,"context_line":"        if obj_getter is None:"},{"line_number":55,"context_line":"            LOG.error(\"Plugin does not have %s method\", method_name)"},{"line_number":56,"context_line":"            return"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_0510d000","line":54,"range":{"start_line":53,"start_character":8,"end_line":54,"end_character":30},"in_reply_to":"ff82abbf_66c1bb80","updated":"2017-11-24 06:53:55.000000000","message":"Done","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    # It returns all resources of type \"resource_type\"."},{"line_number":62,"context_line":"    @classmethod"},{"line_number":63,"context_line":"    def get_resources(cls, context, plugin, resource_suffix):"},{"line_number":64,"context_line":"        method_name \u003d cls._get_method_name_by_resource_suffix(resource_suffix)"},{"line_number":65,"context_line":"        return getattr(plugin, method_name)(context)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_46dd976e","line":64,"range":{"start_line":64,"start_character":8,"end_line":64,"end_character":78},"updated":"2017-11-22 12:41:08.000000000","message":"why not have the method return the method instead of just the name and having an extra step?","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"c4a9ea6021ce5c5cf0c394a7c1bd7a0330285aa0","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    # It returns all resources of type \"resource_type\"."},{"line_number":62,"context_line":"    @classmethod"},{"line_number":63,"context_line":"    def get_resources(cls, context, plugin, resource_suffix):"},{"line_number":64,"context_line":"        method_name \u003d cls._get_method_name_by_resource_suffix(resource_suffix)"},{"line_number":65,"context_line":"        return getattr(plugin, method_name)(context)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_774f2492","line":64,"range":{"start_line":64,"start_character":8,"end_line":64,"end_character":78},"in_reply_to":"ff82abbf_46dd976e","updated":"2017-11-24 06:53:55.000000000","message":"Because method name creation and method fetching has to be decoupled. Some of the driver class needs to provide different name generation mechanism but reuse the same method for fetching methods.","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"2e68e472e3f95bffb27d5e80696fa62e52852a14","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"METHOD_NOT_FOUND \u003d \"%s plugin does not have %s method\""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"ALL_RESOURCES \u003d {}"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_1102040c","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":54},"updated":"2017-11-28 01:31:46.000000000","message":"This isn\u0027t used.","commit_id":"0dfd1a46de5bf9f363e539f942236d48a6efb89d"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"8a0436e351e75c6611be806d62d93f73ed46635e","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def __init__(self, plugin_type, *args, **kwargs):"},{"line_number":40,"context_line":"        super(ResourceBaseDriver, self).__init__(*args, **kwargs)"},{"line_number":41,"context_line":"        self.plugin_type \u003d plugin_type"},{"line_number":42,"context_line":"        for resource, resource_suffix in self.RESOURCES.items():"},{"line_number":43,"context_line":"            ALL_RESOURCES[resource] \u003d self"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_d3d36fd4","line":42,"range":{"start_line":42,"start_character":22,"end_line":42,"end_character":37},"updated":"2017-12-10 13:38:04.000000000","message":"This is unused, why not iterate only over the keys?","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"eb48ce807353da33d0768c2caa77d21aa78c6df6","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def __init__(self, plugin_type, *args, **kwargs):"},{"line_number":40,"context_line":"        super(ResourceBaseDriver, self).__init__(*args, **kwargs)"},{"line_number":41,"context_line":"        self.plugin_type \u003d plugin_type"},{"line_number":42,"context_line":"        for resource, resource_suffix in self.RESOURCES.items():"},{"line_number":43,"context_line":"            ALL_RESOURCES[resource] \u003d self"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_c0d26ad1","line":42,"range":{"start_line":42,"start_character":22,"end_line":42,"end_character":37},"in_reply_to":"df87a7cf_d3d36fd4","updated":"2017-12-12 09:27:33.000000000","message":"Done","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"8a0436e351e75c6611be806d62d93f73ed46635e","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    def get_method_name_by_resource_suffix(method_suffix):"},{"line_number":47,"context_line":"        return \u0027get_%s\u0027 % method_suffix"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @classmethod"},{"line_number":50,"context_line":"    def get_method(cls, plugin_type, method_name):"},{"line_number":51,"context_line":"        plugin \u003d cls.get_plugin(plugin_type)"},{"line_number":52,"context_line":"        obj_getter \u003d getattr(plugin, method_name, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_f32c7303","line":49,"range":{"start_line":49,"start_character":4,"end_line":49,"end_character":16},"updated":"2017-12-10 13:38:04.000000000","message":"Why define as class method, instead of just accessing self.plugin_type?","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"eb48ce807353da33d0768c2caa77d21aa78c6df6","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    def get_method_name_by_resource_suffix(method_suffix):"},{"line_number":47,"context_line":"        return \u0027get_%s\u0027 % method_suffix"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @classmethod"},{"line_number":50,"context_line":"    def get_method(cls, plugin_type, method_name):"},{"line_number":51,"context_line":"        plugin \u003d cls.get_plugin(plugin_type)"},{"line_number":52,"context_line":"        obj_getter \u003d getattr(plugin, method_name, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_006932f7","line":49,"range":{"start_line":49,"start_character":4,"end_line":49,"end_character":16},"in_reply_to":"df87a7cf_f32c7303","updated":"2017-12-12 09:27:33.000000000","message":"I am not sure, what you mean. get_plugin returns the plugin and plugin_type plugin type like CORE, L3.","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"8a0436e351e75c6611be806d62d93f73ed46635e","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        return obj_getter"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    # (rajivk): This method is being utilized for full sync purpose."},{"line_number":61,"context_line":"    # It returns all resources of type \"resource_type\"."},{"line_number":62,"context_line":"    def get_resources_for_full_sync(self, context, resource_type):"},{"line_number":63,"context_line":"        resource_suffix \u003d self.RESOURCES.get(resource_type)"},{"line_number":64,"context_line":"        if resource_suffix is None:"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_c4a8838d","line":61,"range":{"start_line":60,"start_character":4,"end_line":61,"end_character":55},"updated":"2017-12-10 13:38:04.000000000","message":"Doctext would be preferred over a comment","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"eb48ce807353da33d0768c2caa77d21aa78c6df6","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        return obj_getter"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    # (rajivk): This method is being utilized for full sync purpose."},{"line_number":61,"context_line":"    # It returns all resources of type \"resource_type\"."},{"line_number":62,"context_line":"    def get_resources_for_full_sync(self, context, resource_type):"},{"line_number":63,"context_line":"        resource_suffix \u003d self.RESOURCES.get(resource_type)"},{"line_number":64,"context_line":"        if resource_suffix is None:"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_2006b621","line":61,"range":{"start_line":60,"start_character":4,"end_line":61,"end_character":55},"in_reply_to":"df87a7cf_c4a8838d","updated":"2017-12-12 09:27:33.000000000","message":"Done","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"8a0436e351e75c6611be806d62d93f73ed46635e","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def get_resources_for_full_sync(self, context, resource_type):"},{"line_number":63,"context_line":"        resource_suffix \u003d self.RESOURCES.get(resource_type)"},{"line_number":64,"context_line":"        if resource_suffix is None:"},{"line_number":65,"context_line":"            LOG.error(RESOURCE_NOT_REGISTERED, resource_type)"},{"line_number":66,"context_line":"            raise exceptions.UnsupportedResourceType()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        method_name \u003d self.get_method_name_by_resource_suffix(resource_suffix)"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_53d51fe4","line":65,"range":{"start_line":65,"start_character":12,"end_line":65,"end_character":61},"updated":"2017-12-10 13:38:04.000000000","message":"Why do you need to log this?\nYou\u0027re raising an exception either way..","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"eb48ce807353da33d0768c2caa77d21aa78c6df6","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def get_resources_for_full_sync(self, context, resource_type):"},{"line_number":63,"context_line":"        resource_suffix \u003d self.RESOURCES.get(resource_type)"},{"line_number":64,"context_line":"        if resource_suffix is None:"},{"line_number":65,"context_line":"            LOG.error(RESOURCE_NOT_REGISTERED, resource_type)"},{"line_number":66,"context_line":"            raise exceptions.UnsupportedResourceType()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        method_name \u003d self.get_method_name_by_resource_suffix(resource_suffix)"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_2b16974a","line":65,"range":{"start_line":65,"start_character":12,"end_line":65,"end_character":61},"in_reply_to":"df87a7cf_53d51fe4","updated":"2017-12-12 09:27:33.000000000","message":"Done","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"8a0436e351e75c6611be806d62d93f73ed46635e","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            LOG.exception(str(e))"},{"line_number":74,"context_line":"            raise exceptions.UnsupportedResourceType()"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    @staticmethod"},{"line_number":77,"context_line":"    def get_driver(resource_type):"},{"line_number":78,"context_line":"        return ALL_RESOURCES.get(resource_type)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    @staticmethod"},{"line_number":81,"context_line":"    def get_plugin(plugin_type):"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_5e7f29aa","line":78,"range":{"start_line":76,"start_character":4,"end_line":78,"end_character":47},"updated":"2017-12-10 13:38:04.000000000","message":"Actually this would make more sense to be a module level function","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"eb48ce807353da33d0768c2caa77d21aa78c6df6","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            LOG.exception(str(e))"},{"line_number":74,"context_line":"            raise exceptions.UnsupportedResourceType()"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    @staticmethod"},{"line_number":77,"context_line":"    def get_driver(resource_type):"},{"line_number":78,"context_line":"        return ALL_RESOURCES.get(resource_type)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    @staticmethod"},{"line_number":81,"context_line":"    def get_plugin(plugin_type):"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_eb898f74","line":78,"range":{"start_line":76,"start_character":4,"end_line":78,"end_character":47},"in_reply_to":"df87a7cf_5e7f29aa","updated":"2017-12-12 09:27:33.000000000","message":"Done","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"8a0436e351e75c6611be806d62d93f73ed46635e","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def get_driver(resource_type):"},{"line_number":78,"context_line":"        return ALL_RESOURCES.get(resource_type)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    @staticmethod"},{"line_number":81,"context_line":"    def get_plugin(plugin_type):"},{"line_number":82,"context_line":"        return directory.get_plugin(plugin_type)"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_7e7a2dba","line":82,"range":{"start_line":80,"start_character":4,"end_line":82,"end_character":48},"updated":"2017-12-10 13:38:04.000000000","message":"I\u0027m not even sure why this is needed here..","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"eb48ce807353da33d0768c2caa77d21aa78c6df6","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def get_driver(resource_type):"},{"line_number":78,"context_line":"        return ALL_RESOURCES.get(resource_type)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    @staticmethod"},{"line_number":81,"context_line":"    def get_plugin(plugin_type):"},{"line_number":82,"context_line":"        return directory.get_plugin(plugin_type)"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_aba6270e","line":82,"range":{"start_line":80,"start_character":4,"end_line":82,"end_character":48},"in_reply_to":"df87a7cf_7e7a2dba","updated":"2017-12-12 09:27:33.000000000","message":"It hides the neutron directory from other code. Either we can get plugin anytime, we need it or pass call here. in first case, neutron directory will come in picture.","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"7427348ad112950d2c72559f231046b29483f042","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class ResourceBaseDriver(object):"},{"line_number":38,"context_line":"    # NOTE(rajivk), Provides default values for the resources. A driver has to"},{"line_number":39,"context_line":"    # provide class or object attribute RESOURCES, specifying resources it"},{"line_number":40,"context_line":"    # manages."},{"line_number":41,"context_line":"    RESOURCES \u003d {}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def __init__(self, plugin_type, *args, **kwargs):"},{"line_number":44,"context_line":"        super(ResourceBaseDriver, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_8491bf49","line":41,"range":{"start_line":38,"start_character":0,"end_line":41,"end_character":18},"updated":"2017-12-12 01:07:10.000000000","message":"Are you saying that all the driver has to define RESOURCES?\nIf so, we can remove this default value so that it enforces subclass to define RESOURCES.","commit_id":"483b472170df8e65f6dd47f776c4e47a6bb8b20d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"eb48ce807353da33d0768c2caa77d21aa78c6df6","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class ResourceBaseDriver(object):"},{"line_number":38,"context_line":"    # NOTE(rajivk), Provides default values for the resources. A driver has to"},{"line_number":39,"context_line":"    # provide class or object attribute RESOURCES, specifying resources it"},{"line_number":40,"context_line":"    # manages."},{"line_number":41,"context_line":"    RESOURCES \u003d {}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def __init__(self, plugin_type, *args, **kwargs):"},{"line_number":44,"context_line":"        super(ResourceBaseDriver, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_9316e3a7","line":41,"range":{"start_line":38,"start_character":0,"end_line":41,"end_character":18},"in_reply_to":"df87a7cf_8491bf49","updated":"2017-12-12 09:27:33.000000000","message":"Please read earlier discussion.","commit_id":"483b472170df8e65f6dd47f776c4e47a6bb8b20d"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"7427348ad112950d2c72559f231046b29483f042","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        for resource in self.RESOURCES:"},{"line_number":47,"context_line":"            ALL_RESOURCES[resource] \u003d self"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @staticmethod"},{"line_number":50,"context_line":"    def get_method_name_by_resource_suffix(method_suffix):"},{"line_number":51,"context_line":"        return \u0027get_%s\u0027 % method_suffix"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def get_method(self, method_name):"},{"line_number":54,"context_line":"        plugin \u003d self.get_plugin(self.plugin_type)"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_649a7b62","line":51,"range":{"start_line":49,"start_character":0,"end_line":51,"end_character":39},"updated":"2017-12-12 01:07:10.000000000","message":"Please group static method. not distribute them, i.e. line 50 and line 79.","commit_id":"483b472170df8e65f6dd47f776c4e47a6bb8b20d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"eb48ce807353da33d0768c2caa77d21aa78c6df6","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        for resource in self.RESOURCES:"},{"line_number":47,"context_line":"            ALL_RESOURCES[resource] \u003d self"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @staticmethod"},{"line_number":50,"context_line":"    def get_method_name_by_resource_suffix(method_suffix):"},{"line_number":51,"context_line":"        return \u0027get_%s\u0027 % method_suffix"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def get_method(self, method_name):"},{"line_number":54,"context_line":"        plugin \u003d self.get_plugin(self.plugin_type)"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_9364a34b","line":51,"range":{"start_line":49,"start_character":0,"end_line":51,"end_character":39},"in_reply_to":"df87a7cf_649a7b62","updated":"2017-12-12 09:27:33.000000000","message":"Done","commit_id":"483b472170df8e65f6dd47f776c4e47a6bb8b20d"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"7427348ad112950d2c72559f231046b29483f042","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def get_method_name_by_resource_suffix(method_suffix):"},{"line_number":51,"context_line":"        return \u0027get_%s\u0027 % method_suffix"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def get_method(self, method_name):"},{"line_number":54,"context_line":"        plugin \u003d self.get_plugin(self.plugin_type)"},{"line_number":55,"context_line":"        obj_getter \u003d getattr(plugin, method_name, None)"},{"line_number":56,"context_line":"        if obj_getter is None:"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_24a0f38f","line":53,"range":{"start_line":53,"start_character":38,"end_line":53,"end_character":38},"updated":"2017-12-12 01:07:10.000000000","message":"Please add document to explain this default method implementation.","commit_id":"483b472170df8e65f6dd47f776c4e47a6bb8b20d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"eb48ce807353da33d0768c2caa77d21aa78c6df6","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def get_method_name_by_resource_suffix(method_suffix):"},{"line_number":51,"context_line":"        return \u0027get_%s\u0027 % method_suffix"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def get_method(self, method_name):"},{"line_number":54,"context_line":"        plugin \u003d self.get_plugin(self.plugin_type)"},{"line_number":55,"context_line":"        obj_getter \u003d getattr(plugin, method_name, None)"},{"line_number":56,"context_line":"        if obj_getter is None:"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_93c90327","line":53,"range":{"start_line":53,"start_character":38,"end_line":53,"end_character":38},"in_reply_to":"df87a7cf_24a0f38f","updated":"2017-12-12 09:27:33.000000000","message":"Done","commit_id":"483b472170df8e65f6dd47f776c4e47a6bb8b20d"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"7427348ad112950d2c72559f231046b29483f042","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        return \u0027get_%s\u0027 % method_suffix"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def get_method(self, method_name):"},{"line_number":54,"context_line":"        plugin \u003d self.get_plugin(self.plugin_type)"},{"line_number":55,"context_line":"        obj_getter \u003d getattr(plugin, method_name, None)"},{"line_number":56,"context_line":"        if obj_getter is None:"},{"line_number":57,"context_line":"            raise exceptions.PluginMethodNotFound("}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_44b097dd","line":54,"range":{"start_line":54,"start_character":17,"end_line":54,"end_character":50},"updated":"2017-12-12 01:07:10.000000000","message":"can we make get_plugin method normal method instead of static method?","commit_id":"483b472170df8e65f6dd47f776c4e47a6bb8b20d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"eb48ce807353da33d0768c2caa77d21aa78c6df6","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        return \u0027get_%s\u0027 % method_suffix"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def get_method(self, method_name):"},{"line_number":54,"context_line":"        plugin \u003d self.get_plugin(self.plugin_type)"},{"line_number":55,"context_line":"        obj_getter \u003d getattr(plugin, method_name, None)"},{"line_number":56,"context_line":"        if obj_getter is None:"},{"line_number":57,"context_line":"            raise exceptions.PluginMethodNotFound("}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_93a022f6","line":54,"range":{"start_line":54,"start_character":17,"end_line":54,"end_character":50},"in_reply_to":"df87a7cf_44b097dd","updated":"2017-12-12 09:27:33.000000000","message":"Done","commit_id":"483b472170df8e65f6dd47f776c4e47a6bb8b20d"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"504058bb8798ea473277100a82d48ccbadac30c3","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"\"\"\"Base class for all the drivers to support full sync"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"   ResourceBaseDriver class acts as base class for all the drivers and"},{"line_number":18,"context_line":"   provides default behaviour for full sync functionality."},{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from neutron_lib.plugins import directory"},{"line_number":22,"context_line":"from oslo_log import log as logging"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_af26f7b9","line":19,"range":{"start_line":15,"start_character":0,"end_line":19,"end_character":3},"updated":"2017-12-13 09:41:02.000000000","message":"What I meant is that a docstring at this level is for documenting the module, here you are documenting just one class. It should be at the class level.","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"51ba6a29439fccf883a4d4d6aee1fdd5a3861891","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"\"\"\"Base class for all the drivers to support full sync"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"   ResourceBaseDriver class acts as base class for all the drivers and"},{"line_number":18,"context_line":"   provides default behaviour for full sync functionality."},{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from neutron_lib.plugins import directory"},{"line_number":22,"context_line":"from oslo_log import log as logging"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_ff025609","line":19,"range":{"start_line":15,"start_character":0,"end_line":19,"end_character":3},"in_reply_to":"df87a7cf_af26f7b9","updated":"2017-12-14 06:15:20.000000000","message":"Done","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"504058bb8798ea473277100a82d48ccbadac30c3","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    return ALL_RESOURCES.get(resource_type)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class ResourceBaseDriver(object):"},{"line_number":38,"context_line":"    # NOTE(rajivk), Provides default values for the resources. A driver has to"},{"line_number":39,"context_line":"    # provide class or object attribute RESOURCES, specifying resources it"},{"line_number":40,"context_line":"    # manages."}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_f28f0873","line":37,"updated":"2017-12-13 09:41:02.000000000","message":"Unless I\u0027m missing something there is a lot over-architecting here. get_resources_for_fullsync calling get_method_name_by_resource_suffix to then call get_method to then call that. There is a lot of stack traversing without a real added value of function division. I don\u0027t see those functions used anywhere else or making the code simpler.","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"51ba6a29439fccf883a4d4d6aee1fdd5a3861891","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    return ALL_RESOURCES.get(resource_type)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class ResourceBaseDriver(object):"},{"line_number":38,"context_line":"    # NOTE(rajivk), Provides default values for the resources. A driver has to"},{"line_number":39,"context_line":"    # provide class or object attribute RESOURCES, specifying resources it"},{"line_number":40,"context_line":"    # manages."}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_1f34dadd","line":37,"in_reply_to":"df87a7cf_f28f0873","updated":"2017-12-14 06:15:20.000000000","message":"we need to move away logic of fetching names from the get_method name because we would like to define some of the customized method names for the resources. So method name fetching could be overridden in the derived classes.\n\nWhy get_method is defined?\nSo that it can be reused by method for recovery as well. Changed in new patchset.","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"504058bb8798ea473277100a82d48ccbadac30c3","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class ResourceBaseDriver(object):"},{"line_number":38,"context_line":"    # NOTE(rajivk), Provides default values for the resources. A driver has to"},{"line_number":39,"context_line":"    # provide class or object attribute RESOURCES, specifying resources it"},{"line_number":40,"context_line":"    # manages."},{"line_number":41,"context_line":"    RESOURCES \u003d {}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def __init__(self, plugin_type, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_0f69238a","line":40,"range":{"start_line":38,"start_character":0,"end_line":40,"end_character":14},"updated":"2017-12-13 09:41:02.000000000","message":"I don\u0027t think this is needed. Although since you\u0027ll want the drivers to inherit this class and you\u0027d want them to overload this class attribute, then it would make a lot of sense to create a docstring for this class where you explain this.","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"51ba6a29439fccf883a4d4d6aee1fdd5a3861891","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class ResourceBaseDriver(object):"},{"line_number":38,"context_line":"    # NOTE(rajivk), Provides default values for the resources. A driver has to"},{"line_number":39,"context_line":"    # provide class or object attribute RESOURCES, specifying resources it"},{"line_number":40,"context_line":"    # manages."},{"line_number":41,"context_line":"    RESOURCES \u003d {}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def __init__(self, plugin_type, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_9f20ea9d","line":40,"range":{"start_line":38,"start_character":0,"end_line":40,"end_character":14},"in_reply_to":"df87a7cf_0f69238a","updated":"2017-12-14 06:15:20.000000000","message":"Done","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"504058bb8798ea473277100a82d48ccbadac30c3","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def get_method(self, method_name):"},{"line_number":54,"context_line":"        \"\"\"Provides method based on method name \"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        plugin \u003d self.get_plugin()"},{"line_number":57,"context_line":"        obj_getter \u003d getattr(plugin, method_name, None)"},{"line_number":58,"context_line":"        if obj_getter is None:"},{"line_number":59,"context_line":"            raise exceptions.PluginMethodNotFound("}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_cfbfbbce","line":56,"updated":"2017-12-13 09:41:02.000000000","message":"read L80 and this line wouldn\u0027t be that interesting anymore :)","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"51ba6a29439fccf883a4d4d6aee1fdd5a3861891","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def get_method(self, method_name):"},{"line_number":54,"context_line":"        \"\"\"Provides method based on method name \"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        plugin \u003d self.get_plugin()"},{"line_number":57,"context_line":"        obj_getter \u003d getattr(plugin, method_name, None)"},{"line_number":58,"context_line":"        if obj_getter is None:"},{"line_number":59,"context_line":"            raise exceptions.PluginMethodNotFound("}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_3f175ef0","line":56,"in_reply_to":"df87a7cf_cfbfbbce","updated":"2017-12-14 06:15:20.000000000","message":"Done","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"504058bb8798ea473277100a82d48ccbadac30c3","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        \"\"\"Provides method based on method name \"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        plugin \u003d self.get_plugin()"},{"line_number":57,"context_line":"        obj_getter \u003d getattr(plugin, method_name, None)"},{"line_number":58,"context_line":"        if obj_getter is None:"},{"line_number":59,"context_line":"            raise exceptions.PluginMethodNotFound("},{"line_number":60,"context_line":"                method\u003dmethod_name,"},{"line_number":61,"context_line":"                plugin\u003dself.plugin_type)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        return obj_getter"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_4f3acb34","line":61,"range":{"start_line":57,"start_character":8,"end_line":61,"end_character":40},"updated":"2017-12-13 09:41:02.000000000","message":"If the exception is an exception then better to do it with try/except.\n\nreference: https://docs.python.org/3.6/glossary.html#term-eafp","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"51ba6a29439fccf883a4d4d6aee1fdd5a3861891","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        \"\"\"Provides method based on method name \"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        plugin \u003d self.get_plugin()"},{"line_number":57,"context_line":"        obj_getter \u003d getattr(plugin, method_name, None)"},{"line_number":58,"context_line":"        if obj_getter is None:"},{"line_number":59,"context_line":"            raise exceptions.PluginMethodNotFound("},{"line_number":60,"context_line":"                method\u003dmethod_name,"},{"line_number":61,"context_line":"                plugin\u003dself.plugin_type)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        return obj_getter"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_dfd19231","line":61,"range":{"start_line":57,"start_character":8,"end_line":61,"end_character":40},"in_reply_to":"df87a7cf_4f3acb34","updated":"2017-12-14 06:15:20.000000000","message":"Done","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"504058bb8798ea473277100a82d48ccbadac30c3","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    def get_resources_for_full_sync(self, context, resource_type):"},{"line_number":66,"context_line":"        \"\"\"Provide all resources of type resource_type \"\"\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        resource_suffix \u003d self.RESOURCES.get(resource_type)"},{"line_number":69,"context_line":"        if resource_suffix is None:"},{"line_number":70,"context_line":"            raise exceptions.UnsupportedResourceType()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        method_name \u003d self.get_method_name_by_resource_suffix(resource_suffix)"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_0f728312","line":70,"range":{"start_line":68,"start_character":8,"end_line":70,"end_character":54},"updated":"2017-12-13 09:41:02.000000000","message":"EAFP","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"51ba6a29439fccf883a4d4d6aee1fdd5a3861891","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    def get_resources_for_full_sync(self, context, resource_type):"},{"line_number":66,"context_line":"        \"\"\"Provide all resources of type resource_type \"\"\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        resource_suffix \u003d self.RESOURCES.get(resource_type)"},{"line_number":69,"context_line":"        if resource_suffix is None:"},{"line_number":70,"context_line":"            raise exceptions.UnsupportedResourceType()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        method_name \u003d self.get_method_name_by_resource_suffix(resource_suffix)"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_df9992d0","line":70,"range":{"start_line":68,"start_character":8,"end_line":70,"end_character":54},"in_reply_to":"df87a7cf_0f728312","updated":"2017-12-14 06:15:20.000000000","message":"Done","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"504058bb8798ea473277100a82d48ccbadac30c3","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            return self.get_method(method_name)(context)"},{"line_number":76,"context_line":"        except exceptions.PluginMethodNotFound as e:"},{"line_number":77,"context_line":"            LOG.exception(str(e))"},{"line_number":78,"context_line":"            raise exceptions.UnsupportedResourceType()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def get_plugin(self):"},{"line_number":81,"context_line":"        return directory.get_plugin(self.plugin_type)"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_f2e4e83e","line":78,"range":{"start_line":78,"start_character":52,"end_line":78,"end_character":54},"updated":"2017-12-13 09:41:02.000000000","message":"No need for this","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"51ba6a29439fccf883a4d4d6aee1fdd5a3861891","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            return self.get_method(method_name)(context)"},{"line_number":76,"context_line":"        except exceptions.PluginMethodNotFound as e:"},{"line_number":77,"context_line":"            LOG.exception(str(e))"},{"line_number":78,"context_line":"            raise exceptions.UnsupportedResourceType()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def get_plugin(self):"},{"line_number":81,"context_line":"        return directory.get_plugin(self.plugin_type)"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_ff9ed6b6","line":78,"range":{"start_line":78,"start_character":52,"end_line":78,"end_character":54},"in_reply_to":"df87a7cf_f2e4e83e","updated":"2017-12-14 06:15:20.000000000","message":"Done","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"504058bb8798ea473277100a82d48ccbadac30c3","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            LOG.exception(str(e))"},{"line_number":78,"context_line":"            raise exceptions.UnsupportedResourceType()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def get_plugin(self):"},{"line_number":81,"context_line":"        return directory.get_plugin(self.plugin_type)"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_4fe2cb03","line":80,"range":{"start_line":80,"start_character":4,"end_line":80,"end_character":25},"updated":"2017-12-13 09:41:02.000000000","message":"Why not a property?","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"51ba6a29439fccf883a4d4d6aee1fdd5a3861891","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            LOG.exception(str(e))"},{"line_number":78,"context_line":"            raise exceptions.UnsupportedResourceType()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def get_plugin(self):"},{"line_number":81,"context_line":"        return directory.get_plugin(self.plugin_type)"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_9fa30a01","line":80,"range":{"start_line":80,"start_character":4,"end_line":80,"end_character":25},"in_reply_to":"df87a7cf_4fe2cb03","updated":"2017-12-14 06:15:20.000000000","message":"Done","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"e43cc1422f22c58006b4ea804f9b14f746d966b3","unresolved":false,"context_lines":[{"line_number":33,"context_line":"       ResourceBaseDriver class acts as base class for all the drivers and"},{"line_number":34,"context_line":"       provides default behaviour for full sync functionality."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"       A driver has to provide class or object attribute RESOURCES, specifying"},{"line_number":37,"context_line":"       resources it manages."},{"line_number":38,"context_line":"    \"\"\""},{"line_number":39,"context_line":"    RESOURCES \u003d {}"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_baa1e0f9","line":37,"range":{"start_line":36,"start_character":7,"end_line":37,"end_character":28},"updated":"2017-12-18 13:15:07.000000000","message":"You probably want to specify that RESOURCES should be a dict, and what the keys and values are supposed to be, for sake of clarity since this is what the code actually expects.","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"e31aceea4180bfe84d003225a813c735564e5844","unresolved":false,"context_lines":[{"line_number":33,"context_line":"       ResourceBaseDriver class acts as base class for all the drivers and"},{"line_number":34,"context_line":"       provides default behaviour for full sync functionality."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"       A driver has to provide class or object attribute RESOURCES, specifying"},{"line_number":37,"context_line":"       resources it manages."},{"line_number":38,"context_line":"    \"\"\""},{"line_number":39,"context_line":"    RESOURCES \u003d {}"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_1cf556ed","line":37,"range":{"start_line":36,"start_character":7,"end_line":37,"end_character":28},"in_reply_to":"df87a7cf_baa1e0f9","updated":"2017-12-19 07:10:55.000000000","message":"Done","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"e43cc1422f22c58006b4ea804f9b14f746d966b3","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    \"\"\""},{"line_number":39,"context_line":"    RESOURCES \u003d {}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, plugin_type, *args, **kwargs):"},{"line_number":42,"context_line":"        super(ResourceBaseDriver, self).__init__(*args, **kwargs)"},{"line_number":43,"context_line":"        self.plugin_type \u003d plugin_type"},{"line_number":44,"context_line":"        for resource in self.RESOURCES:"}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_9a3c1c30","line":41,"range":{"start_line":41,"start_character":23,"end_line":41,"end_character":34},"updated":"2017-12-18 13:15:07.000000000","message":"Since you\u0027re already keeping RESOURCES on the instance level, doesn\u0027t it make sense to do it for this as well?\nDefault can be none on the class level, and each driver would define it\u0027s own PLUGIN_TYPE","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"e31aceea4180bfe84d003225a813c735564e5844","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    \"\"\""},{"line_number":39,"context_line":"    RESOURCES \u003d {}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, plugin_type, *args, **kwargs):"},{"line_number":42,"context_line":"        super(ResourceBaseDriver, self).__init__(*args, **kwargs)"},{"line_number":43,"context_line":"        self.plugin_type \u003d plugin_type"},{"line_number":44,"context_line":"        for resource in self.RESOURCES:"}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_9ce08628","line":41,"range":{"start_line":41,"start_character":23,"end_line":41,"end_character":34},"in_reply_to":"df87a7cf_9a3c1c30","updated":"2017-12-19 07:10:55.000000000","message":"+1","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"e43cc1422f22c58006b4ea804f9b14f746d966b3","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        for resource in self.RESOURCES:"},{"line_number":45,"context_line":"            ALL_RESOURCES[resource] \u003d self"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @staticmethod"},{"line_number":48,"context_line":"    def get_method_name_by_resource_suffix(method_suffix):"},{"line_number":49,"context_line":"        return \u0027get_%s\u0027 % method_suffix"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def get_resources_for_full_sync(self, context, resource_type):"},{"line_number":52,"context_line":"        \"\"\"Provide all resources of type resource_type \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_ba0b20d3","line":49,"range":{"start_line":47,"start_character":4,"end_line":49,"end_character":39},"updated":"2017-12-18 13:15:07.000000000","message":"Do we really need this function?\nIt does so little, and the name is quite confusing..","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"4c11ae3bdeb326454755f9ffa1ca9a9a7998843a","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        for resource in self.RESOURCES:"},{"line_number":45,"context_line":"            ALL_RESOURCES[resource] \u003d self"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @staticmethod"},{"line_number":48,"context_line":"    def get_method_name_by_resource_suffix(method_suffix):"},{"line_number":49,"context_line":"        return \u0027get_%s\u0027 % method_suffix"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def get_resources_for_full_sync(self, context, resource_type):"},{"line_number":52,"context_line":"        \"\"\"Provide all resources of type resource_type \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_9584c2d4","line":49,"range":{"start_line":47,"start_character":4,"end_line":49,"end_character":39},"in_reply_to":"df87a7cf_32d3a362","updated":"2017-12-20 04:36:10.000000000","message":"Removed","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"ea7c863521487d53228b8a73c46937e0cf1246a3","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        for resource in self.RESOURCES:"},{"line_number":45,"context_line":"            ALL_RESOURCES[resource] \u003d self"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @staticmethod"},{"line_number":48,"context_line":"    def get_method_name_by_resource_suffix(method_suffix):"},{"line_number":49,"context_line":"        return \u0027get_%s\u0027 % method_suffix"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def get_resources_for_full_sync(self, context, resource_type):"},{"line_number":52,"context_line":"        \"\"\"Provide all resources of type resource_type \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_32d3a362","line":49,"range":{"start_line":47,"start_character":4,"end_line":49,"end_character":39},"in_reply_to":"df87a7cf_5c667ec3","updated":"2017-12-19 08:16:52.000000000","message":"Can you show usage of what you describe here?","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"4394b9de097532584b5a47fe991aecf60fee55be","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        for resource in self.RESOURCES:"},{"line_number":45,"context_line":"            ALL_RESOURCES[resource] \u003d self"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @staticmethod"},{"line_number":48,"context_line":"    def get_method_name_by_resource_suffix(method_suffix):"},{"line_number":49,"context_line":"        return \u0027get_%s\u0027 % method_suffix"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def get_resources_for_full_sync(self, context, resource_type):"},{"line_number":52,"context_line":"        \"\"\"Provide all resources of type resource_type \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_f280dbf9","line":49,"range":{"start_line":47,"start_character":4,"end_line":49,"end_character":39},"in_reply_to":"df87a7cf_5c667ec3","updated":"2017-12-19 08:27:52.000000000","message":"full_sync_get_all_method?\nmethod_name_for_full_sync?\n\nAlso a doctext is quite necessary here, especially if you intend this to be inherited..","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"e31aceea4180bfe84d003225a813c735564e5844","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        for resource in self.RESOURCES:"},{"line_number":45,"context_line":"            ALL_RESOURCES[resource] \u003d self"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @staticmethod"},{"line_number":48,"context_line":"    def get_method_name_by_resource_suffix(method_suffix):"},{"line_number":49,"context_line":"        return \u0027get_%s\u0027 % method_suffix"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def get_resources_for_full_sync(self, context, resource_type):"},{"line_number":52,"context_line":"        \"\"\"Provide all resources of type resource_type \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_5c667ec3","line":49,"range":{"start_line":47,"start_character":4,"end_line":49,"end_character":39},"in_reply_to":"df87a7cf_ba0b20d3","updated":"2017-12-19 07:10:55.000000000","message":"We need customized method names for some of the resources, so whenever we need customized method, we can override this method and no need to handle anything else. if i move this processing inside get_resources_for_full_sync method then this complete method has to be overridden and write duplicate code.\n\nCould you please suggest better method name?","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"4c11ae3bdeb326454755f9ffa1ca9a9a7998843a","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        for resource in self.RESOURCES:"},{"line_number":45,"context_line":"            ALL_RESOURCES[resource] \u003d self"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @staticmethod"},{"line_number":48,"context_line":"    def get_method_name_by_resource_suffix(method_suffix):"},{"line_number":49,"context_line":"        return \u0027get_%s\u0027 % method_suffix"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def get_resources_for_full_sync(self, context, resource_type):"},{"line_number":52,"context_line":"        \"\"\"Provide all resources of type resource_type \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_f572ee11","line":49,"range":{"start_line":47,"start_character":4,"end_line":49,"end_character":39},"in_reply_to":"df87a7cf_f280dbf9","updated":"2017-12-20 04:36:10.000000000","message":"as the method is removed, so no need for these.","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"e43cc1422f22c58006b4ea804f9b14f746d966b3","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def get_resources_for_full_sync(self, context, resource_type):"},{"line_number":52,"context_line":"        \"\"\"Provide all resources of type resource_type \"\"\""},{"line_number":53,"context_line":"        resource_suffix \u003d self.RESOURCES.get(resource_type)"},{"line_number":54,"context_line":"        if resource_suffix is None:"},{"line_number":55,"context_line":"            raise exceptions.UnsupportedResourceType()"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_7af918c6","line":53,"range":{"start_line":53,"start_character":8,"end_line":53,"end_character":23},"updated":"2017-12-18 13:15:07.000000000","message":"Shouldn\u0027t this be plural_resource_type or something?","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"f94419330f6f921c2b9eeaf3840c8cfe1b8f7cf0","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def get_resources_for_full_sync(self, context, resource_type):"},{"line_number":52,"context_line":"        \"\"\"Provide all resources of type resource_type \"\"\""},{"line_number":53,"context_line":"        resource_suffix \u003d self.RESOURCES.get(resource_type)"},{"line_number":54,"context_line":"        if resource_suffix is None:"},{"line_number":55,"context_line":"            raise exceptions.UnsupportedResourceType()"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_9ab2e105","line":53,"range":{"start_line":53,"start_character":26,"end_line":53,"end_character":59},"updated":"2017-12-18 09:36:04.000000000","message":"self.RESOURCES[resource_type] and then try/except the operation","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"e31aceea4180bfe84d003225a813c735564e5844","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def get_resources_for_full_sync(self, context, resource_type):"},{"line_number":52,"context_line":"        \"\"\"Provide all resources of type resource_type \"\"\""},{"line_number":53,"context_line":"        resource_suffix \u003d self.RESOURCES.get(resource_type)"},{"line_number":54,"context_line":"        if resource_suffix is None:"},{"line_number":55,"context_line":"            raise exceptions.UnsupportedResourceType()"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_9c6726b8","line":53,"range":{"start_line":53,"start_character":8,"end_line":53,"end_character":23},"in_reply_to":"df87a7cf_7af918c6","updated":"2017-12-19 07:10:55.000000000","message":"Done","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"e31aceea4180bfe84d003225a813c735564e5844","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def get_resources_for_full_sync(self, context, resource_type):"},{"line_number":52,"context_line":"        \"\"\"Provide all resources of type resource_type \"\"\""},{"line_number":53,"context_line":"        resource_suffix \u003d self.RESOURCES.get(resource_type)"},{"line_number":54,"context_line":"        if resource_suffix is None:"},{"line_number":55,"context_line":"            raise exceptions.UnsupportedResourceType()"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_7c6a6281","line":53,"range":{"start_line":53,"start_character":26,"end_line":53,"end_character":59},"in_reply_to":"df87a7cf_9ab2e105","updated":"2017-12-19 07:10:55.000000000","message":"Done","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"f94419330f6f921c2b9eeaf3840c8cfe1b8f7cf0","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        \"\"\"Provide all resources of type resource_type \"\"\""},{"line_number":53,"context_line":"        resource_suffix \u003d self.RESOURCES.get(resource_type)"},{"line_number":54,"context_line":"        if resource_suffix is None:"},{"line_number":55,"context_line":"            raise exceptions.UnsupportedResourceType()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        method_name \u003d self.get_method_name_by_resource_suffix(resource_suffix)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_7a3efdb8","line":55,"range":{"start_line":55,"start_character":52,"end_line":55,"end_character":54},"updated":"2017-12-18 09:36:04.000000000","message":"No need for parenthesis when raising, unless you need to pass init arguments","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"e31aceea4180bfe84d003225a813c735564e5844","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        \"\"\"Provide all resources of type resource_type \"\"\""},{"line_number":53,"context_line":"        resource_suffix \u003d self.RESOURCES.get(resource_type)"},{"line_number":54,"context_line":"        if resource_suffix is None:"},{"line_number":55,"context_line":"            raise exceptions.UnsupportedResourceType()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        method_name \u003d self.get_method_name_by_resource_suffix(resource_suffix)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_bcf9cac8","line":55,"range":{"start_line":55,"start_character":52,"end_line":55,"end_character":54},"in_reply_to":"df87a7cf_7a3efdb8","updated":"2017-12-19 07:10:55.000000000","message":"Done","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"4394b9de097532584b5a47fe991aecf60fee55be","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def get_resources_for_full_sync(self, context, resource_type):"},{"line_number":52,"context_line":"        \"\"\"Provide all resources of type resource_type \"\"\""},{"line_number":53,"context_line":"        resource_suffix \u003d self.RESOURCES.get(resource_type)"},{"line_number":54,"context_line":"        if resource_suffix is None:"},{"line_number":55,"context_line":"            raise exceptions.UnsupportedResourceType()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        method_name \u003d self.get_method_name_by_resource_suffix(resource_suffix)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        try:"},{"line_number":60,"context_line":"            return getattr(self.plugin, method_name)(context)"}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_5290a74a","line":57,"range":{"start_line":53,"start_character":8,"end_line":57,"end_character":78},"updated":"2017-12-19 08:27:52.000000000","message":"For clarity and simplicity, I\u0027d structure this as:\n\n        if resource_type not in self.RESOURCES:\n            raise exceptions.UnsupportedResourceType\n\n        method_name \u003d self.full_sync_get_all_method(\n            self.RESOURCES[resource_type])","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"4c11ae3bdeb326454755f9ffa1ca9a9a7998843a","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def get_resources_for_full_sync(self, context, resource_type):"},{"line_number":52,"context_line":"        \"\"\"Provide all resources of type resource_type \"\"\""},{"line_number":53,"context_line":"        resource_suffix \u003d self.RESOURCES.get(resource_type)"},{"line_number":54,"context_line":"        if resource_suffix is None:"},{"line_number":55,"context_line":"            raise exceptions.UnsupportedResourceType()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        method_name \u003d self.get_method_name_by_resource_suffix(resource_suffix)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        try:"},{"line_number":60,"context_line":"            return getattr(self.plugin, method_name)(context)"}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_b562263d","line":57,"range":{"start_line":53,"start_character":8,"end_line":57,"end_character":78},"in_reply_to":"df87a7cf_5290a74a","updated":"2017-12-20 04:36:10.000000000","message":"Done","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"f94419330f6f921c2b9eeaf3840c8cfe1b8f7cf0","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        method_name \u003d self.get_method_name_by_resource_suffix(resource_suffix)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        try:"},{"line_number":60,"context_line":"            return getattr(self.plugin, method_name)(context)"},{"line_number":61,"context_line":"        except AttributeError:"},{"line_number":62,"context_line":"            raise exceptions.UnsupportedResourceType"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @property"},{"line_number":65,"context_line":"    def plugin(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_3a16354b","line":62,"range":{"start_line":59,"start_character":8,"end_line":62,"end_character":52},"updated":"2017-12-18 09:36:04.000000000","message":"separate this into two steps, \n\n1) one wrapped by the try/except where you get the attr\n2) and another one without the try/except that calls that method\n\nThis is because AttributeError is a very broad exception that could happen anywhere and not just on the one operation.\n\nAlso, an AttributeError wouldn\u0027t need to raise a PluginMethodNotFound?","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"e31aceea4180bfe84d003225a813c735564e5844","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        method_name \u003d self.get_method_name_by_resource_suffix(resource_suffix)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        try:"},{"line_number":60,"context_line":"            return getattr(self.plugin, method_name)(context)"},{"line_number":61,"context_line":"        except AttributeError:"},{"line_number":62,"context_line":"            raise exceptions.UnsupportedResourceType"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @property"},{"line_number":65,"context_line":"    def plugin(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_7ced82ee","line":62,"range":{"start_line":59,"start_character":8,"end_line":62,"end_character":52},"in_reply_to":"df87a7cf_3a16354b","updated":"2017-12-19 07:10:55.000000000","message":"Done","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"f94419330f6f921c2b9eeaf3840c8cfe1b8f7cf0","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @property"},{"line_number":65,"context_line":"    def plugin(self):"},{"line_number":66,"context_line":"        return directory.get_plugin(self.plugin_type)"}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_9aa181fa","line":66,"range":{"start_line":66,"start_character":15,"end_line":66,"end_character":53},"updated":"2017-12-18 09:36:04.000000000","message":"Can it raise exceptions? If so, would you want to treat them here?","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"e31aceea4180bfe84d003225a813c735564e5844","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @property"},{"line_number":65,"context_line":"    def plugin(self):"},{"line_number":66,"context_line":"        return directory.get_plugin(self.plugin_type)"}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_1cb8f6e2","line":66,"range":{"start_line":66,"start_character":15,"end_line":66,"end_character":53},"in_reply_to":"df87a7cf_9aa181fa","updated":"2017-12-19 07:10:55.000000000","message":"AFAIK it does not. If a plugin is not registered then it returns null.","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"7b287642de52d4929f4d32ce92e88d6790208eb7","unresolved":false,"context_lines":[{"line_number":42,"context_line":"       or plural used for the resources."},{"line_number":43,"context_line":"    \"\"\""},{"line_number":44,"context_line":"    RESOURCES \u003d {}"},{"line_number":45,"context_line":"    plugin_type \u003d None"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":48,"context_line":"        super(ResourceBaseDriver, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_f0da12e7","line":45,"range":{"start_line":45,"start_character":4,"end_line":45,"end_character":22},"updated":"2017-12-19 10:41:05.000000000","message":"This should also be documented in the doctext probably..","commit_id":"04b2dbd7132652958556a6bdff35b6b0b989375d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"4c11ae3bdeb326454755f9ffa1ca9a9a7998843a","unresolved":false,"context_lines":[{"line_number":42,"context_line":"       or plural used for the resources."},{"line_number":43,"context_line":"    \"\"\""},{"line_number":44,"context_line":"    RESOURCES \u003d {}"},{"line_number":45,"context_line":"    plugin_type \u003d None"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":48,"context_line":"        super(ResourceBaseDriver, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_3556165e","line":45,"range":{"start_line":45,"start_character":4,"end_line":45,"end_character":22},"in_reply_to":"df87a7cf_f0da12e7","updated":"2017-12-20 04:36:10.000000000","message":"Done","commit_id":"04b2dbd7132652958556a6bdff35b6b0b989375d"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"ea433788105836ef3081e0dd9efe5913e5fdd54c","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    def get_resources_for_full_sync(self, context, resource_type):"},{"line_number":58,"context_line":"        \"\"\"Provide all resources of type resource_type \"\"\""},{"line_number":59,"context_line":"        if resource_type not in self.RESOURCES:"},{"line_number":60,"context_line":"            raise exceptions.UnsupportedResourceType"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        method_name \u003d \u0027get_%s\u0027 % self.RESOURCES[resource_type]"},{"line_number":63,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":13,"id":"7f96bb07_8a92e1f5","line":60,"range":{"start_line":60,"start_character":18,"end_line":60,"end_character":52},"updated":"2018-01-12 08:42:47.000000000","message":"Please raise an instance, not class.\nalso please pass resource_type to message of UnsupportedResourceType for debug.","commit_id":"24675835eef2f8aae4dde9d37fb772706c1892fa"}],"networking_odl/journal/full_sync.py":[{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    sync_resource \u003d base_driver.ResourceBaseDriver.get_resource_details("},{"line_number":161,"context_line":"        object_type)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    # NOTE: if resource is not registered no need to full sync"},{"line_number":164,"context_line":"    if sync_resource is None:"},{"line_number":165,"context_line":"        return"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_06f1cfcd","line":163,"range":{"start_line":163,"start_character":6,"end_line":163,"end_character":10},"updated":"2017-11-22 12:41:08.000000000","message":"try to use NOTE(rajivk)","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":164,"context_line":"    if sync_resource is None:"},{"line_number":165,"context_line":"        return"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    plugin \u003d sync_resource.plugin"},{"line_number":168,"context_line":"    driver \u003d sync_resource.driver"},{"line_number":169,"context_line":"    if plugin is None:"},{"line_number":170,"context_line":"        # NOTE: This condition can occur due to misconfiguration"},{"line_number":171,"context_line":"        LOG.error(\"Plugin is not registered, for %s resource\", object_type)"},{"line_number":172,"context_line":"        return"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    try:"},{"line_number":175,"context_line":"        resources \u003d driver.get_resources(context, plugin,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_c6d3e737","line":172,"range":{"start_line":167,"start_character":4,"end_line":172,"end_character":14},"updated":"2017-11-22 12:41:08.000000000","message":"Handle this with an exception, I think it\u0027s nicer.\n\n(nv) A minor thing regarding L168, I think it should be after this check, since it\u0027s not immediately used and if plugin is None then you just assigned it unnecessarily.","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    try:"},{"line_number":175,"context_line":"        resources \u003d driver.get_resources(context, plugin,"},{"line_number":176,"context_line":"                                         sync_resource.resource_suffix)"},{"line_number":177,"context_line":"    except Exception:"},{"line_number":178,"context_line":"        # If an error occured while processing full sync, skip this entry"},{"line_number":179,"context_line":"        # but proceed to next entry. It can be caused due to some error"},{"line_number":180,"context_line":"        # specific to a resource at ODL side."}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_265093d4","line":177,"range":{"start_line":177,"start_character":11,"end_line":177,"end_character":20},"updated":"2017-11-22 12:41:08.000000000","message":"I think you can narrow down this.","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        resources \u003d driver.get_resources(context, plugin,"},{"line_number":176,"context_line":"                                         sync_resource.resource_suffix)"},{"line_number":177,"context_line":"    except Exception:"},{"line_number":178,"context_line":"        # If an error occured while processing full sync, skip this entry"},{"line_number":179,"context_line":"        # but proceed to next entry. It can be caused due to some error"},{"line_number":180,"context_line":"        # specific to a resource at ODL side."},{"line_number":181,"context_line":"        LOG.error(\"Error in processing %s\", object_type, exc_info\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_e6bf0bce","line":178,"range":{"start_line":178,"start_character":10,"end_line":178,"end_character":34},"updated":"2017-11-22 12:41:08.000000000","message":"try to use NOTE(rajivk)","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"8a0436e351e75c6611be806d62d93f73ed46635e","unresolved":false,"context_lines":[{"line_number":163,"context_line":"def sync_resources(context, resource_type):"},{"line_number":164,"context_line":"    driver \u003d base_driver.ResourceBaseDriver.get_driver(resource_type)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    # NOTE(rajivk): if resource is not registered no need to full sync"},{"line_number":167,"context_line":"    if driver is None:"},{"line_number":168,"context_line":"        raise exceptions.ResourceNotRegistered(resource_type\u003dresource_type,"},{"line_number":169,"context_line":"                                               operation\u003d\u0027full sync\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_d239edd6","line":166,"range":{"start_line":166,"start_character":0,"end_line":166,"end_character":70},"updated":"2017-12-10 13:38:04.000000000","message":"Comment doesn\u0027t match behavior, it\u0027s not a \"no need\" but rather an error judging by the behavior.","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"eb48ce807353da33d0768c2caa77d21aa78c6df6","unresolved":false,"context_lines":[{"line_number":163,"context_line":"def sync_resources(context, resource_type):"},{"line_number":164,"context_line":"    driver \u003d base_driver.ResourceBaseDriver.get_driver(resource_type)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    # NOTE(rajivk): if resource is not registered no need to full sync"},{"line_number":167,"context_line":"    if driver is None:"},{"line_number":168,"context_line":"        raise exceptions.ResourceNotRegistered(resource_type\u003dresource_type,"},{"line_number":169,"context_line":"                                               operation\u003d\u0027full sync\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_0bbe33fe","line":166,"range":{"start_line":166,"start_character":0,"end_line":166,"end_character":70},"in_reply_to":"df87a7cf_d239edd6","updated":"2017-12-12 09:27:33.000000000","message":"Done","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"8a0436e351e75c6611be806d62d93f73ed46635e","unresolved":false,"context_lines":[{"line_number":164,"context_line":"    driver \u003d base_driver.ResourceBaseDriver.get_driver(resource_type)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    # NOTE(rajivk): if resource is not registered no need to full sync"},{"line_number":167,"context_line":"    if driver is None:"},{"line_number":168,"context_line":"        raise exceptions.ResourceNotRegistered(resource_type\u003dresource_type,"},{"line_number":169,"context_line":"                                               operation\u003d\u0027full sync\u0027)"},{"line_number":170,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_922fe586","line":167,"range":{"start_line":167,"start_character":0,"end_line":167,"end_character":22},"updated":"2017-12-10 13:38:04.000000000","message":"This is a bit defensive IMHO, instead if the driver doesn\u0027t exist let it fail with a NoneType error as it\u0027s clearly some bug anyway..","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"eb48ce807353da33d0768c2caa77d21aa78c6df6","unresolved":false,"context_lines":[{"line_number":164,"context_line":"    driver \u003d base_driver.ResourceBaseDriver.get_driver(resource_type)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    # NOTE(rajivk): if resource is not registered no need to full sync"},{"line_number":167,"context_line":"    if driver is None:"},{"line_number":168,"context_line":"        raise exceptions.ResourceNotRegistered(resource_type\u003dresource_type,"},{"line_number":169,"context_line":"                                               operation\u003d\u0027full sync\u0027)"},{"line_number":170,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_ab5b87f3","line":167,"range":{"start_line":167,"start_character":0,"end_line":167,"end_character":22},"in_reply_to":"df87a7cf_922fe586","updated":"2017-12-12 09:27:33.000000000","message":"no, it is not bug. Because syncing of all resource is done no matter, what drivers are enabled. So if a driver is not registered, resources managed by that driver, does not have to be synced. It is expected.","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"8a0436e351e75c6611be806d62d93f73ed46635e","unresolved":false,"context_lines":[{"line_number":167,"context_line":"    if driver is None:"},{"line_number":168,"context_line":"        raise exceptions.ResourceNotRegistered(resource_type\u003dresource_type,"},{"line_number":169,"context_line":"                                               operation\u003d\u0027full sync\u0027)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    plugin \u003d base_driver.ResourceBaseDriver.get_plugin(driver.plugin_type)"},{"line_number":172,"context_line":"    if plugin is None:"},{"line_number":173,"context_line":"        LOG.exception(PLUGIN_NOT_REGISTERED, driver.plugin_type)"},{"line_number":174,"context_line":"        raise exceptions.PluginNotFound(plugin\u003ddriver.plugin_type,"},{"line_number":175,"context_line":"                                        resource_type\u003dresource_type)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    try:"},{"line_number":178,"context_line":"        resources \u003d driver.get_resources_for_full_sync(context, resource_type)"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_52539d17","line":175,"range":{"start_line":170,"start_character":0,"end_line":175,"end_character":68},"updated":"2017-12-10 13:38:04.000000000","message":"plugin is not used here, this isn\u0027t needed","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"eb48ce807353da33d0768c2caa77d21aa78c6df6","unresolved":false,"context_lines":[{"line_number":167,"context_line":"    if driver is None:"},{"line_number":168,"context_line":"        raise exceptions.ResourceNotRegistered(resource_type\u003dresource_type,"},{"line_number":169,"context_line":"                                               operation\u003d\u0027full sync\u0027)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    plugin \u003d base_driver.ResourceBaseDriver.get_plugin(driver.plugin_type)"},{"line_number":172,"context_line":"    if plugin is None:"},{"line_number":173,"context_line":"        LOG.exception(PLUGIN_NOT_REGISTERED, driver.plugin_type)"},{"line_number":174,"context_line":"        raise exceptions.PluginNotFound(plugin\u003ddriver.plugin_type,"},{"line_number":175,"context_line":"                                        resource_type\u003dresource_type)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    try:"},{"line_number":178,"context_line":"        resources \u003d driver.get_resources_for_full_sync(context, resource_type)"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_2b6777b9","line":175,"range":{"start_line":170,"start_character":0,"end_line":175,"end_character":68},"in_reply_to":"df87a7cf_52539d17","updated":"2017-12-12 09:27:33.000000000","message":"do you want it to fail inside get_resources_for_full_sync?","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"8a0436e351e75c6611be806d62d93f73ed46635e","unresolved":false,"context_lines":[{"line_number":177,"context_line":"    try:"},{"line_number":178,"context_line":"        resources \u003d driver.get_resources_for_full_sync(context, resource_type)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    except exceptions.UnsupportedResourceType:"},{"line_number":181,"context_line":"        # NOTE(rajivk): If an resource is not supported for full sync"},{"line_number":182,"context_line":"        # then move to next entry for processing."},{"line_number":183,"context_line":"        LOG.error(UNSUPPORTED_RESOURCE, resource_type)"},{"line_number":184,"context_line":"        raise"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    with db_api.autonested_transaction(context.session):"},{"line_number":187,"context_line":"        for resource in resources:"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_f25511fb","line":184,"range":{"start_line":180,"start_character":0,"end_line":184,"end_character":13},"updated":"2017-12-10 13:38:04.000000000","message":"This makes no sense IMHO, the resource name should be already in the error message which will be printed anyway with it\u0027s stack trace, so why catch and then reraise it?\nJust let the exception fly and the caller will either handle it, or (more likely) it will be logged somewhere anyway..","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"eb48ce807353da33d0768c2caa77d21aa78c6df6","unresolved":false,"context_lines":[{"line_number":177,"context_line":"    try:"},{"line_number":178,"context_line":"        resources \u003d driver.get_resources_for_full_sync(context, resource_type)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    except exceptions.UnsupportedResourceType:"},{"line_number":181,"context_line":"        # NOTE(rajivk): If an resource is not supported for full sync"},{"line_number":182,"context_line":"        # then move to next entry for processing."},{"line_number":183,"context_line":"        LOG.error(UNSUPPORTED_RESOURCE, resource_type)"},{"line_number":184,"context_line":"        raise"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    with db_api.autonested_transaction(context.session):"},{"line_number":187,"context_line":"        for resource in resources:"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_2b1537e5","line":184,"range":{"start_line":180,"start_character":0,"end_line":184,"end_character":13},"in_reply_to":"df87a7cf_f25511fb","updated":"2017-12-12 09:27:33.000000000","message":"Done","commit_id":"58a700fcec68cc98f216bd85a552252894a1d1dd"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"7427348ad112950d2c72559f231046b29483f042","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        raise exceptions.ResourceNotRegistered(resource_type\u003dresource_type,"},{"line_number":170,"context_line":"                                               operation\u003d\u0027full sync\u0027)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    plugin \u003d base_driver.ResourceBaseDriver.get_plugin(driver.plugin_type)"},{"line_number":173,"context_line":"    if plugin is None:"},{"line_number":174,"context_line":"        LOG.exception(PLUGIN_NOT_REGISTERED, driver.plugin_type)"},{"line_number":175,"context_line":"        raise exceptions.PluginNotFound(plugin\u003ddriver.plugin_type,"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_84df7f0b","line":172,"range":{"start_line":172,"start_character":13,"end_line":172,"end_character":74},"updated":"2017-12-12 01:07:10.000000000","message":"Is the driver subclass of ResourceBaseDriver?\nso driver.get_plugin() should work.","commit_id":"483b472170df8e65f6dd47f776c4e47a6bb8b20d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"eb48ce807353da33d0768c2caa77d21aa78c6df6","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        raise exceptions.ResourceNotRegistered(resource_type\u003dresource_type,"},{"line_number":170,"context_line":"                                               operation\u003d\u0027full sync\u0027)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    plugin \u003d base_driver.ResourceBaseDriver.get_plugin(driver.plugin_type)"},{"line_number":173,"context_line":"    if plugin is None:"},{"line_number":174,"context_line":"        LOG.exception(PLUGIN_NOT_REGISTERED, driver.plugin_type)"},{"line_number":175,"context_line":"        raise exceptions.PluginNotFound(plugin\u003ddriver.plugin_type,"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_136732eb","line":172,"range":{"start_line":172,"start_character":13,"end_line":172,"end_character":74},"in_reply_to":"df87a7cf_84df7f0b","updated":"2017-12-12 09:27:33.000000000","message":"Done","commit_id":"483b472170df8e65f6dd47f776c4e47a6bb8b20d"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"504058bb8798ea473277100a82d48ccbadac30c3","unresolved":false,"context_lines":[{"line_number":158,"context_line":""},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"@db_api.retry_if_session_inactive()"},{"line_number":161,"context_line":"# TODO(rajivk): Change name from sync_resource to _sync_resources"},{"line_number":162,"context_line":"# once, we are completely moved to new sync mechanism"},{"line_number":163,"context_line":"def sync_resources(context, resource_type):"},{"line_number":164,"context_line":"    driver \u003d base_driver.get_driver(resource_type)"},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_af3597aa","line":162,"range":{"start_line":161,"start_character":0,"end_line":162,"end_character":53},"updated":"2017-12-13 09:41:02.000000000","message":"Could you explain (not necessarily in the comment) a bit more about this?","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"f94419330f6f921c2b9eeaf3840c8cfe1b8f7cf0","unresolved":false,"context_lines":[{"line_number":158,"context_line":""},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"@db_api.retry_if_session_inactive()"},{"line_number":161,"context_line":"# TODO(rajivk): Change name from sync_resource to _sync_resources"},{"line_number":162,"context_line":"# once, we are completely moved to new sync mechanism"},{"line_number":163,"context_line":"def sync_resources(context, resource_type):"},{"line_number":164,"context_line":"    driver \u003d base_driver.get_driver(resource_type)"},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_7ada7d78","line":162,"range":{"start_line":161,"start_character":0,"end_line":162,"end_character":53},"in_reply_to":"df87a7cf_9fb46af4","updated":"2017-12-18 09:36:04.000000000","message":"mmm it\u0027s still unclear why are you using sync_resource and then why we need to change to _sync_resources and what the condition is met to make that change","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"51ba6a29439fccf883a4d4d6aee1fdd5a3861891","unresolved":false,"context_lines":[{"line_number":158,"context_line":""},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"@db_api.retry_if_session_inactive()"},{"line_number":161,"context_line":"# TODO(rajivk): Change name from sync_resource to _sync_resources"},{"line_number":162,"context_line":"# once, we are completely moved to new sync mechanism"},{"line_number":163,"context_line":"def sync_resources(context, resource_type):"},{"line_number":164,"context_line":"    driver \u003d base_driver.get_driver(resource_type)"},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_9fb46af4","line":162,"range":{"start_line":161,"start_character":0,"end_line":162,"end_character":53},"in_reply_to":"df87a7cf_af3597aa","updated":"2017-12-14 06:15:20.000000000","message":"Done","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"504058bb8798ea473277100a82d48ccbadac30c3","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    # NOTE(rajivk): if resource is not registered no need to sync this"},{"line_number":167,"context_line":"    # resource."},{"line_number":168,"context_line":"    if driver is None:"},{"line_number":169,"context_line":"        raise exceptions.ResourceNotRegistered(resource_type\u003dresource_type,"},{"line_number":170,"context_line":"                                               operation\u003d\u0027full sync\u0027)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    plugin \u003d driver.get_plugin()"},{"line_number":173,"context_line":"    if plugin is None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_6fca2fa2","line":170,"range":{"start_line":168,"start_character":1,"end_line":170,"end_character":69},"updated":"2017-12-13 09:41:02.000000000","message":"1) Why not having this inside of `get_driver`? \n2) In python, when the exception is REALLY an exception it\u0027s preferred to have try/except than to check with if. Therefore  it would be better to access the dictionary directly, except on KeyError and raise the exception you are excepting here.","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"51ba6a29439fccf883a4d4d6aee1fdd5a3861891","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    # NOTE(rajivk): if resource is not registered no need to sync this"},{"line_number":167,"context_line":"    # resource."},{"line_number":168,"context_line":"    if driver is None:"},{"line_number":169,"context_line":"        raise exceptions.ResourceNotRegistered(resource_type\u003dresource_type,"},{"line_number":170,"context_line":"                                               operation\u003d\u0027full sync\u0027)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    plugin \u003d driver.get_plugin()"},{"line_number":173,"context_line":"    if plugin is None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_1fc4da3f","line":170,"range":{"start_line":168,"start_character":1,"end_line":170,"end_character":69},"in_reply_to":"df87a7cf_6fca2fa2","updated":"2017-12-14 06:15:20.000000000","message":"2 agreed and changed. If we go with 1 then we will have to check if resource type is registered or not, so it is against EAFP.","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"504058bb8798ea473277100a82d48ccbadac30c3","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        raise exceptions.ResourceNotRegistered(resource_type\u003dresource_type,"},{"line_number":170,"context_line":"                                               operation\u003d\u0027full sync\u0027)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    plugin \u003d driver.get_plugin()"},{"line_number":173,"context_line":"    if plugin is None:"},{"line_number":174,"context_line":"        LOG.exception(PLUGIN_NOT_REGISTERED, driver.plugin_type)"},{"line_number":175,"context_line":"        raise exceptions.PluginNotFound(plugin\u003ddriver.plugin_type,"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_526fd491","line":172,"range":{"start_line":172,"start_character":4,"end_line":172,"end_character":10},"updated":"2017-12-13 09:41:02.000000000","message":"plugin is never used, what\u0027s this for?","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"51ba6a29439fccf883a4d4d6aee1fdd5a3861891","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        raise exceptions.ResourceNotRegistered(resource_type\u003dresource_type,"},{"line_number":170,"context_line":"                                               operation\u003d\u0027full sync\u0027)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    plugin \u003d driver.get_plugin()"},{"line_number":173,"context_line":"    if plugin is None:"},{"line_number":174,"context_line":"        LOG.exception(PLUGIN_NOT_REGISTERED, driver.plugin_type)"},{"line_number":175,"context_line":"        raise exceptions.PluginNotFound(plugin\u003ddriver.plugin_type,"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_3fc19e2f","line":172,"range":{"start_line":172,"start_character":4,"end_line":172,"end_character":10},"in_reply_to":"df87a7cf_526fd491","updated":"2017-12-14 06:15:20.000000000","message":"Done","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"504058bb8798ea473277100a82d48ccbadac30c3","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        raise exceptions.ResourceNotRegistered(resource_type\u003dresource_type,"},{"line_number":170,"context_line":"                                               operation\u003d\u0027full sync\u0027)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    plugin \u003d driver.get_plugin()"},{"line_number":173,"context_line":"    if plugin is None:"},{"line_number":174,"context_line":"        LOG.exception(PLUGIN_NOT_REGISTERED, driver.plugin_type)"},{"line_number":175,"context_line":"        raise exceptions.PluginNotFound(plugin\u003ddriver.plugin_type,"},{"line_number":176,"context_line":"                                        resource_type\u003dresource_type)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    resources \u003d driver.get_resources_for_full_sync(context, resource_type)"},{"line_number":179,"context_line":"    with db_api.autonested_transaction(context.session):"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_d23a0497","line":176,"range":{"start_line":172,"start_character":4,"end_line":176,"end_character":68},"updated":"2017-12-13 09:41:02.000000000","message":"why not inside of get_plugin?","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"51ba6a29439fccf883a4d4d6aee1fdd5a3861891","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        raise exceptions.ResourceNotRegistered(resource_type\u003dresource_type,"},{"line_number":170,"context_line":"                                               operation\u003d\u0027full sync\u0027)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    plugin \u003d driver.get_plugin()"},{"line_number":173,"context_line":"    if plugin is None:"},{"line_number":174,"context_line":"        LOG.exception(PLUGIN_NOT_REGISTERED, driver.plugin_type)"},{"line_number":175,"context_line":"        raise exceptions.PluginNotFound(plugin\u003ddriver.plugin_type,"},{"line_number":176,"context_line":"                                        resource_type\u003dresource_type)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    resources \u003d driver.get_resources_for_full_sync(context, resource_type)"},{"line_number":179,"context_line":"    with db_api.autonested_transaction(context.session):"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_dfdbd21e","line":176,"range":{"start_line":172,"start_character":4,"end_line":176,"end_character":68},"in_reply_to":"df87a7cf_d23a0497","updated":"2017-12-14 06:15:20.000000000","message":"Done","commit_id":"9ff4c09051ab21467a92f000f335c803fd61241d"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"e43cc1422f22c58006b4ea804f9b14f746d966b3","unresolved":false,"context_lines":[{"line_number":28,"context_line":"from networking_odl.journal import journal"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# Define which pending operation types should be deleted"},{"line_number":34,"context_line":"_CANARY_NETWORK_ID \u003d \"bd8db3a8-2b30-4083-a8b3-b3fd46401142\""}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_bae320d8","line":31,"range":{"start_line":31,"start_character":0,"end_line":31,"end_character":33},"updated":"2017-12-18 13:15:07.000000000","message":"Unused","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"e31aceea4180bfe84d003225a813c735564e5844","unresolved":false,"context_lines":[{"line_number":28,"context_line":"from networking_odl.journal import journal"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# Define which pending operation types should be deleted"},{"line_number":34,"context_line":"_CANARY_NETWORK_ID \u003d \"bd8db3a8-2b30-4083-a8b3-b3fd46401142\""}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_5c9bde16","line":31,"range":{"start_line":31,"start_character":0,"end_line":31,"end_character":33},"in_reply_to":"df87a7cf_bae320d8","updated":"2017-12-19 07:10:55.000000000","message":"Done","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"f94419330f6f921c2b9eeaf3840c8cfe1b8f7cf0","unresolved":false,"context_lines":[{"line_number":162,"context_line":"    driver \u003d base_driver.get_driver(resource_type)"},{"line_number":163,"context_line":"    try:"},{"line_number":164,"context_line":"        resources \u003d driver.get_resources_for_full_sync(context, resource_type)"},{"line_number":165,"context_line":"    except AttributeError:"},{"line_number":166,"context_line":"        # NOTE(rajivk): if resource is not registered no need to sync this"},{"line_number":167,"context_line":"        # resource."},{"line_number":168,"context_line":"        raise exceptions.ResourceNotRegistered(resource_type\u003dresource_type)"}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_1abc9104","line":165,"range":{"start_line":165,"start_character":11,"end_line":165,"end_character":25},"updated":"2017-12-18 09:36:04.000000000","message":"1) Separate this line into two steps so you can isolate  AttributeError. \n\n2) Also, I think that if the resource is not registered then the ResourceNotRegistered should be risen inside get_driver by not using the `.get` but accessing the key directly and excepting KeyError.\n\n3) Finally, I want to mention that this AttributeError check would be handled when accessing driver.get_resources_for_full_sync and the function doesn\u0027t exist. In that case ResourceNotRegistered doesn\u0027t seem like a descriptive exception.","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"e43cc1422f22c58006b4ea804f9b14f746d966b3","unresolved":false,"context_lines":[{"line_number":162,"context_line":"    driver \u003d base_driver.get_driver(resource_type)"},{"line_number":163,"context_line":"    try:"},{"line_number":164,"context_line":"        resources \u003d driver.get_resources_for_full_sync(context, resource_type)"},{"line_number":165,"context_line":"    except AttributeError:"},{"line_number":166,"context_line":"        # NOTE(rajivk): if resource is not registered no need to sync this"},{"line_number":167,"context_line":"        # resource."},{"line_number":168,"context_line":"        raise exceptions.ResourceNotRegistered(resource_type\u003dresource_type)"}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_daace4a0","line":165,"range":{"start_line":165,"start_character":11,"end_line":165,"end_character":25},"in_reply_to":"df87a7cf_1abc9104","updated":"2017-12-18 13:15:07.000000000","message":"+1 on the question \"why do you expect this here?\"","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"e31aceea4180bfe84d003225a813c735564e5844","unresolved":false,"context_lines":[{"line_number":162,"context_line":"    driver \u003d base_driver.get_driver(resource_type)"},{"line_number":163,"context_line":"    try:"},{"line_number":164,"context_line":"        resources \u003d driver.get_resources_for_full_sync(context, resource_type)"},{"line_number":165,"context_line":"    except AttributeError:"},{"line_number":166,"context_line":"        # NOTE(rajivk): if resource is not registered no need to sync this"},{"line_number":167,"context_line":"        # resource."},{"line_number":168,"context_line":"        raise exceptions.ResourceNotRegistered(resource_type\u003dresource_type)"}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_dc012e3a","line":165,"range":{"start_line":165,"start_character":11,"end_line":165,"end_character":25},"in_reply_to":"df87a7cf_1abc9104","updated":"2017-12-19 07:10:55.000000000","message":"Done","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"e31aceea4180bfe84d003225a813c735564e5844","unresolved":false,"context_lines":[{"line_number":162,"context_line":"    driver \u003d base_driver.get_driver(resource_type)"},{"line_number":163,"context_line":"    try:"},{"line_number":164,"context_line":"        resources \u003d driver.get_resources_for_full_sync(context, resource_type)"},{"line_number":165,"context_line":"    except AttributeError:"},{"line_number":166,"context_line":"        # NOTE(rajivk): if resource is not registered no need to sync this"},{"line_number":167,"context_line":"        # resource."},{"line_number":168,"context_line":"        raise exceptions.ResourceNotRegistered(resource_type\u003dresource_type)"}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_7cfa6243","line":165,"range":{"start_line":165,"start_character":11,"end_line":165,"end_character":25},"in_reply_to":"df87a7cf_daace4a0","updated":"2017-12-19 07:10:55.000000000","message":"Do you mean attribute error?","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"7b287642de52d4929f4d32ce92e88d6790208eb7","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    try:"},{"line_number":162,"context_line":"        resources_getter \u003d driver.get_resources_for_full_sync"},{"line_number":163,"context_line":"    except AttributeError:"},{"line_number":164,"context_line":"        raise exceptions.FullSyncNotSupported(resource_type\u003dresource_type)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    resources \u003d resources_getter(context, resource_type)"},{"line_number":167,"context_line":"    with db_api.autonested_transaction(context.session):"}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_b08ecace","line":164,"range":{"start_line":163,"start_character":4,"end_line":164,"end_character":74},"updated":"2017-12-19 10:41:05.000000000","message":"This doesn\u0027t make sense IMHO, just let it fail with the original error since this is clearly a bug..\n\nAlso the parameter to the exception deosn\u0027t make sense since it doesn\u0027t really matter what value is there, the driver doesn\u0027t support \"full sync\"..","commit_id":"04b2dbd7132652958556a6bdff35b6b0b989375d"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"4c11ae3bdeb326454755f9ffa1ca9a9a7998843a","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    try:"},{"line_number":162,"context_line":"        resources_getter \u003d driver.get_resources_for_full_sync"},{"line_number":163,"context_line":"    except AttributeError:"},{"line_number":164,"context_line":"        raise exceptions.FullSyncNotSupported(resource_type\u003dresource_type)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    resources \u003d resources_getter(context, resource_type)"},{"line_number":167,"context_line":"    with db_api.autonested_transaction(context.session):"}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_154992b5","line":164,"range":{"start_line":163,"start_character":4,"end_line":164,"end_character":74},"in_reply_to":"df87a7cf_b08ecace","updated":"2017-12-20 04:36:10.000000000","message":"Done","commit_id":"04b2dbd7132652958556a6bdff35b6b0b989375d"}],"networking_odl/tests/unit/journal/test_base_driver.py":[{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"ff82abbf_86b63ffa","updated":"2017-11-22 12:41:08.000000000","message":"I haven\u0027t checked this one yet, I\u0027ll wait for changes on the other files.","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"e43cc1422f22c58006b4ea804f9b14f746d966b3","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    }"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def __init__(self):"},{"line_number":46,"context_line":"        directory.add_plugin(TEST_PLUGIN, TestPlugin())"},{"line_number":47,"context_line":"        super(TestDriver, self).__init__(TEST_PLUGIN)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_7a2838e1","line":46,"range":{"start_line":46,"start_character":8,"end_line":46,"end_character":55},"updated":"2017-12-18 13:15:07.000000000","message":"Shouldn\u0027t this be in the test setUp?\nI don\u0027t see why it needs to be here","commit_id":"c147c31588977e2ba10dd2688e6f2c9811b67a83"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"806a4bd07bf5d297d1d0f0e82d01923ca6df7869","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        super(BaseDriverTestCase, self).setUp()"},{"line_number":53,"context_line":"        self.test_driver \u003d TestDriver()"},{"line_number":54,"context_line":"        self.plugin \u003d TestPlugin()"},{"line_number":55,"context_line":"        directory.add_plugin(TEST_PLUGIN, self.plugin)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def test_get_resource_driver(self):"},{"line_number":58,"context_line":"        for resource, resource_suffix in self.test_driver.RESOURCES.items():"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf8cb3f7_fa578d01","line":55,"range":{"start_line":55,"start_character":8,"end_line":55,"end_character":54},"updated":"2017-12-27 13:01:39.000000000","message":"I think there should be a cleanup for this, don\u0027t you?","commit_id":"3bebda7e43116d7dca7d00d0edbd2ec257b95af6"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"8bc2ac2f23a3557ce0cc692d905d061b68883053","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.test_driver \u003d TestDriver()"},{"line_number":54,"context_line":"        self.plugin \u003d TestPlugin()"},{"line_number":55,"context_line":"        directory.add_plugin(TEST_PLUGIN, self.plugin)"},{"line_number":56,"context_line":"        self.addCleanup(self.cleanup)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def cleanup(self):"},{"line_number":59,"context_line":"        directory.add_plugin(TEST_PLUGIN, None)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def test_get_resource_driver(self):"},{"line_number":62,"context_line":"        for resource, resource_suffix in self.test_driver.RESOURCES.items():"}],"source_content_type":"text/x-python","patch_set":12,"id":"9f91af0f_6c48d4cb","line":59,"range":{"start_line":56,"start_character":8,"end_line":59,"end_character":47},"updated":"2018-01-03 09:36:34.000000000","message":"Why not just self.addCleanup(directory.add_plugin, TEST_PLUGIN, None) ?","commit_id":"e97742597fa44754d0c844ab8cc1092dfa0e992b"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"5824eefac2e3057782b556e5be05a69880a1b9e4","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.test_driver \u003d TestDriver()"},{"line_number":54,"context_line":"        self.plugin \u003d TestPlugin()"},{"line_number":55,"context_line":"        directory.add_plugin(TEST_PLUGIN, self.plugin)"},{"line_number":56,"context_line":"        self.addCleanup(self.cleanup)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def cleanup(self):"},{"line_number":59,"context_line":"        directory.add_plugin(TEST_PLUGIN, None)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def test_get_resource_driver(self):"},{"line_number":62,"context_line":"        for resource, resource_suffix in self.test_driver.RESOURCES.items():"}],"source_content_type":"text/x-python","patch_set":12,"id":"9f91af0f_25464d51","line":59,"range":{"start_line":56,"start_character":8,"end_line":59,"end_character":47},"in_reply_to":"9f91af0f_6c48d4cb","updated":"2018-01-04 04:14:37.000000000","message":"Done","commit_id":"e97742597fa44754d0c844ab8cc1092dfa0e992b"}],"networking_odl/tests/unit/journal/test_full_sync.py":[{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"ff82abbf_26c5f35b","updated":"2017-11-22 12:41:08.000000000","message":"I haven\u0027t checked this one yet, I\u0027ll wait for changes on the other files.","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"},{"author":{"_account_id":26507,"name":"Michel Peterson","email":"michel@redhat.com","username":"mpeterson"},"change_message_id":"b2aeb2ebc8656fb7f82f1a03ce0a32af60de6071","unresolved":false,"context_lines":[{"line_number":44,"context_line":"from networking_odl.trunk import trunk_driver_v2 as trunk_driver"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"PLUGIN_NOT_REGISTERED \u003d \"Plugin is not registered, for %s resource\""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class FullSyncTestCase(test_base_db.ODLBaseDbTestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff82abbf_c6a1a7ab","line":47,"updated":"2017-11-22 12:41:08.000000000","message":"you have this string in full_sync as well. Variable reuse please.","commit_id":"64de8aed4cb4434fcfa80e6fa1c71bdd3f957513"}]}
