)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"9b173a039d2c4cd362d4e579b61469ea31810296","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"This patch changes those cases where \"host\" is no longer appropriate"},{"line_number":13,"context_line":"(ie: `find_retype_host`) and uses the more generic name \"backend\" (ie:"},{"line_number":14,"context_line":"`find_retype_bakend`)."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Specs: https://review.openstack.org/327283"},{"line_number":17,"context_line":"Implements: blueprint cinder-volume-active-active-support"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":28,"id":"5a74a57a_83da3d16","line":14,"range":{"start_line":14,"start_character":13,"end_line":14,"end_character":19},"updated":"2016-11-29 22:04:17.000000000","message":"s/bakend/backend/","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d3d629bfab65a10e39a584872c3e1683cda9657a","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"This patch changes those cases where \"host\" is no longer appropriate"},{"line_number":13,"context_line":"(ie: `find_retype_host`) and uses the more generic name \"backend\" (ie:"},{"line_number":14,"context_line":"`find_retype_bakend`)."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Specs: https://review.openstack.org/327283"},{"line_number":17,"context_line":"Implements: blueprint cinder-volume-active-active-support"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":28,"id":"5a74a57a_87494891","line":14,"range":{"start_line":14,"start_character":13,"end_line":14,"end_character":19},"in_reply_to":"5a74a57a_83da3d16","updated":"2016-11-30 18:15:36.000000000","message":"Done","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"}],"cinder/exception.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"f398380136224d83a3aa46b7ceceafbe6ee14d0e","unresolved":false,"context_lines":[{"line_number":574,"context_line":"    message \u003d _(\"Could not load paste app \u0027%(name)s\u0027 from %(path)s\")"},{"line_number":575,"context_line":""},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"class NoValidBackend(CinderException):"},{"line_number":578,"context_line":"    message \u003d _(\"No valid backend was found. %(reason)s\")"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_32a1c794","line":577,"range":{"start_line":577,"start_character":0,"end_line":577,"end_character":38},"updated":"2016-11-29 15:48:06.000000000","message":"Oh. I wonder if users/operators won\u0027t hate this change - I can imagine a lot of monitoring scripts relying on this exception name. We should at least indicate this in release notes.","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d3d629bfab65a10e39a584872c3e1683cda9657a","unresolved":false,"context_lines":[{"line_number":574,"context_line":"    message \u003d _(\"Could not load paste app \u0027%(name)s\u0027 from %(path)s\")"},{"line_number":575,"context_line":""},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"class NoValidBackend(CinderException):"},{"line_number":578,"context_line":"    message \u003d _(\"No valid backend was found. %(reason)s\")"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_2a6599e0","line":577,"range":{"start_line":577,"start_character":0,"end_line":577,"end_character":38},"in_reply_to":"5a74a57a_32a1c794","updated":"2016-11-30 18:15:36.000000000","message":"And what should I say?  That the text of a failure has changed?  That\u0027s a weird thing to document in the release notes, so even if I see why they would want to know it, response messages are subject to change.  If you don\u0027t have a strong opinion about adding it I\u0027d rather not add it.","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"}],"cinder/scheduler/driver.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"f398380136224d83a3aa46b7ceceafbe6ee14d0e","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                                                      cluster_name,"},{"line_number":110,"context_line":"                                                      timestamp)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def backend_passes_filters(self, context, backend, request_spec,"},{"line_number":113,"context_line":"                               filter_properties):"},{"line_number":114,"context_line":"        \"\"\"Check if the specified host passes the filters.\"\"\""},{"line_number":115,"context_line":"        raise NotImplementedError(_(\"Must implement backend_passes_filters\"))"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def find_retype_backend(self, context, request_spec,"},{"line_number":118,"context_line":"                            filter_properties\u003dNone, migration_policy\u003d\u0027never\u0027):"},{"line_number":119,"context_line":"        \"\"\"Find a backend that can accept the volume with its new type.\"\"\""},{"line_number":120,"context_line":"        raise NotImplementedError(_(\"Must implement find_retype_backend\"))"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def schedule(self, context, topic, method, *_args, **_kwargs):"},{"line_number":123,"context_line":"        \"\"\"Must override schedule method for scheduler to work.\"\"\""}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_72433faf","line":120,"range":{"start_line":112,"start_character":0,"end_line":120,"end_character":74},"updated":"2016-11-29 15:48:06.000000000","message":"CONF.scheduler_driver is an option. If someone has a custom scheduler (e.g. random scheduler implementation) we\u0027ll break it. We should at least indicate interface name change in the release notes.","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d3d629bfab65a10e39a584872c3e1683cda9657a","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                                                      cluster_name,"},{"line_number":110,"context_line":"                                                      timestamp)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def backend_passes_filters(self, context, backend, request_spec,"},{"line_number":113,"context_line":"                               filter_properties):"},{"line_number":114,"context_line":"        \"\"\"Check if the specified host passes the filters.\"\"\""},{"line_number":115,"context_line":"        raise NotImplementedError(_(\"Must implement backend_passes_filters\"))"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def find_retype_backend(self, context, request_spec,"},{"line_number":118,"context_line":"                            filter_properties\u003dNone, migration_policy\u003d\u0027never\u0027):"},{"line_number":119,"context_line":"        \"\"\"Find a backend that can accept the volume with its new type.\"\"\""},{"line_number":120,"context_line":"        raise NotImplementedError(_(\"Must implement find_retype_backend\"))"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def schedule(self, context, topic, method, *_args, **_kwargs):"},{"line_number":123,"context_line":"        \"\"\"Must override schedule method for scheduler to work.\"\"\""}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_8ab94def","line":120,"range":{"start_line":112,"start_character":0,"end_line":120,"end_character":74},"in_reply_to":"5a74a57a_72433faf","updated":"2016-11-30 18:15:36.000000000","message":"Good point, I\u0027ll change it to be compatible with the old interface.","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"51aa319e7ee6c02471a024791bc41a9393f1b16b","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        raise NotImplementedError(_(\"Must implement find_retype_backend\"))"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    # NOTE(geguileo): For backward compatibility with out of tree Schedulers"},{"line_number":123,"context_line":"    # we don\u0027t change host_passes_filters or find_retype_host method namesm but"},{"line_number":124,"context_line":"    # create an \"alias\" for them with the right name instead."},{"line_number":125,"context_line":"    backend_passes_filters \u003d host_passes_filters"},{"line_number":126,"context_line":"    find_retype_backend \u003d find_retype_host"}],"source_content_type":"text/x-python","patch_set":29,"id":"3a71b18c_1a820b01","line":123,"range":{"start_line":123,"start_character":69,"end_line":123,"end_character":75},"updated":"2016-12-01 13:59:19.000000000","message":"typo","commit_id":"4f9e1f1f2d5c9178b653a8833f3edeaa95dea1bc"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"809264d832fc008e37f67479b21afaaf36f3de47","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        raise NotImplementedError(_(\"Must implement find_retype_backend\"))"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    # NOTE(geguileo): For backward compatibility with out of tree Schedulers"},{"line_number":123,"context_line":"    # we don\u0027t change host_passes_filters or find_retype_host method namesm but"},{"line_number":124,"context_line":"    # create an \"alias\" for them with the right name instead."},{"line_number":125,"context_line":"    backend_passes_filters \u003d host_passes_filters"},{"line_number":126,"context_line":"    find_retype_backend \u003d find_retype_host"}],"source_content_type":"text/x-python","patch_set":29,"id":"3a71b18c_20b6b88a","line":123,"range":{"start_line":123,"start_character":69,"end_line":123,"end_character":75},"in_reply_to":"3a71b18c_1a820b01","updated":"2016-12-01 15:34:57.000000000","message":"Done","commit_id":"4f9e1f1f2d5c9178b653a8833f3edeaa95dea1bc"}],"cinder/scheduler/filter_scheduler.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"f398380136224d83a3aa46b7ceceafbe6ee14d0e","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        retry \u003d filter_properties.get(\u0027retry\u0027, None)"},{"line_number":218,"context_line":"        if not retry:"},{"line_number":219,"context_line":"            return"},{"line_number":220,"context_line":"        hosts \u003d retry[\u0027backends\u0027]"},{"line_number":221,"context_line":"        hosts.append(backend)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def _max_attempts(self):"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_add57643","line":220,"range":{"start_line":220,"start_character":0,"end_line":220,"end_character":33},"updated":"2016-11-29 15:48:06.000000000","message":"This can break rescheduling mechanism during upgrade. Imagine older c-sch receiving a request with only retry[\u0027backends\u0027] set. Or vice-versa. Until we have filter_properties as objects, we should really change this in a non-backward compatible way. Same goes with other changes of this field below.\n\nIt\u0027s probably high time to revive my RequestSpec and FilterProperties objects patches…","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d3d629bfab65a10e39a584872c3e1683cda9657a","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        retry \u003d filter_properties.get(\u0027retry\u0027, None)"},{"line_number":218,"context_line":"        if not retry:"},{"line_number":219,"context_line":"            return"},{"line_number":220,"context_line":"        hosts \u003d retry[\u0027backends\u0027]"},{"line_number":221,"context_line":"        hosts.append(backend)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def _max_attempts(self):"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_30234c07","line":220,"range":{"start_line":220,"start_character":0,"end_line":220,"end_character":33},"in_reply_to":"5a74a57a_add57643","updated":"2016-11-30 18:15:36.000000000","message":"OK, I added backward compatibility code.","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"d07885fae9da6df32d832e91dfaaff74865a4c10","unresolved":false,"context_lines":[{"line_number":648,"context_line":"    def _schedule_generic_group(self, context, group_spec, request_spec_list,"},{"line_number":649,"context_line":"                                group_filter_properties\u003dNone,"},{"line_number":650,"context_line":"                                filter_properties_list\u003dNone):"},{"line_number":651,"context_line":"        weighed_bakends \u003d self._get_weighted_candidates_generic_group("},{"line_number":652,"context_line":"            context,"},{"line_number":653,"context_line":"            group_spec,"},{"line_number":654,"context_line":"            request_spec_list,"}],"source_content_type":"text/x-python","patch_set":34,"id":"3a71b18c_36e8907c","line":651,"range":{"start_line":651,"start_character":16,"end_line":651,"end_character":23},"updated":"2016-12-08 17:04:18.000000000","message":"/bakends/backends/","commit_id":"dc211342d926208760596afbae450457bfaf1b8d"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"18cd56e49af7840b8ab5ea9854692f661c6b667c","unresolved":false,"context_lines":[{"line_number":648,"context_line":"    def _schedule_generic_group(self, context, group_spec, request_spec_list,"},{"line_number":649,"context_line":"                                group_filter_properties\u003dNone,"},{"line_number":650,"context_line":"                                filter_properties_list\u003dNone):"},{"line_number":651,"context_line":"        weighed_bakends \u003d self._get_weighted_candidates_generic_group("},{"line_number":652,"context_line":"            context,"},{"line_number":653,"context_line":"            group_spec,"},{"line_number":654,"context_line":"            request_spec_list,"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_52c60768","line":651,"range":{"start_line":651,"start_character":16,"end_line":651,"end_character":23},"in_reply_to":"3a71b18c_36e8907c","updated":"2016-12-13 15:07:12.000000000","message":"Done","commit_id":"dc211342d926208760596afbae450457bfaf1b8d"},{"author":{"_account_id":7173,"name":"Scott DAngelo","email":"scott.dangelo@gmail.com","username":"scottda"},"change_message_id":"01e2d365f0aa0c9a52eeb98bdc690620adcceb64","unresolved":false,"context_lines":[{"line_number":654,"context_line":"            request_spec_list,"},{"line_number":655,"context_line":"            group_filter_properties,"},{"line_number":656,"context_line":"            filter_properties_list)"},{"line_number":657,"context_line":"        if not weighed_bakends:"},{"line_number":658,"context_line":"            return None"},{"line_number":659,"context_line":"        return self._choose_top_backend_generic_group(weighed_bakends)"},{"line_number":660,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"3a71b18c_1dc48590","line":657,"updated":"2016-12-08 23:10:33.000000000","message":"and here","commit_id":"dc211342d926208760596afbae450457bfaf1b8d"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"18cd56e49af7840b8ab5ea9854692f661c6b667c","unresolved":false,"context_lines":[{"line_number":654,"context_line":"            request_spec_list,"},{"line_number":655,"context_line":"            group_filter_properties,"},{"line_number":656,"context_line":"            filter_properties_list)"},{"line_number":657,"context_line":"        if not weighed_bakends:"},{"line_number":658,"context_line":"            return None"},{"line_number":659,"context_line":"        return self._choose_top_backend_generic_group(weighed_bakends)"},{"line_number":660,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_92a6dfbf","line":657,"in_reply_to":"3a71b18c_1dc48590","updated":"2016-12-13 15:07:12.000000000","message":"Done","commit_id":"dc211342d926208760596afbae450457bfaf1b8d"},{"author":{"_account_id":7173,"name":"Scott DAngelo","email":"scott.dangelo@gmail.com","username":"scottda"},"change_message_id":"01e2d365f0aa0c9a52eeb98bdc690620adcceb64","unresolved":false,"context_lines":[{"line_number":656,"context_line":"            filter_properties_list)"},{"line_number":657,"context_line":"        if not weighed_bakends:"},{"line_number":658,"context_line":"            return None"},{"line_number":659,"context_line":"        return self._choose_top_backend_generic_group(weighed_bakends)"},{"line_number":660,"context_line":""},{"line_number":661,"context_line":"    def _choose_top_backend(self, weighed_backends, request_spec):"},{"line_number":662,"context_line":"        top_backend \u003d weighed_backends[0]"}],"source_content_type":"text/x-python","patch_set":34,"id":"3a71b18c_5dbefdff","line":659,"updated":"2016-12-08 23:10:33.000000000","message":"don\u0027t forget here.","commit_id":"dc211342d926208760596afbae450457bfaf1b8d"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"18cd56e49af7840b8ab5ea9854692f661c6b667c","unresolved":false,"context_lines":[{"line_number":656,"context_line":"            filter_properties_list)"},{"line_number":657,"context_line":"        if not weighed_bakends:"},{"line_number":658,"context_line":"            return None"},{"line_number":659,"context_line":"        return self._choose_top_backend_generic_group(weighed_bakends)"},{"line_number":660,"context_line":""},{"line_number":661,"context_line":"    def _choose_top_backend(self, weighed_backends, request_spec):"},{"line_number":662,"context_line":"        top_backend \u003d weighed_backends[0]"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_b2abdb88","line":659,"in_reply_to":"3a71b18c_5dbefdff","updated":"2016-12-13 15:07:12.000000000","message":"Done","commit_id":"dc211342d926208760596afbae450457bfaf1b8d"}],"cinder/scheduler/filters/capacity_filter.py":[{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"9b173a039d2c4cd362d4e579b61469ea31810296","unresolved":false,"context_lines":[{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class CapacityFilter(filters.BaseHostFilter):"},{"line_number":32,"context_line":"    \"\"\"CapacityFilter filters based on volume host\u0027s capacity utilization.\"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def host_passes(self, backend_state, filter_properties):"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_c3b8b5eb","line":31,"range":{"start_line":31,"start_character":29,"end_line":31,"end_character":43},"updated":"2016-11-29 22:04:17.000000000","message":"Filter class could also be renamed.","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d3d629bfab65a10e39a584872c3e1683cda9657a","unresolved":false,"context_lines":[{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class CapacityFilter(filters.BaseHostFilter):"},{"line_number":32,"context_line":"    \"\"\"CapacityFilter filters based on volume host\u0027s capacity utilization.\"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def host_passes(self, backend_state, filter_properties):"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_89c072e2","line":31,"range":{"start_line":31,"start_character":29,"end_line":31,"end_character":43},"in_reply_to":"5a74a57a_c3b8b5eb","updated":"2016-11-30 18:15:36.000000000","message":"Done","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"f398380136224d83a3aa46b7ceceafbe6ee14d0e","unresolved":false,"context_lines":[{"line_number":31,"context_line":"class CapacityFilter(filters.BaseHostFilter):"},{"line_number":32,"context_line":"    \"\"\"CapacityFilter filters based on volume host\u0027s capacity utilization.\"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def host_passes(self, backend_state, filter_properties):"},{"line_number":35,"context_line":"        \"\"\"Return True if host has sufficient capacity.\"\"\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        # If the volume already exists on this host, don\u0027t fail it for"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_ed104e02","line":34,"range":{"start_line":34,"start_character":8,"end_line":34,"end_character":19},"updated":"2016-11-29 15:48:06.000000000","message":"Should it be backend_passes now? That would break any custom filters people may have…","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d3d629bfab65a10e39a584872c3e1683cda9657a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"class CapacityFilter(filters.BaseHostFilter):"},{"line_number":32,"context_line":"    \"\"\"CapacityFilter filters based on volume host\u0027s capacity utilization.\"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def host_passes(self, backend_state, filter_properties):"},{"line_number":35,"context_line":"        \"\"\"Return True if host has sufficient capacity.\"\"\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        # If the volume already exists on this host, don\u0027t fail it for"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_a96c4e09","line":34,"range":{"start_line":34,"start_character":8,"end_line":34,"end_character":19},"in_reply_to":"5a74a57a_ed104e02","updated":"2016-11-30 18:15:36.000000000","message":"Done, in a backward compatible way","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"9b173a039d2c4cd362d4e579b61469ea31810296","unresolved":false,"context_lines":[{"line_number":31,"context_line":"class CapacityFilter(filters.BaseHostFilter):"},{"line_number":32,"context_line":"    \"\"\"CapacityFilter filters based on volume host\u0027s capacity utilization.\"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def host_passes(self, backend_state, filter_properties):"},{"line_number":35,"context_line":"        \"\"\"Return True if host has sufficient capacity.\"\"\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        # If the volume already exists on this host, don\u0027t fail it for"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_e392114b","line":34,"range":{"start_line":34,"start_character":8,"end_line":34,"end_character":19},"in_reply_to":"5a74a57a_ed104e02","updated":"2016-11-29 22:04:17.000000000","message":"If that\u0027s the case host_passes could be left with depreciated warning and call backend_passes.","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"}],"cinder/scheduler/host_manager.py":[{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"9b173a039d2c4cd362d4e579b61469ea31810296","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"Manage hosts in the current zone."},{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import collections"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_2357a8cb","line":17,"updated":"2016-11-29 22:04:17.000000000","message":"Change module name to backend_manager?","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d3d629bfab65a10e39a584872c3e1683cda9657a","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"Manage hosts in the current zone."},{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import collections"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_26f3040c","line":17,"in_reply_to":"5a74a57a_2357a8cb","updated":"2016-11-30 18:15:36.000000000","message":"I started doing that, but then we have to write compatibility code to handle the mapping for the old path for \"scheduler_host_manager\" option, and we would want to rename that one as well, and then we\u0027d rename the weight classes, and also add mappings for the `scheduler_weight_handler` option to be backward compatible, and I\u0027m sure there would be more...  So I think I\u0027ll add this to our technical debt for the moment.\n\nI actually did more than half of that before deciding now wasn\u0027t probably the best time to do it.","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"}],"cinder/scheduler/manager.py":[{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"9b173a039d2c4cd362d4e579b61469ea31810296","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        super(SchedulerManager, self).__init__(*args, **kwargs)"},{"line_number":73,"context_line":"        self._startup_delay \u003d True"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def init_host_with_rpc(self):"},{"line_number":76,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":77,"context_line":"        self.request_service_capabilities(ctxt)"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_c3ec3595","line":75,"range":{"start_line":75,"start_character":13,"end_line":75,"end_character":17},"updated":"2016-11-29 22:04:17.000000000","message":"backend?","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d3d629bfab65a10e39a584872c3e1683cda9657a","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        super(SchedulerManager, self).__init__(*args, **kwargs)"},{"line_number":73,"context_line":"        self._startup_delay \u003d True"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def init_host_with_rpc(self):"},{"line_number":76,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":77,"context_line":"        self.request_service_capabilities(ctxt)"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_86c5b83e","line":75,"range":{"start_line":75,"start_character":13,"end_line":75,"end_character":17},"in_reply_to":"5a74a57a_c3ec3595","updated":"2016-11-30 18:15:36.000000000","message":"Not in this case, this is initializing this specific host.","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"9b173a039d2c4cd362d4e579b61469ea31810296","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        self.driver.reset()"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def update_service_capabilities(self, context, service_name\u003dNone,"},{"line_number":87,"context_line":"                                    host\u003dNone, capabilities\u003dNone,"},{"line_number":88,"context_line":"                                    cluster_name\u003dNone, timestamp\u003dNone,"},{"line_number":89,"context_line":"                                    **kwargs):"},{"line_number":90,"context_line":"        \"\"\"Process a capability update from a service node.\"\"\""}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_638521ac","line":87,"range":{"start_line":87,"start_character":36,"end_line":87,"end_character":40},"updated":"2016-11-29 22:04:17.000000000","message":"backend?","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d3d629bfab65a10e39a584872c3e1683cda9657a","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        self.driver.reset()"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def update_service_capabilities(self, context, service_name\u003dNone,"},{"line_number":87,"context_line":"                                    host\u003dNone, capabilities\u003dNone,"},{"line_number":88,"context_line":"                                    cluster_name\u003dNone, timestamp\u003dNone,"},{"line_number":89,"context_line":"                                    **kwargs):"},{"line_number":90,"context_line":"        \"\"\"Process a capability update from a service node.\"\"\""}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_260ce493","line":87,"range":{"start_line":87,"start_character":36,"end_line":87,"end_character":40},"in_reply_to":"5a74a57a_638521ac","updated":"2016-11-30 18:15:36.000000000","message":"No this is correct, because we receive the host and the cluster_name as 2 separate parameters.","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"9b173a039d2c4cd362d4e579b61469ea31810296","unresolved":false,"context_lines":[{"line_number":141,"context_line":"                group_filter_properties,"},{"line_number":142,"context_line":"                filter_properties_list)"},{"line_number":143,"context_line":"        except exception.NoValidBackend:"},{"line_number":144,"context_line":"            LOG.error(_LE(\"Could not find a host for group \""},{"line_number":145,"context_line":"                          \"%(group_id)s.\"),"},{"line_number":146,"context_line":"                      {\u0027group_id\u0027: group.id})"},{"line_number":147,"context_line":"            group.status \u003d \u0027error\u0027"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_235ec976","line":144,"range":{"start_line":144,"start_character":44,"end_line":144,"end_character":48},"updated":"2016-11-29 22:04:17.000000000","message":"backend","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d3d629bfab65a10e39a584872c3e1683cda9657a","unresolved":false,"context_lines":[{"line_number":141,"context_line":"                group_filter_properties,"},{"line_number":142,"context_line":"                filter_properties_list)"},{"line_number":143,"context_line":"        except exception.NoValidBackend:"},{"line_number":144,"context_line":"            LOG.error(_LE(\"Could not find a host for group \""},{"line_number":145,"context_line":"                          \"%(group_id)s.\"),"},{"line_number":146,"context_line":"                      {\u0027group_id\u0027: group.id})"},{"line_number":147,"context_line":"            group.status \u003d \u0027error\u0027"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_468640dc","line":144,"range":{"start_line":144,"start_character":44,"end_line":144,"end_character":48},"in_reply_to":"5a74a57a_235ec976","updated":"2016-11-30 18:15:36.000000000","message":"Done","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"9b173a039d2c4cd362d4e579b61469ea31810296","unresolved":false,"context_lines":[{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def migrate_volume(self, context, volume, backend, force_copy,"},{"line_number":191,"context_line":"                       request_spec, filter_properties):"},{"line_number":192,"context_line":"        \"\"\"Ensure that the host exists and can accept the volume.\"\"\""},{"line_number":193,"context_line":"        self._wait_for_scheduler()"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        def _migrate_volume_set_error(self, context, ex, request_spec):"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_435d8547","line":192,"range":{"start_line":192,"start_character":27,"end_line":192,"end_character":31},"updated":"2016-11-29 22:04:17.000000000","message":"backend","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d3d629bfab65a10e39a584872c3e1683cda9657a","unresolved":false,"context_lines":[{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def migrate_volume(self, context, volume, backend, force_copy,"},{"line_number":191,"context_line":"                       request_spec, filter_properties):"},{"line_number":192,"context_line":"        \"\"\"Ensure that the host exists and can accept the volume.\"\"\""},{"line_number":193,"context_line":"        self._wait_for_scheduler()"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        def _migrate_volume_set_error(self, context, ex, request_spec):"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_86685823","line":192,"range":{"start_line":192,"start_character":27,"end_line":192,"end_character":31},"in_reply_to":"5a74a57a_435d8547","updated":"2016-11-30 18:15:36.000000000","message":"Done","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"}],"cinder/test.py":[{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"2949022e37a5812d72cdd1d668eb2c632cac2941","unresolved":false,"context_lines":[{"line_number":412,"context_line":"    def _assertEqualListsOfObjects(self, objs1, objs2, ignored_keys\u003dNone,"},{"line_number":413,"context_line":"                                   msg\u003dNone):"},{"line_number":414,"context_line":"        obj_to_dict \u003d lambda o: self._dict_from_object(o, ignored_keys)"},{"line_number":415,"context_line":"        objs1 \u003d map(obj_to_dict, objs1)"},{"line_number":416,"context_line":"        objs2 \u003d list(map(obj_to_dict, objs2))"},{"line_number":417,"context_line":"        # We don\u0027t care about the order of the lists, as long as they are in"},{"line_number":418,"context_line":"        for obj1 in objs1:"},{"line_number":419,"context_line":"            self.assertIn(obj1, objs2)"},{"line_number":420,"context_line":"            objs2.remove(obj1)"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"    def _assertEqualListsOfPrimitivesAsSets(self, primitives1, primitives2):"},{"line_number":423,"context_line":"        self.assertEqual(len(primitives1), len(primitives2))"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_bba7a3a5","line":420,"range":{"start_line":415,"start_character":8,"end_line":420,"end_character":30},"updated":"2016-08-11 18:40:52.000000000","message":"why not use assertSetEqual:\n\nself.assertSetEqual({obj_to_dict(o) for o in objs1},\n                    {obj_to_dict(o) for o in objs2})","commit_id":"859af01c01843745d52fb03870c7e2a1b6412c8b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7fee28d92dfd282465448084f134a7068c9c7ae1","unresolved":false,"context_lines":[{"line_number":412,"context_line":"    def _assertEqualListsOfObjects(self, objs1, objs2, ignored_keys\u003dNone,"},{"line_number":413,"context_line":"                                   msg\u003dNone):"},{"line_number":414,"context_line":"        obj_to_dict \u003d lambda o: self._dict_from_object(o, ignored_keys)"},{"line_number":415,"context_line":"        objs1 \u003d map(obj_to_dict, objs1)"},{"line_number":416,"context_line":"        objs2 \u003d list(map(obj_to_dict, objs2))"},{"line_number":417,"context_line":"        # We don\u0027t care about the order of the lists, as long as they are in"},{"line_number":418,"context_line":"        for obj1 in objs1:"},{"line_number":419,"context_line":"            self.assertIn(obj1, objs2)"},{"line_number":420,"context_line":"            objs2.remove(obj1)"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"    def _assertEqualListsOfPrimitivesAsSets(self, primitives1, primitives2):"},{"line_number":423,"context_line":"        self.assertEqual(len(primitives1), len(primitives2))"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_a7800a4b","line":420,"range":{"start_line":415,"start_character":8,"end_line":420,"end_character":30},"in_reply_to":"9ad45d7e_5b71280b","updated":"2016-08-12 08:38:01.000000000","message":"Now I remember why I didn\u0027t do it like that...  Because it only works on Python 3, on Python 2 you cannot create a set of dictionaries because they are unhashable.   XD","commit_id":"859af01c01843745d52fb03870c7e2a1b6412c8b"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"ce5a1009b11182cbaa658f35ae6a1df19877c52f","unresolved":false,"context_lines":[{"line_number":412,"context_line":"    def _assertEqualListsOfObjects(self, objs1, objs2, ignored_keys\u003dNone,"},{"line_number":413,"context_line":"                                   msg\u003dNone):"},{"line_number":414,"context_line":"        obj_to_dict \u003d lambda o: self._dict_from_object(o, ignored_keys)"},{"line_number":415,"context_line":"        objs1 \u003d map(obj_to_dict, objs1)"},{"line_number":416,"context_line":"        objs2 \u003d list(map(obj_to_dict, objs2))"},{"line_number":417,"context_line":"        # We don\u0027t care about the order of the lists, as long as they are in"},{"line_number":418,"context_line":"        for obj1 in objs1:"},{"line_number":419,"context_line":"            self.assertIn(obj1, objs2)"},{"line_number":420,"context_line":"            objs2.remove(obj1)"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"    def _assertEqualListsOfPrimitivesAsSets(self, primitives1, primitives2):"},{"line_number":423,"context_line":"        self.assertEqual(len(primitives1), len(primitives2))"}],"source_content_type":"text/x-python","patch_set":6,"id":"3ac371cc_6fdea56e","line":420,"range":{"start_line":415,"start_character":8,"end_line":420,"end_character":30},"in_reply_to":"9ad45d7e_a7800a4b","updated":"2016-08-15 23:04:45.000000000","message":"Ah, forgot about that, sorry.","commit_id":"859af01c01843745d52fb03870c7e2a1b6412c8b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6bbdfec23896e3e80ef1c155045aa2561b2f74bf","unresolved":false,"context_lines":[{"line_number":412,"context_line":"    def _assertEqualListsOfObjects(self, objs1, objs2, ignored_keys\u003dNone,"},{"line_number":413,"context_line":"                                   msg\u003dNone):"},{"line_number":414,"context_line":"        obj_to_dict \u003d lambda o: self._dict_from_object(o, ignored_keys)"},{"line_number":415,"context_line":"        objs1 \u003d map(obj_to_dict, objs1)"},{"line_number":416,"context_line":"        objs2 \u003d list(map(obj_to_dict, objs2))"},{"line_number":417,"context_line":"        # We don\u0027t care about the order of the lists, as long as they are in"},{"line_number":418,"context_line":"        for obj1 in objs1:"},{"line_number":419,"context_line":"            self.assertIn(obj1, objs2)"},{"line_number":420,"context_line":"            objs2.remove(obj1)"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"    def _assertEqualListsOfPrimitivesAsSets(self, primitives1, primitives2):"},{"line_number":423,"context_line":"        self.assertEqual(len(primitives1), len(primitives2))"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_5b71280b","line":420,"range":{"start_line":415,"start_character":8,"end_line":420,"end_character":30},"in_reply_to":"9ad45d7e_bba7a3a5","updated":"2016-08-12 08:22:06.000000000","message":"Apparently I was too fixated on how current code did things to think how it should actually be done.  XD\n\nChanged downstream, will update the next time I upload this patch series.","commit_id":"859af01c01843745d52fb03870c7e2a1b6412c8b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"f398380136224d83a3aa46b7ceceafbe6ee14d0e","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        for key, value in obj1.items():"},{"line_number":411,"context_line":"            self.assertEqual(value, obj2[key])"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"    def _assertEqualListsOfObjects(self, objs1, objs2, ignored_keys\u003dNone,"},{"line_number":414,"context_line":"                                   msg\u003dNone):"},{"line_number":415,"context_line":"        obj_to_dict \u003d lambda o: self._dict_from_object(o, ignored_keys)"},{"line_number":416,"context_line":"        objs1 \u003d map(obj_to_dict, objs1)"},{"line_number":417,"context_line":"        objs2 \u003d list(map(obj_to_dict, objs2))"},{"line_number":418,"context_line":"        # We don\u0027t care about the order of the lists, as long as they are in"},{"line_number":419,"context_line":"        for obj1 in objs1:"},{"line_number":420,"context_line":"            self.assertIn(obj1, objs2)"},{"line_number":421,"context_line":"            objs2.remove(obj1)"},{"line_number":422,"context_line":""},{"line_number":423,"context_line":"    def _assertEqualListsOfPrimitivesAsSets(self, primitives1, primitives2):"},{"line_number":424,"context_line":"        self.assertEqual(len(primitives1), len(primitives2))"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_7266dfbb","line":421,"range":{"start_line":413,"start_character":0,"end_line":421,"end_character":30},"updated":"2016-11-29 15:48:06.000000000","message":"Shouldn\u0027t we also compare lengths of both lists? This way we\u0027ll ignore any additional items objs2 have.","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"9b173a039d2c4cd362d4e579b61469ea31810296","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        for key, value in obj1.items():"},{"line_number":411,"context_line":"            self.assertEqual(value, obj2[key])"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"    def _assertEqualListsOfObjects(self, objs1, objs2, ignored_keys\u003dNone,"},{"line_number":414,"context_line":"                                   msg\u003dNone):"},{"line_number":415,"context_line":"        obj_to_dict \u003d lambda o: self._dict_from_object(o, ignored_keys)"},{"line_number":416,"context_line":"        objs1 \u003d map(obj_to_dict, objs1)"},{"line_number":417,"context_line":"        objs2 \u003d list(map(obj_to_dict, objs2))"},{"line_number":418,"context_line":"        # We don\u0027t care about the order of the lists, as long as they are in"},{"line_number":419,"context_line":"        for obj1 in objs1:"},{"line_number":420,"context_line":"            self.assertIn(obj1, objs2)"},{"line_number":421,"context_line":"            objs2.remove(obj1)"},{"line_number":422,"context_line":""},{"line_number":423,"context_line":"    def _assertEqualListsOfPrimitivesAsSets(self, primitives1, primitives2):"},{"line_number":424,"context_line":"        self.assertEqual(len(primitives1), len(primitives2))"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_c3727449","line":421,"range":{"start_line":413,"start_character":0,"end_line":421,"end_character":30},"in_reply_to":"5a74a57a_7266dfbb","updated":"2016-11-29 22:04:17.000000000","message":"Or even better, just check if objs2 is empty after loop :)","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d3d629bfab65a10e39a584872c3e1683cda9657a","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        for key, value in obj1.items():"},{"line_number":411,"context_line":"            self.assertEqual(value, obj2[key])"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"    def _assertEqualListsOfObjects(self, objs1, objs2, ignored_keys\u003dNone,"},{"line_number":414,"context_line":"                                   msg\u003dNone):"},{"line_number":415,"context_line":"        obj_to_dict \u003d lambda o: self._dict_from_object(o, ignored_keys)"},{"line_number":416,"context_line":"        objs1 \u003d map(obj_to_dict, objs1)"},{"line_number":417,"context_line":"        objs2 \u003d list(map(obj_to_dict, objs2))"},{"line_number":418,"context_line":"        # We don\u0027t care about the order of the lists, as long as they are in"},{"line_number":419,"context_line":"        for obj1 in objs1:"},{"line_number":420,"context_line":"            self.assertIn(obj1, objs2)"},{"line_number":421,"context_line":"            objs2.remove(obj1)"},{"line_number":422,"context_line":""},{"line_number":423,"context_line":"    def _assertEqualListsOfPrimitivesAsSets(self, primitives1, primitives2):"},{"line_number":424,"context_line":"        self.assertEqual(len(primitives1), len(primitives2))"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a74a57a_a6e554a9","line":421,"range":{"start_line":413,"start_character":0,"end_line":421,"end_character":30},"in_reply_to":"5a74a57a_c3727449","updated":"2016-11-30 18:15:36.000000000","message":"Done","commit_id":"55fef1f49c862390ef1d7863d133c510ba5c6b48"}],"cinder/tests/unit/api/contrib/test_admin_actions.py":[{"author":{"_account_id":7173,"name":"Scott DAngelo","email":"scott.dangelo@gmail.com","username":"scottda"},"change_message_id":"01e2d365f0aa0c9a52eeb98bdc690620adcceb64","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def _create_volume(self, context, updates\u003dNone):"},{"line_number":63,"context_line":"        db_volume \u003d {\u0027status\u0027: \u0027available\u0027,"},{"line_number":64,"context_line":"                     \u0027host\u0027: \u0027test\u0027,"},{"line_number":65,"context_line":"                     \u0027binary\u0027: \u0027cinver-volume\u0027,"},{"line_number":66,"context_line":"                     \u0027availability_zone\u0027: \u0027fake_zone\u0027,"},{"line_number":67,"context_line":"                     \u0027attach_status\u0027: fields.VolumeAttachStatus.DETACHED}"},{"line_number":68,"context_line":"        if updates:"}],"source_content_type":"text/x-python","patch_set":34,"id":"3a71b18c_9d87b511","line":65,"updated":"2016-12-08 23:10:33.000000000","message":"should be \u0027cinder-volume\u0027","commit_id":"dc211342d926208760596afbae450457bfaf1b8d"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"18cd56e49af7840b8ab5ea9854692f661c6b667c","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def _create_volume(self, context, updates\u003dNone):"},{"line_number":63,"context_line":"        db_volume \u003d {\u0027status\u0027: \u0027available\u0027,"},{"line_number":64,"context_line":"                     \u0027host\u0027: \u0027test\u0027,"},{"line_number":65,"context_line":"                     \u0027binary\u0027: \u0027cinver-volume\u0027,"},{"line_number":66,"context_line":"                     \u0027availability_zone\u0027: \u0027fake_zone\u0027,"},{"line_number":67,"context_line":"                     \u0027attach_status\u0027: fields.VolumeAttachStatus.DETACHED}"},{"line_number":68,"context_line":"        if updates:"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_7204e37d","line":65,"in_reply_to":"3a71b18c_9d87b511","updated":"2016-12-13 15:07:12.000000000","message":"Done","commit_id":"dc211342d926208760596afbae450457bfaf1b8d"}],"cinder/tests/unit/test_db_api.py":[{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"2949022e37a5812d72cdd1d668eb2c632cac2941","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        disabled_services \u003d services[-3:]"},{"line_number":194,"context_line":"        non_disabled_services \u003d services[:-3]"},{"line_number":195,"context_line":"        up_services \u003d services[0:7]"},{"line_number":196,"context_line":"        down_services \u003d [services[7]]"},{"line_number":197,"context_line":"        expected \u003d services[:2]"},{"line_number":198,"context_line":"        expected_bin \u003d services[1:3]"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_dba9b725","line":195,"range":{"start_line":195,"start_character":22,"end_line":195,"end_character":35},"updated":"2016-08-11 18:40:52.000000000","message":"nit: Why not [:7] or even better [:-1]","commit_id":"859af01c01843745d52fb03870c7e2a1b6412c8b"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"ce5a1009b11182cbaa658f35ae6a1df19877c52f","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        disabled_services \u003d services[-3:]"},{"line_number":194,"context_line":"        non_disabled_services \u003d services[:-3]"},{"line_number":195,"context_line":"        up_services \u003d services[0:7]"},{"line_number":196,"context_line":"        down_services \u003d [services[7]]"},{"line_number":197,"context_line":"        expected \u003d services[:2]"},{"line_number":198,"context_line":"        expected_bin \u003d services[1:3]"}],"source_content_type":"text/x-python","patch_set":6,"id":"3ac371cc_af4a5dc3","line":195,"range":{"start_line":195,"start_character":22,"end_line":195,"end_character":35},"in_reply_to":"9ad45d7e_679e1265","updated":"2016-08-15 23:04:45.000000000","message":"Yeah, it\u0027s really small. Ad [:-1] - exactly that - you don\u0027t need to know the length, so at sight you know that\u0027s all except last row, rather than counting list rows to be sure. Anyway I didn\u0027t found anything other that could be improved :)","commit_id":"859af01c01843745d52fb03870c7e2a1b6412c8b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7fee28d92dfd282465448084f134a7068c9c7ae1","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        disabled_services \u003d services[-3:]"},{"line_number":194,"context_line":"        non_disabled_services \u003d services[:-3]"},{"line_number":195,"context_line":"        up_services \u003d services[0:7]"},{"line_number":196,"context_line":"        down_services \u003d [services[7]]"},{"line_number":197,"context_line":"        expected \u003d services[:2]"},{"line_number":198,"context_line":"        expected_bin \u003d services[1:3]"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_679e1265","line":195,"range":{"start_line":195,"start_character":22,"end_line":195,"end_character":35},"in_reply_to":"9ad45d7e_dba9b725","updated":"2016-08-12 08:38:01.000000000","message":"I\u0027m ok using [:7] notation, although that\u0027s just syntactic sugar, but I don\u0027t see any added value in using [:-1] notation here for something I already know the length of.","commit_id":"859af01c01843745d52fb03870c7e2a1b6412c8b"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"2949022e37a5812d72cdd1d668eb2c632cac2941","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        disabled_services \u003d services[-3:]"},{"line_number":194,"context_line":"        non_disabled_services \u003d services[:-3]"},{"line_number":195,"context_line":"        up_services \u003d services[0:7]"},{"line_number":196,"context_line":"        down_services \u003d [services[7]]"},{"line_number":197,"context_line":"        expected \u003d services[:2]"},{"line_number":198,"context_line":"        expected_bin \u003d services[1:3]"},{"line_number":199,"context_line":"        compares \u003d ["}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_fb68fbf6","line":196,"range":{"start_line":196,"start_character":25,"end_line":196,"end_character":36},"updated":"2016-08-11 18:40:52.000000000","message":"nit: services[-1]","commit_id":"859af01c01843745d52fb03870c7e2a1b6412c8b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7fee28d92dfd282465448084f134a7068c9c7ae1","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        disabled_services \u003d services[-3:]"},{"line_number":194,"context_line":"        non_disabled_services \u003d services[:-3]"},{"line_number":195,"context_line":"        up_services \u003d services[0:7]"},{"line_number":196,"context_line":"        down_services \u003d [services[7]]"},{"line_number":197,"context_line":"        expected \u003d services[:2]"},{"line_number":198,"context_line":"        expected_bin \u003d services[1:3]"},{"line_number":199,"context_line":"        compares \u003d ["}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_a7864a14","line":196,"range":{"start_line":196,"start_character":25,"end_line":196,"end_character":36},"in_reply_to":"9ad45d7e_fb68fbf6","updated":"2016-08-12 08:38:01.000000000","message":"ditto","commit_id":"859af01c01843745d52fb03870c7e2a1b6412c8b"}]}
