)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":19919,"name":"Wenjun Wang","email":"wenjun_dev@126.com","username":"June"},"change_message_id":"6807c70cc0744373873154e4e1fdc5b9e0722be6","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] Switch service capabilities to ovo"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The c-vol currently sends service capabilities to c-sch in dict form. We need"},{"line_number":10,"context_line":"convert it from dict blob to Oslo Versioned object notation. This is important"},{"line_number":11,"context_line":"so that capabilities are supporting backporting in case of rolling-upgrades"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I1586c2b2b20c92724ca931d9aeb6b60c8d19ef97"},{"line_number":14,"context_line":"Partial-Implements: blueprint cinder-objects"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"bab6814e_ff4e526d","line":11,"range":{"start_line":9,"start_character":0,"end_line":11,"end_character":75},"updated":"2016-05-21 06:37:13.000000000","message":"Subsequent lines should be wrapped at 72 characters.","commit_id":"69bfbefb2bed7cacf97595c6f283436a1d5b651e"},{"author":{"_account_id":19919,"name":"Wenjun Wang","email":"wenjun_dev@126.com","username":"June"},"change_message_id":"6807c70cc0744373873154e4e1fdc5b9e0722be6","unresolved":false,"context_lines":[{"line_number":11,"context_line":"so that capabilities are supporting backporting in case of rolling-upgrades"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I1586c2b2b20c92724ca931d9aeb6b60c8d19ef97"},{"line_number":14,"context_line":"Partial-Implements: blueprint cinder-objects"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"bab6814e_df538e15","line":14,"range":{"start_line":14,"start_character":20,"end_line":14,"end_character":44},"updated":"2016-05-21 06:37:13.000000000","message":"I can not access this bp,some words may be missed.","commit_id":"69bfbefb2bed7cacf97595c6f283436a1d5b651e"}],"cinder/objects/base.py":[{"author":{"_account_id":17275,"name":"Nate Potter","email":"nathaniel.potter@intel.com","username":"npotter"},"change_message_id":"cae30051db7a89decd6910399654d0eef4a79d68","unresolved":false,"context_lines":[{"line_number":106,"context_line":"OBJ_VERSIONS.add(\u00271.7\u0027, {\u0027Cluster\u0027: \u00271.0\u0027, \u0027ClusterList\u0027: \u00271.0\u0027,"},{"line_number":107,"context_line":"                         \u0027Service\u0027: \u00271.4\u0027, \u0027Volume\u0027: \u00271.4\u0027,"},{"line_number":108,"context_line":"                         \u0027ConsistencyGroup\u0027: \u00271.3\u0027})"},{"line_number":109,"context_line":"OBJ_VERSIONS.add(\u00271.8\u0027, {\u0027Capabilities\u0027: \u00271.0\u0027, \u0027Pool\u0027: \u00271.0\u0027})"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"class CinderObjectRegistry(base.VersionedObjectRegistry):"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_caa12a48","line":109,"range":{"start_line":109,"start_character":18,"end_line":109,"end_character":21},"updated":"2016-08-04 21:22:28.000000000","message":"Version 1.8 has been merged to master, you\u0027re going to need to bump this up to 1.9 now","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"a0c098322276cf79bbd90059aa18d162e0f00ef1","unresolved":false,"context_lines":[{"line_number":106,"context_line":"OBJ_VERSIONS.add(\u00271.7\u0027, {\u0027Cluster\u0027: \u00271.0\u0027, \u0027ClusterList\u0027: \u00271.0\u0027,"},{"line_number":107,"context_line":"                         \u0027Service\u0027: \u00271.4\u0027, \u0027Volume\u0027: \u00271.4\u0027,"},{"line_number":108,"context_line":"                         \u0027ConsistencyGroup\u0027: \u00271.3\u0027})"},{"line_number":109,"context_line":"OBJ_VERSIONS.add(\u00271.8\u0027, {\u0027Capabilities\u0027: \u00271.0\u0027, \u0027Pool\u0027: \u00271.0\u0027})"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"class CinderObjectRegistry(base.VersionedObjectRegistry):"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_f47dec6d","line":109,"range":{"start_line":109,"start_character":18,"end_line":109,"end_character":21},"in_reply_to":"bacf61ea_caa12a48","updated":"2016-08-05 00:10:37.000000000","message":"@Nate: Thanks. I will bump this soon.","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"ea5765fd2584b59a37f99eeae28d07e7c96293ed","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                         \u0027ConsistencyGroup\u0027: \u00271.3\u0027})"},{"line_number":113,"context_line":"OBJ_VERSIONS.add(\u00271.8\u0027, {\u0027RequestSpec\u0027: \u00271.0\u0027, \u0027VolumeProperties\u0027: \u00271.0\u0027})"},{"line_number":114,"context_line":"OBJ_VERSIONS.add(\u00271.9\u0027, {\u0027GroupType\u0027: \u00271.0\u0027, \u0027GroupTypeList\u0027: \u00271.0\u0027})"},{"line_number":115,"context_line":"OBJ_VERSIONS.add(\u00272.0\u0027, {\u0027Capabilities\u0027: \u00271.0\u0027, \u0027Pool\u0027: \u00271.0\u0027})"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"class CinderObjectRegistry(base.VersionedObjectRegistry):"}],"source_content_type":"text/x-python","patch_set":19,"id":"9ad45d7e_a49944c6","line":115,"range":{"start_line":115,"start_character":18,"end_line":115,"end_character":21},"updated":"2016-08-15 22:43:31.000000000","message":"Not sure, but IMO it should be 1.10, when we drop backward compatibility then there will be 2.0","commit_id":"3cb64a352699a239f198823b62cfcc9fe64deecc"}],"cinder/objects/capabilities.py":[{"author":{"_account_id":17275,"name":"Nate Potter","email":"nathaniel.potter@intel.com","username":"npotter"},"change_message_id":"9ab23b82aa8c09841175320d6e0cfa93049395dd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#   Copyright 2015 Intel Corporation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":8,"id":"9abb7d3a_af31daee","line":1,"range":{"start_line":1,"start_character":4,"end_line":1,"end_character":13},"updated":"2016-05-27 16:53:14.000000000","message":"Maybe not the most important, but it\u0027s 2016 ;)","commit_id":"14e6bb7db69dabcbf3750c5599833bc579b32d9a"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"7fe5e857f36cd9c9129c42e5fc403cea5a9d935f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#   Copyright 2015 Intel Corporation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":8,"id":"9abb7d3a_c83a4acd","line":1,"range":{"start_line":1,"start_character":4,"end_line":1,"end_character":13},"in_reply_to":"9abb7d3a_af31daee","updated":"2016-05-29 02:56:20.000000000","message":"A typo..will get that corrected","commit_id":"14e6bb7db69dabcbf3750c5599833bc579b32d9a"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"bddfd80a1ed20688b93171a364fbcad5772100a8","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        # Returns Capabilities object creating it from legacy dictionary."},{"line_number":46,"context_line":"        # FIXME(karthikp): This should go away in early O as we stop"},{"line_number":47,"context_line":"        # supporting backward compatibility with M."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        cap \u003d capg.copy()"},{"line_number":50,"context_line":"        cap_obj \u003d cls()"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        pools \u003d cap.pop(\u0027pools\u0027, [])"},{"line_number":53,"context_line":"        cap_obj.pools \u003d pools"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        for k, v in cap.items():"},{"line_number":56,"context_line":"            setattr(cap_obj, k, v)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        return cap_obj"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_165ba388","line":58,"range":{"start_line":48,"start_character":0,"end_line":58,"end_character":22},"updated":"2016-05-30 14:48:30.000000000","message":"Won\u0027t:\n\n        cap \u003d capg.copy()\n        pools \u003d cap.pop(\u0027pools\u0027, [])\n        cap_obj \u003d cls(**cap)\n\n        cap_obj.pools \u003d pools\n\n        return cap_obj\n\nwork just fine? Or even (totally not sure on this one):\n\n        cap \u003d capg.copy()\n        return cls(**cap)\n\nAnd yes, I\u0027ve noticed I\u0027ve did it similarly to your way in my patches. I\u0027ll fix them. :)","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"da17c64fc78432fdb4e98402b2206ff45401f5dc","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        # Returns Capabilities object creating it from legacy dictionary."},{"line_number":46,"context_line":"        # FIXME(karthikp): This should go away in early O as we stop"},{"line_number":47,"context_line":"        # supporting backward compatibility with M."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        cap \u003d capg.copy()"},{"line_number":50,"context_line":"        cap_obj \u003d cls()"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        pools \u003d cap.pop(\u0027pools\u0027, [])"},{"line_number":53,"context_line":"        cap_obj.pools \u003d pools"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        for k, v in cap.items():"},{"line_number":56,"context_line":"            setattr(cap_obj, k, v)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        return cap_obj"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_d678e92d","line":58,"range":{"start_line":48,"start_character":0,"end_line":58,"end_character":22},"in_reply_to":"9abb7d3a_165ba388","updated":"2016-06-01 02:11:42.000000000","message":"Oh Ya the first code snippet above works perfectly. The second one makes one test case fail","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8dbac274693026b532b1f0800ecfad15f9cafc9a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        \u0027driver_version\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":32,"context_line":"        \u0027filter_function\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":33,"context_line":"        \u0027goodness_function\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":34,"context_line":"        \u0027pools\u0027: fields.ListOfDictOfNullableStringsField(nullable\u003dTrue),"},{"line_number":35,"context_line":"        \u0027sparse_copy_volume\u0027:"},{"line_number":36,"context_line":"            fields.BooleanField(default\u003dFalse, nullable\u003dTrue),"},{"line_number":37,"context_line":"        \u0027storage_protocol\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_6468d088","line":34,"range":{"start_line":34,"start_character":0,"end_line":34,"end_character":72},"updated":"2016-06-02 10:18:59.000000000","message":"Error in tempest logs suggests me that this isn\u0027t actually dict of strings:\n\n2016-06-02 04:32:47.565 13892 ERROR cinder.scheduler.manager   File \"/opt/stack/new/cinder/cinder/scheduler/filters/capacity_filter.py\", line 78, in host_passes\n2016-06-02 04:32:47.565 13892 ERROR cinder.scheduler.manager     free \u003d free_space - math.floor(total * reserved)\n2016-06-02 04:32:47.565 13892 ERROR cinder.scheduler.manager TypeError: unsupported operand type(s) for -: \u0027unicode\u0027 and \u0027float\u0027 \n\nI think you\u0027ll be required to represent pools field as a new, well defined object that defines correct types.","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"7b30d7474454ec9ea74fcb1717d5ed4441bb035a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        \u0027driver_version\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":32,"context_line":"        \u0027filter_function\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":33,"context_line":"        \u0027goodness_function\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":34,"context_line":"        \u0027pools\u0027: fields.ListOfDictOfNullableStringsField(nullable\u003dTrue),"},{"line_number":35,"context_line":"        \u0027sparse_copy_volume\u0027:"},{"line_number":36,"context_line":"            fields.BooleanField(default\u003dFalse, nullable\u003dTrue),"},{"line_number":37,"context_line":"        \u0027storage_protocol\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_87713e47","line":34,"range":{"start_line":34,"start_character":0,"end_line":34,"end_character":72},"in_reply_to":"9abb7d3a_6468d088","updated":"2016-06-03 06:14:50.000000000","message":"Yes. Thanks for the hint here! Will do this","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8dbac274693026b532b1f0800ecfad15f9cafc9a","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027storage_protocol\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":38,"context_line":"        \u0027vendor_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":39,"context_line":"        \u0027volume_backend_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        \u0027timestamp\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":41,"context_line":"    }"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_6472904b","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":54},"updated":"2016-06-02 10:18:59.000000000","message":"Why not DateTimeField? Also according to hacking guidelines you\u0027re missing a comma at the end of the line [1].\n\n[1] http://docs.openstack.org/developer/hacking/#dictionaries-lists","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"7b30d7474454ec9ea74fcb1717d5ed4441bb035a","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027storage_protocol\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":38,"context_line":"        \u0027vendor_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":39,"context_line":"        \u0027volume_backend_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        \u0027timestamp\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":41,"context_line":"    }"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_c7a346b0","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":54},"in_reply_to":"9abb7d3a_6472904b","updated":"2016-06-03 06:14:50.000000000","message":"This will require me to incorporate UTC timezone in datetime in tests so that during checks its does not throw Typeerror.\n\nWill do this.","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"2949e23ea0973897219ee8ccd0e18931df702d22","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        pools \u003d cap.pop(\u0027pools\u0027, [])"},{"line_number":53,"context_line":"        cap_obj.pools \u003d pools"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        return cap_obj"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_e84aaeab","line":54,"updated":"2016-06-02 20:22:59.000000000","message":"Your new object don\u0027t copy any other fields from capg.","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"7b30d7474454ec9ea74fcb1717d5ed4441bb035a","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        pools \u003d cap.pop(\u0027pools\u0027, [])"},{"line_number":53,"context_line":"        cap_obj.pools \u003d pools"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        return cap_obj"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_4777563b","line":54,"in_reply_to":"9abb7d3a_e84aaeab","updated":"2016-06-03 06:14:50.000000000","message":"Yes, Not sure how that got missed in this patchset. Thanks! I will some work pending here.","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"ea625a8062d383b137249aadadd42bd0a3c77155","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        \u0027storage_protocol\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":39,"context_line":"        \u0027vendor_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        \u0027volume_backend_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027timestamp\u0027: fields.DateTimeField(nullable\u003dTrue),"},{"line_number":42,"context_line":"    }"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":11,"id":"7aa08908_ac698d27","line":41,"updated":"2016-06-07 13:11:09.000000000","message":"Looks like you\u0027ll need tzinfo_aware\u003dFalse here to get over tempest failures.","commit_id":"18a1987495d46a1016d70f6a00e32f40c9873456"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"8c98f4488ecfa66b14c83f75334dc0d773f5b537","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from cinder import objects"},{"line_number":16,"context_line":"from cinder.objects import base"},{"line_number":17,"context_line":"from oslo_config import cfg"},{"line_number":18,"context_line":"from oslo_log import log as logging"},{"line_number":19,"context_line":"from oslo_versionedobjects import fields"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_59ee2b8c","line":18,"range":{"start_line":17,"start_character":0,"end_line":18,"end_character":35},"updated":"2016-07-28 08:35:42.000000000","message":"Not used.","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"8c98f4488ecfa66b14c83f75334dc0d773f5b537","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from oslo_log import log as logging"},{"line_number":19,"context_line":"from oslo_versionedobjects import fields"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"CONF \u003d cfg.CONF"},{"line_number":22,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"@base.CinderObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_19e673b4","line":22,"range":{"start_line":21,"start_character":0,"end_line":22,"end_character":33},"updated":"2016-07-28 08:35:42.000000000","message":"Seems CONF and LOG are not used in this file.","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"8c98f4488ecfa66b14c83f75334dc0d773f5b537","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        \u0027allocated_capacity_gb\u0027: fields.FloatField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027filter_function\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027free_capacity_gb\u0027: fields.FloatField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027goodness_function\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027location_info\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027max_over_subscription_ratio\u0027: fields.FloatField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027multiattach\u0027: fields.BooleanField(default\u003dFalse, nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_d9b05b8e","line":46,"updated":"2016-07-28 08:35:42.000000000","message":"Duplicated with Line 34.","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"a0c098322276cf79bbd90059aa18d162e0f00ef1","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        \u0027allocated_capacity_gb\u0027: fields.FloatField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027filter_function\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027free_capacity_gb\u0027: fields.FloatField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027goodness_function\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027location_info\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027max_over_subscription_ratio\u0027: fields.FloatField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027multiattach\u0027: fields.BooleanField(default\u003dFalse, nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_362f8b89","line":46,"in_reply_to":"bacf61ea_d9b05b8e","updated":"2016-08-05 00:10:37.000000000","message":"yes,   will remove this.","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"8c98f4488ecfa66b14c83f75334dc0d773f5b537","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \u0027location_info\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027max_over_subscription_ratio\u0027: fields.FloatField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027multiattach\u0027: fields.BooleanField(default\u003dFalse, nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027pool_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":51,"context_line":"        \u0027provisioned_capacity_gb\u0027: fields.FloatField(nullable\u003dTrue),"},{"line_number":52,"context_line":"        \u0027reserved_percentage\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":53,"context_line":"        \u0027thick_provisioning_support\u0027:"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_b97487cf","line":50,"updated":"2016-07-28 08:35:42.000000000","message":"Why pool_name is not in Pool (pools)?","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"a0c098322276cf79bbd90059aa18d162e0f00ef1","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \u0027location_info\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027max_over_subscription_ratio\u0027: fields.FloatField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027multiattach\u0027: fields.BooleanField(default\u003dFalse, nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027pool_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":51,"context_line":"        \u0027provisioned_capacity_gb\u0027: fields.FloatField(nullable\u003dTrue),"},{"line_number":52,"context_line":"        \u0027reserved_percentage\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":53,"context_line":"        \u0027thick_provisioning_support\u0027:"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_36b4ab33","line":50,"in_reply_to":"bacf61ea_b97487cf","updated":"2016-08-05 00:10:37.000000000","message":"It is present in Pool. Please check line 127.\n\nThe reason why you would see some of the attributes from the Pool repeated in Capabilities is because some drivers don\u0027t support Pool at all","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"8c98f4488ecfa66b14c83f75334dc0d773f5b537","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":70,"context_line":"        if attrname \u003d\u003d \u0027ven_specific_cap\u0027:"},{"line_number":71,"context_line":"            self.vendor_spec_capabilities \u003d {}"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def __getattr__(self, name):"},{"line_number":74,"context_line":"        if name \u003d\u003d \u0027_obj_ven_specific_cap\u0027:"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_eb90e697","line":71,"updated":"2016-07-28 08:35:42.000000000","message":"Why not self.ven_specific_cap \u003d {}","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"a0c098322276cf79bbd90059aa18d162e0f00ef1","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":70,"context_line":"        if attrname \u003d\u003d \u0027ven_specific_cap\u0027:"},{"line_number":71,"context_line":"            self.vendor_spec_capabilities \u003d {}"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def __getattr__(self, name):"},{"line_number":74,"context_line":"        if name \u003d\u003d \u0027_obj_ven_specific_cap\u0027:"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_163c07c7","line":71,"in_reply_to":"bacf61ea_eb90e697","updated":"2016-08-05 00:10:37.000000000","message":"Good Catch. I will change it","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"8c98f4488ecfa66b14c83f75334dc0d773f5b537","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            self.vendor_spec_capabilities \u003d {}"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def __getattr__(self, name):"},{"line_number":74,"context_line":"        if name \u003d\u003d \u0027_obj_ven_specific_cap\u0027:"},{"line_number":75,"context_line":"            return {}"},{"line_number":76,"context_line":"        try:"},{"line_number":77,"context_line":"            return self.ven_specific_cap[name]"},{"line_number":78,"context_line":"        except KeyError:"},{"line_number":79,"context_line":"            raise AttributeError"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def __setattr__(self, name, value):"},{"line_number":82,"context_line":"        if name.startswith(\u0027_\u0027) or name in self.fields:"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_2bd03e53","line":79,"range":{"start_line":74,"start_character":0,"end_line":79,"end_character":32},"updated":"2016-07-28 08:35:42.000000000","message":"How about self.extra_capabilities? What is the return? I think you need to refer to __setattr__.","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"a0c098322276cf79bbd90059aa18d162e0f00ef1","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            self.vendor_spec_capabilities \u003d {}"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def __getattr__(self, name):"},{"line_number":74,"context_line":"        if name \u003d\u003d \u0027_obj_ven_specific_cap\u0027:"},{"line_number":75,"context_line":"            return {}"},{"line_number":76,"context_line":"        try:"},{"line_number":77,"context_line":"            return self.ven_specific_cap[name]"},{"line_number":78,"context_line":"        except KeyError:"},{"line_number":79,"context_line":"            raise AttributeError"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def __setattr__(self, name, value):"},{"line_number":82,"context_line":"        if name.startswith(\u0027_\u0027) or name in self.fields:"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_16d0871e","line":79,"range":{"start_line":74,"start_character":0,"end_line":79,"end_character":32},"in_reply_to":"bacf61ea_2bd03e53","updated":"2016-08-05 00:10:37.000000000","message":"extra_capabilities contains the key-value pairs sent to the capability scheduler as part of volume-type.\n\nvendor_specific _cap are a collection of extra attributes that many vendors may support. This attribute does not exist for many vendors\n\nSince extra_capabilities was earlier a dict and supported by cinder core,\nfrom_primitives handles it and I dont need to put in setattr.\n\nLet me know if I have answered your question.","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"ea5765fd2584b59a37f99eeae28d07e7c96293ed","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    # Version 1.0: Initial version"},{"line_number":29,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    fields \u003d {"},{"line_number":32,"context_line":"        \u0027driver_version\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":33,"context_line":"        \u0027filter_function\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":34,"context_line":"        \u0027goodness_function\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":19,"id":"9ad45d7e_c44f1832","line":31,"range":{"start_line":31,"start_character":4,"end_line":31,"end_character":10},"updated":"2016-08-15 22:43:31.000000000","message":"It would be awesome to have fields logically grouped and sorted (take a look at Volume or Snapshot) Ex:\n\n    \u0027timestamp\u0027,\n    \n    \u0027allocated_capacity_gb\u0027,\n    \u0027free_capacity_gb\u0027,\n    \u0027provisioned_capacity_gb\u0027,\n    \u0027total_capacity_gb\u0027,\n    \n    \u0027consistencygroup_support\u0027,\n    \u0027qos_support\u0027,\n    \u0027replication_support\u0027,\n    \u0027thick_provisioning_support\u0027,\n    \u0027thin_provisioning_support\u0027,\n    \n    \u0027driver_version\u0027,\n    \u0027filter_function\u0027,\n    \u0027goodness_function\u0027,\n    \u0027location_info\u0027,\n    \u0027max_over_subscription_ratio\u0027,\n    \u0027multiattach\u0027,\n    \u0027pool_name\u0027,\n    \u0027pools\u0027,\n    \u0027reserved_percentage\u0027,\n    \u0027sparse_copy_volume\u0027,\n    \u0027storage_protocol\u0027,\n    \u0027total_volumes\u0027,\n    \u0027vendor_name\u0027,\n    \u0027volume_backend_name\u0027,\n    \n    \u0027ven_specific_cap\u0027,\n    \u0027extra_capabilities\u0027,","commit_id":"3cb64a352699a239f198823b62cfcc9fe64deecc"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"08c727caffcd8742d981e2d597342b64dbcd8ae2","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    # Version 1.0: Initial version"},{"line_number":29,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    fields \u003d {"},{"line_number":32,"context_line":"        \u0027driver_version\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":33,"context_line":"        \u0027filter_function\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":34,"context_line":"        \u0027goodness_function\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":19,"id":"3ac371cc_bc270a63","line":31,"range":{"start_line":31,"start_character":4,"end_line":31,"end_character":10},"in_reply_to":"9ad45d7e_c44f1832","updated":"2016-08-17 18:56:58.000000000","message":"Seems like a sensible thing to do. Maybe I should do the same thing with Pool","commit_id":"3cb64a352699a239f198823b62cfcc9fe64deecc"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"ea5765fd2584b59a37f99eeae28d07e7c96293ed","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        \u0027vendor_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        \u0027volume_backend_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027timestamp\u0027: fields.DateTimeField(nullable\u003dTrue, tzinfo_aware\u003dFalse),"},{"line_number":42,"context_line":"        \u0027QoS_support\u0027: fields.BooleanField(default\u003dFalse, nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027allocated_capacity_gb\u0027: fields.FloatField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027filter_function\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027free_capacity_gb\u0027: fields.FloatField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":19,"id":"9ad45d7e_64f2ac07","line":42,"range":{"start_line":42,"start_character":9,"end_line":42,"end_character":20},"updated":"2016-08-15 22:43:31.000000000","message":"IMO it should be lowercase","commit_id":"3cb64a352699a239f198823b62cfcc9fe64deecc"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"08c727caffcd8742d981e2d597342b64dbcd8ae2","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        \u0027vendor_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        \u0027volume_backend_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027timestamp\u0027: fields.DateTimeField(nullable\u003dTrue, tzinfo_aware\u003dFalse),"},{"line_number":42,"context_line":"        \u0027QoS_support\u0027: fields.BooleanField(default\u003dFalse, nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027allocated_capacity_gb\u0027: fields.FloatField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027filter_function\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027free_capacity_gb\u0027: fields.FloatField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":19,"id":"3ac371cc_0104f947","line":42,"range":{"start_line":42,"start_character":9,"end_line":42,"end_character":20},"in_reply_to":"9ad45d7e_64f2ac07","updated":"2016-08-17 18:56:58.000000000","message":"I dont think so!\n\nhttps://github.com/openstack/cinder/search?utf8\u003d%E2%9C%93\u0026q\u003dQoS_support\u0026type\u003dCode","commit_id":"3cb64a352699a239f198823b62cfcc9fe64deecc"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"ea5765fd2584b59a37f99eeae28d07e7c96293ed","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        \u0027timestamp\u0027: fields.DateTimeField(nullable\u003dTrue, tzinfo_aware\u003dFalse),"},{"line_number":42,"context_line":"        \u0027QoS_support\u0027: fields.BooleanField(default\u003dFalse, nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027allocated_capacity_gb\u0027: fields.FloatField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027filter_function\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027free_capacity_gb\u0027: fields.FloatField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027location_info\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027max_over_subscription_ratio\u0027: fields.FloatField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":19,"id":"9ad45d7e_44284833","line":44,"range":{"start_line":44,"start_character":9,"end_line":44,"end_character":24},"updated":"2016-08-15 22:43:31.000000000","message":"Duplicated key","commit_id":"3cb64a352699a239f198823b62cfcc9fe64deecc"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"08c727caffcd8742d981e2d597342b64dbcd8ae2","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        \u0027timestamp\u0027: fields.DateTimeField(nullable\u003dTrue, tzinfo_aware\u003dFalse),"},{"line_number":42,"context_line":"        \u0027QoS_support\u0027: fields.BooleanField(default\u003dFalse, nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027allocated_capacity_gb\u0027: fields.FloatField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027filter_function\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027free_capacity_gb\u0027: fields.FloatField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027location_info\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027max_over_subscription_ratio\u0027: fields.FloatField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":19,"id":"3ac371cc_41af1181","line":44,"range":{"start_line":44,"start_character":9,"end_line":44,"end_character":24},"in_reply_to":"9ad45d7e_44284833","updated":"2016-08-17 18:56:58.000000000","message":"Thanks.","commit_id":"3cb64a352699a239f198823b62cfcc9fe64deecc"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"ea5765fd2584b59a37f99eeae28d07e7c96293ed","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":69,"context_line":"        if attrname \u003d\u003d \u0027ven_specific_cap\u0027:"},{"line_number":70,"context_line":"            self.ven_spec_cap \u003d {}"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def __getattr__(self, name):"},{"line_number":73,"context_line":"        if name \u003d\u003d \u0027_obj_ven_specific_cap\u0027:"}],"source_content_type":"text/x-python","patch_set":19,"id":"9ad45d7e_d571800d","line":70,"range":{"start_line":70,"start_character":17,"end_line":70,"end_character":29},"updated":"2016-08-15 22:43:31.000000000","message":"I think it should be ven_specific_cap.\nActually you should make tests for this object to avoid errors like that.","commit_id":"3cb64a352699a239f198823b62cfcc9fe64deecc"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"08c727caffcd8742d981e2d597342b64dbcd8ae2","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":69,"context_line":"        if attrname \u003d\u003d \u0027ven_specific_cap\u0027:"},{"line_number":70,"context_line":"            self.ven_spec_cap \u003d {}"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def __getattr__(self, name):"},{"line_number":73,"context_line":"        if name \u003d\u003d \u0027_obj_ven_specific_cap\u0027:"}],"source_content_type":"text/x-python","patch_set":19,"id":"3ac371cc_5c2a567f","line":70,"range":{"start_line":70,"start_character":17,"end_line":70,"end_character":29},"in_reply_to":"9ad45d7e_d571800d","updated":"2016-08-17 18:56:58.000000000","message":"Yes, I will add some tests for this.","commit_id":"3cb64a352699a239f198823b62cfcc9fe64deecc"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"ea5765fd2584b59a37f99eeae28d07e7c96293ed","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            self.ven_spec_cap \u003d {}"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def __getattr__(self, name):"},{"line_number":73,"context_line":"        if name \u003d\u003d \u0027_obj_ven_specific_cap\u0027:"},{"line_number":74,"context_line":"            return {}"},{"line_number":75,"context_line":"        try:"},{"line_number":76,"context_line":"            return self.ven_specific_cap[name]"},{"line_number":77,"context_line":"        except KeyError:"}],"source_content_type":"text/x-python","patch_set":19,"id":"9ad45d7e_aaeaabd8","line":74,"range":{"start_line":73,"start_character":8,"end_line":74,"end_character":21},"updated":"2016-08-15 22:43:31.000000000","message":"Is it necessary, I don\u0027y think your are using _obj_ven_specific_cap anywhere","commit_id":"3cb64a352699a239f198823b62cfcc9fe64deecc"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"75da2e962eab31210c59f0803765af36f8306760","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class VendorSpecific(object):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    fields \u003d {"},{"line_number":29,"context_line":"        \u0027ven_specific\u0027: fields.DictOfNullableStringsField(),"},{"line_number":30,"context_line":"    }"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":33,"context_line":"        if attrname \u003d\u003d \u0027ven_specific\u0027:"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a89bdaa_c2830003","line":30,"range":{"start_line":28,"start_character":0,"end_line":30,"end_character":5},"updated":"2016-09-06 14:06:11.000000000","message":"Wow, I would expect this will overwrite Capabilities fields, but it looks like we\u0027re having some o.vo magic that actually appends all the fields from all the superclasses.","commit_id":"ee4aeb17a524a1ecf2a528478397676a37d59b18"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"5e39a1d5beb31dd0478e93fdb2f9ac17df4fe184","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class VendorSpecific(object):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    fields \u003d {"},{"line_number":29,"context_line":"        \u0027ven_specific\u0027: fields.DictOfNullableStringsField(),"},{"line_number":30,"context_line":"    }"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":33,"context_line":"        if attrname \u003d\u003d \u0027ven_specific\u0027:"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a89bdaa_f8c33555","line":30,"range":{"start_line":28,"start_character":0,"end_line":30,"end_character":5},"in_reply_to":"9a89bdaa_c2830003","updated":"2016-09-09 18:51:42.000000000","message":"ahh.. i remember going through this...it appends this field to the fields in capabilities...so its not over write for sure!  :)\n\nAlso, moved other common attributes to a new class to remove clutter\n\nhttps://github.com/openstack/cinder/blob/9567844f0e180a7278767fdcd4378b19913933be/cinder/objects/base.py#L356","commit_id":"ee4aeb17a524a1ecf2a528478397676a37d59b18"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"b4393b8f969bf64c39328e57d612ed033389e03a","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        # Returns Capabilities object creating it from legacy dictionary."},{"line_number":106,"context_line":"        # FIXME(karthikp): This should go away in early O as we stop"},{"line_number":107,"context_line":"        # supporting backward compatibility with M."},{"line_number":108,"context_line":"        if cap is None:"},{"line_number":109,"context_line":"            return None"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        cap_copy \u003d cap.copy()"},{"line_number":112,"context_line":"        cap_obj \u003d cls()"}],"source_content_type":"text/x-python","patch_set":30,"id":"7a8ec9b2_65012a05","line":109,"range":{"start_line":108,"start_character":8,"end_line":109,"end_character":23},"updated":"2016-09-15 23:37:49.000000000","message":"IMO it should return empty Capabilities object even when cap is None","commit_id":"2af229dcc1cff9767fc5025054b3263053f50bcb"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"b4393b8f969bf64c39328e57d612ed033389e03a","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            return None"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        cap_copy \u003d cap.copy()"},{"line_number":112,"context_line":"        cap_obj \u003d cls()"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        pools \u003d cap_copy.pop(\u0027pools\u0027, None)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        if pools is not None:"},{"line_number":117,"context_line":"            pool_list \u003d []"},{"line_number":118,"context_line":"            for p in pools:"},{"line_number":119,"context_line":"                pool_obj \u003d objects.Pool(**p)"},{"line_number":120,"context_line":"                pool_list.append(pool_obj)"},{"line_number":121,"context_line":"            cap_obj.pools \u003d pool_list"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        for k, v in cap_copy.items():"},{"line_number":124,"context_line":"            setattr(cap_obj, k, v)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        return cap_obj"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"@base.CinderObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":30,"id":"7a8ec9b2_85a8f68e","line":126,"range":{"start_line":112,"start_character":8,"end_line":126,"end_character":22},"updated":"2016-09-15 23:37:49.000000000","message":"would be simpler with try/except and list comprehension:\n\ntry:\n     pools \u003d cap_copy[\u0027pools\u0027]\n     cap_copy[\u0027pools\u0027] \u003d [objects.Pool(**p) for p in pools]\nexcept KeyError:\n    pass\nreturn cls(**cap_copy)","commit_id":"2af229dcc1cff9767fc5025054b3263053f50bcb"}],"cinder/scheduler/filter_scheduler.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"68bde94701af7885241ba5f71178044b1190565b","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from oslo_config import cfg"},{"line_number":24,"context_line":"from oslo_log import log as logging"},{"line_number":25,"context_line":"from oslo_serialization import jsonutils"},{"line_number":26,"context_line":"from cinder import exception"},{"line_number":27,"context_line":"from cinder.i18n import _, _LE, _LW"},{"line_number":28,"context_line":"from cinder.scheduler import driver"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_a13417de","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":40},"updated":"2016-05-25 10:16:03.000000000","message":"Looks like leftover.","commit_id":"42a9b7f08c6a89cde12ac888c5e3c2f70cfd226f"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"d7cc4e34b9bd6debeacf22ed664d4a42c7456180","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from oslo_config import cfg"},{"line_number":24,"context_line":"from oslo_log import log as logging"},{"line_number":25,"context_line":"from oslo_serialization import jsonutils"},{"line_number":26,"context_line":"from cinder import exception"},{"line_number":27,"context_line":"from cinder.i18n import _, _LE, _LW"},{"line_number":28,"context_line":"from cinder.scheduler import driver"}],"source_content_type":"text/x-python","patch_set":6,"id":"9abb7d3a_482c9a4a","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":40},"in_reply_to":"bab6814e_a13417de","updated":"2016-05-29 03:00:27.000000000","message":"I will remove it in next patchset","commit_id":"42a9b7f08c6a89cde12ac888c5e3c2f70cfd226f"},{"author":{"_account_id":17275,"name":"Nate Potter","email":"nathaniel.potter@intel.com","username":"npotter"},"change_message_id":"9ab23b82aa8c09841175320d6e0cfa93049395dd","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from cinder.scheduler import scheduler_options"},{"line_number":27,"context_line":"from cinder.volume import utils"},{"line_number":28,"context_line":"from oslo_config import cfg"},{"line_number":29,"context_line":"from oslo_log import log as logging"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"CONF \u003d cfg.CONF"},{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9abb7d3a_4fb02ede","line":29,"updated":"2016-05-27 16:53:14.000000000","message":"Why are these imports moved here?","commit_id":"14e6bb7db69dabcbf3750c5599833bc579b32d9a"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"7fe5e857f36cd9c9129c42e5fc403cea5a9d935f","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from cinder.scheduler import scheduler_options"},{"line_number":27,"context_line":"from cinder.volume import utils"},{"line_number":28,"context_line":"from oslo_config import cfg"},{"line_number":29,"context_line":"from oslo_log import log as logging"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"CONF \u003d cfg.CONF"},{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9abb7d3a_5f4d7771","line":29,"in_reply_to":"9abb7d3a_4fb02ede","updated":"2016-05-29 02:56:20.000000000","message":"They have moved down for pep8 compliance","commit_id":"14e6bb7db69dabcbf3750c5599833bc579b32d9a"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"bddfd80a1ed20688b93171a364fbcad5772100a8","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from cinder.scheduler import driver"},{"line_number":26,"context_line":"from cinder.scheduler import scheduler_options"},{"line_number":27,"context_line":"from cinder.volume import utils"},{"line_number":28,"context_line":"from oslo_config import cfg"},{"line_number":29,"context_line":"from oslo_log import log as logging"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"CONF \u003d cfg.CONF"},{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_3136b1e7","line":29,"range":{"start_line":28,"start_character":0,"end_line":29,"end_character":35},"updated":"2016-05-30 14:48:30.000000000","message":"Waaait, this shouldn\u0027t really be like that according to OpenStack\u0027s hacking guidelines [1]. I\u0027m not really sure why this was causing PEP8 failures for you.\n\n[1] http://docs.openstack.org/developer/hacking/#import-order-template","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"da17c64fc78432fdb4e98402b2206ff45401f5dc","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from cinder.scheduler import driver"},{"line_number":26,"context_line":"from cinder.scheduler import scheduler_options"},{"line_number":27,"context_line":"from cinder.volume import utils"},{"line_number":28,"context_line":"from oslo_config import cfg"},{"line_number":29,"context_line":"from oslo_log import log as logging"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"CONF \u003d cfg.CONF"},{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_f0f05093","line":29,"range":{"start_line":28,"start_character":0,"end_line":29,"end_character":35},"in_reply_to":"9abb7d3a_24d11124","updated":"2016-06-01 02:11:42.000000000","message":"@Nate: Oh yes, sorry about that. Thanks.","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":17275,"name":"Nate Potter","email":"nathaniel.potter@intel.com","username":"npotter"},"change_message_id":"11562f33b95aa02bdbc6dd937e26064e3f376bc5","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from cinder.scheduler import driver"},{"line_number":26,"context_line":"from cinder.scheduler import scheduler_options"},{"line_number":27,"context_line":"from cinder.volume import utils"},{"line_number":28,"context_line":"from oslo_config import cfg"},{"line_number":29,"context_line":"from oslo_log import log as logging"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"CONF \u003d cfg.CONF"},{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_24d11124","line":29,"range":{"start_line":28,"start_character":0,"end_line":29,"end_character":35},"in_reply_to":"9abb7d3a_3136b1e7","updated":"2016-05-31 16:20:32.000000000","message":"Karthik, you got pep8 failures before because in patch set 7 you deleted the blank line on 25. The oslo imports get their own stanza, you should put them back.","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"}],"cinder/scheduler/filters/capabilities_filter.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"75da2e962eab31210c59f0803765af36f8306760","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            elif scope[0] \u003d\u003d \"capabilities\":"},{"line_number":51,"context_line":"                del scope[0]"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"            try:"},{"line_number":54,"context_line":"                cap \u003d capabilities[\u0027extra_capabilities\u0027]"},{"line_number":55,"context_line":"            except KeyError:"},{"line_number":56,"context_line":"                cap \u003d capabilities"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"            for index in range(len(scope)):"},{"line_number":59,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a89bdaa_68a7734f","line":56,"range":{"start_line":53,"start_character":0,"end_line":56,"end_character":34},"updated":"2016-09-06 14:06:11.000000000","message":"Why is this change needed?","commit_id":"ee4aeb17a524a1ecf2a528478397676a37d59b18"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"5e39a1d5beb31dd0478e93fdb2f9ac17df4fe184","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            elif scope[0] \u003d\u003d \"capabilities\":"},{"line_number":51,"context_line":"                del scope[0]"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"            try:"},{"line_number":54,"context_line":"                cap \u003d capabilities[\u0027extra_capabilities\u0027]"},{"line_number":55,"context_line":"            except KeyError:"},{"line_number":56,"context_line":"                cap \u003d capabilities"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"            for index in range(len(scope)):"},{"line_number":59,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a89bdaa_71c81ba9","line":56,"range":{"start_line":53,"start_character":0,"end_line":56,"end_character":34},"in_reply_to":"9a89bdaa_68a7734f","updated":"2016-09-09 18:51:42.000000000","message":"I added this as part of your comment on patchset 11. I messed up this part. \n\nI have corrected this part in the patchset 28. The extra_capabilities in not working in master. I have fixed that and made it to work with capabilities object too.\n\nWell this is needed if customer decides to add extra_capabililites to his/her backend by adding attributes in key-value pairs\n\nhttp://docs.openstack.org/kilo/config-reference/content/section_cinder.conf.html","commit_id":"ee4aeb17a524a1ecf2a528478397676a37d59b18"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"b4393b8f969bf64c39328e57d612ed033389e03a","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            elif scope[0] \u003d\u003d \"capabilities\":"},{"line_number":51,"context_line":"                del scope[0]"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"            try:"},{"line_number":54,"context_line":"                cap_extra_specs \u003d dict()"},{"line_number":55,"context_line":"                extra_specs \u003d capabilities[\u0027extra_capabilities\u0027]"},{"line_number":56,"context_line":"                cap_extra_specs.update(extra_specs)"},{"line_number":57,"context_line":"                cap_extra_specs.update(capabilities)"},{"line_number":58,"context_line":"            except KeyError:"},{"line_number":59,"context_line":"                pass"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"            cap \u003d (cap_extra_specs if len(cap_extra_specs) !\u003d 0 else"},{"line_number":62,"context_line":"                   capabilities)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"            for index in range(len(scope)):"},{"line_number":65,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":30,"id":"7a8ec9b2_22e478aa","line":62,"range":{"start_line":53,"start_character":12,"end_line":62,"end_character":32},"updated":"2016-09-15 23:37:49.000000000","message":"Else clause doesn\u0027t make much sense - it will only be executed when both capabilities and extra_capabilities are empty, what\u0027s the point in returning capabilities then. Whole thing could be simpler:\n\n cap \u003d dict(capabilities)\n cap.update(capabilities.get(\u0027extra_capabilities\u0027, {}))","commit_id":"2af229dcc1cff9767fc5025054b3263053f50bcb"}],"cinder/scheduler/host_manager.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"68bde94701af7885241ba5f71178044b1190565b","unresolved":false,"context_lines":[{"line_number":433,"context_line":"                      {\u0027service_name\u0027: service_name, \u0027host\u0027: host})"},{"line_number":434,"context_line":"            return"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"        # Copy the capabilities, so we don\u0027t modify the original dict"},{"line_number":437,"context_line":"        capabilities.timestamp \u003d timeutils.utcnow()  # Reported time"},{"line_number":438,"context_line":"        self.service_states[host] \u003d capabilities"},{"line_number":439,"context_line":"        LOG.debug(\"Received %(service_name)s service update from \""}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_61206f4a","line":436,"updated":"2016-05-25 10:16:03.000000000","message":"I believe you should follow the older pattern and log with non-modified timestamp. I think you can use:\n\n capab_copy \u003d capabilities.copy()\n\ninstead of\n\n capab_copy \u003d dict(capabilities)","commit_id":"42a9b7f08c6a89cde12ac888c5e3c2f70cfd226f"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"4588e9154180a05c7fa6da6efe135c48a82cb23a","unresolved":false,"context_lines":[{"line_number":433,"context_line":"                      {\u0027service_name\u0027: service_name, \u0027host\u0027: host})"},{"line_number":434,"context_line":"            return"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"        # Copy the capabilities, so we don\u0027t modify the original dict"},{"line_number":437,"context_line":"        capabilities.timestamp \u003d timeutils.utcnow()  # Reported time"},{"line_number":438,"context_line":"        self.service_states[host] \u003d capabilities"},{"line_number":439,"context_line":"        LOG.debug(\"Received %(service_name)s service update from \""}],"source_content_type":"text/x-python","patch_set":6,"id":"9abb7d3a_d6d0fb55","line":436,"in_reply_to":"9abb7d3a_c8ceca82","updated":"2016-05-30 13:58:07.000000000","message":"To prevent that you should check in scheduler.manager.update_service_capabilities if you\u0027ve received dict and convert it to object using Capabilities.from_primitives.","commit_id":"42a9b7f08c6a89cde12ac888c5e3c2f70cfd226f"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"55a0fbaec59c85ad2a111b32021c327bd60a2298","unresolved":false,"context_lines":[{"line_number":433,"context_line":"                      {\u0027service_name\u0027: service_name, \u0027host\u0027: host})"},{"line_number":434,"context_line":"            return"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"        # Copy the capabilities, so we don\u0027t modify the original dict"},{"line_number":437,"context_line":"        capabilities.timestamp \u003d timeutils.utcnow()  # Reported time"},{"line_number":438,"context_line":"        self.service_states[host] \u003d capabilities"},{"line_number":439,"context_line":"        LOG.debug(\"Received %(service_name)s service update from \""}],"source_content_type":"text/x-python","patch_set":6,"id":"9abb7d3a_50eafcac","line":436,"in_reply_to":"9abb7d3a_d6d0fb55","updated":"2016-06-01 03:17:05.000000000","message":"Yes. The capabilities.copy() would work in case if a dict is passed to it..but fail in cases where capabilities is object itself. \n\nIn ovo form, capabilities.copy() would not work.","commit_id":"42a9b7f08c6a89cde12ac888c5e3c2f70cfd226f"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"d7cc4e34b9bd6debeacf22ed664d4a42c7456180","unresolved":false,"context_lines":[{"line_number":433,"context_line":"                      {\u0027service_name\u0027: service_name, \u0027host\u0027: host})"},{"line_number":434,"context_line":"            return"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"        # Copy the capabilities, so we don\u0027t modify the original dict"},{"line_number":437,"context_line":"        capabilities.timestamp \u003d timeutils.utcnow()  # Reported time"},{"line_number":438,"context_line":"        self.service_states[host] \u003d capabilities"},{"line_number":439,"context_line":"        LOG.debug(\"Received %(service_name)s service update from \""}],"source_content_type":"text/x-python","patch_set":6,"id":"9abb7d3a_c8ceca82","line":436,"in_reply_to":"bab6814e_61206f4a","updated":"2016-05-29 03:00:27.000000000","message":"Changing from dict(capabilities) to capabilities.copy alone will break the code when the volume sends capbs in ovo form.\n\nI believe the below check is required:\n\nif isinstance(capabilities, dict):\n   capabilities_copy \u003d capabilities.copy()\n   capabilities_copy[\"timestamp\"] \u003d timeutils.utcnow()\nelse:\n   capabilities_copy \u003d capabilities.obj_clone()\n   capabilities_copy.timestamp \u003d timeutils.utcnow()\n\nPlease correct me if my understanding is wrong!!","commit_id":"42a9b7f08c6a89cde12ac888c5e3c2f70cfd226f"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"68bde94701af7885241ba5f71178044b1190565b","unresolved":false,"context_lines":[{"line_number":523,"context_line":"                new_pool \u003d dict(name\u003dpool_key)"},{"line_number":524,"context_line":"                new_pool.update(dict(capabilities\u003dpool.capabilities))"},{"line_number":525,"context_line":"                all_pools.append(new_pool)"},{"line_number":526,"context_line":"        print all_pools"},{"line_number":527,"context_line":"        return all_pools"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_e1b9ffed","line":526,"range":{"start_line":526,"start_character":8,"end_line":526,"end_character":23},"updated":"2016-05-25 10:16:03.000000000","message":"Debugging leftover?","commit_id":"42a9b7f08c6a89cde12ac888c5e3c2f70cfd226f"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"d7cc4e34b9bd6debeacf22ed664d4a42c7456180","unresolved":false,"context_lines":[{"line_number":523,"context_line":"                new_pool \u003d dict(name\u003dpool_key)"},{"line_number":524,"context_line":"                new_pool.update(dict(capabilities\u003dpool.capabilities))"},{"line_number":525,"context_line":"                all_pools.append(new_pool)"},{"line_number":526,"context_line":"        print all_pools"},{"line_number":527,"context_line":"        return all_pools"}],"source_content_type":"text/x-python","patch_set":6,"id":"9abb7d3a_e8c58e5b","line":526,"range":{"start_line":526,"start_character":8,"end_line":526,"end_character":23},"in_reply_to":"bab6814e_e1b9ffed","updated":"2016-05-29 03:00:27.000000000","message":"Sorry. I will get rid of this in next patchset.","commit_id":"42a9b7f08c6a89cde12ac888c5e3c2f70cfd226f"},{"author":{"_account_id":17275,"name":"Nate Potter","email":"nathaniel.potter@intel.com","username":"npotter"},"change_message_id":"9ab23b82aa8c09841175320d6e0cfa93049395dd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2012 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":8,"id":"9abb7d3a_2feccac6","line":1,"updated":"2016-05-27 16:53:14.000000000","message":"What is this year changed for here?","commit_id":"14e6bb7db69dabcbf3750c5599833bc579b32d9a"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"7fe5e857f36cd9c9129c42e5fc403cea5a9d935f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2012 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":8,"id":"9abb7d3a_6af3560b","line":1,"in_reply_to":"9abb7d3a_2feccac6","updated":"2016-05-29 02:56:20.000000000","message":"Sorry ..its a typo!!","commit_id":"14e6bb7db69dabcbf3750c5599833bc579b32d9a"},{"author":{"_account_id":17275,"name":"Nate Potter","email":"nathaniel.potter@intel.com","username":"npotter"},"change_message_id":"9ab23b82aa8c09841175320d6e0cfa93049395dd","unresolved":false,"context_lines":[{"line_number":433,"context_line":"                      {\u0027service_name\u0027: service_name, \u0027host\u0027: host})"},{"line_number":434,"context_line":"            return"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"        # Copy the capabilities, so we don\u0027t modify the original dicti"},{"line_number":437,"context_line":"        capabilities_copy \u003d dict(capabilities)"},{"line_number":438,"context_line":"        capabilities_copy[\"timestamp\"] \u003d timeutils.utcnow()  # Reported time"},{"line_number":439,"context_line":"        self.service_states[host] \u003d capabilities_copy"}],"source_content_type":"text/x-python","patch_set":8,"id":"9abb7d3a_6f237206","line":436,"range":{"start_line":436,"start_character":69,"end_line":436,"end_character":70},"updated":"2016-05-27 16:53:14.000000000","message":"Typo added here","commit_id":"14e6bb7db69dabcbf3750c5599833bc579b32d9a"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"7fe5e857f36cd9c9129c42e5fc403cea5a9d935f","unresolved":false,"context_lines":[{"line_number":433,"context_line":"                      {\u0027service_name\u0027: service_name, \u0027host\u0027: host})"},{"line_number":434,"context_line":"            return"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"        # Copy the capabilities, so we don\u0027t modify the original dicti"},{"line_number":437,"context_line":"        capabilities_copy \u003d dict(capabilities)"},{"line_number":438,"context_line":"        capabilities_copy[\"timestamp\"] \u003d timeutils.utcnow()  # Reported time"},{"line_number":439,"context_line":"        self.service_states[host] \u003d capabilities_copy"}],"source_content_type":"text/x-python","patch_set":8,"id":"9abb7d3a_2ad30e3a","line":436,"range":{"start_line":436,"start_character":69,"end_line":436,"end_character":70},"in_reply_to":"9abb7d3a_6f237206","updated":"2016-05-29 02:56:20.000000000","message":"Will fix in next patchset","commit_id":"14e6bb7db69dabcbf3750c5599833bc579b32d9a"},{"author":{"_account_id":17275,"name":"Nate Potter","email":"nathaniel.potter@intel.com","username":"npotter"},"change_message_id":"9ab23b82aa8c09841175320d6e0cfa93049395dd","unresolved":false,"context_lines":[{"line_number":434,"context_line":"            return"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"        # Copy the capabilities, so we don\u0027t modify the original dicti"},{"line_number":437,"context_line":"        capabilities_copy \u003d dict(capabilities)"},{"line_number":438,"context_line":"        capabilities_copy[\"timestamp\"] \u003d timeutils.utcnow()  # Reported time"},{"line_number":439,"context_line":"        self.service_states[host] \u003d capabilities_copy"},{"line_number":440,"context_line":"        LOG.debug(\"Received %(service_name)s service update from \""}],"source_content_type":"text/x-python","patch_set":8,"id":"9abb7d3a_4f830ecd","line":437,"updated":"2016-05-27 16:53:14.000000000","message":"Were you going to address Michał\u0027s comment w/ regards to capabilities.copy() replacing dict(capabilities) here?","commit_id":"14e6bb7db69dabcbf3750c5599833bc579b32d9a"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"7fe5e857f36cd9c9129c42e5fc403cea5a9d935f","unresolved":false,"context_lines":[{"line_number":434,"context_line":"            return"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"        # Copy the capabilities, so we don\u0027t modify the original dicti"},{"line_number":437,"context_line":"        capabilities_copy \u003d dict(capabilities)"},{"line_number":438,"context_line":"        capabilities_copy[\"timestamp\"] \u003d timeutils.utcnow()  # Reported time"},{"line_number":439,"context_line":"        self.service_states[host] \u003d capabilities_copy"},{"line_number":440,"context_line":"        LOG.debug(\"Received %(service_name)s service update from \""}],"source_content_type":"text/x-python","patch_set":8,"id":"9abb7d3a_ca0082ad","line":437,"in_reply_to":"9abb7d3a_4f830ecd","updated":"2016-05-29 02:56:20.000000000","message":"The code breaks here if i just change from dict(capabilities) to capabilities.copy()\n\nI need to have a check here if capabilities is instance of dict..if yes then capabilities.copy works, otherwise need to get capabilities.obj_clone() and add timestamp to it","commit_id":"14e6bb7db69dabcbf3750c5599833bc579b32d9a"},{"author":{"_account_id":17275,"name":"Nate Potter","email":"nathaniel.potter@intel.com","username":"npotter"},"change_message_id":"9ab23b82aa8c09841175320d6e0cfa93049395dd","unresolved":false,"context_lines":[{"line_number":515,"context_line":"        \"\"\"Returns a dict of all pools on all hosts HostManager knows about.\"\"\""},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"        self._update_host_state_map(context)"},{"line_number":518,"context_line":"        all_pools \u003d []"},{"line_number":519,"context_line":"        for host, state in self.host_state_map.items():"},{"line_number":520,"context_line":"            for key in state.pools:"},{"line_number":521,"context_line":"                pool \u003d state.pools[key]"}],"source_content_type":"text/x-python","patch_set":8,"id":"9abb7d3a_afef1aaf","line":518,"updated":"2016-05-27 16:53:14.000000000","message":"Unneeded line deletion here","commit_id":"14e6bb7db69dabcbf3750c5599833bc579b32d9a"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"55b092e2b45a67431b585d7efa1ed935ab693b70","unresolved":false,"context_lines":[{"line_number":436,"context_line":"        # Copy the capabilities, so we don\u0027t modify the original dict and"},{"line_number":437,"context_line":"        # add the reported time to the copy"},{"line_number":438,"context_line":"        if isinstance(capabilities, dict):"},{"line_number":439,"context_line":"            capabilities_copy \u003d capabilities.copy()"},{"line_number":440,"context_line":"            capabilities_copy[\"timestamp\"] \u003d timeutils.utcnow()"},{"line_number":441,"context_line":"        else:"},{"line_number":442,"context_line":"            capabilities_copy \u003d capabilities.obj_clone()"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_e27fe2a8","line":439,"range":{"start_line":439,"start_character":49,"end_line":439,"end_character":51},"updated":"2016-06-01 05:13:55.000000000","message":"I think this line should have something like capabilities.obj_clone()","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"f474d57840a52ed87e03f1e285b13d8cdacca833","unresolved":false,"context_lines":[{"line_number":436,"context_line":"        # Copy the capabilities, so we don\u0027t modify the original dict and"},{"line_number":437,"context_line":"        # add the reported time to the copy"},{"line_number":438,"context_line":"        if isinstance(capabilities, dict):"},{"line_number":439,"context_line":"            capabilities_copy \u003d capabilities.copy()"},{"line_number":440,"context_line":"            capabilities_copy[\"timestamp\"] \u003d timeutils.utcnow()"},{"line_number":441,"context_line":"        else:"},{"line_number":442,"context_line":"            capabilities_copy \u003d capabilities.obj_clone()"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_bc4831b4","line":439,"range":{"start_line":439,"start_character":49,"end_line":439,"end_character":51},"in_reply_to":"9abb7d3a_e27fe2a8","updated":"2016-06-01 18:40:04.000000000","message":"You\u0027re right!","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"bddfd80a1ed20688b93171a364fbcad5772100a8","unresolved":false,"context_lines":[{"line_number":433,"context_line":"                      {\u0027service_name\u0027: service_name, \u0027host\u0027: host})"},{"line_number":434,"context_line":"            return"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"        # Copy the capabilities, so we don\u0027t modify the original dict and"},{"line_number":437,"context_line":"        # add the reported time to the copy"},{"line_number":438,"context_line":"        if isinstance(capabilities, dict):"},{"line_number":439,"context_line":"            capabilities_copy \u003d capabilities.copy()"},{"line_number":440,"context_line":"            capabilities_copy[\"timestamp\"] \u003d timeutils.utcnow()"},{"line_number":441,"context_line":"        else:"},{"line_number":442,"context_line":"            capabilities_copy \u003d capabilities.obj_clone()"},{"line_number":443,"context_line":"            capabilities_copy.timestamp \u003d timeutils.utcnow()"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"        self.service_states[host] \u003d capabilities_copy"},{"line_number":446,"context_line":"        LOG.debug(\"Received %(service_name)s service update from \""},{"line_number":447,"context_line":"                  \"%(host)s: %(cap)s\","},{"line_number":448,"context_line":"                  {\u0027service_name\u0027: service_name, \u0027host\u0027: host,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_7147994b","line":445,"range":{"start_line":436,"start_character":0,"end_line":445,"end_character":53},"updated":"2016-05-30 14:48:30.000000000","message":"I don\u0027t get it. You should make your manager convert dict to object if received. That way you wouldn\u0027t need to worry here and could just assume you\u0027re receiving object here.","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"da17c64fc78432fdb4e98402b2206ff45401f5dc","unresolved":false,"context_lines":[{"line_number":433,"context_line":"                      {\u0027service_name\u0027: service_name, \u0027host\u0027: host})"},{"line_number":434,"context_line":"            return"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"        # Copy the capabilities, so we don\u0027t modify the original dict and"},{"line_number":437,"context_line":"        # add the reported time to the copy"},{"line_number":438,"context_line":"        if isinstance(capabilities, dict):"},{"line_number":439,"context_line":"            capabilities_copy \u003d capabilities.copy()"},{"line_number":440,"context_line":"            capabilities_copy[\"timestamp\"] \u003d timeutils.utcnow()"},{"line_number":441,"context_line":"        else:"},{"line_number":442,"context_line":"            capabilities_copy \u003d capabilities.obj_clone()"},{"line_number":443,"context_line":"            capabilities_copy.timestamp \u003d timeutils.utcnow()"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"        self.service_states[host] \u003d capabilities_copy"},{"line_number":446,"context_line":"        LOG.debug(\"Received %(service_name)s service update from \""},{"line_number":447,"context_line":"                  \"%(host)s: %(cap)s\","},{"line_number":448,"context_line":"                  {\u0027service_name\u0027: service_name, \u0027host\u0027: host,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_b36ff229","line":445,"range":{"start_line":436,"start_character":0,"end_line":445,"end_character":53},"in_reply_to":"9abb7d3a_7147994b","updated":"2016-06-01 02:11:42.000000000","message":"The capabilities.copy wouldn\u0027t work if the capabilities is passed as ovo, since copy works on dicts.\n\nAttributeError: \u0027Capabilities\u0027 object has no attribute \u0027copy\u0027","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"}],"cinder/scheduler/manager.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"68bde94701af7885241ba5f71178044b1190565b","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                                    host\u003dNone, capabilities\u003dNone, **kwargs):"},{"line_number":84,"context_line":"        \"\"\"Process a capability update from a service node.\"\"\""},{"line_number":85,"context_line":"        if capabilities is None:"},{"line_number":86,"context_line":"            capabilities \u003d objects.Capabilities.from_primitives({})"},{"line_number":87,"context_line":"        self.driver.update_service_capabilities(service_name,"},{"line_number":88,"context_line":"                                                host,"},{"line_number":89,"context_line":"                                                capabilities)"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_a1f25798","line":86,"range":{"start_line":86,"start_character":12,"end_line":86,"end_character":67},"updated":"2016-05-25 10:16:03.000000000","message":"Why not simply:\n\n capabilities \u003d objects.Capabilities()\n\n?","commit_id":"42a9b7f08c6a89cde12ac888c5e3c2f70cfd226f"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"4588e9154180a05c7fa6da6efe135c48a82cb23a","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                                    host\u003dNone, capabilities\u003dNone, **kwargs):"},{"line_number":84,"context_line":"        \"\"\"Process a capability update from a service node.\"\"\""},{"line_number":85,"context_line":"        if capabilities is None:"},{"line_number":86,"context_line":"            capabilities \u003d objects.Capabilities.from_primitives({})"},{"line_number":87,"context_line":"        self.driver.update_service_capabilities(service_name,"},{"line_number":88,"context_line":"                                                host,"},{"line_number":89,"context_line":"                                                capabilities)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9abb7d3a_76682f88","line":86,"range":{"start_line":86,"start_character":12,"end_line":86,"end_character":67},"in_reply_to":"9abb7d3a_321ed8ba","updated":"2016-05-30 13:58:07.000000000","message":"You\u0027re right with your code snippet - this should do the work.\n\nOn checking - I don\u0027t understand why you would want that. This code will always run as 2.1, just we can get 2.0 params. But you\u0027re preventing that with aforementioned snippet. I\u0027m not sure if I follow.","commit_id":"42a9b7f08c6a89cde12ac888c5e3c2f70cfd226f"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"55a0fbaec59c85ad2a111b32021c327bd60a2298","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                                    host\u003dNone, capabilities\u003dNone, **kwargs):"},{"line_number":84,"context_line":"        \"\"\"Process a capability update from a service node.\"\"\""},{"line_number":85,"context_line":"        if capabilities is None:"},{"line_number":86,"context_line":"            capabilities \u003d objects.Capabilities.from_primitives({})"},{"line_number":87,"context_line":"        self.driver.update_service_capabilities(service_name,"},{"line_number":88,"context_line":"                                                host,"},{"line_number":89,"context_line":"                                                capabilities)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9abb7d3a_81e6d812","line":86,"range":{"start_line":86,"start_character":12,"end_line":86,"end_character":67},"in_reply_to":"9abb7d3a_76682f88","updated":"2016-06-01 03:17:05.000000000","message":"I did this so that i dont have to worry about conversion in scheduler\u0027s host manager. I believe you concur with this approach in patchset 9?","commit_id":"42a9b7f08c6a89cde12ac888c5e3c2f70cfd226f"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"d7cc4e34b9bd6debeacf22ed664d4a42c7456180","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                                    host\u003dNone, capabilities\u003dNone, **kwargs):"},{"line_number":84,"context_line":"        \"\"\"Process a capability update from a service node.\"\"\""},{"line_number":85,"context_line":"        if capabilities is None:"},{"line_number":86,"context_line":"            capabilities \u003d objects.Capabilities.from_primitives({})"},{"line_number":87,"context_line":"        self.driver.update_service_capabilities(service_name,"},{"line_number":88,"context_line":"                                                host,"},{"line_number":89,"context_line":"                                                capabilities)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9abb7d3a_321ed8ba","line":86,"range":{"start_line":86,"start_character":12,"end_line":86,"end_character":67},"in_reply_to":"bab6814e_a1f25798","updated":"2016-05-29 03:00:27.000000000","message":"I was planning to have something like this..\n\nif isinstance(capabilities, dict):\n   capabilities \u003d objects.Capabilities.from_primitive(capabilities)\n \nif capabilities is None:\n   capabilities \u003d objects.Capabilities()\n\nI think we should also have a check for rpc_api_version on line 85... line 86 would fail because if scheduler rpc_api_version is less than 2.1\n\nPlease correct me if my understanding is incorrect here. Thanks!!","commit_id":"42a9b7f08c6a89cde12ac888c5e3c2f70cfd226f"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"bddfd80a1ed20688b93171a364fbcad5772100a8","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    def update_service_capabilities(self, context, service_name\u003dNone,"},{"line_number":83,"context_line":"                                    host\u003dNone, capabilities\u003dNone, **kwargs):"},{"line_number":84,"context_line":"        \"\"\"Process a capability update from a service node.\"\"\""},{"line_number":85,"context_line":"        if isinstance(capabilities, dict):"},{"line_number":86,"context_line":"            capabilities \u003d objects.Capabilities.from_primitive(capabilities)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        if capabilities is None:"},{"line_number":89,"context_line":"            capabilities \u003d objects.Capabilities()"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        self.driver.update_service_capabilities(service_name,"},{"line_number":92,"context_line":"                                                host,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_51ded56d","line":89,"range":{"start_line":85,"start_character":0,"end_line":89,"end_character":49},"updated":"2016-05-30 14:48:30.000000000","message":"I think this should make it for the safety code in host_manager, isn\u0027t it?","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"da17c64fc78432fdb4e98402b2206ff45401f5dc","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    def update_service_capabilities(self, context, service_name\u003dNone,"},{"line_number":83,"context_line":"                                    host\u003dNone, capabilities\u003dNone, **kwargs):"},{"line_number":84,"context_line":"        \"\"\"Process a capability update from a service node.\"\"\""},{"line_number":85,"context_line":"        if isinstance(capabilities, dict):"},{"line_number":86,"context_line":"            capabilities \u003d objects.Capabilities.from_primitive(capabilities)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        if capabilities is None:"},{"line_number":89,"context_line":"            capabilities \u003d objects.Capabilities()"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        self.driver.update_service_capabilities(service_name,"},{"line_number":92,"context_line":"                                                host,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_a16afcb0","line":89,"range":{"start_line":85,"start_character":0,"end_line":89,"end_character":49},"in_reply_to":"9abb7d3a_51ded56d","updated":"2016-06-01 02:11:42.000000000","message":"Yes, this code here is sufficient to make sure only ovo reaches the host manager.\n\nMy only doubt is that how should I need to handle capabilities.copy() in a different way in update_service_caps in host_manager when capabilities is a ovo.","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"f474d57840a52ed87e03f1e285b13d8cdacca833","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    def update_service_capabilities(self, context, service_name\u003dNone,"},{"line_number":83,"context_line":"                                    host\u003dNone, capabilities\u003dNone, **kwargs):"},{"line_number":84,"context_line":"        \"\"\"Process a capability update from a service node.\"\"\""},{"line_number":85,"context_line":"        if isinstance(capabilities, dict):"},{"line_number":86,"context_line":"            capabilities \u003d objects.Capabilities.from_primitive(capabilities)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        if capabilities is None:"},{"line_number":89,"context_line":"            capabilities \u003d objects.Capabilities()"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        self.driver.update_service_capabilities(service_name,"},{"line_number":92,"context_line":"                                                host,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_dc80958d","line":89,"range":{"start_line":85,"start_character":0,"end_line":89,"end_character":49},"in_reply_to":"9abb7d3a_a16afcb0","updated":"2016-06-01 18:40:04.000000000","message":"Where exactly?","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"2949e23ea0973897219ee8ccd0e18931df702d22","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                                    host\u003dNone, capabilities\u003dNone, **kwargs):"},{"line_number":84,"context_line":"        \"\"\"Process a capability update from a service node.\"\"\""},{"line_number":85,"context_line":"        if isinstance(capabilities, dict):"},{"line_number":86,"context_line":"            capabilities \u003d objects.Capabilities.from_primitive(capabilities)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        if capabilities is None:"},{"line_number":89,"context_line":"            capabilities \u003d objects.Capabilities()"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_68719ee0","line":86,"range":{"start_line":86,"start_character":48,"end_line":86,"end_character":62},"updated":"2016-06-02 20:22:59.000000000","message":"from_primitive don\u0027t support None so either move second if before this one, or add support for None in from_primitive","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"7b30d7474454ec9ea74fcb1717d5ed4441bb035a","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                                    host\u003dNone, capabilities\u003dNone, **kwargs):"},{"line_number":84,"context_line":"        \"\"\"Process a capability update from a service node.\"\"\""},{"line_number":85,"context_line":"        if isinstance(capabilities, dict):"},{"line_number":86,"context_line":"            capabilities \u003d objects.Capabilities.from_primitive(capabilities)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        if capabilities is None:"},{"line_number":89,"context_line":"            capabilities \u003d objects.Capabilities()"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_0738ae3c","line":86,"range":{"start_line":86,"start_character":48,"end_line":86,"end_character":62},"in_reply_to":"9abb7d3a_68719ee0","updated":"2016-06-03 06:14:50.000000000","message":"I beleive I can add support in from_primitive for this. That will make the manager code more clean.","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"b4393b8f969bf64c39328e57d612ed033389e03a","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                                    host\u003dNone, capabilities\u003dNone, **kwargs):"},{"line_number":86,"context_line":"        \"\"\"Process a capability update from a service node.\"\"\""},{"line_number":87,"context_line":"        if capabilities is None:"},{"line_number":88,"context_line":"            capabilities \u003d objects.Capabilities.from_primitives()"},{"line_number":89,"context_line":"        self.driver.update_service_capabilities(service_name,"},{"line_number":90,"context_line":"                                                host,"},{"line_number":91,"context_line":"                                                capabilities)"}],"source_content_type":"text/x-python","patch_set":30,"id":"7a8ec9b2_a58092f8","line":88,"range":{"start_line":88,"start_character":27,"end_line":88,"end_character":65},"updated":"2016-09-15 23:37:49.000000000","message":"Why not objects.Capabilities()","commit_id":"2af229dcc1cff9767fc5025054b3263053f50bcb"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"85d8816fe76d1802fa481da563b7963d654c120a","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        super(SchedulerManager, self).reset()"},{"line_number":82,"context_line":"        self.driver.reset()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def update_service_capabilities(self, context, service_name\u003dNone,"},{"line_number":85,"context_line":"                                    host\u003dNone, capabilities\u003dNone, **kwargs):"},{"line_number":86,"context_line":"        \"\"\"Process a capability update from a service node.\"\"\""},{"line_number":87,"context_line":"        if capabilities is None:"},{"line_number":88,"context_line":"            capabilities \u003d objects.Capabilities.from_primitives()"},{"line_number":89,"context_line":"        self.driver.update_service_capabilities(service_name,"},{"line_number":90,"context_line":"                                                host,"},{"line_number":91,"context_line":"                                                capabilities)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def _wait_for_scheduler(self):"},{"line_number":94,"context_line":"        # NOTE(dulek): We\u0027re waiting for scheduler to announce that it\u0027s ready"}],"source_content_type":"text/x-python","patch_set":44,"id":"1a95cdbc_8d234305","line":91,"range":{"start_line":84,"start_character":0,"end_line":91,"end_character":61},"updated":"2016-10-04 19:57:17.000000000","message":"Okay, so this is *exactly* why multinode grenade CI is failing on the patch. It is running new c-api and c-sch with old c-vols. Now these c-vols are reporting capabilities in dict form. You need to do a check here and load the capabilities into an object when dict is received. Logs are stating exactly that [1]. You\u0027ll need something like [2] here.\n\n[1] http://logs.openstack.org/40/319040/44/check/gate-grenade-dsvm-cinder-multinode-nv/7f6a987/logs/new/screen-c-sch.txt.gz?level\u003dERROR\n[2] https://github.com/openstack/cinder/blob/dc74d836cbd1f81be1f1e8242ed2623c049bf1dd/cinder/volume/manager.py#L571-L574","commit_id":"31762462570e1e84fcbcd785032f324d3ef29450"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"5ad3343c452457fe106a0fe2df898261cbc431de","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        super(SchedulerManager, self).reset()"},{"line_number":82,"context_line":"        self.driver.reset()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def update_service_capabilities(self, context, service_name\u003dNone,"},{"line_number":85,"context_line":"                                    host\u003dNone, capabilities\u003dNone, **kwargs):"},{"line_number":86,"context_line":"        \"\"\"Process a capability update from a service node.\"\"\""},{"line_number":87,"context_line":"        if capabilities is None:"},{"line_number":88,"context_line":"            capabilities \u003d objects.Capabilities.from_primitives()"},{"line_number":89,"context_line":"        self.driver.update_service_capabilities(service_name,"},{"line_number":90,"context_line":"                                                host,"},{"line_number":91,"context_line":"                                                capabilities)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def _wait_for_scheduler(self):"},{"line_number":94,"context_line":"        # NOTE(dulek): We\u0027re waiting for scheduler to announce that it\u0027s ready"}],"source_content_type":"text/x-python","patch_set":44,"id":"1a95cdbc_6587de61","line":91,"range":{"start_line":84,"start_character":0,"end_line":91,"end_character":61},"in_reply_to":"1a95cdbc_8d234305","updated":"2016-10-05 05:23:24.000000000","message":"Thanks for taking the time to explain. This was really helpful.","commit_id":"31762462570e1e84fcbcd785032f324d3ef29450"}],"cinder/scheduler/rpcapi.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"68bde94701af7885241ba5f71178044b1190565b","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                          request_spec\u003drequest_spec_p,"},{"line_number":125,"context_line":"                          filter_properties\u003dfilter_properties)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def get_pools(self, ctxt, filters\u003dNone):"},{"line_number":128,"context_line":"        version \u003d \u00272.1\u0027"},{"line_number":129,"context_line":"        if not self.client.can_send_version(\u00272.1\u0027):"},{"line_number":130,"context_line":"            version \u003d \u00272.0\u0027"},{"line_number":131,"context_line":"        cctxt \u003d self.client.prepare(version\u003dversion)"},{"line_number":132,"context_line":"        return cctxt.call(ctxt, \u0027get_pools\u0027,"},{"line_number":133,"context_line":"                          filters\u003dfilters)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def update_service_capabilities(self, ctxt,"},{"line_number":136,"context_line":"                                    service_name, host,"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_c114bba0","line":133,"range":{"start_line":127,"start_character":0,"end_line":133,"end_character":42},"updated":"2016-05-25 10:16:03.000000000","message":"I don\u0027t think we need to modify this one.","commit_id":"42a9b7f08c6a89cde12ac888c5e3c2f70cfd226f"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"d7cc4e34b9bd6debeacf22ed664d4a42c7456180","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                          request_spec\u003drequest_spec_p,"},{"line_number":125,"context_line":"                          filter_properties\u003dfilter_properties)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def get_pools(self, ctxt, filters\u003dNone):"},{"line_number":128,"context_line":"        version \u003d \u00272.1\u0027"},{"line_number":129,"context_line":"        if not self.client.can_send_version(\u00272.1\u0027):"},{"line_number":130,"context_line":"            version \u003d \u00272.0\u0027"},{"line_number":131,"context_line":"        cctxt \u003d self.client.prepare(version\u003dversion)"},{"line_number":132,"context_line":"        return cctxt.call(ctxt, \u0027get_pools\u0027,"},{"line_number":133,"context_line":"                          filters\u003dfilters)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def update_service_capabilities(self, ctxt,"},{"line_number":136,"context_line":"                                    service_name, host,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9abb7d3a_326098ce","line":133,"range":{"start_line":127,"start_character":0,"end_line":133,"end_character":42},"in_reply_to":"bab6814e_c114bba0","updated":"2016-05-29 03:00:27.000000000","message":"I was testing something..This will be reverted","commit_id":"42a9b7f08c6a89cde12ac888c5e3c2f70cfd226f"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"b4393b8f969bf64c39328e57d612ed033389e03a","unresolved":false,"context_lines":[{"line_number":186,"context_line":"    def update_service_capabilities(self, ctxt,"},{"line_number":187,"context_line":"                                    service_name, host,"},{"line_number":188,"context_line":"                                    capabilities):"},{"line_number":189,"context_line":"        version \u003d self._compat_ver(\u00273.1\u0027, \u00272.0\u0027)"},{"line_number":190,"context_line":"        if isinstance(capabilities, dict):"},{"line_number":191,"context_line":"            # Send capabilities as ovo always as scheduler gets updated first"},{"line_number":192,"context_line":"            capabilities \u003d objects.Capabilities.from_primitives(capabilities)"}],"source_content_type":"text/x-python","patch_set":30,"id":"7a8ec9b2_b03e12d8","line":189,"range":{"start_line":189,"start_character":35,"end_line":189,"end_character":47},"updated":"2016-09-15 23:37:49.000000000","message":"Shouldn\u0027t it be 3.1, 3.0, 2.0 ?","commit_id":"2af229dcc1cff9767fc5025054b3263053f50bcb"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"85d8816fe76d1802fa481da563b7963d654c120a","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                                    service_name, host,"},{"line_number":191,"context_line":"                                    capabilities):"},{"line_number":192,"context_line":"        version \u003d self._compat_ver(\u00273.1\u0027, \u00273.0\u0027, \u00272.0\u0027)"},{"line_number":193,"context_line":"        if isinstance(capabilities, dict):"},{"line_number":194,"context_line":"            # Send capabilities as ovo always as scheduler gets updated first"},{"line_number":195,"context_line":"            capabilities \u003d objects.Capabilities.from_primitives(capabilities)"},{"line_number":196,"context_line":"        cctxt \u003d self.client.prepare(fanout\u003dTrue, version\u003dversion)"},{"line_number":197,"context_line":"        cctxt.cast(ctxt, \u0027update_service_capabilities\u0027,"},{"line_number":198,"context_line":"                   service_name\u003dservice_name, host\u003dhost,"}],"source_content_type":"text/x-python","patch_set":44,"id":"1a95cdbc_d017a0eb","line":195,"range":{"start_line":193,"start_character":0,"end_line":195,"end_character":77},"updated":"2016-10-04 19:57:17.000000000","message":"rpcapi module is on the *client* side, so it\u0027s used by c-vols (older in our scenario). So this doesn\u0027t really matter and should be implemented on receivers/server side (manager).\n\nTo be decent we should probably do to_primitives when version is lower than 3.1, but in our standard upgrade order this shouldn\u0027t really matter.","commit_id":"31762462570e1e84fcbcd785032f324d3ef29450"}],"cinder/tests/unit/objects/test_capabilities.py":[{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"b4393b8f969bf64c39328e57d612ed033389e03a","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        pool_list \u003d list()"},{"line_number":95,"context_line":"        pool_list.append(self.pool_dict)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        self.caps_dict.update({\u0027pools\u0027: pool_list})"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        cap_pool \u003d objects.Capabilities.from_primitives(self.caps_dict)"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"7a8ec9b2_d028fee4","line":97,"range":{"start_line":97,"start_character":8,"end_line":97,"end_character":51},"updated":"2016-09-15 23:37:49.000000000","message":"Why not:\n\n self.caps_dict.update({\u0027pools\u0027:[self.pool_dict]})","commit_id":"2af229dcc1cff9767fc5025054b3263053f50bcb"}],"cinder/tests/unit/scheduler/test_host_manager.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"68bde94701af7885241ba5f71178044b1190565b","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.assertDictMatch({}, service_states)"},{"line_number":95,"context_line":"        _mock_utcnow.side_effect \u003d [31337, 31338, 31339]"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        host1_volume_capabs \u003d \\"},{"line_number":98,"context_line":"            objects.Capabilities.from_primitives(dict(free_capacity_gb\u003d4321, timestamp\u003d1))"},{"line_number":99,"context_line":"        host2_volume_capabs \u003d \\"},{"line_number":100,"context_line":"            objects.Capabilities.from_primitives(dict(free_capacity_gb\u003d5432, timestamp\u003d1))"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_d74c7978","line":97,"range":{"start_line":97,"start_character":30,"end_line":97,"end_character":31},"updated":"2016-05-25 10:16:03.000000000","message":"It\u0027s preferred to use parentheses to wrap long lines. Also can\u0027t we just use\n\nobjects.Capabilities(free_capacity_gb\u003d4321, timestamp\u003d1)\n\n?","commit_id":"42a9b7f08c6a89cde12ac888c5e3c2f70cfd226f"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"d7cc4e34b9bd6debeacf22ed664d4a42c7456180","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.assertDictMatch({}, service_states)"},{"line_number":95,"context_line":"        _mock_utcnow.side_effect \u003d [31337, 31338, 31339]"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        host1_volume_capabs \u003d \\"},{"line_number":98,"context_line":"            objects.Capabilities.from_primitives(dict(free_capacity_gb\u003d4321, timestamp\u003d1))"},{"line_number":99,"context_line":"        host2_volume_capabs \u003d \\"},{"line_number":100,"context_line":"            objects.Capabilities.from_primitives(dict(free_capacity_gb\u003d5432, timestamp\u003d1))"}],"source_content_type":"text/x-python","patch_set":6,"id":"9abb7d3a_9204e47e","line":97,"range":{"start_line":97,"start_character":30,"end_line":97,"end_character":31},"in_reply_to":"bab6814e_d74c7978","updated":"2016-05-29 03:00:27.000000000","message":"Yes. This is better way. I will fix this in next patchset","commit_id":"42a9b7f08c6a89cde12ac888c5e3c2f70cfd226f"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"bddfd80a1ed20688b93171a364fbcad5772100a8","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.assertDictMatch({}, service_states)"},{"line_number":95,"context_line":"        _mock_utcnow.side_effect \u003d [31337, 31338, 31339]"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        host1_volume_capabs \u003d \\"},{"line_number":98,"context_line":"            objects.Capabilities(free_capacity_gb\u003d4321, timestamp\u003d1)"},{"line_number":99,"context_line":"        host2_volume_capabs \u003d \\"},{"line_number":100,"context_line":"            objects.Capabilities(free_capacity_gb\u003d5432, timestamp\u003d1)"},{"line_number":101,"context_line":"        host3_volume_capabs \u003d \\"},{"line_number":102,"context_line":"            objects.Capabilities(free_capacity_gb\u003d6543, timestamp\u003d1)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        service_name \u003d \u0027volume\u0027"},{"line_number":105,"context_line":"        self.host_manager.update_service_capabilities(service_name, \u0027host1\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_11360d52","line":102,"range":{"start_line":97,"start_character":0,"end_line":102,"end_character":68},"updated":"2016-05-30 14:48:30.000000000","message":"Can we do it like that for example:\n\n        host1_volume_capabs \u003d objects.Capabilities(free_capacity_gb\u003d4321,\n                                                   timestamp\u003d1)\n        host2_volume_capabs \u003d objects.Capabilities(free_capacity_gb\u003d5432,\n                                                   timestamp\u003d1)\n        host3_volume_capabs \u003d objects.Capabilities(free_capacity_gb\u003d6543,\n                                                   timestamp\u003d1)\n\n?","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"da17c64fc78432fdb4e98402b2206ff45401f5dc","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.assertDictMatch({}, service_states)"},{"line_number":95,"context_line":"        _mock_utcnow.side_effect \u003d [31337, 31338, 31339]"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        host1_volume_capabs \u003d \\"},{"line_number":98,"context_line":"            objects.Capabilities(free_capacity_gb\u003d4321, timestamp\u003d1)"},{"line_number":99,"context_line":"        host2_volume_capabs \u003d \\"},{"line_number":100,"context_line":"            objects.Capabilities(free_capacity_gb\u003d5432, timestamp\u003d1)"},{"line_number":101,"context_line":"        host3_volume_capabs \u003d \\"},{"line_number":102,"context_line":"            objects.Capabilities(free_capacity_gb\u003d6543, timestamp\u003d1)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        service_name \u003d \u0027volume\u0027"},{"line_number":105,"context_line":"        self.host_manager.update_service_capabilities(service_name, \u0027host1\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_e1b7e437","line":102,"range":{"start_line":97,"start_character":0,"end_line":102,"end_character":68},"in_reply_to":"9abb7d3a_11360d52","updated":"2016-06-01 02:11:42.000000000","message":"I will fix this in next patchset.","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"bddfd80a1ed20688b93171a364fbcad5772100a8","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        self.host_manager \u003d host_manager.HostManager()"},{"line_number":142,"context_line":"        self.assertFalse(self.host_manager.has_all_capabilities())"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        host1_volume_capabs \u003d \\"},{"line_number":145,"context_line":"            objects.Capabilities(free_capacity_gb\u003d4321, timestamp\u003d1)"},{"line_number":146,"context_line":"        host2_volume_capabs \u003d \\"},{"line_number":147,"context_line":"            objects.Capabilities(free_capacity_gb\u003d5432, timestamp\u003d1)"},{"line_number":148,"context_line":"        host3_volume_capabs \u003d \\"},{"line_number":149,"context_line":"            objects.Capabilities(free_capacity_gb\u003d6543, timestamp\u003d1)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        service_name \u003d \u0027volume\u0027"},{"line_number":152,"context_line":"        self.host_manager.update_service_capabilities(service_name, \u0027host1\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_313b513a","line":149,"range":{"start_line":144,"start_character":0,"end_line":149,"end_character":68},"updated":"2016-05-30 14:48:30.000000000","message":"ditto","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"da17c64fc78432fdb4e98402b2206ff45401f5dc","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        self.host_manager \u003d host_manager.HostManager()"},{"line_number":142,"context_line":"        self.assertFalse(self.host_manager.has_all_capabilities())"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        host1_volume_capabs \u003d \\"},{"line_number":145,"context_line":"            objects.Capabilities(free_capacity_gb\u003d4321, timestamp\u003d1)"},{"line_number":146,"context_line":"        host2_volume_capabs \u003d \\"},{"line_number":147,"context_line":"            objects.Capabilities(free_capacity_gb\u003d5432, timestamp\u003d1)"},{"line_number":148,"context_line":"        host3_volume_capabs \u003d \\"},{"line_number":149,"context_line":"            objects.Capabilities(free_capacity_gb\u003d6543, timestamp\u003d1)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        service_name \u003d \u0027volume\u0027"},{"line_number":152,"context_line":"        self.host_manager.update_service_capabilities(service_name, \u0027host1\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_c1b46036","line":149,"range":{"start_line":144,"start_character":0,"end_line":149,"end_character":68},"in_reply_to":"9abb7d3a_313b513a","updated":"2016-06-01 02:11:42.000000000","message":"I will fix this in next patchset.","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8dbac274693026b532b1f0800ecfad15f9cafc9a","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.assertDictMatch({}, service_states)"},{"line_number":95,"context_line":"        _mock_utcnow.side_effect \u003d [31337, 31338, 31339]"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        host1_volume_capabs \u003d objects.Capabilities(free_capacity_gb\u003d4321,"},{"line_number":98,"context_line":"                                                   timestamp\u003d1)"},{"line_number":99,"context_line":"        host2_volume_capabs \u003d objects.Capabilities(free_capacity_gb\u003d5432,"},{"line_number":100,"context_line":"                                                   timestamp\u003d1)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_44daecea","line":97,"range":{"start_line":97,"start_character":51,"end_line":97,"end_character":67},"updated":"2016-06-02 10:18:59.000000000","message":"Wait, why there isn\u0027t free_capacity_gb in the Capabilities object fields. Either test is wrong or you\u0027ve modeled Capabilities only against a single corner case.","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"7b30d7474454ec9ea74fcb1717d5ed4441bb035a","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.assertDictMatch({}, service_states)"},{"line_number":95,"context_line":"        _mock_utcnow.side_effect \u003d [31337, 31338, 31339]"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        host1_volume_capabs \u003d objects.Capabilities(free_capacity_gb\u003d4321,"},{"line_number":98,"context_line":"                                                   timestamp\u003d1)"},{"line_number":99,"context_line":"        host2_volume_capabs \u003d objects.Capabilities(free_capacity_gb\u003d5432,"},{"line_number":100,"context_line":"                                                   timestamp\u003d1)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_f04a8326","line":97,"range":{"start_line":97,"start_character":51,"end_line":97,"end_character":67},"in_reply_to":"9abb7d3a_44daecea","updated":"2016-06-03 06:14:50.000000000","message":"Actually the free_capacity_gb is a subfield. It a dict item of pools, which is dict item of capabilities\n\nhttp://paste.openstack.org/show/507362/\n\nI think I need to modify these tests","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"7a5f1af0d4af3ec1ecfda25e3a0a93c7dbdb0fa1","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.assertDictMatch({}, service_states)"},{"line_number":95,"context_line":"        _mock_utcnow.side_effect \u003d [31337, 31338, 31339]"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        host1_volume_capabs \u003d objects.Capabilities(free_capacity_gb\u003d4321,"},{"line_number":98,"context_line":"                                                   timestamp\u003d1)"},{"line_number":99,"context_line":"        host2_volume_capabs \u003d objects.Capabilities(free_capacity_gb\u003d5432,"},{"line_number":100,"context_line":"                                                   timestamp\u003d1)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_4eff5daa","line":97,"range":{"start_line":97,"start_character":51,"end_line":97,"end_character":67},"in_reply_to":"9abb7d3a_a646fb4c","updated":"2016-06-07 01:08:25.000000000","message":"Thanks. I have added these two as well","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"faf65a2f48f2a6aa75bec316bbeedffcd35cd4f8","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.assertDictMatch({}, service_states)"},{"line_number":95,"context_line":"        _mock_utcnow.side_effect \u003d [31337, 31338, 31339]"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        host1_volume_capabs \u003d objects.Capabilities(free_capacity_gb\u003d4321,"},{"line_number":98,"context_line":"                                                   timestamp\u003d1)"},{"line_number":99,"context_line":"        host2_volume_capabs \u003d objects.Capabilities(free_capacity_gb\u003d5432,"},{"line_number":100,"context_line":"                                                   timestamp\u003d1)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_a646fb4c","line":97,"range":{"start_line":97,"start_character":51,"end_line":97,"end_character":67},"in_reply_to":"9abb7d3a_f04a8326","updated":"2016-06-03 09:05:02.000000000","message":"Oh, thanks for that paste! So it\u0027s evident here that elements of pool field should be a new object. Also note there are two more options [1].\n\n[1] https://github.com/openstack/cinder/blob/master/cinder/tests/unit/fake_driver.py#L229-L230","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8dbac274693026b532b1f0800ecfad15f9cafc9a","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                                                          host_volume_capabs)"},{"line_number":204,"context_line":"            res \u003d self.host_manager.get_pools(context)"},{"line_number":205,"context_line":"            self.assertEqual(1, len(res))"},{"line_number":206,"context_line":"            self.assertEqual(str(dates[1]),"},{"line_number":207,"context_line":"                             res[0][\u0027capabilities\u0027][\u0027timestamp\u0027])"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"            self.host_manager.update_service_capabilities(service_name,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_44882cc7","line":206,"range":{"start_line":206,"start_character":29,"end_line":206,"end_character":42},"updated":"2016-06-02 10:18:59.000000000","message":"If I\u0027m not missing something you\u0027ll won\u0027t need that if your timestamp field would be a DateTimeField. Same goes for other occurrences.","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"7b30d7474454ec9ea74fcb1717d5ed4441bb035a","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                                                          host_volume_capabs)"},{"line_number":204,"context_line":"            res \u003d self.host_manager.get_pools(context)"},{"line_number":205,"context_line":"            self.assertEqual(1, len(res))"},{"line_number":206,"context_line":"            self.assertEqual(str(dates[1]),"},{"line_number":207,"context_line":"                             res[0][\u0027capabilities\u0027][\u0027timestamp\u0027])"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"            self.host_manager.update_service_capabilities(service_name,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_d7ff8ba8","line":206,"range":{"start_line":206,"start_character":29,"end_line":206,"end_character":42},"in_reply_to":"9abb7d3a_44882cc7","updated":"2016-06-03 06:14:50.000000000","message":"Ya I agree. I will do this.","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"}],"cinder/tests/unit/scheduler/test_rpcapi.py":[{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"8c98f4488ecfa66b14c83f75334dc0d773f5b537","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                for kwarg, value in self.fake_kwargs.items():"},{"line_number":78,"context_line":"                    self.assertEqual(expected_msg[kwarg], value)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    @mock.patch(\u0027oslo_messaging.RPCClient.can_send_version\u0027, return_value\u003dTrue)"},{"line_number":81,"context_line":"    def test_update_service_capabilities(self, can_send_version):"},{"line_number":82,"context_line":"        self._test_scheduler_api(\u0027update_service_capabilities\u0027,"},{"line_number":83,"context_line":"                                 rpc_method\u003d\u0027cast\u0027,"},{"line_number":84,"context_line":"                                 service_name\u003d\u0027fake_name\u0027,"},{"line_number":85,"context_line":"                                 host\u003d\u0027fake_host\u0027,"},{"line_number":86,"context_line":"                                 capabilities\u003d\u0027fake_capabilities\u0027,"},{"line_number":87,"context_line":"                                 fanout\u003dTrue,"},{"line_number":88,"context_line":"                                 version\u003d\u00272.2\u0027)"},{"line_number":89,"context_line":"        can_send_version.assert_has_calls([mock.call(\u00272.2\u0027)])"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    @mock.patch(\u0027oslo_messaging.RPCClient.can_send_version\u0027,"},{"line_number":92,"context_line":"                return_value\u003dFalse)"},{"line_number":93,"context_line":"    def test_update_service_capabilities_serialization(self, can_send_version):"},{"line_number":94,"context_line":"        self._test_scheduler_api(\u0027update_service_capabilities\u0027,"},{"line_number":95,"context_line":"                                 rpc_method\u003d\u0027cast\u0027,"},{"line_number":96,"context_line":"                                 service_name\u003d\u0027fake-name\u0027,"},{"line_number":97,"context_line":"                                 host\u003d\u0027fake_host\u0027,"},{"line_number":98,"context_line":"                                 capabilities\u003d\u0027fake_capabilities\u0027,"},{"line_number":99,"context_line":"                                 fanout\u003dTrue,"},{"line_number":100,"context_line":"                                 version\u003d\u00272.0\u0027)"},{"line_number":101,"context_line":"        can_send_version.assert_has_calls([mock.call(\u00272.2\u0027)])"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def test_create_volume(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_8eadf833","line":100,"range":{"start_line":80,"start_character":0,"end_line":100,"end_character":47},"updated":"2016-07-28 08:35:42.000000000","message":"You can use ddt to do it. No duplicate code.\n\nhttps://github.com/openstack/cinder/blob/master/cinder/tests/unit/test_volume_rpcapi.py#L422","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"a0c098322276cf79bbd90059aa18d162e0f00ef1","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                for kwarg, value in self.fake_kwargs.items():"},{"line_number":78,"context_line":"                    self.assertEqual(expected_msg[kwarg], value)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    @mock.patch(\u0027oslo_messaging.RPCClient.can_send_version\u0027, return_value\u003dTrue)"},{"line_number":81,"context_line":"    def test_update_service_capabilities(self, can_send_version):"},{"line_number":82,"context_line":"        self._test_scheduler_api(\u0027update_service_capabilities\u0027,"},{"line_number":83,"context_line":"                                 rpc_method\u003d\u0027cast\u0027,"},{"line_number":84,"context_line":"                                 service_name\u003d\u0027fake_name\u0027,"},{"line_number":85,"context_line":"                                 host\u003d\u0027fake_host\u0027,"},{"line_number":86,"context_line":"                                 capabilities\u003d\u0027fake_capabilities\u0027,"},{"line_number":87,"context_line":"                                 fanout\u003dTrue,"},{"line_number":88,"context_line":"                                 version\u003d\u00272.2\u0027)"},{"line_number":89,"context_line":"        can_send_version.assert_has_calls([mock.call(\u00272.2\u0027)])"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    @mock.patch(\u0027oslo_messaging.RPCClient.can_send_version\u0027,"},{"line_number":92,"context_line":"                return_value\u003dFalse)"},{"line_number":93,"context_line":"    def test_update_service_capabilities_serialization(self, can_send_version):"},{"line_number":94,"context_line":"        self._test_scheduler_api(\u0027update_service_capabilities\u0027,"},{"line_number":95,"context_line":"                                 rpc_method\u003d\u0027cast\u0027,"},{"line_number":96,"context_line":"                                 service_name\u003d\u0027fake-name\u0027,"},{"line_number":97,"context_line":"                                 host\u003d\u0027fake_host\u0027,"},{"line_number":98,"context_line":"                                 capabilities\u003d\u0027fake_capabilities\u0027,"},{"line_number":99,"context_line":"                                 fanout\u003dTrue,"},{"line_number":100,"context_line":"                                 version\u003d\u00272.0\u0027)"},{"line_number":101,"context_line":"        can_send_version.assert_has_calls([mock.call(\u00272.2\u0027)])"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def test_create_volume(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_1641a7a9","line":100,"range":{"start_line":80,"start_character":0,"end_line":100,"end_character":47},"in_reply_to":"bacf61ea_8eadf833","updated":"2016-08-05 00:10:37.000000000","message":"Makes sense. I will do it. Thanks!","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"b4393b8f969bf64c39328e57d612ed033389e03a","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                for kwarg, value in self.fake_kwargs.items():"},{"line_number":84,"context_line":"                    self.assertEqual(expected_msg[kwarg], value)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    @ddt.data(\u00273.1\u0027)"},{"line_number":87,"context_line":"    @mock.patch(\u0027oslo_messaging.RPCClient.can_send_version\u0027)"},{"line_number":88,"context_line":"    def test_update_service_capabilities(self, version, can_send_version):"},{"line_number":89,"context_line":"        can_send_version.side_effect \u003d lambda x: x \u003d\u003d version"}],"source_content_type":"text/x-python","patch_set":30,"id":"7a8ec9b2_5065ce1b","line":86,"range":{"start_line":86,"start_character":14,"end_line":86,"end_character":19},"updated":"2016-09-15 23:37:49.000000000","message":"What about 3.0","commit_id":"2af229dcc1cff9767fc5025054b3263053f50bcb"}],"cinder/tests/unit/scheduler/test_scheduler.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"68bde94701af7885241ba5f71178044b1190565b","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        service \u003d \u0027fake_service\u0027"},{"line_number":99,"context_line":"        host \u003d \u0027fake_host\u0027"},{"line_number":100,"context_line":"        capabilities \u003d {}"},{"line_number":101,"context_line":"        capabilities_obj \u003d objects.Capabilities.from_primitives(capabilities)"},{"line_number":102,"context_line":"        self.manager.update_service_capabilities(self.context,"},{"line_number":103,"context_line":"                                                 service_name\u003dservice,"},{"line_number":104,"context_line":"                                                 host\u003dhost)"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_9762f1d6","line":101,"range":{"start_line":101,"start_character":8,"end_line":101,"end_character":77},"updated":"2016-05-25 10:16:03.000000000","message":"Just do an empty object?","commit_id":"42a9b7f08c6a89cde12ac888c5e3c2f70cfd226f"}],"cinder/tests/unit/test_volume_rpcapi.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8dbac274693026b532b1f0800ecfad15f9cafc9a","unresolved":false,"context_lines":[{"line_number":478,"context_line":"                              source_cg\u003dself.fake_src_cg,"},{"line_number":479,"context_line":"                              version\u003d\u00272.0\u0027)"},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"    def test_get_capabilities(self):"},{"line_number":482,"context_line":"        self._test_volume_api(\u0027get_capabilities\u0027,"},{"line_number":483,"context_line":"                              rpc_method\u003d\u0027call\u0027,"},{"line_number":484,"context_line":"                              host\u003d\u0027fake_host\u0027,"},{"line_number":485,"context_line":"                              discover\u003dTrue,"},{"line_number":486,"context_line":"                              version\u003d\u00272.1\u0027)"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"    def test_remove_export(self):"},{"line_number":489,"context_line":"        self._test_volume_api(\u0027remove_export\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_e43e80d9","line":486,"range":{"start_line":481,"start_character":0,"end_line":486,"end_character":44},"updated":"2016-06-02 10:18:59.000000000","message":"Would be cool to have test checking both 2.0 and 2.1. Something like that [1].\n\n[1] https://review.openstack.org/#/c/246600/27/cinder/tests/unit/test_volume_rpcapi.py@246","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"7a5f1af0d4af3ec1ecfda25e3a0a93c7dbdb0fa1","unresolved":false,"context_lines":[{"line_number":478,"context_line":"                              source_cg\u003dself.fake_src_cg,"},{"line_number":479,"context_line":"                              version\u003d\u00272.0\u0027)"},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"    def test_get_capabilities(self):"},{"line_number":482,"context_line":"        self._test_volume_api(\u0027get_capabilities\u0027,"},{"line_number":483,"context_line":"                              rpc_method\u003d\u0027call\u0027,"},{"line_number":484,"context_line":"                              host\u003d\u0027fake_host\u0027,"},{"line_number":485,"context_line":"                              discover\u003dTrue,"},{"line_number":486,"context_line":"                              version\u003d\u00272.1\u0027)"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"    def test_remove_export(self):"},{"line_number":489,"context_line":"        self._test_volume_api(\u0027remove_export\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_8ea4a5b9","line":486,"range":{"start_line":481,"start_character":0,"end_line":486,"end_character":44},"in_reply_to":"9abb7d3a_e43e80d9","updated":"2016-06-07 01:08:25.000000000","message":"Yes. I did this for get_capabilities.","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"8c98f4488ecfa66b14c83f75334dc0d773f5b537","unresolved":false,"context_lines":[{"line_number":494,"context_line":"                              source_cg\u003dself.fake_src_cg,"},{"line_number":495,"context_line":"                              version\u003d\u00272.0\u0027)"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"    @mock.patch(\u0027oslo_messaging.RPCClient.can_send_version\u0027,"},{"line_number":498,"context_line":"                return_value\u003dTrue)"},{"line_number":499,"context_line":"    def test_get_capabilities(self, can_send_version):"},{"line_number":500,"context_line":"        self._test_volume_api(\u0027get_capabilities\u0027,"},{"line_number":501,"context_line":"                              rpc_method\u003d\u0027call\u0027,"},{"line_number":502,"context_line":"                              host\u003d\u0027fake_host\u0027,"},{"line_number":503,"context_line":"                              discover\u003dTrue,"},{"line_number":504,"context_line":"                              version\u003d\u00272.4\u0027)"},{"line_number":505,"context_line":"        can_send_version.assert_has_calls([mock.call(\u00272.4\u0027)])"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"    @mock.patch(\u0027oslo_messaging.RPCClient.can_send_version\u0027,"},{"line_number":508,"context_line":"                return_value\u003dFalse)"},{"line_number":509,"context_line":"    def test_get_capabilities_serialization(self, can_send_version):"},{"line_number":510,"context_line":"        self._test_volume_api(\u0027get_capabilities\u0027,"},{"line_number":511,"context_line":"                              rpc_method\u003d\u0027call\u0027,"},{"line_number":512,"context_line":"                              host\u003d\u0027fake_host\u0027,"},{"line_number":513,"context_line":"                              discover\u003dTrue,"},{"line_number":514,"context_line":"                              version\u003d\u00272.3\u0027)"},{"line_number":515,"context_line":"        can_send_version.assert_has_calls([mock.call(\u00272.4\u0027)])"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"    def test_remove_export(self):"},{"line_number":518,"context_line":"        self._test_volume_api(\u0027remove_export\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_6e440474","line":515,"range":{"start_line":497,"start_character":0,"end_line":515,"end_character":61},"updated":"2016-07-28 08:35:42.000000000","message":"You can use ddt to do it.","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"a0c098322276cf79bbd90059aa18d162e0f00ef1","unresolved":false,"context_lines":[{"line_number":494,"context_line":"                              source_cg\u003dself.fake_src_cg,"},{"line_number":495,"context_line":"                              version\u003d\u00272.0\u0027)"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"    @mock.patch(\u0027oslo_messaging.RPCClient.can_send_version\u0027,"},{"line_number":498,"context_line":"                return_value\u003dTrue)"},{"line_number":499,"context_line":"    def test_get_capabilities(self, can_send_version):"},{"line_number":500,"context_line":"        self._test_volume_api(\u0027get_capabilities\u0027,"},{"line_number":501,"context_line":"                              rpc_method\u003d\u0027call\u0027,"},{"line_number":502,"context_line":"                              host\u003d\u0027fake_host\u0027,"},{"line_number":503,"context_line":"                              discover\u003dTrue,"},{"line_number":504,"context_line":"                              version\u003d\u00272.4\u0027)"},{"line_number":505,"context_line":"        can_send_version.assert_has_calls([mock.call(\u00272.4\u0027)])"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"    @mock.patch(\u0027oslo_messaging.RPCClient.can_send_version\u0027,"},{"line_number":508,"context_line":"                return_value\u003dFalse)"},{"line_number":509,"context_line":"    def test_get_capabilities_serialization(self, can_send_version):"},{"line_number":510,"context_line":"        self._test_volume_api(\u0027get_capabilities\u0027,"},{"line_number":511,"context_line":"                              rpc_method\u003d\u0027call\u0027,"},{"line_number":512,"context_line":"                              host\u003d\u0027fake_host\u0027,"},{"line_number":513,"context_line":"                              discover\u003dTrue,"},{"line_number":514,"context_line":"                              version\u003d\u00272.3\u0027)"},{"line_number":515,"context_line":"        can_send_version.assert_has_calls([mock.call(\u00272.4\u0027)])"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"    def test_remove_export(self):"},{"line_number":518,"context_line":"        self._test_volume_api(\u0027remove_export\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_d4826851","line":515,"range":{"start_line":497,"start_character":0,"end_line":515,"end_character":61},"in_reply_to":"bacf61ea_6e440474","updated":"2016-08-05 00:10:37.000000000","message":"Yes agreed. I will do it.","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"}],"cinder/volume/manager.py":[{"author":{"_account_id":17275,"name":"Nate Potter","email":"nathaniel.potter@intel.com","username":"npotter"},"change_message_id":"9ab23b82aa8c09841175320d6e0cfa93049395dd","unresolved":false,"context_lines":[{"line_number":1968,"context_line":"                    self._append_filter_goodness_functions(volume_stats))"},{"line_number":1969,"context_line":""},{"line_number":1970,"context_line":"                capabilities \u003d \\"},{"line_number":1971,"context_line":"                    objects.Capabilities.from_primitives(volume_stats)"},{"line_number":1972,"context_line":"                # queue it to be sent to the Schedulers."},{"line_number":1973,"context_line":"                self.update_service_capabilities(capabilities)"},{"line_number":1974,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9abb7d3a_0bae1985","line":1971,"updated":"2016-05-27 16:53:14.000000000","message":"So, if the scheduler\u0027s RPCAPI version is \u003c 2.1, this update_service_capabilities call is going to need to pass in a dict rather than an object, because it\u0027ll then be passed via publish_service_capabilities to the scheduler rpcapi. If you can\u0027t just use the global (e.g. scheduler_manager.RPC_API_VERSION after importing the scheduler manager) maybe you could just create a little function in the scheduler manager called _get_rpc_version or something that would return it, and then call that here and pass in the object or the dict accordingly.","commit_id":"14e6bb7db69dabcbf3750c5599833bc579b32d9a"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"7fe5e857f36cd9c9129c42e5fc403cea5a9d935f","unresolved":false,"context_lines":[{"line_number":1968,"context_line":"                    self._append_filter_goodness_functions(volume_stats))"},{"line_number":1969,"context_line":""},{"line_number":1970,"context_line":"                capabilities \u003d \\"},{"line_number":1971,"context_line":"                    objects.Capabilities.from_primitives(volume_stats)"},{"line_number":1972,"context_line":"                # queue it to be sent to the Schedulers."},{"line_number":1973,"context_line":"                self.update_service_capabilities(capabilities)"},{"line_number":1974,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9abb7d3a_a8ac26ee","line":1971,"in_reply_to":"9abb7d3a_0bae1985","updated":"2016-05-29 02:56:20.000000000","message":"As per my understanding, I will need to have a test for the RPC Version of the sending Scheduler manager and then accordingly update_service_Capabilities using dict or ovo. \n\nA function would be good to have, but I think I will stick to current implementation for now","commit_id":"14e6bb7db69dabcbf3750c5599833bc579b32d9a"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"bddfd80a1ed20688b93171a364fbcad5772100a8","unresolved":false,"context_lines":[{"line_number":1969,"context_line":"                    self._append_filter_goodness_functions(volume_stats))"},{"line_number":1970,"context_line":""},{"line_number":1971,"context_line":"                # queue it to be sent to the Scheduler."},{"line_number":1972,"context_line":"                if scheduler_manager.RPC_API_VERSION \u003c \u00272.1\u0027:"},{"line_number":1973,"context_line":"                    self.update_service_capabilities(volume_stats)"},{"line_number":1974,"context_line":"                else:"},{"line_number":1975,"context_line":"                    capabilities \u003d objects.Capabilities(**volume_stats)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_e7a8ebdd","line":1972,"range":{"start_line":1972,"start_character":0,"end_line":1972,"end_character":61},"updated":"2016-05-30 14:48:30.000000000","message":"Hm, not quite… RPC_API_VERSION is a constant - you need to check RPC version pin. You\u0027ll need something like this to determine it:\n\n cap \u003d self.scheduler_rpcapi._determine_rpc_version_cap()\n\nAnd then all the comparing. BTW - you cannot compare them as strings. Just convert them to tuples using oslo\u0027s versionutils and compare. Ah, and scheduler_rpcapi is there because VolumeManager derives from SchedulerDependentManager - we\u0027re lucky on that. We may want however to change _determine_rpc_version_cap to public method - your call.","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"f474d57840a52ed87e03f1e285b13d8cdacca833","unresolved":false,"context_lines":[{"line_number":1969,"context_line":"                    self._append_filter_goodness_functions(volume_stats))"},{"line_number":1970,"context_line":""},{"line_number":1971,"context_line":"                # queue it to be sent to the Scheduler."},{"line_number":1972,"context_line":"                if scheduler_manager.RPC_API_VERSION \u003c \u00272.1\u0027:"},{"line_number":1973,"context_line":"                    self.update_service_capabilities(volume_stats)"},{"line_number":1974,"context_line":"                else:"},{"line_number":1975,"context_line":"                    capabilities \u003d objects.Capabilities(**volume_stats)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_c75c421b","line":1972,"range":{"start_line":1972,"start_character":0,"end_line":1972,"end_character":61},"in_reply_to":"9abb7d3a_096b34f2","updated":"2016-06-01 18:40:04.000000000","message":"_determine_rpc_version_cap is there already. Take a look on cinder.rpc.RPCAPI class. What it does - it gets all the services listening for particular RPC API, checks their reported RPC API versions and chooses the lowest one. All the services will be talking with the lowest common denominator. Of course to save on DB calls it does some caching (cache invalidates when cinder.service.Service.reset is called - that is when service process gets SIGHUP signal).","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"da17c64fc78432fdb4e98402b2206ff45401f5dc","unresolved":false,"context_lines":[{"line_number":1969,"context_line":"                    self._append_filter_goodness_functions(volume_stats))"},{"line_number":1970,"context_line":""},{"line_number":1971,"context_line":"                # queue it to be sent to the Scheduler."},{"line_number":1972,"context_line":"                if scheduler_manager.RPC_API_VERSION \u003c \u00272.1\u0027:"},{"line_number":1973,"context_line":"                    self.update_service_capabilities(volume_stats)"},{"line_number":1974,"context_line":"                else:"},{"line_number":1975,"context_line":"                    capabilities \u003d objects.Capabilities(**volume_stats)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_096b34f2","line":1972,"range":{"start_line":1972,"start_character":0,"end_line":1972,"end_character":61},"in_reply_to":"9abb7d3a_e7a8ebdd","updated":"2016-06-01 02:11:42.000000000","message":"Ahh I see. This pointer is really helpful. I will create a method _determine_rpc_version_cap() in scheduler rpcapi as below:\n\nIn that public method, i will have something like this\ndef _determine_rpc_version_cap():\n   return self.RPC_API_VERSION\n\nMeanwhile, In the report_driver_status in volume.manager I will call the above method, convert to tuple using versionutils.convert_version_to_tuple(version) and then compare with 2.1 and decide to treat as object or dict for self.update_service_capabilties in line 1976.\n\nThis guards our volume manager for RPC version 2.0 and 2.1 as well.\n\nLet me know if my understanding is coherent to yours.","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8dbac274693026b532b1f0800ecfad15f9cafc9a","unresolved":false,"context_lines":[{"line_number":1641,"context_line":"        capabilities \u003d rpcapi.get_capabilities(ctxt, dest_vol[\u0027host\u0027],"},{"line_number":1642,"context_line":"                                               False)"},{"line_number":1643,"context_line":""},{"line_number":1644,"context_line":"        if isinstance(capabilities, dict):"},{"line_number":1645,"context_line":"            capabilities \u003d objects.Capabilities(**capabilities)"},{"line_number":1646,"context_line":""},{"line_number":1647,"context_line":"        sparse_copy_volume \u003d bool(capabilities and"},{"line_number":1648,"context_line":"                                  capabilities.get(\u0027sparse_copy_volume\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_3836e8e7","line":1645,"range":{"start_line":1644,"start_character":0,"end_line":1645,"end_character":63},"updated":"2016-06-02 10:18:59.000000000","message":"Why not do that inside rpcapi itself?","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"7b30d7474454ec9ea74fcb1717d5ed4441bb035a","unresolved":false,"context_lines":[{"line_number":1641,"context_line":"        capabilities \u003d rpcapi.get_capabilities(ctxt, dest_vol[\u0027host\u0027],"},{"line_number":1642,"context_line":"                                               False)"},{"line_number":1643,"context_line":""},{"line_number":1644,"context_line":"        if isinstance(capabilities, dict):"},{"line_number":1645,"context_line":"            capabilities \u003d objects.Capabilities(**capabilities)"},{"line_number":1646,"context_line":""},{"line_number":1647,"context_line":"        sparse_copy_volume \u003d bool(capabilities and"},{"line_number":1648,"context_line":"                                  capabilities.get(\u0027sparse_copy_volume\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_67f9bac8","line":1645,"range":{"start_line":1644,"start_character":0,"end_line":1645,"end_character":63},"in_reply_to":"9abb7d3a_3836e8e7","updated":"2016-06-03 06:14:50.000000000","message":"Yes, I will capture the returned capabilities in rpcapi and then convert it if its a dict. I believe it consolidate all changes in one place(ie: volume rpcapi)","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8dbac274693026b532b1f0800ecfad15f9cafc9a","unresolved":false,"context_lines":[{"line_number":1972,"context_line":"                volume_stats \u003d ("},{"line_number":1973,"context_line":"                    self._append_filter_goodness_functions(volume_stats))"},{"line_number":1974,"context_line":""},{"line_number":1975,"context_line":"                # queue it to be sent to the Scheduler."},{"line_number":1976,"context_line":"                cap \u003d self.scheduler_rpcapi._determine_rpc_version_cap()"},{"line_number":1977,"context_line":"                if versionutils.convert_version_to_tuple(cap) \u003c (2, 1):"},{"line_number":1978,"context_line":"                    self.update_service_capabilities(volume_stats)"},{"line_number":1979,"context_line":"                else:"},{"line_number":1980,"context_line":"                    capabilities \u003d objects.Capabilities(**volume_stats)"},{"line_number":1981,"context_line":"                    self.update_service_capabilities(capabilities)"},{"line_number":1982,"context_line":""},{"line_number":1983,"context_line":"    def _append_volume_stats(self, vol_stats):"},{"line_number":1984,"context_line":"        pools \u003d vol_stats.get(\u0027pools\u0027, None)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_7816b0f2","line":1981,"range":{"start_line":1975,"start_character":0,"end_line":1981,"end_character":66},"updated":"2016-06-02 10:18:59.000000000","message":"Now when I look at it - you should be able to just always convert and pass object here and and let scheduler.rpcapi let figure out what to send (you\u0027ll need similar code there).","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8dbac274693026b532b1f0800ecfad15f9cafc9a","unresolved":false,"context_lines":[{"line_number":3429,"context_line":"            self.driver.init_capabilities()"},{"line_number":3430,"context_line":"        capabilities \u003d self.driver.capabilities"},{"line_number":3431,"context_line":""},{"line_number":3432,"context_line":"        if not isinstance(capabilities, dict):"},{"line_number":3433,"context_line":"            capabilities \u003d jsonutils.to_primitive(capabilities)"},{"line_number":3434,"context_line":"        LOG.debug(\"Obtained capabilities list: %s.\", capabilities)"},{"line_number":3435,"context_line":"        return capabilities"},{"line_number":3436,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_7b9b4a73","line":3433,"range":{"start_line":3432,"start_character":0,"end_line":3433,"end_character":63},"updated":"2016-06-02 10:18:59.000000000","message":"Driver will pass dicts anyway as we\u0027re not modifying them. Anyway I was sure you can get API version in context, but it seems I was wrong. Looks like you need to instantiate volume.rpcapi.VolumeAPI and use _determine_version_cap to see how to respond.\n\nUgly… I\u0027ll check with Nova upgrade gurus to see if there\u0027s a better way.","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"faf65a2f48f2a6aa75bec316bbeedffcd35cd4f8","unresolved":false,"context_lines":[{"line_number":3429,"context_line":"            self.driver.init_capabilities()"},{"line_number":3430,"context_line":"        capabilities \u003d self.driver.capabilities"},{"line_number":3431,"context_line":""},{"line_number":3432,"context_line":"        if not isinstance(capabilities, dict):"},{"line_number":3433,"context_line":"            capabilities \u003d jsonutils.to_primitive(capabilities)"},{"line_number":3434,"context_line":"        LOG.debug(\"Obtained capabilities list: %s.\", capabilities)"},{"line_number":3435,"context_line":"        return capabilities"},{"line_number":3436,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_063707b1","line":3433,"range":{"start_line":3432,"start_character":0,"end_line":3433,"end_character":63},"in_reply_to":"9abb7d3a_6aa33f9f","updated":"2016-06-03 09:05:02.000000000","message":"Yup, can_send_version should also work, so whatever it\u0027s easier to use.","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"7b30d7474454ec9ea74fcb1717d5ed4441bb035a","unresolved":false,"context_lines":[{"line_number":3429,"context_line":"            self.driver.init_capabilities()"},{"line_number":3430,"context_line":"        capabilities \u003d self.driver.capabilities"},{"line_number":3431,"context_line":""},{"line_number":3432,"context_line":"        if not isinstance(capabilities, dict):"},{"line_number":3433,"context_line":"            capabilities \u003d jsonutils.to_primitive(capabilities)"},{"line_number":3434,"context_line":"        LOG.debug(\"Obtained capabilities list: %s.\", capabilities)"},{"line_number":3435,"context_line":"        return capabilities"},{"line_number":3436,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_6aa33f9f","line":3433,"range":{"start_line":3432,"start_character":0,"end_line":3433,"end_character":63},"in_reply_to":"9abb7d3a_7b9b4a73","updated":"2016-06-03 06:14:50.000000000","message":"Ya this one here is tricky. Szymon was suggesting some like \n\ndef _compat_ver(self, current, *legacy):\n\nhttps://review.openstack.org/#/c/238894/30/cinder/volume/rpcapi.py","commit_id":"261a77fe20b35a5e78fd03da8a35f3f961b6d0e9"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"8c98f4488ecfa66b14c83f75334dc0d773f5b537","unresolved":false,"context_lines":[{"line_number":1582,"context_line":"                                               False, support_ovo\u003dTrue)"},{"line_number":1583,"context_line":""},{"line_number":1584,"context_line":"        sparse_copy_volume \u003d bool(capabilities and"},{"line_number":1585,"context_line":"                                  capabilities.get(\u0027sparse_copy_volume\u0027,"},{"line_number":1586,"context_line":"                                                   False))"},{"line_number":1587,"context_line":""},{"line_number":1588,"context_line":"        copy_error \u003d True"},{"line_number":1589,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_813e69b6","line":1586,"range":{"start_line":1585,"start_character":0,"end_line":1586,"end_character":58},"updated":"2016-07-28 08:35:42.000000000","message":"capabilities.sparse_copy_volume?","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"a0c098322276cf79bbd90059aa18d162e0f00ef1","unresolved":false,"context_lines":[{"line_number":1582,"context_line":"                                               False, support_ovo\u003dTrue)"},{"line_number":1583,"context_line":""},{"line_number":1584,"context_line":"        sparse_copy_volume \u003d bool(capabilities and"},{"line_number":1585,"context_line":"                                  capabilities.get(\u0027sparse_copy_volume\u0027,"},{"line_number":1586,"context_line":"                                                   False))"},{"line_number":1587,"context_line":""},{"line_number":1588,"context_line":"        copy_error \u003d True"},{"line_number":1589,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_f6521366","line":1586,"range":{"start_line":1585,"start_character":0,"end_line":1586,"end_character":58},"in_reply_to":"bacf61ea_813e69b6","updated":"2016-08-05 00:10:37.000000000","message":"Yes. I will make this change","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"8c98f4488ecfa66b14c83f75334dc0d773f5b537","unresolved":false,"context_lines":[{"line_number":1900,"context_line":"        else:"},{"line_number":1901,"context_line":"            volume_stats \u003d self.driver.get_volume_stats(refresh\u003dTrue)"},{"line_number":1902,"context_line":"            if self.extra_capabilities:"},{"line_number":1903,"context_line":"                temp \u003d dict()"},{"line_number":1904,"context_line":"                temp[\u0027extra_capabilities\u0027] \u003d self.extra_capabilities"},{"line_number":1905,"context_line":"                volume_stats.update(temp)"},{"line_number":1906,"context_line":"            if volume_stats:"},{"line_number":1907,"context_line":"                # Append volume stats with \u0027allocated_capacity_gb\u0027"},{"line_number":1908,"context_line":"                self._append_volume_stats(volume_stats)"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_4181114a","line":1905,"range":{"start_line":1903,"start_character":0,"end_line":1905,"end_character":41},"updated":"2016-07-28 08:35:42.000000000","message":"volume_status.update({\u0027extra_capabilities\u0027: self.extra_capabilities})?","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"a0c098322276cf79bbd90059aa18d162e0f00ef1","unresolved":false,"context_lines":[{"line_number":1900,"context_line":"        else:"},{"line_number":1901,"context_line":"            volume_stats \u003d self.driver.get_volume_stats(refresh\u003dTrue)"},{"line_number":1902,"context_line":"            if self.extra_capabilities:"},{"line_number":1903,"context_line":"                temp \u003d dict()"},{"line_number":1904,"context_line":"                temp[\u0027extra_capabilities\u0027] \u003d self.extra_capabilities"},{"line_number":1905,"context_line":"                volume_stats.update(temp)"},{"line_number":1906,"context_line":"            if volume_stats:"},{"line_number":1907,"context_line":"                # Append volume stats with \u0027allocated_capacity_gb\u0027"},{"line_number":1908,"context_line":"                self._append_volume_stats(volume_stats)"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_f66b331c","line":1905,"range":{"start_line":1903,"start_character":0,"end_line":1905,"end_character":41},"in_reply_to":"bacf61ea_4181114a","updated":"2016-08-05 00:10:37.000000000","message":"Thanks. I will do it","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"8c98f4488ecfa66b14c83f75334dc0d773f5b537","unresolved":false,"context_lines":[{"line_number":1912,"context_line":"                    self._append_filter_goodness_functions(volume_stats))"},{"line_number":1913,"context_line":""},{"line_number":1914,"context_line":"                # queue it to be sent to the Scheduler."},{"line_number":1915,"context_line":"                cap \u003d self.scheduler_rpcapi._determine_rpc_version_cap()"},{"line_number":1916,"context_line":"                # support for service capabilities on scheduler starts with"},{"line_number":1917,"context_line":"                # version 2.2"},{"line_number":1918,"context_line":"                if versionutils.convert_version_to_tuple(cap) \u003c (2, 2):"},{"line_number":1919,"context_line":"                    self.update_service_capabilities(volume_stats)"},{"line_number":1920,"context_line":"                else:"},{"line_number":1921,"context_line":"                    capbs \u003d objects.Capabilities.from_primitives(volume_stats)"},{"line_number":1922,"context_line":"                    self.update_service_capabilities(capbs)"},{"line_number":1923,"context_line":""},{"line_number":1924,"context_line":"    def _append_volume_stats(self, vol_stats):"},{"line_number":1925,"context_line":"        pools \u003d vol_stats.get(\u0027pools\u0027, None)"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_e1776500","line":1922,"range":{"start_line":1915,"start_character":0,"end_line":1922,"end_character":59},"updated":"2016-07-28 08:35:42.000000000","message":"I think you just need \n\ncapbs \u003d objects.Capabilities.from_primitives(volume_stats)\nself.update_service_capabilities(capbs)\n\nLet scheduler rpc to deal with version related things.","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"a0c098322276cf79bbd90059aa18d162e0f00ef1","unresolved":false,"context_lines":[{"line_number":1912,"context_line":"                    self._append_filter_goodness_functions(volume_stats))"},{"line_number":1913,"context_line":""},{"line_number":1914,"context_line":"                # queue it to be sent to the Scheduler."},{"line_number":1915,"context_line":"                cap \u003d self.scheduler_rpcapi._determine_rpc_version_cap()"},{"line_number":1916,"context_line":"                # support for service capabilities on scheduler starts with"},{"line_number":1917,"context_line":"                # version 2.2"},{"line_number":1918,"context_line":"                if versionutils.convert_version_to_tuple(cap) \u003c (2, 2):"},{"line_number":1919,"context_line":"                    self.update_service_capabilities(volume_stats)"},{"line_number":1920,"context_line":"                else:"},{"line_number":1921,"context_line":"                    capbs \u003d objects.Capabilities.from_primitives(volume_stats)"},{"line_number":1922,"context_line":"                    self.update_service_capabilities(capbs)"},{"line_number":1923,"context_line":""},{"line_number":1924,"context_line":"    def _append_volume_stats(self, vol_stats):"},{"line_number":1925,"context_line":"        pools \u003d vol_stats.get(\u0027pools\u0027, None)"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_b6141b4d","line":1922,"range":{"start_line":1915,"start_character":0,"end_line":1922,"end_character":59},"in_reply_to":"bacf61ea_e1776500","updated":"2016-08-05 00:10:37.000000000","message":"There is a rpc call made from scheduler to volume to publish its capabilities for which the volume manager needs to know if the scheduler supports ovo or not. \n\nHence we make that check here. I could push that code to the rpc of scheduler if that makes the code clean at cvol manager.","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"8c98f4488ecfa66b14c83f75334dc0d773f5b537","unresolved":false,"context_lines":[{"line_number":3424,"context_line":"                                  \"to driver error.\"))"},{"line_number":3425,"context_line":"        return driver_entries"},{"line_number":3426,"context_line":""},{"line_number":3427,"context_line":"    def get_capabilities(self, context, discover):"},{"line_number":3428,"context_line":"        \"\"\"Get capabilities of backend storage.\"\"\""},{"line_number":3429,"context_line":"        if discover:"},{"line_number":3430,"context_line":"            self.driver.init_capabilities()"},{"line_number":3431,"context_line":"        capabilities \u003d self.driver.capabilities"},{"line_number":3432,"context_line":"        LOG.debug(\"Obtained capabilities list: %s.\", capabilities)"},{"line_number":3433,"context_line":"        return capabilities"},{"line_number":3434,"context_line":""},{"line_number":3435,"context_line":"    def get_backup_device(self, ctxt, backup):"},{"line_number":3436,"context_line":"        (backup_device, is_snapshot) \u003d ("}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_0479e793","line":3433,"range":{"start_line":3427,"start_character":0,"end_line":3433,"end_character":27},"updated":"2016-07-28 08:35:42.000000000","message":"Here get_capabilities() returns a dict. This should change to object.","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"a0c098322276cf79bbd90059aa18d162e0f00ef1","unresolved":false,"context_lines":[{"line_number":3424,"context_line":"                                  \"to driver error.\"))"},{"line_number":3425,"context_line":"        return driver_entries"},{"line_number":3426,"context_line":""},{"line_number":3427,"context_line":"    def get_capabilities(self, context, discover):"},{"line_number":3428,"context_line":"        \"\"\"Get capabilities of backend storage.\"\"\""},{"line_number":3429,"context_line":"        if discover:"},{"line_number":3430,"context_line":"            self.driver.init_capabilities()"},{"line_number":3431,"context_line":"        capabilities \u003d self.driver.capabilities"},{"line_number":3432,"context_line":"        LOG.debug(\"Obtained capabilities list: %s.\", capabilities)"},{"line_number":3433,"context_line":"        return capabilities"},{"line_number":3434,"context_line":""},{"line_number":3435,"context_line":"    def get_backup_device(self, ctxt, backup):"},{"line_number":3436,"context_line":"        (backup_device, is_snapshot) \u003d ("}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_54b03843","line":3433,"range":{"start_line":3427,"start_character":0,"end_line":3433,"end_character":27},"in_reply_to":"bacf61ea_0479e793","updated":"2016-08-05 00:10:37.000000000","message":"This is being taken care in rpc of volume manager.","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"c2ed528334969dc777707cbe3f73f235d5dcf68b","unresolved":false,"context_lines":[{"line_number":3424,"context_line":"                                  \"to driver error.\"))"},{"line_number":3425,"context_line":"        return driver_entries"},{"line_number":3426,"context_line":""},{"line_number":3427,"context_line":"    def get_capabilities(self, context, discover):"},{"line_number":3428,"context_line":"        \"\"\"Get capabilities of backend storage.\"\"\""},{"line_number":3429,"context_line":"        if discover:"},{"line_number":3430,"context_line":"            self.driver.init_capabilities()"},{"line_number":3431,"context_line":"        capabilities \u003d self.driver.capabilities"},{"line_number":3432,"context_line":"        LOG.debug(\"Obtained capabilities list: %s.\", capabilities)"},{"line_number":3433,"context_line":"        return capabilities"},{"line_number":3434,"context_line":""},{"line_number":3435,"context_line":"    def get_backup_device(self, ctxt, backup):"},{"line_number":3436,"context_line":"        (backup_device, is_snapshot) \u003d ("}],"source_content_type":"text/x-python","patch_set":17,"id":"3ac371cc_ff5d51ed","line":3433,"range":{"start_line":3427,"start_character":0,"end_line":3433,"end_character":27},"in_reply_to":"bacf61ea_54b03843","updated":"2016-08-15 06:48:00.000000000","message":"No, this function should return a obj for o services. I think this is ovo.","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"e65922fef167e675d9ae73c257a647464b54e807","unresolved":false,"context_lines":[{"line_number":1940,"context_line":"                    self._append_filter_goodness_functions(volume_stats))"},{"line_number":1941,"context_line":""},{"line_number":1942,"context_line":"                # queue it to be sent to the Scheduler."},{"line_number":1943,"context_line":"                cap \u003d self.scheduler_rpcapi.determine_rpc_version_cap()"},{"line_number":1944,"context_line":"                # support for service capabilities on scheduler starts with"},{"line_number":1945,"context_line":"                # version 2.3"},{"line_number":1946,"context_line":"                if versionutils.convert_version_to_tuple(cap) \u003c (2, 3):"},{"line_number":1947,"context_line":"                    self.update_service_capabilities(volume_stats)"},{"line_number":1948,"context_line":"                else:"},{"line_number":1949,"context_line":"                    capbs \u003d objects.Capabilities.from_primitives(volume_stats)"},{"line_number":1950,"context_line":"                    self.update_service_capabilities(capbs)"},{"line_number":1951,"context_line":""},{"line_number":1952,"context_line":"    def _append_volume_stats(self, vol_stats):"},{"line_number":1953,"context_line":"        pools \u003d vol_stats.get(\u0027pools\u0027, None)"}],"source_content_type":"text/x-python","patch_set":19,"id":"3ac371cc_fcd27f33","line":1950,"range":{"start_line":1943,"start_character":0,"end_line":1950,"end_character":59},"updated":"2016-08-15 06:49:35.000000000","message":"-1\n\nThe update_service_capabilities() to set last_capabilities of manager. \n\nAnd in periodic time, manager sends the capabilities to scheduler.\n\nhttps://github.com/openstack/cinder/blob/master/cinder/manager.py#L162\n\nI think you don\u0027t need to check the rpc_version here, just creates a Capabilities object, and set it to last_capabilities.\n\nYour codes in rpcapi will later determine whether it needs to transfer the object to dict, and sends it to scheduler:\n\nhttps://review.openstack.org/#/c/319040/19/cinder/scheduler/rpcapi.py","commit_id":"3cb64a352699a239f198823b62cfcc9fe64deecc"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"e65922fef167e675d9ae73c257a647464b54e807","unresolved":false,"context_lines":[{"line_number":3452,"context_line":"                                  \"to driver error.\"))"},{"line_number":3453,"context_line":"        return driver_entries"},{"line_number":3454,"context_line":""},{"line_number":3455,"context_line":"    def get_capabilities(self, context, discover):"},{"line_number":3456,"context_line":"        \"\"\"Get capabilities of backend storage.\"\"\""},{"line_number":3457,"context_line":"        if discover:"},{"line_number":3458,"context_line":"            self.driver.init_capabilities()"}],"source_content_type":"text/x-python","patch_set":19,"id":"3ac371cc_5f93c5a3","line":3455,"updated":"2016-08-15 06:49:35.000000000","message":"-1\n\nThis function needs to update. \n\nYou may refer to the following example: \n\nhttps://review.openstack.org/#/c/329332/10/cinder/volume/manager.py Line 3454","commit_id":"3cb64a352699a239f198823b62cfcc9fe64deecc"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"75da2e962eab31210c59f0803765af36f8306760","unresolved":false,"context_lines":[{"line_number":2004,"context_line":"        else:"},{"line_number":2005,"context_line":"            volume_stats \u003d self.driver.get_volume_stats(refresh\u003dTrue)"},{"line_number":2006,"context_line":"            if self.extra_capabilities:"},{"line_number":2007,"context_line":"                volume_stats.update({\u0027extra_capabilities\u0027:"},{"line_number":2008,"context_line":"                                     self.extra_capabilities})"},{"line_number":2009,"context_line":"            if volume_stats:"},{"line_number":2010,"context_line":"                # Append volume stats with \u0027allocated_capacity_gb\u0027"},{"line_number":2011,"context_line":"                self._append_volume_stats(volume_stats)"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a89bdaa_bc729cab","line":2008,"range":{"start_line":2007,"start_character":36,"end_line":2008,"end_character":61},"updated":"2016-09-06 14:06:11.000000000","message":"Oh, I see, extra_capabilities is another undefined type of stuff.","commit_id":"ee4aeb17a524a1ecf2a528478397676a37d59b18"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"75da2e962eab31210c59f0803765af36f8306760","unresolved":false,"context_lines":[{"line_number":4325,"context_line":"                                  \"to driver error.\"))"},{"line_number":4326,"context_line":"        return driver_entries"},{"line_number":4327,"context_line":""},{"line_number":4328,"context_line":"    def get_capabilities(self, context, discover):"},{"line_number":4329,"context_line":"        \"\"\"Get capabilities of backend storage.\"\"\""},{"line_number":4330,"context_line":"        if discover:"},{"line_number":4331,"context_line":"            self.driver.init_capabilities()"},{"line_number":4332,"context_line":"        capabilities \u003d self.driver.capabilities"},{"line_number":4333,"context_line":"        LOG.debug(\"Obtained capabilities list: %s.\", capabilities)"},{"line_number":4334,"context_line":"        return capabilities"},{"line_number":4335,"context_line":""},{"line_number":4336,"context_line":"    def get_backup_device(self, ctxt, backup):"},{"line_number":4337,"context_line":"        (backup_device, is_snapshot) \u003d ("}],"source_content_type":"text/x-python","patch_set":26,"id":"9a89bdaa_7fe1e6cf","line":4334,"range":{"start_line":4328,"start_character":0,"end_line":4334,"end_character":27},"updated":"2016-09-06 14:06:11.000000000","message":"Are we returning a plain dictionary here, or are capabilities converted to object on a driver level? In general we should make sure we\u0027re both *sending* and *returning* objects instead of dict blobs. But there\u0027s also a tricky part here. In case of volume migration, the destination host is probed by the source host by calling get_capabilities over RPC [1]. It may happen that an older version of a c-vol will try to probe a newer c-vol (actually a situation totally expected in an upgrade scenario).\n\nIn this case we need to make sure that this older c-vol will not receive an object which it doesn\u0027t understand. We can achieve that in two ways:\n\n* Add wants_objects\u003dFalse to this call and only send objects when receiver explicitly asked for it. You can see an example of that in patch [2].\n* As with our c-api-\u003ec-sch-\u003ec-vol/c-bak upgrade order the only situation when older service will call a newer one can happen between c-vols, we can simply check the version pin and base our response on that.\n\nI would *probably* go with the first solution. It gives us some more flexibility if someone would want to call get_capabilities from some other place (e.g. c-bak), but I\u0027m leaving the decision for you.\n\n[1] https://github.com/openstack/cinder/blob/27530c02fb4e8dfaf0a550831baabdefeb8d3351/cinder/volume/manager.py#L1676-L1677\n[2] https://review.openstack.org/#/c/329332/15/cinder/volume/rpcapi.py","commit_id":"ee4aeb17a524a1ecf2a528478397676a37d59b18"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"5e39a1d5beb31dd0478e93fdb2f9ac17df4fe184","unresolved":false,"context_lines":[{"line_number":4325,"context_line":"                                  \"to driver error.\"))"},{"line_number":4326,"context_line":"        return driver_entries"},{"line_number":4327,"context_line":""},{"line_number":4328,"context_line":"    def get_capabilities(self, context, discover):"},{"line_number":4329,"context_line":"        \"\"\"Get capabilities of backend storage.\"\"\""},{"line_number":4330,"context_line":"        if discover:"},{"line_number":4331,"context_line":"            self.driver.init_capabilities()"},{"line_number":4332,"context_line":"        capabilities \u003d self.driver.capabilities"},{"line_number":4333,"context_line":"        LOG.debug(\"Obtained capabilities list: %s.\", capabilities)"},{"line_number":4334,"context_line":"        return capabilities"},{"line_number":4335,"context_line":""},{"line_number":4336,"context_line":"    def get_backup_device(self, ctxt, backup):"},{"line_number":4337,"context_line":"        (backup_device, is_snapshot) \u003d ("}],"source_content_type":"text/x-python","patch_set":26,"id":"9a89bdaa_31b853c8","line":4334,"range":{"start_line":4328,"start_character":0,"end_line":4334,"end_character":27},"in_reply_to":"9a89bdaa_7fe1e6cf","updated":"2016-09-09 18:51:42.000000000","message":"The Capabilities is returned as a dict from the driver. I am handling the check for volume migration in volume rpcapi. If the client cannot support 2.7, I am converting it to dict.\n\nfor now, I would like to stick to this approach as it aligns with most of the ovo code out there.","commit_id":"ee4aeb17a524a1ecf2a528478397676a37d59b18"}],"cinder/volume/rpcapi.py":[{"author":{"_account_id":17275,"name":"Nate Potter","email":"nathaniel.potter@intel.com","username":"npotter"},"change_message_id":"9ab23b82aa8c09841175320d6e0cfa93049395dd","unresolved":false,"context_lines":[{"line_number":205,"context_line":"    def publish_service_capabilities(self, ctxt):"},{"line_number":206,"context_line":"        version \u003d \u00272.1\u0027"},{"line_number":207,"context_line":"        if not self.client.can_send_version(\u00272.1\u0027):"},{"line_number":208,"context_line":"            version \u003d \u00272.0\u0027"},{"line_number":209,"context_line":"        cctxt \u003d self.client.prepare(fanout\u003dTrue, version\u003dversion)"},{"line_number":210,"context_line":"        cctxt.cast(ctxt, \u0027publish_service_capabilities\u0027)"},{"line_number":211,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9abb7d3a_34409f56","line":208,"updated":"2016-05-27 16:53:14.000000000","message":"What is the purpose of bumping up this version? There are no new parameters being passed through or anything here.","commit_id":"14e6bb7db69dabcbf3750c5599833bc579b32d9a"},{"author":{"_account_id":17275,"name":"Nate Potter","email":"nathaniel.potter@intel.com","username":"npotter"},"change_message_id":"02d25eccc44cc04a0b3ee6dfc3bfd4c95cb12bab","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        version \u003d \u00272.1\u0027"},{"line_number":207,"context_line":"        if not self.client.can_send_version(\u00272.1\u0027):"},{"line_number":208,"context_line":"            version \u003d \u00272.0\u0027"},{"line_number":209,"context_line":"        cctxt \u003d self.client.prepare(fanout\u003dTrue, version\u003dversion)"},{"line_number":210,"context_line":"        cctxt.cast(ctxt, \u0027publish_service_capabilities\u0027)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    def accept_transfer(self, ctxt, volume, new_user, new_project):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9abb7d3a_8b8329cc","line":209,"updated":"2016-05-27 16:57:29.000000000","message":"Looking again I\u0027m guessing maybe you bumped this with the intent of checking the volume rpc_api version in the volume manager to pass object or dict to the scheduler, but with rolling upgrades I think you could be updating these services independently of one another, so one could be at 2.1 while the other is still at 2.0. I think my comment in the volume manager would be a better way of solving this problem.","commit_id":"14e6bb7db69dabcbf3750c5599833bc579b32d9a"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"7fe5e857f36cd9c9129c42e5fc403cea5a9d935f","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        version \u003d \u00272.1\u0027"},{"line_number":207,"context_line":"        if not self.client.can_send_version(\u00272.1\u0027):"},{"line_number":208,"context_line":"            version \u003d \u00272.0\u0027"},{"line_number":209,"context_line":"        cctxt \u003d self.client.prepare(fanout\u003dTrue, version\u003dversion)"},{"line_number":210,"context_line":"        cctxt.cast(ctxt, \u0027publish_service_capabilities\u0027)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    def accept_transfer(self, ctxt, volume, new_user, new_project):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9abb7d3a_086d7298","line":209,"in_reply_to":"9abb7d3a_8b8329cc","updated":"2016-05-29 02:56:20.000000000","message":"Yes, there is no reason of bumping up the version here. Handling this in the volume manager will be a better approach.\n\nThanks for this suggestion.. Will keep this untouched","commit_id":"14e6bb7db69dabcbf3750c5599833bc579b32d9a"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"bddfd80a1ed20688b93171a364fbcad5772100a8","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                   ref\u003dref)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    def get_capabilities(self, ctxt, host, discover):"},{"line_number":288,"context_line":"        cctxt \u003d self._get_cctxt(host, \u00272.0\u0027)"},{"line_number":289,"context_line":"        return cctxt.call(ctxt, \u0027get_capabilities\u0027, discover\u003ddiscover)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def get_backup_device(self, ctxt, backup, volume):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_07cb6fa6","line":288,"range":{"start_line":288,"start_character":39,"end_line":288,"end_character":42},"updated":"2016-05-30 14:48:30.000000000","message":"You should make this one 2.1 as in 2.1 you\u0027ll be returning object here (you\u0027re still missing that code in volume.manager).","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"da17c64fc78432fdb4e98402b2206ff45401f5dc","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                   ref\u003dref)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    def get_capabilities(self, ctxt, host, discover):"},{"line_number":288,"context_line":"        cctxt \u003d self._get_cctxt(host, \u00272.0\u0027)"},{"line_number":289,"context_line":"        return cctxt.call(ctxt, \u0027get_capabilities\u0027, discover\u003ddiscover)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def get_backup_device(self, ctxt, backup, volume):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_169cec0d","line":288,"range":{"start_line":288,"start_character":39,"end_line":288,"end_character":42},"in_reply_to":"9abb7d3a_07cb6fa6","updated":"2016-06-01 02:11:42.000000000","message":"I was under the opinion that this does not necessarily needs to be changed as the request is made from client through api layer to volume manager. \n\nSo I wasn\u0027t sure why this would be impact from a rolling upgrades standpoint. Am I missing something here?","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"f474d57840a52ed87e03f1e285b13d8cdacca833","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                   ref\u003dref)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    def get_capabilities(self, ctxt, host, discover):"},{"line_number":288,"context_line":"        cctxt \u003d self._get_cctxt(host, \u00272.0\u0027)"},{"line_number":289,"context_line":"        return cctxt.call(ctxt, \u0027get_capabilities\u0027, discover\u003ddiscover)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def get_backup_device(self, ctxt, backup, volume):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9abb7d3a_27e0aecc","line":288,"range":{"start_line":288,"start_character":39,"end_line":288,"end_character":42},"in_reply_to":"9abb7d3a_169cec0d","updated":"2016-06-01 18:40:04.000000000","message":"Yeah, it\u0027s not trivial… Let\u0027s consider these cases having in mind that in the end we want to return an object from this call. Also note that we don\u0027t know if the RPC call gets received by new or old c-vol service.\n\n1. We\u0027re running with version pin set to 2.1.\n\n* 2.1 version pin means all the c-vols are new and able to return object.\n* We\u0027re guaranteed that everybody understands 2.1 so just receive and return an object - life is fine.\n\n2. We\u0027re running with 2.0 version pin and request gets received by old c-vol (that understands only 2.0).\n\n* We need to send request as 2.0 (old c-vol will fail on 2.1).\n* Old c-vol returns a dict.\n* Once we\u0027ll receive a dict we need to convert it to object (from_primitive) and return it as rest of our *new* code expects object.\n\n3. We\u0027re running with 2.0 version pin and request gets received by new c-vol (that understands both 2.1 and 2.0).\n\n* We send request as 2.0 (we don\u0027t know here that it will be received by new c-vol… okay, we could check, but it\u0027s easier to assume).\n* c-vol before returning (in volume.manager) converts object to dict (to_primitive). Note that c-vol don\u0027t know if the request was made by someone understanding 2.1. It needs to obey and send 2.0 response (based on received context).\n* We\u0027re receiving a dict, so similarly to 2. case we convert it to object (from_primitive).\n\nI hope this is a little cleaner explanation. :)","commit_id":"a20fd8136fec65d3377acce9a49da64ebeaa210e"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"8c98f4488ecfa66b14c83f75334dc0d773f5b537","unresolved":false,"context_lines":[{"line_number":310,"context_line":"                   ref\u003dref)"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    # FIXME(karthikp): Remove the support_ovo parameter in early O."},{"line_number":313,"context_line":"    def get_capabilities(self, ctxt, host, discover, support_ovo\u003dFalse):"},{"line_number":314,"context_line":"        version \u003d self._compat_ver(\u00272.4\u0027, \u00272.3\u0027)"},{"line_number":315,"context_line":"        cctxt \u003d self._get_cctxt(host, version)"},{"line_number":316,"context_line":"        capabilities \u003d cctxt.call(ctxt, \u0027get_capabilities\u0027, discover\u003ddiscover)"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_a44bbb2a","line":313,"updated":"2016-07-28 08:35:42.000000000","message":"I don\u0027t think support_ovo is needed here. Only volume manager needs to check when to return ovo, and when to return dict. \n\nYou may refer to \n\nhttps://review.openstack.org/#/c/329332/","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"a0c098322276cf79bbd90059aa18d162e0f00ef1","unresolved":false,"context_lines":[{"line_number":310,"context_line":"                   ref\u003dref)"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    # FIXME(karthikp): Remove the support_ovo parameter in early O."},{"line_number":313,"context_line":"    def get_capabilities(self, ctxt, host, discover, support_ovo\u003dFalse):"},{"line_number":314,"context_line":"        version \u003d self._compat_ver(\u00272.4\u0027, \u00272.3\u0027)"},{"line_number":315,"context_line":"        cctxt \u003d self._get_cctxt(host, version)"},{"line_number":316,"context_line":"        capabilities \u003d cctxt.call(ctxt, \u0027get_capabilities\u0027, discover\u003ddiscover)"}],"source_content_type":"text/x-python","patch_set":17,"id":"bacf61ea_f6f6938d","line":313,"in_reply_to":"bacf61ea_a44bbb2a","updated":"2016-08-05 00:10:37.000000000","message":"I added this a call to the new c-vol could have been made by a old c-vol. \n\nIn that case, we need a way to figure out whether to return a ovo or a dict. If its a old c-vol, we need to return dict otherwise its a ovo\n\nHence we need that.\n\nLet me know if that makes sense to you.","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"c2ed528334969dc777707cbe3f73f235d5dcf68b","unresolved":false,"context_lines":[{"line_number":310,"context_line":"                   ref\u003dref)"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    # FIXME(karthikp): Remove the support_ovo parameter in early O."},{"line_number":313,"context_line":"    def get_capabilities(self, ctxt, host, discover, support_ovo\u003dFalse):"},{"line_number":314,"context_line":"        version \u003d self._compat_ver(\u00272.4\u0027, \u00272.3\u0027)"},{"line_number":315,"context_line":"        cctxt \u003d self._get_cctxt(host, version)"},{"line_number":316,"context_line":"        capabilities \u003d cctxt.call(ctxt, \u0027get_capabilities\u0027, discover\u003ddiscover)"}],"source_content_type":"text/x-python","patch_set":17,"id":"3ac371cc_bfe7593f","line":313,"in_reply_to":"bacf61ea_f6f6938d","updated":"2016-08-15 06:48:00.000000000","message":"I mean support_ovo is not needed here. support_ovo is needed in get_capabilities of volume/manager.py.","commit_id":"5cc7cb483a6d7428646dc7514eb2dccb223fbaec"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"e65922fef167e675d9ae73c257a647464b54e807","unresolved":false,"context_lines":[{"line_number":318,"context_line":"                   ref\u003dref)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    # FIXME(karthikp): Remove the support_ovo parameter in early O."},{"line_number":321,"context_line":"    def get_capabilities(self, ctxt, host, discover, support_ovo\u003dFalse):"},{"line_number":322,"context_line":"        version \u003d self._compat_ver(\u00272.5\u0027, \u00272.0\u0027)"},{"line_number":323,"context_line":"        cctxt \u003d self._get_cctxt(host, version)"},{"line_number":324,"context_line":"        capabilities \u003d cctxt.call(ctxt, \u0027get_capabilities\u0027, discover\u003ddiscover)"}],"source_content_type":"text/x-python","patch_set":19,"id":"3ac371cc_1c72fbe5","line":321,"updated":"2016-08-15 06:49:35.000000000","message":"-1\n\nsupport_ovo is not needed here. As the new file is accompanied with new services, it should be something like:\n\nsupport_ovo needs to be in manager:\n\nmsg_args \u003d {\u0027discover\u0027: discover}\n\nif version \u003e\u003d \u00272.5\u0027:\n\n    msg_args[\u0027support_ovo\u0027] \u003d True\n\n\ncapabilities \u003d cctxt.call(ctxt, \u0027get_capabilities\u0027, **msg_args)\n\nAnd then transfer dict to object if needed.","commit_id":"3cb64a352699a239f198823b62cfcc9fe64deecc"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"e6112d8d9af4c0daa6eefbba21cd9669dfccfc4b","unresolved":false,"context_lines":[{"line_number":318,"context_line":"                   ref\u003dref)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    # FIXME(karthikp): Remove the support_ovo parameter in early O."},{"line_number":321,"context_line":"    def get_capabilities(self, ctxt, host, discover, support_ovo\u003dFalse):"},{"line_number":322,"context_line":"        version \u003d self._compat_ver(\u00272.5\u0027, \u00272.0\u0027)"},{"line_number":323,"context_line":"        cctxt \u003d self._get_cctxt(host, version)"},{"line_number":324,"context_line":"        capabilities \u003d cctxt.call(ctxt, \u0027get_capabilities\u0027, discover\u003ddiscover)"}],"source_content_type":"text/x-python","patch_set":19,"id":"1ac06dbe_0226bbcd","line":321,"in_reply_to":"1ac06dbe_c4b9257b","updated":"2016-08-25 19:20:48.000000000","message":"HI Lisa,\n\nI understand your point but, In case of capabilities we have to make an exception because:\n\nIf I try to push the the object conversion further down into the driver.volume, it will break capability reporting of almost all drivers because although they should, they don\u0027t follow the driver.interface pattern and don\u0027t implement _init_vendor_properties()\n\ndriver interface pattern which should have been followed by most vendors\nhttps://github.com/openstack/cinder/commit/0e2783360ce730beed3423bee31ad9726a51c8e1\n\n\nHence, I am left with no other option but to handle this in rpc. Please let me know if it makes sense","commit_id":"3cb64a352699a239f198823b62cfcc9fe64deecc"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"08c727caffcd8742d981e2d597342b64dbcd8ae2","unresolved":false,"context_lines":[{"line_number":318,"context_line":"                   ref\u003dref)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    # FIXME(karthikp): Remove the support_ovo parameter in early O."},{"line_number":321,"context_line":"    def get_capabilities(self, ctxt, host, discover, support_ovo\u003dFalse):"},{"line_number":322,"context_line":"        version \u003d self._compat_ver(\u00272.5\u0027, \u00272.0\u0027)"},{"line_number":323,"context_line":"        cctxt \u003d self._get_cctxt(host, version)"},{"line_number":324,"context_line":"        capabilities \u003d cctxt.call(ctxt, \u0027get_capabilities\u0027, discover\u003ddiscover)"}],"source_content_type":"text/x-python","patch_set":19,"id":"3ac371cc_bd73c5b0","line":321,"in_reply_to":"3ac371cc_1c72fbe5","updated":"2016-08-17 18:56:58.000000000","message":"I am not sure why this code needs to be pushed to the manager itself. Is that the usual protocol?\n\nTo the best of my knowledge, its better to handle it in rpcapi and keep the manager clean.","commit_id":"3cb64a352699a239f198823b62cfcc9fe64deecc"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"697d611bc69bfe14b79d9bab66ad7b7340c79a9d","unresolved":false,"context_lines":[{"line_number":318,"context_line":"                   ref\u003dref)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    # FIXME(karthikp): Remove the support_ovo parameter in early O."},{"line_number":321,"context_line":"    def get_capabilities(self, ctxt, host, discover, support_ovo\u003dFalse):"},{"line_number":322,"context_line":"        version \u003d self._compat_ver(\u00272.5\u0027, \u00272.0\u0027)"},{"line_number":323,"context_line":"        cctxt \u003d self._get_cctxt(host, version)"},{"line_number":324,"context_line":"        capabilities \u003d cctxt.call(ctxt, \u0027get_capabilities\u0027, discover\u003ddiscover)"}],"source_content_type":"text/x-python","patch_set":19,"id":"1ac06dbe_c4b9257b","line":321,"in_reply_to":"3ac371cc_bd73c5b0","updated":"2016-08-23 05:19:58.000000000","message":"I understand that we transfer objects between services. Here it calls remote get_capabilities in volume service, but gets a dict result. This is not consistent with rolling upgrade. rpcapi just provides an interface to call remote functions, the important point is object transfer between services.","commit_id":"3cb64a352699a239f198823b62cfcc9fe64deecc"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"b4393b8f969bf64c39328e57d612ed033389e03a","unresolved":false,"context_lines":[{"line_number":388,"context_line":"                   ref\u003dref)"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"    def get_capabilities(self, ctxt, host, discover):"},{"line_number":391,"context_line":"        version \u003d self._compat_ver(\u00273.1\u0027, \u00272.0\u0027)"},{"line_number":392,"context_line":"        cctxt \u003d self._get_cctxt(host, version)"},{"line_number":393,"context_line":"        capabilities \u003d cctxt.call(ctxt, \u0027get_capabilities\u0027, discover\u003ddiscover)"},{"line_number":394,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"7a8ec9b2_0b8f9775","line":391,"range":{"start_line":391,"start_character":35,"end_line":391,"end_character":47},"updated":"2016-09-15 23:37:49.000000000","message":"Again, shouldn\u0027t it be \u00273.1\u0027, \u00273.0\u0027, \u00272.0\u0027 ?","commit_id":"2af229dcc1cff9767fc5025054b3263053f50bcb"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"b4393b8f969bf64c39328e57d612ed033389e03a","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        capabilities \u003d cctxt.call(ctxt, \u0027get_capabilities\u0027, discover\u003ddiscover)"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"        # FIXME(karthikp): Remove below check in early O."},{"line_number":396,"context_line":"        if versionutils.convert_version_to_tuple(version) \u003c (3, 1):"},{"line_number":397,"context_line":"            capabilities \u003d jsonutils.to_primitive(capabilities)"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        return capabilities"}],"source_content_type":"text/x-python","patch_set":30,"id":"7a8ec9b2_cb6a0fb3","line":396,"range":{"start_line":396,"start_character":11,"end_line":396,"end_character":66},"updated":"2016-09-15 23:37:49.000000000","message":"Nice, but to keep it similar to rest of the code I recommend \"version in (\u00273.0\u0027, \u00272.0\u0027)\"","commit_id":"2af229dcc1cff9767fc5025054b3263053f50bcb"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"85d8816fe76d1802fa481da563b7963d654c120a","unresolved":false,"context_lines":[{"line_number":384,"context_line":"        cctxt \u003d self._get_cctxt(host, version)"},{"line_number":385,"context_line":"        capabilities \u003d cctxt.call(ctxt, \u0027get_capabilities\u0027, discover\u003ddiscover)"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        # FIXME(karthikp): Remove below check in early O."},{"line_number":388,"context_line":"        if version in (\u00273.0\u0027, \u00272.0\u0027):"},{"line_number":389,"context_line":"            capabilities \u003d jsonutils.to_primitive(capabilities)"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"        return capabilities"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    def get_backup_device(self, ctxt, backup, volume):"},{"line_number":394,"context_line":"        version \u003d self._compat_ver(\u00273.0\u0027, \u00272.0\u0027)"}],"source_content_type":"text/x-python","patch_set":44,"id":"1a95cdbc_736df631","line":391,"range":{"start_line":387,"start_character":0,"end_line":391,"end_character":27},"updated":"2016-10-04 19:57:17.000000000","message":"This again is wrong approach, as rpcapi modules are on the client sides.","commit_id":"31762462570e1e84fcbcd785032f324d3ef29450"}]}
