)]}'
{"cinder/volume/drivers/pure.py":[{"author":{"_account_id":10379,"name":"Rajini Karthik","email":"rrajini@gmail.com","username":"rajinir"},"change_message_id":"9ab09a9c0a01070c75104f27eb71c9cb7c568e8c","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    \"\"\"Performs volume management on Pure Storage FlashArray.\"\"\""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    VERSION \u003d \"2.0.4\""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    SUPPORTED_REST_API_VERSIONS \u003d [\u00271.2\u0027, \u00271.3\u0027, \u00271.4\u0027]"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_240c9642","line":103,"updated":"2015-02-20 16:22:01.000000000","message":"Do you maintian the change history in this file? I don\u0027t see the change description","commit_id":"c715bb33f96020fa5dec1b9d94c091d90a9f13ef"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"d5beefe4bcf2119785a9b64c33c878288e25b0ad","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    \"\"\"Performs volume management on Pure Storage FlashArray.\"\"\""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    VERSION \u003d \"2.0.4\""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    SUPPORTED_REST_API_VERSIONS \u003d [\u00271.2\u0027, \u00271.3\u0027, \u00271.4\u0027]"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_bed08d54","line":103,"in_reply_to":"ba7be1f8_240c9642","updated":"2015-02-20 18:16:02.000000000","message":"We don\u0027t maintain a history in the file since it is all kept in the git log anyway.\n\nThese version numbers are pretty much only helpful for our internal QA/support tracking, although we haven\u0027t been very consistent with updating them : (","commit_id":"c715bb33f96020fa5dec1b9d94c091d90a9f13ef"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"1d73565a738e3eb4cdabdc15a29a5f1d00a13e1c","unresolved":false,"context_lines":[{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        model_update \u003d {\u0027status\u0027: group.status}"},{"line_number":468,"context_line":"        LOG.debug(\"Leave PureISCSIDriver.delete_consistencygroup\")"},{"line_number":469,"context_line":"        return model_update, add_volumes, remove_volumes"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    def create_cgsnapshot(self, context, cgsnapshot):"},{"line_number":472,"context_line":"        \"\"\"Creates a cgsnapshot.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_5c15cfef","line":469,"updated":"2015-02-20 23:49:38.000000000","message":"If error occurs, the status for group and individual volumes should be set to \u0027error\u0027.  I don\u0027t see you are doing any error checking here?","commit_id":"c715bb33f96020fa5dec1b9d94c091d90a9f13ef"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"97dec6f4f3de36914775adb2ec805c477dfc5e0b","unresolved":false,"context_lines":[{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        model_update \u003d {\u0027status\u0027: group.status}"},{"line_number":468,"context_line":"        LOG.debug(\"Leave PureISCSIDriver.delete_consistencygroup\")"},{"line_number":469,"context_line":"        return model_update, add_volumes, remove_volumes"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    def create_cgsnapshot(self, context, cgsnapshot):"},{"line_number":472,"context_line":"        \"\"\"Creates a cgsnapshot.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_5f3c7dc8","line":469,"in_reply_to":"ba7be1f8_015ad2f2","updated":"2015-02-24 19:39:43.000000000","message":"Sounds good, I\u0027ll update this impl accordingly.","commit_id":"c715bb33f96020fa5dec1b9d94c091d90a9f13ef"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"c82f7ef336e6c9f8faa2ee8338491612310bdf33","unresolved":false,"context_lines":[{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        model_update \u003d {\u0027status\u0027: group.status}"},{"line_number":468,"context_line":"        LOG.debug(\"Leave PureISCSIDriver.delete_consistencygroup\")"},{"line_number":469,"context_line":"        return model_update, add_volumes, remove_volumes"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    def create_cgsnapshot(self, context, cgsnapshot):"},{"line_number":472,"context_line":"        \"\"\"Creates a cgsnapshot.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_5c186f81","line":469,"in_reply_to":"ba7be1f8_5c15cfef","updated":"2015-02-21 00:16:58.000000000","message":"I wasn\u0027t sure the best way to handle that. As-is this will throw an exception if there is an error when we call self._array.set_prgroup(..). From the looks of the manager code it will catch that and set the group to an error state.\n\nMy thinking on adjusting the volumes state is that for us whether it got added or removed from a group it doesn\u0027t change if a volume is available to be attached or have other operations done on it. This lead me to decide we don\u0027t really need to change the volume status on the update error (ex, if it was \u0027available\u0027 before you tried to put it in a group, it should still be \u0027available\u0027, even if that cg update failed and the group is now in an error state).\n\nSo, this means if we have an error the manager sets the group state to \u0027error\u0027 for us correctly, and the volumes stay as they were. That should effectively block someone from trying to do any cg operations on them, but still allow you to use the volumes as you would have previously.\n\nDoes that behavior make sense? Or am I going to introduce too much difference in behavior from what this is supposed to do?","commit_id":"c715bb33f96020fa5dec1b9d94c091d90a9f13ef"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"f7ee390dde557be27c5def2975c0b79d5a7edcef","unresolved":false,"context_lines":[{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        model_update \u003d {\u0027status\u0027: group.status}"},{"line_number":468,"context_line":"        LOG.debug(\"Leave PureISCSIDriver.delete_consistencygroup\")"},{"line_number":469,"context_line":"        return model_update, add_volumes, remove_volumes"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    def create_cgsnapshot(self, context, cgsnapshot):"},{"line_number":472,"context_line":"        \"\"\"Creates a cgsnapshot.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_93900d97","line":469,"in_reply_to":"ba7be1f8_5c186f81","updated":"2015-02-21 18:21:40.000000000","message":"What you said makes sense. Here is what I think. If a volume cannot be added to a CG, it could be in some in-between state where you can no longer perform volume level operations on. That is something only the backend knows. I\u0027m concerned about this. So I think it is safer to mark it as \u0027error\u0027. Admin can reset it if needed. \n\nFor example, currently a volume could be marked as \u0027available\u0027 while it is already attached on the array. This could happen when initialize_connection times out while array continues to attach the volume and completes it. So \u0027available\u0027 should really be \u0027error\u0027 in this case. This is difficult to detect for the admin as it appears to be \u0027available\u0027. Problem will happen later.","commit_id":"c715bb33f96020fa5dec1b9d94c091d90a9f13ef"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"0ff97289180a6b01462c999d3508f52946586b76","unresolved":false,"context_lines":[{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        model_update \u003d {\u0027status\u0027: group.status}"},{"line_number":468,"context_line":"        LOG.debug(\"Leave PureISCSIDriver.delete_consistencygroup\")"},{"line_number":469,"context_line":"        return model_update, add_volumes, remove_volumes"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    def create_cgsnapshot(self, context, cgsnapshot):"},{"line_number":472,"context_line":"        \"\"\"Creates a cgsnapshot.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_015ad2f2","line":469,"in_reply_to":"ba7be1f8_6fcf0980","updated":"2015-02-24 03:19:45.000000000","message":"Probably a good idea. This is more complicated than the regular volume operation because there are more than 1 return values. So driver has to return 3 values or throw exception.\n\nI\u0027m going to make a change. Driver can\u0027t just return add_volumes and remove_volumes any more as those can\u0027t be used directly for db update. Driver will have to build its own dictionary or return None for each model_update or throw exception. This is more consistent with other operations.","commit_id":"c715bb33f96020fa5dec1b9d94c091d90a9f13ef"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"321caaf41dfa4e5fed86bc14d2205103d1890b61","unresolved":false,"context_lines":[{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        model_update \u003d {\u0027status\u0027: group.status}"},{"line_number":468,"context_line":"        LOG.debug(\"Leave PureISCSIDriver.delete_consistencygroup\")"},{"line_number":469,"context_line":"        return model_update, add_volumes, remove_volumes"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    def create_cgsnapshot(self, context, cgsnapshot):"},{"line_number":472,"context_line":"        \"\"\"Creates a cgsnapshot.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_6fcf0980","line":469,"in_reply_to":"ba7be1f8_93900d97","updated":"2015-02-23 19:23:54.000000000","message":"Hmm yea, that is a good point, I can agree that we should play it safe and set the volumes in error state. I forgot it is easy for an admin to reset them if  they are actually OK.\n\nWith that in mind I\u0027m wondering if it would be better to have the manger code that catches exceptions from the driver method set the volumes to an error state. Right now it will automatically set the consistency group status to error, but not the volumes. From your comment it sounds like we always want to set the volumes to error if something bad happens, unless the driver explicitly say not to (ie. returns model updates instead of raising an exception and not returning). It seems like we could save some code duplication by handling that in the manager so each driver doesn\u0027t have to do it. IMO that behavior falls more in line with the other driver methods where they can just raise an exception and manager knows how to deal with it.","commit_id":"c715bb33f96020fa5dec1b9d94c091d90a9f13ef"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"16593227c422e7d8da819ddd193d7b773a716441","unresolved":false,"context_lines":[{"line_number":425,"context_line":"            for volume, snapshot in zip(volumes, snapshots):"},{"line_number":426,"context_line":"                self.create_volume_from_snapshot(volume, snapshot)"},{"line_number":427,"context_line":"        else:"},{"line_number":428,"context_line":"            raise NotImplementedError()"},{"line_number":429,"context_line":"        return None, None"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"    def delete_consistencygroup(self, context, group):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_ecaab183","line":428,"updated":"2015-02-26 00:00:10.000000000","message":"NotImplementedError means your driver didn\u0027t implement this method.  That is not true.  InvalidInput is more appropriate.","commit_id":"ab2accb57780f648461fa08c3ea3b41228722489"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"6abf117f740777762adbca84edb773f51f21b02d","unresolved":false,"context_lines":[{"line_number":425,"context_line":"            for volume, snapshot in zip(volumes, snapshots):"},{"line_number":426,"context_line":"                self.create_volume_from_snapshot(volume, snapshot)"},{"line_number":427,"context_line":"        else:"},{"line_number":428,"context_line":"            raise NotImplementedError()"},{"line_number":429,"context_line":"        return None, None"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"    def delete_consistencygroup(self, context, group):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_27b30299","line":428,"in_reply_to":"ba7be1f8_ecaab183","updated":"2015-02-26 00:41:46.000000000","message":"Done","commit_id":"ab2accb57780f648461fa08c3ea3b41228722489"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e7373497a67a4c0bcb5b6d00b654eb57fd9f81b8","unresolved":false,"context_lines":[{"line_number":99,"context_line":"class PureISCSIDriver(san.SanISCSIDriver):"},{"line_number":100,"context_line":"    \"\"\"Performs volume management on Pure Storage FlashArray.\"\"\""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    VERSION \u003d \"2.0.6\""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    SUPPORTED_REST_API_VERSIONS \u003d [\u00271.2\u0027, \u00271.3\u0027, \u00271.4\u0027]"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba7be1f8_486ba2b6","line":102,"updated":"2015-02-26 04:25:41.000000000","message":"Why is the version jumping from 2.0.3 to 2.0.6? What happens to 4 and 5?","commit_id":"31eef3882e82dc440ae6f0674fc988dc6ca9f271"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"d544ad7f253d4bb3f331cf9a8821fa2fa57d0fd1","unresolved":false,"context_lines":[{"line_number":99,"context_line":"class PureISCSIDriver(san.SanISCSIDriver):"},{"line_number":100,"context_line":"    \"\"\"Performs volume management on Pure Storage FlashArray.\"\"\""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    VERSION \u003d \"2.0.6\""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    SUPPORTED_REST_API_VERSIONS \u003d [\u00271.2\u0027, \u00271.3\u0027, \u00271.4\u0027]"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba7be1f8_080feae1","line":102,"in_reply_to":"ba7be1f8_486ba2b6","updated":"2015-02-26 04:40:29.000000000","message":"Ehh these are mostly just for our internal tracking of things as we are testing them out or when bugs show up, we have two other patches in flight right now (2.0.4 is the thin provisioning and 2.0.5 is for CHAP support).\n\nIn retrospect it might have been easier to keep the versioning internal and just do one small update at the end of each cycle to move it to the right version.","commit_id":"31eef3882e82dc440ae6f0674fc988dc6ca9f271"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"7f256fe9289271f8ab3ccf21b04f16f544ef2966","unresolved":false,"context_lines":[{"line_number":579,"context_line":"        self._array.set_pgroup(pgroup_name, addvollist\u003daddvollist,"},{"line_number":580,"context_line":"                               remvollist\u003dremvollist)"},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"        LOG.debug(\"Leave PureISCSIDriver.delete_consistencygroup\")"},{"line_number":583,"context_line":"        return None, None, None"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"    def create_cgsnapshot(self, context, cgsnapshot):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_1aa2d74a","line":582,"updated":"2015-03-09 17:42:55.000000000","message":"This log message is not right.  Leave PureISCSIDriver.update_consistencygroup","commit_id":"b24fef5735d3711583d62591fb0519378c0bdfd5"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"e8063112772a96743edcb66301d4b01fea6fd467","unresolved":false,"context_lines":[{"line_number":579,"context_line":"        self._array.set_pgroup(pgroup_name, addvollist\u003daddvollist,"},{"line_number":580,"context_line":"                               remvollist\u003dremvollist)"},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"        LOG.debug(\"Leave PureISCSIDriver.delete_consistencygroup\")"},{"line_number":583,"context_line":"        return None, None, None"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"    def create_cgsnapshot(self, context, cgsnapshot):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_a5a450ba","line":582,"in_reply_to":"9a80dd14_1aa2d74a","updated":"2015-03-09 17:55:18.000000000","message":"Done","commit_id":"b24fef5735d3711583d62591fb0519378c0bdfd5"}]}
