)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ce4c7b549f611c78ac9a66b37624ae1c60050cc2","unresolved":false,"context_lines":[{"line_number":11,"context_line":"using sphinx that users can reference. This work does not complete the"},{"line_number":12,"context_line":"feature-classification but is in support of the eventual goal."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Implements: blueprint feature-classification-ocata"},{"line_number":15,"context_line":"Change-Id: If4f7be551e46e7804bf3c99af635c2dd723e5f4f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"7a8ec9b2_b51a606d","line":14,"range":{"start_line":14,"start_character":22,"end_line":14,"end_character":50},"updated":"2016-09-22 02:40:40.000000000","message":"This is a nova blueprint, you should use a cinder blueprint for this. I\u0027m not even really sure you need a blueprint for this honestly.","commit_id":"0e3328bb602488e4a3d3e4af87724a12d7ce9597"}],"cinder/interface/backup_chunked_driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a157c7d74ea16883ee0fac9477e2303f08c5890b","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class BackupChunkedDriver(backup_driver.BackupDriver):"},{"line_number":25,"context_line":"    \"\"\"Backup driver that supports \u0027chunked\u0027 backups.\"\"\""},{"line_number":26,"context_line":"    SHORT_DESCRIPTION \u003d \"Chunked Support\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def put_container(self, container):"},{"line_number":29,"context_line":"        \"\"\"Create the container if needed. No failure if it pre-exists."}],"source_content_type":"text/x-python","patch_set":4,"id":"7a8ec9b2_55a75c0a","line":26,"updated":"2016-09-22 02:45:08.000000000","message":"If this is extending an ABC then maybe add a get_support_matrix_description method on that or something so that the concrete classes have to return it, else the SHORT_DESCRIPTION seems a bit out of place since it\u0027s not used here and you have to be aware that this is for the docs to build.","commit_id":"0e3328bb602488e4a3d3e4af87724a12d7ce9597"},{"author":{"_account_id":2515,"name":"Derrick Wippler","email":"thrawn01@gmail.com","username":"thrawn01"},"change_message_id":"92b1a4c268e1170eb4c005302645d7aae2491165","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class BackupChunkedDriver(backup_driver.BackupDriver):"},{"line_number":25,"context_line":"    \"\"\"Backup driver that supports \u0027chunked\u0027 backups.\"\"\""},{"line_number":26,"context_line":"    SHORT_DESCRIPTION \u003d \"Chunked Support\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def put_container(self, container):"},{"line_number":29,"context_line":"        \"\"\"Create the container if needed. No failure if it pre-exists."}],"source_content_type":"text/x-python","patch_set":4,"id":"5a8bc5a2_d821304f","line":26,"in_reply_to":"7a8ec9b2_55a75c0a","updated":"2016-09-23 17:23:13.000000000","message":"The SHORT_DESCRIPTION is the description of the interface, and should NOT be overridden by the concrete implementation. These interfaces are not designed to be super classed by concrete implementations.","commit_id":"0e3328bb602488e4a3d3e4af87724a12d7ce9597"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8ada0bfcaaa879fb78d57b5928e3eaca74e7161c","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class BackupChunkedDriver(backup_driver.BackupDriver):"},{"line_number":25,"context_line":"    \"\"\"Backup driver that supports \u0027chunked\u0027 backups.\"\"\""},{"line_number":26,"context_line":"    SHORT_DESCRIPTION \u003d \"Chunked Support\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def put_container(self, container):"},{"line_number":29,"context_line":"        \"\"\"Create the container if needed. No failure if it pre-exists."}],"source_content_type":"text/x-python","patch_set":5,"id":"1a95cdbc_a1b0f18c","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":41},"updated":"2016-10-05 10:28:15.000000000","message":"Hm, actually I think this is an implementation detail that isn\u0027t really meaningful for the end-user or operator.","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"94f7a8af22f39f2502a6992a5e288eedb0d3df61","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class BackupChunkedDriver(backup_driver.BackupDriver):"},{"line_number":25,"context_line":"    \"\"\"Backup driver that supports \u0027chunked\u0027 backups.\"\"\""},{"line_number":26,"context_line":"    SHORT_DESCRIPTION \u003d \"Chunked Support\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def put_container(self, container):"},{"line_number":29,"context_line":"        \"\"\"Create the container if needed. No failure if it pre-exists."}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_a318531f","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":41},"in_reply_to":"1a95cdbc_a1b0f18c","updated":"2017-01-30 23:11:57.000000000","message":"Made it Chunked backup...not sure if it helps!!","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"46394d6ffa51ca16b9c55bfd25ac24998f5e04b8","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from cinder.interface import backup_driver"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class BackupChunkedDriver(backup_driver.BackupDriver):"},{"line_number":25,"context_line":"    \"\"\"Backup driver that supports \u0027chunked\u0027 backups.\"\"\""},{"line_number":26,"context_line":"    SHORT_DESCRIPTION \u003d \"Chunked Backup\""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1a430d35_bbe9b382","line":24,"range":{"start_line":24,"start_character":6,"end_line":24,"end_character":25},"updated":"2017-02-06 16:04:16.000000000","message":"I would vote to remove it from the matrix, but let\u0027s wait until someone else will provide opinion on that matter. My argument here is that this is an implementation detail, that shouldn\u0027t be relevant to end-user or operator.\n\nBut maybe I\u0027m wrong and this info is valuable for ops?","commit_id":"a79736232302b5101a40266745d70a70881f40b5"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3c4c4d97bcd4e550bb0b9feaef7ea08e2ed6a928","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from cinder.interface import backup_driver"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class BackupChunkedDriver(backup_driver.BackupDriver):"},{"line_number":25,"context_line":"    \"\"\"Backup driver that supports \u0027chunked\u0027 backups.\"\"\""},{"line_number":26,"context_line":"    SHORT_DESCRIPTION \u003d \"Chunked Backup\""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1a430d35_fa9150f2","line":24,"range":{"start_line":24,"start_character":6,"end_line":24,"end_character":25},"in_reply_to":"1a430d35_bbe9b382","updated":"2017-02-07 10:10:15.000000000","message":"I agree, this is an implementation detail, we should only care if it\u0027s a backup driver, and if it supports incremental backups.","commit_id":"a79736232302b5101a40266745d70a70881f40b5"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"a44af23baa447a842faa7eae19e92b29625bd618","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from cinder.interface import backup_driver"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class BackupChunkedDriver(backup_driver.BackupDriver):"},{"line_number":25,"context_line":"    \"\"\"Backup driver that supports \u0027chunked\u0027 backups.\"\"\""},{"line_number":26,"context_line":"    SHORT_DESCRIPTION \u003d \"Chunked Backup\""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba2be162_95925156","line":24,"range":{"start_line":24,"start_character":6,"end_line":24,"end_character":25},"in_reply_to":"1a430d35_fa9150f2","updated":"2017-03-01 02:00:28.000000000","message":"removed it in new patchset","commit_id":"a79736232302b5101a40266745d70a70881f40b5"}],"cinder/interface/backup_verify_driver.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8ada0bfcaaa879fb78d57b5928e3eaca74e7161c","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class BackupDriverWithVerify(backup_driver.BackupDriver):"},{"line_number":28,"context_line":"    \"\"\"Backup driver that supports the optional verification.\"\"\""},{"line_number":29,"context_line":"    SHORT_DESCRIPTION \u003d \"Verify Support\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def verify(self, backup):"},{"line_number":32,"context_line":"        \"\"\"Verify that the backup exists on the backend."}],"source_content_type":"text/x-python","patch_set":5,"id":"1a95cdbc_3cffa402","line":29,"range":{"start_line":29,"start_character":25,"end_line":29,"end_character":39},"updated":"2016-10-05 10:28:15.000000000","message":"That\u0027s a little vague, can be misunderstood into something like \"Ah, this driver is verifying backup consistency once they\u0027re done\".","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"94f7a8af22f39f2502a6992a5e288eedb0d3df61","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class BackupDriverWithVerify(backup_driver.BackupDriver):"},{"line_number":28,"context_line":"    \"\"\"Backup driver that supports the optional verification.\"\"\""},{"line_number":29,"context_line":"    SHORT_DESCRIPTION \u003d \"Verify Support\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def verify(self, backup):"},{"line_number":32,"context_line":"        \"\"\"Verify that the backup exists on the backend."}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_43aecf98","line":29,"range":{"start_line":29,"start_character":25,"end_line":29,"end_character":39},"in_reply_to":"1a95cdbc_3cffa402","updated":"2017-01-30 23:11:57.000000000","message":"Made it Verify Backup","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"46394d6ffa51ca16b9c55bfd25ac24998f5e04b8","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class BackupDriverWithVerify(backup_driver.BackupDriver):"},{"line_number":28,"context_line":"    \"\"\"Backup driver that supports the optional verification.\"\"\""},{"line_number":29,"context_line":"    SHORT_DESCRIPTION \u003d \"Verify Backup\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def verify(self, backup):"},{"line_number":32,"context_line":"        \"\"\"Verify that the backup exists on the backend."}],"source_content_type":"text/x-python","patch_set":14,"id":"1a430d35_163e1eb8","line":29,"range":{"start_line":29,"start_character":25,"end_line":29,"end_character":38},"updated":"2017-02-06 16:04:16.000000000","message":"That\u0027s better than \"Verify Support\". :)","commit_id":"a79736232302b5101a40266745d70a70881f40b5"}],"cinder/interface/util.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8ada0bfcaaa879fb78d57b5928e3eaca74e7161c","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        submodule \u003d package[1]"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        # find a module that has the driver interface type requested"},{"line_number":59,"context_line":"        if submodule.startswith(driver_type) and \\"},{"line_number":60,"context_line":"                submodule.endswith(\"driver\"):"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"            # load the module"},{"line_number":63,"context_line":"            qualified_module \u003d module_name + \".\" + submodule"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a95cdbc_c15b3d53","line":60,"range":{"start_line":59,"start_character":0,"end_line":60,"end_character":45},"updated":"2016-10-05 10:28:15.000000000","message":"Please use parentheses to wrap lines.","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"94f7a8af22f39f2502a6992a5e288eedb0d3df61","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        submodule \u003d package[1]"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        # find a module that has the driver interface type requested"},{"line_number":59,"context_line":"        if submodule.startswith(driver_type) and \\"},{"line_number":60,"context_line":"                submodule.endswith(\"driver\"):"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"            # load the module"},{"line_number":63,"context_line":"            qualified_module \u003d module_name + \".\" + submodule"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_a39db367","line":60,"range":{"start_line":59,"start_character":0,"end_line":60,"end_character":45},"in_reply_to":"1a95cdbc_c15b3d53","updated":"2017-01-30 23:11:57.000000000","message":"Done","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8ada0bfcaaa879fb78d57b5928e3eaca74e7161c","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            # search the module for classes that subclass base.CinderInterface"},{"line_number":67,"context_line":"            for attr_name in dir(module):"},{"line_number":68,"context_line":"                attr \u003d getattr(module, attr_name)"},{"line_number":69,"context_line":"                if inspect.isclass(attr) and \\"},{"line_number":70,"context_line":"                        issubclass(attr, base.CinderInterface):"},{"line_number":71,"context_line":"                    results.append(attr)"},{"line_number":72,"context_line":"    return results"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a95cdbc_2131410c","line":70,"range":{"start_line":69,"start_character":0,"end_line":70,"end_character":63},"updated":"2016-10-05 10:28:15.000000000","message":"Same here.","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"94f7a8af22f39f2502a6992a5e288eedb0d3df61","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            # search the module for classes that subclass base.CinderInterface"},{"line_number":67,"context_line":"            for attr_name in dir(module):"},{"line_number":68,"context_line":"                attr \u003d getattr(module, attr_name)"},{"line_number":69,"context_line":"                if inspect.isclass(attr) and \\"},{"line_number":70,"context_line":"                        issubclass(attr, base.CinderInterface):"},{"line_number":71,"context_line":"                    results.append(attr)"},{"line_number":72,"context_line":"    return results"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_c39abf6d","line":70,"range":{"start_line":69,"start_character":0,"end_line":70,"end_character":63},"in_reply_to":"1a95cdbc_2131410c","updated":"2017-01-30 23:11:57.000000000","message":"Done","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"eaa47d92baf95613397436f04beb755cee5720c9","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from cinder.interface import base"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# The exceptions contain all the drivers which needs to be mentioned"},{"line_number":25,"context_line":"# but excluded from the feature matrix"},{"line_number":26,"context_line":"exceptions \u003d [\u0027volume_cloneableimage_driver\u0027,"},{"line_number":27,"context_line":"              \u0027volume_migrate_driver\u0027]"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"ba2be162_498accc0","line":25,"updated":"2017-03-02 04:58:34.000000000","message":"Why excluding them?","commit_id":"ecad3c227942b27bc882a5d09b19bca8a394974e"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"15879dd5572ffcf20c940029c6c4fb1188e7b0df","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        # find a module that has the driver interface type requested and"},{"line_number":59,"context_line":"        # not in exceptions"},{"line_number":60,"context_line":"        if (submodule.startswith(driver_type) and"},{"line_number":61,"context_line":"           submodule.endswith(\"driver\")):"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"            # load the module"},{"line_number":64,"context_line":"            qualified_module \u003d module_name + \".\" + submodule"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba2be162_a3ccbfbb","line":61,"updated":"2017-03-05 16:53:56.000000000","message":"Nit: This \"s\" for the second line should line up inside the opening (, but this was fine on one line, so not sure why it was reformatted.","commit_id":"34fa1fa232e941545916322b4bf08c77eea91140"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"a7786ecbc26a70450a017e43eac67fcc9ebc1804","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        # find a module that has the driver interface type requested and"},{"line_number":59,"context_line":"        # not in exceptions"},{"line_number":60,"context_line":"        if (submodule.startswith(driver_type) and"},{"line_number":61,"context_line":"           submodule.endswith(\"driver\")):"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"            # load the module"},{"line_number":64,"context_line":"            qualified_module \u003d module_name + \".\" + submodule"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a30ddce_79f17c94","line":61,"in_reply_to":"ba2be162_a3ccbfbb","updated":"2017-03-13 16:19:59.000000000","message":"Done","commit_id":"34fa1fa232e941545916322b4bf08c77eea91140"}],"cinder/interface/volume_cloneableimage_driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a157c7d74ea16883ee0fac9477e2303f08c5890b","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from cinder.interface import base"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class CloneableImageDriver(base.CinderInterface):"},{"line_number":25,"context_line":"    SHORT_DESCRIPTION \u003d \"Clone Images\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def clone_image(self, volume, image_location,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a8ec9b2_557e7c6a","line":24,"updated":"2016-09-22 02:45:08.000000000","message":"Is something supposed to extend this as a mixin?","commit_id":"0e3328bb602488e4a3d3e4af87724a12d7ce9597"},{"author":{"_account_id":2515,"name":"Derrick Wippler","email":"thrawn01@gmail.com","username":"thrawn01"},"change_message_id":"92b1a4c268e1170eb4c005302645d7aae2491165","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from cinder.interface import base"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class CloneableImageDriver(base.CinderInterface):"},{"line_number":25,"context_line":"    SHORT_DESCRIPTION \u003d \"Clone Images\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def clone_image(self, volume, image_location,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a8bc5a2_58b7e0d7","line":24,"in_reply_to":"7a8ec9b2_557e7c6a","updated":"2016-09-23 17:23:13.000000000","message":"A driver can implement the ClonableImageDriver without needing to inherit from ClonableImageDriver. They only need to implement the methods defined in ClonableImageDriver.  When checking for interface compliance on a concrete class. issubclass() will return true if the class implements the required methods, even if the concrete class doesn\u0027t inherit from ClonableImageDriver. This works through a bit of python magic which is defined here https://github.com/openstack/cinder/blob/master/cinder/interface/base.py#L77 Further questions about the how and why should be directed to Sean McGinnis as he is the one that explained it to me.","commit_id":"0e3328bb602488e4a3d3e4af87724a12d7ce9597"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8ada0bfcaaa879fb78d57b5928e3eaca74e7161c","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class CloneableImageDriver(base.CinderInterface):"},{"line_number":25,"context_line":"    SHORT_DESCRIPTION \u003d \"Clone Images\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def clone_image(self, volume, image_location,"},{"line_number":28,"context_line":"                    image_id, image_meta, image_service):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a95cdbc_5c79d092","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":38},"updated":"2016-10-05 10:28:15.000000000","message":"Not meaningful at all. We have a generic implementation of image clone, so this method is only used for driver-specific optimizations.","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"94f7a8af22f39f2502a6992a5e288eedb0d3df61","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class CloneableImageDriver(base.CinderInterface):"},{"line_number":25,"context_line":"    SHORT_DESCRIPTION \u003d \"Clone Images\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def clone_image(self, volume, image_location,"},{"line_number":28,"context_line":"                    image_id, image_meta, image_service):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_8d946843","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":38},"in_reply_to":"1a95cdbc_4b6e4802","updated":"2017-01-30 23:11:57.000000000","message":"Since this exists in the Volume Driver, i have removed it here.\n\n@Sean: Since clone_image is already in Volume Driver, isn\u0027t it better to remove this interface?","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"497b2108e74ec887eb43760b1b7998041de53d89","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class CloneableImageDriver(base.CinderInterface):"},{"line_number":25,"context_line":"    SHORT_DESCRIPTION \u003d \"Clone Images\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def clone_image(self, volume, image_location,"},{"line_number":28,"context_line":"                    image_id, image_meta, image_service):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a95cdbc_4b6e4802","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":38},"in_reply_to":"1a95cdbc_5c79d092","updated":"2016-10-05 20:05:29.000000000","message":"Yeah, not useful for matrix I think.\n\nMight be good to have a flag or an exclude list in the matrix generation. There are some of these interfaces that would be nice to have defined here for documentation purposes and for other runtime checks of the driver, but we wouldn\u0027t necessarily want them to show up in the generated support matrix.","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"15879dd5572ffcf20c940029c6c4fb1188e7b0df","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class CloneableImageDriver(base.CinderInterface):"},{"line_number":25,"context_line":"    SHORT_DESCRIPTION \u003d \"Volume Clone\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def clone_image(self, volume, image_location,"},{"line_number":28,"context_line":"                    image_id, image_meta, image_service):"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba2be162_03be6bfe","line":25,"range":{"start_line":25,"start_character":25,"end_line":25,"end_character":31},"updated":"2017-03-05 16:53:56.000000000","message":"I think \"Image Clone\" would be a better name. Otherwise my assumption seeing the table was that it was indicating the driver supports cloning, which is a related but different concept from Glance image cloning.","commit_id":"34fa1fa232e941545916322b4bf08c77eea91140"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"a7786ecbc26a70450a017e43eac67fcc9ebc1804","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class CloneableImageDriver(base.CinderInterface):"},{"line_number":25,"context_line":"    SHORT_DESCRIPTION \u003d \"Volume Clone\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def clone_image(self, volume, image_location,"},{"line_number":28,"context_line":"                    image_id, image_meta, image_service):"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a30ddce_b92db4ff","line":25,"range":{"start_line":25,"start_character":25,"end_line":25,"end_character":31},"in_reply_to":"ba2be162_03be6bfe","updated":"2017-03-13 16:19:59.000000000","message":"Done","commit_id":"34fa1fa232e941545916322b4bf08c77eea91140"}],"cinder/interface/volume_local_driver.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8ada0bfcaaa879fb78d57b5928e3eaca74e7161c","unresolved":false,"context_lines":[{"line_number":24,"context_line":"class LocalDriver(base.CinderInterface):"},{"line_number":25,"context_line":"    \"\"\"Interface for drivers that support local drives\"\"\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    SHORT_DESCRIPTION \u003d \"Local Volumes\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def local_path(self, volume):"},{"line_number":30,"context_line":"        \"\"\"TODO: Needs doc string"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a95cdbc_dcc16082","line":27,"range":{"start_line":27,"start_character":0,"end_line":27,"end_character":39},"updated":"2016-10-05 10:28:15.000000000","message":"Not sure on this one. Probably it could be useful for operators if the consequences of being a local driver would be explained.","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"94f7a8af22f39f2502a6992a5e288eedb0d3df61","unresolved":false,"context_lines":[{"line_number":24,"context_line":"class LocalDriver(base.CinderInterface):"},{"line_number":25,"context_line":"    \"\"\"Interface for drivers that support local drives\"\"\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    SHORT_DESCRIPTION \u003d \"Local Volumes\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def local_path(self, volume):"},{"line_number":30,"context_line":"        \"\"\"TODO: Needs doc string"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_ed324c0f","line":27,"range":{"start_line":27,"start_character":0,"end_line":27,"end_character":39},"in_reply_to":"1a95cdbc_8b03f041","updated":"2017-01-30 23:11:57.000000000","message":"Created as \"Local Attach\"","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"497b2108e74ec887eb43760b1b7998041de53d89","unresolved":false,"context_lines":[{"line_number":24,"context_line":"class LocalDriver(base.CinderInterface):"},{"line_number":25,"context_line":"    \"\"\"Interface for drivers that support local drives\"\"\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    SHORT_DESCRIPTION \u003d \"Local Volumes\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def local_path(self, volume):"},{"line_number":30,"context_line":"        \"\"\"TODO: Needs doc string"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a95cdbc_8b03f041","line":27,"range":{"start_line":27,"start_character":0,"end_line":27,"end_character":39},"in_reply_to":"1a95cdbc_dcc16082","updated":"2016-10-05 20:05:29.000000000","message":"Maybe something like \"Direct Attach\"?","commit_id":"04af6f025dfa003151212938852196f306a2d69b"}],"cinder/interface/volume_migrate_driver.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8ada0bfcaaa879fb78d57b5928e3eaca74e7161c","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class MigrateVolumeDriver(base.CinderInterface):"},{"line_number":25,"context_line":"    SHORT_DESCRIPTION \u003d \"Migrate Volumes\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def migrate_volume(self, context, volume, host):"},{"line_number":28,"context_line":"        \"\"\"Migrate the volume to the specified host."}],"source_content_type":"text/x-python","patch_set":5,"id":"1a95cdbc_5c0ab0d3","line":25,"range":{"start_line":25,"start_character":25,"end_line":25,"end_character":40},"updated":"2016-10-05 10:28:15.000000000","message":"We have generic volume migration that should work for all volume backends and migrate_volume is there only for backend-specific optimizations.","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"497b2108e74ec887eb43760b1b7998041de53d89","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class MigrateVolumeDriver(base.CinderInterface):"},{"line_number":25,"context_line":"    SHORT_DESCRIPTION \u003d \"Migrate Volumes\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def migrate_volume(self, context, volume, host):"},{"line_number":28,"context_line":"        \"\"\"Migrate the volume to the specified host."}],"source_content_type":"text/x-python","patch_set":5,"id":"1a95cdbc_abfeec35","line":25,"range":{"start_line":25,"start_character":25,"end_line":25,"end_character":40},"in_reply_to":"1a95cdbc_5c0ab0d3","updated":"2016-10-05 20:05:29.000000000","message":"Yeah, probably better to just skip this one.","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"94f7a8af22f39f2502a6992a5e288eedb0d3df61","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class MigrateVolumeDriver(base.CinderInterface):"},{"line_number":25,"context_line":"    SHORT_DESCRIPTION \u003d \"Migrate Volumes\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def migrate_volume(self, context, volume, host):"},{"line_number":28,"context_line":"        \"\"\"Migrate the volume to the specified host."}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_0d8f982a","line":25,"range":{"start_line":25,"start_character":25,"end_line":25,"end_character":40},"in_reply_to":"1a95cdbc_abfeec35","updated":"2017-01-30 23:11:57.000000000","message":"Done","commit_id":"04af6f025dfa003151212938852196f306a2d69b"}],"cinder/interface/volume_replica_driver.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8ada0bfcaaa879fb78d57b5928e3eaca74e7161c","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from cinder.interface import base"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class ExtendVolumeDriver(base.CinderInterface):"},{"line_number":25,"context_line":"    SHORT_DESCRIPTION \u003d \"Volume Replication\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def reenable_replication(self, context, volume):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a95cdbc_bcf9f4ca","line":24,"range":{"start_line":24,"start_character":6,"end_line":24,"end_character":24},"updated":"2016-10-05 10:28:15.000000000","message":"That\u0027s wrong name.","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8ada0bfcaaa879fb78d57b5928e3eaca74e7161c","unresolved":false,"context_lines":[{"line_number":24,"context_line":"class ExtendVolumeDriver(base.CinderInterface):"},{"line_number":25,"context_line":"    SHORT_DESCRIPTION \u003d \"Volume Replication\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def reenable_replication(self, context, volume):"},{"line_number":28,"context_line":"        \"\"\"Re-enable replication between the replica and primary volume."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        This is used to re-enable/fix the replication between primary"},{"line_number":31,"context_line":"        and secondary. One use is as part of the fail-back process, when"},{"line_number":32,"context_line":"        you re-synchorize your old primary with the promoted volume"},{"line_number":33,"context_line":"        (the old replica)."},{"line_number":34,"context_line":"        Returns model_update for the volume to reflect the actions of the"},{"line_number":35,"context_line":"        driver."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        The driver is expected to update the following entries:"},{"line_number":38,"context_line":"        - \u0027replication_status\u0027"},{"line_number":39,"context_line":"        - \u0027replication_extended_status\u0027"},{"line_number":40,"context_line":"        - \u0027replication_driver_data\u0027"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        Possible \u0027replication_status\u0027 values (in model_update) are:"},{"line_number":43,"context_line":"        - \u0027error\u0027 - replication in error state"},{"line_number":44,"context_line":"        - \u0027copying\u0027 - replication copying data to secondary (inconsistent)"},{"line_number":45,"context_line":"        - \u0027active\u0027 - replication copying data to secondary (consistent)"},{"line_number":46,"context_line":"        - \u0027active-stopped\u0027 - replication data copy on hold (consistent)"},{"line_number":47,"context_line":"        - \u0027inactive\u0027 - replication data copy on hold (inconsistent)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        Values in \u0027replication_extended_status\u0027 and \u0027replication_driver_data\u0027"},{"line_number":50,"context_line":"        are managed by the driver."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        :param context: Context"},{"line_number":53,"context_line":"        :param volume: A dictionary describing the volume"},{"line_number":54,"context_line":"        \"\"\""},{"line_number":55,"context_line":"        return"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def promote_replica(self, context, volume):"},{"line_number":58,"context_line":"        \"\"\"Promote the replica to be the primary volume."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        Following this command, replication between the volumes at"},{"line_number":61,"context_line":"        the storage level should be stopped, the replica should be"},{"line_number":62,"context_line":"        available to be attached, and the replication status should"},{"line_number":63,"context_line":"        be in status \u0027inactive\u0027."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        Returns model_update for the volume."},{"line_number":66,"context_line":"        The driver is expected to update the following entries:"},{"line_number":67,"context_line":"        - \u0027replication_status\u0027"},{"line_number":68,"context_line":"        - \u0027replication_extended_status\u0027"},{"line_number":69,"context_line":"        - \u0027replication_driver_data\u0027"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        Possible \u0027replication_status\u0027 values (in model_update) are:"},{"line_number":72,"context_line":"        - \u0027error\u0027 - replication in error state"},{"line_number":73,"context_line":"        - \u0027inactive\u0027 - replication data copy on hold (inconsistent)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        Values in \u0027replication_extended_status\u0027 and \u0027replication_driver_data\u0027"},{"line_number":76,"context_line":"        are managed by the driver."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        :param context: Context"},{"line_number":79,"context_line":"        :param volume: A dictionary describing the volume"},{"line_number":80,"context_line":"        \"\"\""},{"line_number":81,"context_line":"        return"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def create_replica_test_volume(self, volume, src_vref):"},{"line_number":84,"context_line":"        \"\"\"Creates a test replica clone of the specified replicated volume."}],"source_content_type":"text/x-python","patch_set":5,"id":"1a95cdbc_5ca630c2","line":81,"range":{"start_line":27,"start_character":0,"end_line":81,"end_character":14},"updated":"2016-10-05 10:28:15.000000000","message":"These methods are removed now [1].\n\n[1] https://review.openstack.org/#/c/365620/","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"46394d6ffa51ca16b9c55bfd25ac24998f5e04b8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"1a430d35_411c6212","updated":"2017-02-06 16:04:16.000000000","message":"I think this interface is missing failover_host. Also we probably need another interface for failover_completed (A/A version of replication).\n\nI\u0027ll add Gorka to review to understand how he sees that.","commit_id":"a79736232302b5101a40266745d70a70881f40b5"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3c4c4d97bcd4e550bb0b9feaef7ea08e2ed6a928","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"1a430d35_5a9c240f","in_reply_to":"1a430d35_411c6212","updated":"2017-02-07 10:10:15.000000000","message":"-1: This is not how we should be detecting replication v2.1, because methods are not abstract and only 1 driver implements that method but there are a lot of drivers supporting replication.\n\nWe should be using supports_replication_feature class method like I was doing in the patch for generate_driver_list [1]\n\nAnd methods that must be implemented in the driver can be seen in the code [2]\n\n[1] https://review.openstack.org/#/c/403854/36/cinder/interface/util.py\n[2] https://github.com/openstack/cinder/blob/da8f485337e4d1a7ed8a2f8d83deb8b11a762dc2/cinder/volume/driver.py#L339","commit_id":"a79736232302b5101a40266745d70a70881f40b5"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"a44af23baa447a842faa7eae19e92b29625bd618","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"ba2be162_95797132","in_reply_to":"1a430d35_5a9c240f","updated":"2017-03-01 02:00:28.000000000","message":"removed it as per my interpretation it  detail is not required in the drivers\u0027s list anymore.","commit_id":"a79736232302b5101a40266745d70a70881f40b5"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3c4c4d97bcd4e550bb0b9feaef7ea08e2ed6a928","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\"\"\""},{"line_number":18,"context_line":"Volume Replication driver interface."},{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from cinder.interface import base"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1a430d35_5a6a64ef","line":19,"range":{"start_line":17,"start_character":0,"end_line":19,"end_character":3},"updated":"2017-02-07 10:10:15.000000000","message":"nit: This doesn\u0027t provide any additional information that isn\u0027t in the file path","commit_id":"a79736232302b5101a40266745d70a70881f40b5"}],"cinder/interface/volume_snapshot_driver.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8ada0bfcaaa879fb78d57b5928e3eaca74e7161c","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    TODO(smcginnis) Merge into VolumeDriverBase once NFS driver supports"},{"line_number":28,"context_line":"    snapshots."},{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":"    SHORT_DESCRIPTION \u003d \"Snapshots\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def create_snapshot(self, snapshot):"},{"line_number":33,"context_line":"        \"\"\"Creates a snapshot."}],"source_content_type":"text/x-python","patch_set":5,"id":"1a95cdbc_dca08093","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":35},"updated":"2016-10-05 10:28:15.000000000","message":"I agree to keep it until TODO item explained above will be completed.","commit_id":"04af6f025dfa003151212938852196f306a2d69b"}],"doc/ext/driver_support_matrix.py":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"497b2108e74ec887eb43760b1b7998041de53d89","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    .. driver_support_matrix:: backup"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"\"\"\""},{"line_number":28,"context_line":"from cinder.interface import util"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"from docutils import nodes"},{"line_number":31,"context_line":"from docutils.parsers import rst"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a95cdbc_eb1c74c3","line":28,"updated":"2016-10-05 20:05:29.000000000","message":"cinder imports should be below docutils imports.","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"94f7a8af22f39f2502a6992a5e288eedb0d3df61","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    .. driver_support_matrix:: backup"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"\"\"\""},{"line_number":28,"context_line":"from cinder.interface import util"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"from docutils import nodes"},{"line_number":31,"context_line":"from docutils.parsers import rst"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_4385ef04","line":28,"in_reply_to":"1a95cdbc_eb1c74c3","updated":"2017-01-30 23:11:57.000000000","message":"Done","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"497b2108e74ec887eb43760b1b7998041de53d89","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class MatrixInfo(object):"},{"line_number":35,"context_line":"    def __init__(self, driver_type):"},{"line_number":36,"context_line":"        \"\"\"Initializes the object with the appropriate driver"},{"line_number":37,"context_line":"        implementation details"},{"line_number":38,"context_line":"        \"\"\""},{"line_number":39,"context_line":"        self.drivers \u003d {}"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a95cdbc_ab3b4c37","line":36,"updated":"2016-10-05 20:05:29.000000000","message":"Nit: Follow docstring convention and have single sentence on one line, or summary line with a blank line and then more detailed description.","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"94f7a8af22f39f2502a6992a5e288eedb0d3df61","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class MatrixInfo(object):"},{"line_number":35,"context_line":"    def __init__(self, driver_type):"},{"line_number":36,"context_line":"        \"\"\"Initializes the object with the appropriate driver"},{"line_number":37,"context_line":"        implementation details"},{"line_number":38,"context_line":"        \"\"\""},{"line_number":39,"context_line":"        self.drivers \u003d {}"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_637e6b1a","line":36,"in_reply_to":"1a95cdbc_ab3b4c37","updated":"2017-01-30 23:11:57.000000000","message":"Done","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"497b2108e74ec887eb43760b1b7998041de53d89","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            # for every possible interface"},{"line_number":54,"context_line":"            for interface in all_interfaces:"},{"line_number":55,"context_line":"                # Is True if the driver implements this interface"},{"line_number":56,"context_line":"                interfaces[interface.SHORT_DESCRIPTION] \u003d \\"},{"line_number":57,"context_line":"                    issubclass(driver.cls, interface)"},{"line_number":58,"context_line":"            self.drivers[driver.class_name] \u003d interfaces"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a95cdbc_6b1064a9","line":56,"range":{"start_line":56,"start_character":58,"end_line":56,"end_character":59},"updated":"2016-10-05 20:05:29.000000000","message":"Avoid using \\ for line continuation.","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"94f7a8af22f39f2502a6992a5e288eedb0d3df61","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            # for every possible interface"},{"line_number":54,"context_line":"            for interface in all_interfaces:"},{"line_number":55,"context_line":"                # Is True if the driver implements this interface"},{"line_number":56,"context_line":"                interfaces[interface.SHORT_DESCRIPTION] \u003d \\"},{"line_number":57,"context_line":"                    issubclass(driver.cls, interface)"},{"line_number":58,"context_line":"            self.drivers[driver.class_name] \u003d interfaces"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_837b5727","line":56,"range":{"start_line":56,"start_character":58,"end_line":56,"end_character":59},"in_reply_to":"1a95cdbc_6b1064a9","updated":"2017-01-30 23:11:57.000000000","message":"Done","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"15879dd5572ffcf20c940029c6c4fb1188e7b0df","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                # Is True if the driver implements this interface"},{"line_number":76,"context_line":"                if interface.SHORT_DESCRIPTION \u003d\u003d \u0027Volume Replication\u0027:"},{"line_number":77,"context_line":"                    if driver.cls.supports_replication_feature(\u0027a/a\u0027):"},{"line_number":78,"context_line":"                        interfaces[\u0027Supports Clustered Replication\u0027] \u003d True"},{"line_number":79,"context_line":"                        interfaces[\u0027Supports Replication\u0027] \u003d True"},{"line_number":80,"context_line":"                        interfaces[\u0027Supports A/P Replication\u0027] \u003d True"},{"line_number":81,"context_line":"                    elif driver.cls.supports_replication_feature(\u0027v2.1\u0027):"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba2be162_03558bc4","line":78,"range":{"start_line":78,"start_character":45,"end_line":78,"end_character":54},"updated":"2017-03-05 16:53:56.000000000","message":"\"Clustered\" here means with the Cinder service running in A/A mode? That\u0027s a little confusing. I\u0027d rather it say A/A, or not even call out replication separately since it should be assumed if a driver can run in an A/A configuration that replication is a part of that.","commit_id":"34fa1fa232e941545916322b4bf08c77eea91140"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"15879dd5572ffcf20c940029c6c4fb1188e7b0df","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                    if driver.cls.supports_replication_feature(\u0027a/a\u0027):"},{"line_number":78,"context_line":"                        interfaces[\u0027Supports Clustered Replication\u0027] \u003d True"},{"line_number":79,"context_line":"                        interfaces[\u0027Supports Replication\u0027] \u003d True"},{"line_number":80,"context_line":"                        interfaces[\u0027Supports A/P Replication\u0027] \u003d True"},{"line_number":81,"context_line":"                    elif driver.cls.supports_replication_feature(\u0027v2.1\u0027):"},{"line_number":82,"context_line":"                        interfaces[\u0027Supports Clustered Replication\u0027] \u003d False"},{"line_number":83,"context_line":"                        interfaces[\u0027Supports Replication\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba2be162_2350cfd3","line":80,"updated":"2017-03-05 16:53:56.000000000","message":"This is always true if a driver supports replication. I think it should just be removed.","commit_id":"34fa1fa232e941545916322b4bf08c77eea91140"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"9109925e3f2d228473af04a52085eaf0a3f7baa3","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                    if driver.cls.supports_replication_feature(\u0027a/a\u0027):"},{"line_number":78,"context_line":"                        interfaces[\u0027Supports Clustered Replication\u0027] \u003d True"},{"line_number":79,"context_line":"                        interfaces[\u0027Supports Replication\u0027] \u003d True"},{"line_number":80,"context_line":"                        interfaces[\u0027Supports A/P Replication\u0027] \u003d True"},{"line_number":81,"context_line":"                    elif driver.cls.supports_replication_feature(\u0027v2.1\u0027):"},{"line_number":82,"context_line":"                        interfaces[\u0027Supports Clustered Replication\u0027] \u003d False"},{"line_number":83,"context_line":"                        interfaces[\u0027Supports Replication\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":19,"id":"ffe62b97_6bf9a6c6","line":80,"in_reply_to":"9a30ddce_59cf5855","updated":"2017-03-26 15:19:31.000000000","message":"I don\u0027t understand what these three are, so I\u0027m just confused by this. And I think viewers of the support matrix will be too. Can you explain what these are? Either a driver supports replication or it doesn\u0027t.","commit_id":"34fa1fa232e941545916322b4bf08c77eea91140"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"a7786ecbc26a70450a017e43eac67fcc9ebc1804","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                    if driver.cls.supports_replication_feature(\u0027a/a\u0027):"},{"line_number":78,"context_line":"                        interfaces[\u0027Supports Clustered Replication\u0027] \u003d True"},{"line_number":79,"context_line":"                        interfaces[\u0027Supports Replication\u0027] \u003d True"},{"line_number":80,"context_line":"                        interfaces[\u0027Supports A/P Replication\u0027] \u003d True"},{"line_number":81,"context_line":"                    elif driver.cls.supports_replication_feature(\u0027v2.1\u0027):"},{"line_number":82,"context_line":"                        interfaces[\u0027Supports Clustered Replication\u0027] \u003d False"},{"line_number":83,"context_line":"                        interfaces[\u0027Supports Replication\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a30ddce_59cf5855","line":80,"in_reply_to":"ba2be162_2350cfd3","updated":"2017-03-13 16:19:59.000000000","message":"Actually, each of these features is a column in the matrix, each driver will be marked against these three features. There will be some drivers which only Support A/P replication. So these columns cant be dropped","commit_id":"34fa1fa232e941545916322b4bf08c77eea91140"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"eeb859626e3292d1ea5518334e1bb0928c448ee9","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                    if driver.cls.supports_replication_feature(\u0027a/a\u0027):"},{"line_number":78,"context_line":"                        interfaces[\u0027Supports Clustered Replication\u0027] \u003d True"},{"line_number":79,"context_line":"                        interfaces[\u0027Supports Replication\u0027] \u003d True"},{"line_number":80,"context_line":"                        interfaces[\u0027Supports A/P Replication\u0027] \u003d True"},{"line_number":81,"context_line":"                    elif driver.cls.supports_replication_feature(\u0027v2.1\u0027):"},{"line_number":82,"context_line":"                        interfaces[\u0027Supports Clustered Replication\u0027] \u003d False"},{"line_number":83,"context_line":"                        interfaces[\u0027Supports Replication\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":19,"id":"ffe62b97_7826e9d0","line":80,"in_reply_to":"ffe62b97_6bf9a6c6","updated":"2017-03-27 23:10:47.000000000","message":"I was trying to follow Gorka\u0027s advise on Feb 7 where he says we should check for volume replication the way he does in:\n\nThe reason Gorka asked me to use this approach is because most drivers replication methods are not abstract and only 1 driver implements that method but there are a lot of drivers supporting replication.\n\nhttps://review.openstack.org/#/c/403854/36/cinder/interface/util.py\n\nWhen you look at the output of the report it may make more sense:\n\nhttp://docs-draft.openstack.org/69/371169/20/check/gate-cinder-docs-ubuntu-xenial/792ac5a//doc/build/html/driver_support_matrix.html\n\nIn current format of Drivers(rows) vs features(columns) I will not able to keep one that is implemented and skip the rest. \n\nFor a given driver, I need information for \u0027Supports Replication\u0027, \u0027Supports Clustered Replication\u0027 \u0026 \u0027Supports A/P Replication\u0027 at the same time or the report will error.  \n\nPlease let me know if I am missing something.","commit_id":"34fa1fa232e941545916322b4bf08c77eea91140"}],"doc/source/driver_support_matrix.rst":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8ada0bfcaaa879fb78d57b5928e3eaca74e7161c","unresolved":false,"context_lines":[{"line_number":21,"context_line":"not be implemented."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"The following is a comprehensive list of all available drivers and what feature"},{"line_number":24,"context_line":"is currently supported for this release of cinder."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":".. table_example::"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a95cdbc_1cf02890","line":24,"range":{"start_line":24,"start_character":27,"end_line":24,"end_character":31},"updated":"2016-10-05 10:28:15.000000000","message":"Are we able to insert release name here? Maybe based on reno somehow? I would prefer to be more specific here, so people would be able to see what features are supported in what release. A lot of clouds is still running Juno/Kilo/Liberty.","commit_id":"04af6f025dfa003151212938852196f306a2d69b"}],"doc/source/index.rst":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"497b2108e74ec887eb43760b1b7998041de53d89","unresolved":false,"context_lines":[{"line_number":56,"context_line":".. toctree::"},{"line_number":57,"context_line":"   :maxdepth: 1"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"   driver_support_matrix"},{"line_number":60,"context_line":"   drivers"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"API Extensions"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a95cdbc_cbc5f83c","line":59,"updated":"2016-10-05 20:05:29.000000000","message":"Please move this below the link for the list of all drivers.","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"94f7a8af22f39f2502a6992a5e288eedb0d3df61","unresolved":false,"context_lines":[{"line_number":56,"context_line":".. toctree::"},{"line_number":57,"context_line":"   :maxdepth: 1"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"   driver_support_matrix"},{"line_number":60,"context_line":"   drivers"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"API Extensions"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a461143_0396873e","line":59,"in_reply_to":"1a95cdbc_cbc5f83c","updated":"2017-01-30 23:11:57.000000000","message":"Done in latest patchset 8","commit_id":"04af6f025dfa003151212938852196f306a2d69b"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"89638de35df3a5fbe88a59c72426a5c39fb556ec","unresolved":false,"context_lines":[{"line_number":57,"context_line":".. toctree::"},{"line_number":58,"context_line":"   :maxdepth: 1"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"   driver_support_matrix"},{"line_number":61,"context_line":"   drivers"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"API Extensions"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a461143_f2ef8784","line":60,"updated":"2017-01-30 21:48:26.000000000","message":"Can you move this after the link for the full driver list?","commit_id":"5cfdb339dbab87200e28eeaa786e9104a999c333"}]}
