)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":17405,"name":"Jacob Gregor","email":"jgregor@us.ibm.com","username":"jgregor"},"change_message_id":"bc1e195c2683a48d4d53bbe108cefeff08d0b33e","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Enable consisgroups in SolidFire driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch enables Consistency Group support in the SolidFire driver. SolidFire"},{"line_number":10,"context_line":"group snapshots are what is used to provide consistent snapshots on the"},{"line_number":11,"context_line":"backend."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"fa69d971_96320d5d","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":79},"updated":"2016-01-05 17:45:06.000000000","message":"Lines should be wrapped at 72 characters.\n\nhttps://wiki.openstack.org/wiki/GitCommitMessages#Summary_of_Git_commit_message_structure","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"23a4f55ae49c33568319570cb57e0192b3c6f767","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Enable consisgroups in SolidFire driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch enables Consistency Group support in the SolidFire driver. SolidFire"},{"line_number":10,"context_line":"group snapshots are what is used to provide consistent snapshots on the"},{"line_number":11,"context_line":"backend."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"fa69d971_4ea86e8d","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":79},"in_reply_to":"fa69d971_96320d5d","updated":"2016-01-05 23:51:55.000000000","message":"Pretty certain I\u0027m going to consistently screw the commit message up over and over again. Correcting, thanks.","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"}],"cinder/tests/unit/test_solidfire.py":[{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"89b8e96ff89dbbd2fe65a1925b3d41dfc708dfba","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"3a7e1126_c939e4a5","updated":"2015-12-18 22:17:57.000000000","message":"I\u0027m not really satisfied with these tests as I felt like I was spending more time exercising mocks than actually testing logic. I suppose though tests at the minimum roughly confirm the code passes stuff around correctly.","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":17405,"name":"Jacob Gregor","email":"jgregor@us.ibm.com","username":"jgregor"},"change_message_id":"bc1e195c2683a48d4d53bbe108cefeff08d0b33e","unresolved":false,"context_lines":[{"line_number":1531,"context_line":"                               \u0027_issue_api_request\u0027,"},{"line_number":1532,"context_line":"                               return_value\u003dfake_result) as fake_api:"},{"line_number":1533,"context_line":"            res \u003d sfv._create_group_snapshot(name, sf_volumes)"},{"line_number":1534,"context_line":"            self.assertEqual(res, \u0027contrived_test\u0027)"},{"line_number":1535,"context_line":"            fake_api.assert_called_with(\u0027CreateGroupSnapshot\u0027,"},{"line_number":1536,"context_line":"                                        expected_params,"},{"line_number":1537,"context_line":"                                        version\u003d\u00277.0\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_b6df1139","line":1534,"range":{"start_line":1534,"start_character":17,"end_line":1534,"end_character":28},"updated":"2016-01-05 17:45:06.000000000","message":"I think this should be set up as assertEqual(expected, result)","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"23a4f55ae49c33568319570cb57e0192b3c6f767","unresolved":false,"context_lines":[{"line_number":1531,"context_line":"                               \u0027_issue_api_request\u0027,"},{"line_number":1532,"context_line":"                               return_value\u003dfake_result) as fake_api:"},{"line_number":1533,"context_line":"            res \u003d sfv._create_group_snapshot(name, sf_volumes)"},{"line_number":1534,"context_line":"            self.assertEqual(res, \u0027contrived_test\u0027)"},{"line_number":1535,"context_line":"            fake_api.assert_called_with(\u0027CreateGroupSnapshot\u0027,"},{"line_number":1536,"context_line":"                                        expected_params,"},{"line_number":1537,"context_line":"                                        version\u003d\u00277.0\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_aedfaa67","line":1534,"range":{"start_line":1534,"start_character":17,"end_line":1534,"end_character":28},"in_reply_to":"fa69d971_b6df1139","updated":"2016-01-05 23:51:55.000000000","message":"Done","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":17405,"name":"Jacob Gregor","email":"jgregor@us.ibm.com","username":"jgregor"},"change_message_id":"bc1e195c2683a48d4d53bbe108cefeff08d0b33e","unresolved":false,"context_lines":[{"line_number":1590,"context_line":"                               \u0027_issue_api_request\u0027,"},{"line_number":1591,"context_line":"                               return_value\u003dres):"},{"line_number":1592,"context_line":"            result \u003d sfv._list_group_snapshots()"},{"line_number":1593,"context_line":"            self.assertEqual(result, \u0027a_thing\u0027)"},{"line_number":1594,"context_line":""},{"line_number":1595,"context_line":"    def test_get_group_snapshot_by_name(self):"},{"line_number":1596,"context_line":"        sfv \u003d solidfire.SolidFireDriver(configuration\u003dself.configuration)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_b6add19c","line":1593,"range":{"start_line":1593,"start_character":17,"end_line":1593,"end_character":28},"updated":"2016-01-05 17:45:06.000000000","message":"ditto","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"23a4f55ae49c33568319570cb57e0192b3c6f767","unresolved":false,"context_lines":[{"line_number":1590,"context_line":"                               \u0027_issue_api_request\u0027,"},{"line_number":1591,"context_line":"                               return_value\u003dres):"},{"line_number":1592,"context_line":"            result \u003d sfv._list_group_snapshots()"},{"line_number":1593,"context_line":"            self.assertEqual(result, \u0027a_thing\u0027)"},{"line_number":1594,"context_line":""},{"line_number":1595,"context_line":"    def test_get_group_snapshot_by_name(self):"},{"line_number":1596,"context_line":"        sfv \u003d solidfire.SolidFireDriver(configuration\u003dself.configuration)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_cedc5e75","line":1593,"range":{"start_line":1593,"start_character":17,"end_line":1593,"end_character":28},"in_reply_to":"fa69d971_b6add19c","updated":"2016-01-05 23:51:55.000000000","message":"Done","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":17405,"name":"Jacob Gregor","email":"jgregor@us.ibm.com","username":"jgregor"},"change_message_id":"bc1e195c2683a48d4d53bbe108cefeff08d0b33e","unresolved":false,"context_lines":[{"line_number":1639,"context_line":"                               \u0027_get_sf_volume\u0027,"},{"line_number":1640,"context_line":"                               return_value\u003dsource_vol) as get_vol:"},{"line_number":1641,"context_line":"            res \u003d sfv._find_linked_snapshot(\u0027fake_uuid\u0027, group_snap)"},{"line_number":1642,"context_line":"            self.assertEqual(res, source_vol)"},{"line_number":1643,"context_line":"            get_vol.assert_called_with(\u0027fake_uuid\u0027)"},{"line_number":1644,"context_line":""},{"line_number":1645,"context_line":"    def test_create_consisgroup_from_src_cgsnapshot(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_d6896527","line":1642,"range":{"start_line":1642,"start_character":17,"end_line":1642,"end_character":28},"updated":"2016-01-05 17:45:06.000000000","message":"ditto","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"23a4f55ae49c33568319570cb57e0192b3c6f767","unresolved":false,"context_lines":[{"line_number":1639,"context_line":"                               \u0027_get_sf_volume\u0027,"},{"line_number":1640,"context_line":"                               return_value\u003dsource_vol) as get_vol:"},{"line_number":1641,"context_line":"            res \u003d sfv._find_linked_snapshot(\u0027fake_uuid\u0027, group_snap)"},{"line_number":1642,"context_line":"            self.assertEqual(res, source_vol)"},{"line_number":1643,"context_line":"            get_vol.assert_called_with(\u0027fake_uuid\u0027)"},{"line_number":1644,"context_line":""},{"line_number":1645,"context_line":"    def test_create_consisgroup_from_src_cgsnapshot(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_6ee53236","line":1642,"range":{"start_line":1642,"start_character":17,"end_line":1642,"end_character":28},"in_reply_to":"fa69d971_d6896527","updated":"2016-01-05 23:51:55.000000000","message":"Done","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":17405,"name":"Jacob Gregor","email":"jgregor@us.ibm.com","username":"jgregor"},"change_message_id":"bc1e195c2683a48d4d53bbe108cefeff08d0b33e","unresolved":false,"context_lines":[{"line_number":1705,"context_line":"                source_cg,"},{"line_number":1706,"context_line":"                source_vols)"},{"line_number":1707,"context_line":"            get_snap.assert_called_with(source_cg[\u0027id\u0027])"},{"line_number":1708,"context_line":"            self.assertEqual(model, {\u0027status\u0027: \u0027available\u0027})"},{"line_number":1709,"context_line":""},{"line_number":1710,"context_line":"    def test_create_cgsnapshot(self):"},{"line_number":1711,"context_line":"        sfv \u003d solidfire.SolidFireDriver(configuration\u003dself.configuration)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_d6908545","line":1708,"range":{"start_line":1708,"start_character":17,"end_line":1708,"end_character":28},"updated":"2016-01-05 17:45:06.000000000","message":"ditto","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"23a4f55ae49c33568319570cb57e0192b3c6f767","unresolved":false,"context_lines":[{"line_number":1705,"context_line":"                source_cg,"},{"line_number":1706,"context_line":"                source_vols)"},{"line_number":1707,"context_line":"            get_snap.assert_called_with(source_cg[\u0027id\u0027])"},{"line_number":1708,"context_line":"            self.assertEqual(model, {\u0027status\u0027: \u0027available\u0027})"},{"line_number":1709,"context_line":""},{"line_number":1710,"context_line":"    def test_create_cgsnapshot(self):"},{"line_number":1711,"context_line":"        sfv \u003d solidfire.SolidFireDriver(configuration\u003dself.configuration)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_8ee2e62d","line":1708,"range":{"start_line":1708,"start_character":17,"end_line":1708,"end_character":28},"in_reply_to":"fa69d971_d6908545","updated":"2016-01-05 23:51:55.000000000","message":"Done","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"}],"cinder/volume/drivers/solidfire.py":[{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"89b8e96ff89dbbd2fe65a1925b3d41dfc708dfba","unresolved":false,"context_lines":[{"line_number":448,"context_line":"        return model_update"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    def _do_clone_volume(self, src_uuid,"},{"line_number":451,"context_line":"                         src_project_id,"},{"line_number":452,"context_line":"                         vref):"},{"line_number":453,"context_line":"        \"\"\"Create a clone of an existing volume or snapshot.\"\"\""},{"line_number":454,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_a9e018fb","side":"PARENT","line":451,"range":{"start_line":451,"start_character":25,"end_line":451,"end_character":39},"updated":"2015-12-18 22:17:57.000000000","message":"This unused input was removed and calls to _do_clone_volume were modified to reflect that.","commit_id":"ef08af911244210b5b7839502302a90199b14263"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"89b8e96ff89dbbd2fe65a1925b3d41dfc708dfba","unresolved":false,"context_lines":[{"line_number":448,"context_line":"                                            self.cluster_uuid))"},{"line_number":449,"context_line":"        return model_update"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"    def _snapshot_discovery(self, src_uuid, params, vref):"},{"line_number":452,"context_line":"        # NOTE(jdg): First check the SF snapshots"},{"line_number":453,"context_line":"        # if we don\u0027t find a snap by the given name, just move on to check"},{"line_number":454,"context_line":"        # volumes.  This may be a running system that was updated from"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_29c4285d","line":451,"updated":"2015-12-18 22:17:57.000000000","message":"Broke this out to a helper function primarily to clean up _do_clone_volume, as I was adding some functionality to _do_clone_volume.","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ec252b3a0d55b2c6e9aa8e4d0a21fd7df75c51e3","unresolved":false,"context_lines":[{"line_number":477,"context_line":""},{"line_number":478,"context_line":"        attributes \u003d {}"},{"line_number":479,"context_line":"        sf_account \u003d self._get_create_account(vref[\u0027project_id\u0027])"},{"line_number":480,"context_line":"        params \u003d {\u0027name\u0027: \u0027%s%s\u0027 % (self.configuration.sf_volume_prefix,"},{"line_number":481,"context_line":"                                    vref[\u0027id\u0027]),"},{"line_number":482,"context_line":"                  \u0027newAccountID\u0027: sf_account[\u0027accountID\u0027]}"},{"line_number":483,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_09928cf6","line":480,"updated":"2015-12-18 22:44:39.000000000","message":"Please use keyword parameters.","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"23a4f55ae49c33568319570cb57e0192b3c6f767","unresolved":false,"context_lines":[{"line_number":477,"context_line":""},{"line_number":478,"context_line":"        attributes \u003d {}"},{"line_number":479,"context_line":"        sf_account \u003d self._get_create_account(vref[\u0027project_id\u0027])"},{"line_number":480,"context_line":"        params \u003d {\u0027name\u0027: \u0027%s%s\u0027 % (self.configuration.sf_volume_prefix,"},{"line_number":481,"context_line":"                                    vref[\u0027id\u0027]),"},{"line_number":482,"context_line":"                  \u0027newAccountID\u0027: sf_account[\u0027accountID\u0027]}"},{"line_number":483,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_4ef06efe","line":480,"in_reply_to":"3a7e1126_09928cf6","updated":"2016-01-05 23:51:55.000000000","message":"Done","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"89b8e96ff89dbbd2fe65a1925b3d41dfc708dfba","unresolved":false,"context_lines":[{"line_number":503,"context_line":""},{"line_number":504,"context_line":"        # NOTE(jdg): all attributes are copied via clone, need to do an update"},{"line_number":505,"context_line":"        # to set any that were provided"},{"line_number":506,"context_line":"        qos_params \u003d {\u0027volumeID\u0027: sf_volume_id}"},{"line_number":507,"context_line":"        create_time \u003d vref[\u0027created_at\u0027].isoformat()"},{"line_number":508,"context_line":"        attributes \u003d {\u0027uuid\u0027: vref[\u0027id\u0027],"},{"line_number":509,"context_line":"                      \u0027is_clone\u0027: \u0027True\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_49d414eb","line":506,"range":{"start_line":506,"start_character":8,"end_line":506,"end_character":18},"updated":"2015-12-18 22:17:57.000000000","message":"Renamed params to qos_params as params was used earlier in the function for the CloneVolume call. Not necessary, just more clear in my opinion.","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"89b8e96ff89dbbd2fe65a1925b3d41dfc708dfba","unresolved":false,"context_lines":[{"line_number":804,"context_line":"            return sfaccount"},{"line_number":805,"context_line":"        return None"},{"line_number":806,"context_line":""},{"line_number":807,"context_line":"    def _get_create_account(self, proj_id):"},{"line_number":808,"context_line":"        # Retrieve SolidFire accountID to be used for creating volumes."},{"line_number":809,"context_line":"        sf_accounts \u003d self._get_sfaccounts_for_tenant(proj_id)"},{"line_number":810,"context_line":"        if not sf_accounts:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_c9b804cb","line":807,"range":{"start_line":807,"start_character":8,"end_line":807,"end_character":27},"updated":"2015-12-18 22:17:57.000000000","message":"More duplicate code moved into a helper from _do_clone_volume and other functions.","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"89b8e96ff89dbbd2fe65a1925b3d41dfc708dfba","unresolved":false,"context_lines":[{"line_number":1033,"context_line":""},{"line_number":1034,"context_line":"        return model, True"},{"line_number":1035,"context_line":""},{"line_number":1036,"context_line":"    def _retrieve_qos_setting(self, volume):"},{"line_number":1037,"context_line":"        qos \u003d {}"},{"line_number":1038,"context_line":"        if (self.configuration.sf_allow_tenant_qos and"},{"line_number":1039,"context_line":"                volume.get(\u0027volume_metadata\u0027)is not None):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_2972e849","line":1036,"range":{"start_line":1036,"start_character":8,"end_line":1036,"end_character":29},"updated":"2015-12-18 22:17:57.000000000","message":"Noticed while cleaning up _do_clone_volume that the pattern in _retrieve_qos_setting was utilized in multiple places. Threw it into a helper and replaced the duplicate code w/ calls to this.","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"89b8e96ff89dbbd2fe65a1925b3d41dfc708dfba","unresolved":false,"context_lines":[{"line_number":1182,"context_line":"            volume)"},{"line_number":1183,"context_line":""},{"line_number":1184,"context_line":"        return model"},{"line_number":1185,"context_line":""},{"line_number":1186,"context_line":"    # Consistency group helpers"},{"line_number":1187,"context_line":"    def _create_group_snapshot(self, name, sf_volumes):"},{"line_number":1188,"context_line":"        # Group snapshot is our version of a consistency group snapshot."}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_e98060c2","line":1185,"updated":"2015-12-18 22:17:57.000000000","message":"I think I have sufficient in-line comments describing all the non-obvious helper functions and why stuff is juggled around. Let me know if something isn\u0027t obvious.","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ec252b3a0d55b2c6e9aa8e4d0a21fd7df75c51e3","unresolved":false,"context_lines":[{"line_number":1195,"context_line":"        return snapshot_id[\u0027result\u0027]"},{"line_number":1196,"context_line":""},{"line_number":1197,"context_line":"    def _group_snapshot_creator(self, gsnap_name, src_vol_ids):"},{"line_number":1198,"context_line":"        # Common helper that takes in an array of openstack Volume UUIDs and"},{"line_number":1199,"context_line":"        # creates a SolidFire group snapshot with them."},{"line_number":1200,"context_line":"        vol_names \u003d [self.configuration.sf_volume_prefix + vol_id"},{"line_number":1201,"context_line":"                     for vol_id in src_vol_ids]"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_e99ce010","line":1198,"updated":"2015-12-18 22:44:39.000000000","message":"s/openstack/OpenStack","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"23a4f55ae49c33568319570cb57e0192b3c6f767","unresolved":false,"context_lines":[{"line_number":1195,"context_line":"        return snapshot_id[\u0027result\u0027]"},{"line_number":1196,"context_line":""},{"line_number":1197,"context_line":"    def _group_snapshot_creator(self, gsnap_name, src_vol_ids):"},{"line_number":1198,"context_line":"        # Common helper that takes in an array of openstack Volume UUIDs and"},{"line_number":1199,"context_line":"        # creates a SolidFire group snapshot with them."},{"line_number":1200,"context_line":"        vol_names \u003d [self.configuration.sf_volume_prefix + vol_id"},{"line_number":1201,"context_line":"                     for vol_id in src_vol_ids]"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_8e8bc667","line":1198,"in_reply_to":"3a7e1126_e99ce010","updated":"2016-01-05 23:51:55.000000000","message":"Done","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ec252b3a0d55b2c6e9aa8e4d0a21fd7df75c51e3","unresolved":false,"context_lines":[{"line_number":1205,"context_line":"        if len(src_vol_ids) !\u003d len(target_vols):"},{"line_number":1206,"context_line":"            msg \u003d (\"Retrieved a different amount of SolidFire volumes for the\""},{"line_number":1207,"context_line":"                   \"provided Cinder volumes. Retrieved: {}\""},{"line_number":1208,"context_line":"                   \"Desired: {}\".format(len(target_vols),"},{"line_number":1209,"context_line":"                                        len(src_vol_ids)))"},{"line_number":1210,"context_line":"            raise exception.SolidFireDriverException(msg)"},{"line_number":1211,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_49b3b498","line":1208,"updated":"2015-12-18 22:44:39.000000000","message":"Please use the %s format and keyword parameters.","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"23a4f55ae49c33568319570cb57e0192b3c6f767","unresolved":false,"context_lines":[{"line_number":1205,"context_line":"        if len(src_vol_ids) !\u003d len(target_vols):"},{"line_number":1206,"context_line":"            msg \u003d (\"Retrieved a different amount of SolidFire volumes for the\""},{"line_number":1207,"context_line":"                   \"provided Cinder volumes. Retrieved: {}\""},{"line_number":1208,"context_line":"                   \"Desired: {}\".format(len(target_vols),"},{"line_number":1209,"context_line":"                                        len(src_vol_ids)))"},{"line_number":1210,"context_line":"            raise exception.SolidFireDriverException(msg)"},{"line_number":1211,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_ae980ac1","line":1208,"in_reply_to":"3a7e1126_49b3b498","updated":"2016-01-05 23:51:55.000000000","message":"Done","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ec252b3a0d55b2c6e9aa8e4d0a21fd7df75c51e3","unresolved":false,"context_lines":[{"line_number":1215,"context_line":"    def _create_temp_group_snapshot(self, source_cg, source_vols):"},{"line_number":1216,"context_line":"        # Take a temporary snapshot to create the volumes for a new"},{"line_number":1217,"context_line":"        # consistency group."},{"line_number":1218,"context_line":"        gsnap_name \u003d \u0027{}{}-tmp\u0027.format(self.configuration.sf_volume_prefix,"},{"line_number":1219,"context_line":"                                       source_cg[\u0027id\u0027])"},{"line_number":1220,"context_line":"        vol_ids \u003d [vol[\u0027id\u0027] for vol in source_vols]"},{"line_number":1221,"context_line":"        self._group_snapshot_creator(gsnap_name, vol_ids)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_e9514037","line":1218,"updated":"2015-12-18 22:44:39.000000000","message":"same","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"23a4f55ae49c33568319570cb57e0192b3c6f767","unresolved":false,"context_lines":[{"line_number":1215,"context_line":"    def _create_temp_group_snapshot(self, source_cg, source_vols):"},{"line_number":1216,"context_line":"        # Take a temporary snapshot to create the volumes for a new"},{"line_number":1217,"context_line":"        # consistency group."},{"line_number":1218,"context_line":"        gsnap_name \u003d \u0027{}{}-tmp\u0027.format(self.configuration.sf_volume_prefix,"},{"line_number":1219,"context_line":"                                       source_cg[\u0027id\u0027])"},{"line_number":1220,"context_line":"        vol_ids \u003d [vol[\u0027id\u0027] for vol in source_vols]"},{"line_number":1221,"context_line":"        self._group_snapshot_creator(gsnap_name, vol_ids)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_0e7fd666","line":1218,"in_reply_to":"3a7e1126_e9514037","updated":"2016-01-05 23:51:55.000000000","message":"Done","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ec252b3a0d55b2c6e9aa8e4d0a21fd7df75c51e3","unresolved":false,"context_lines":[{"line_number":1243,"context_line":"        # Common function used to find and delete a snapshot."},{"line_number":1244,"context_line":"        target \u003d self._get_group_snapshot_by_name(snap_name)"},{"line_number":1245,"context_line":"        if not target:"},{"line_number":1246,"context_line":"            msg \u003d \"Failed to find group snapshot named: {}\".format(snap_name)"},{"line_number":1247,"context_line":"            raise exception.SolidFireDriverException(msg)"},{"line_number":1248,"context_line":"        self._delete_group_snapshot(target[\u0027groupSnapshotID\u0027])"},{"line_number":1249,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_695eb045","line":1246,"updated":"2015-12-18 22:44:39.000000000","message":"Please use the %s format.","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"23a4f55ae49c33568319570cb57e0192b3c6f767","unresolved":false,"context_lines":[{"line_number":1243,"context_line":"        # Common function used to find and delete a snapshot."},{"line_number":1244,"context_line":"        target \u003d self._get_group_snapshot_by_name(snap_name)"},{"line_number":1245,"context_line":"        if not target:"},{"line_number":1246,"context_line":"            msg \u003d \"Failed to find group snapshot named: {}\".format(snap_name)"},{"line_number":1247,"context_line":"            raise exception.SolidFireDriverException(msg)"},{"line_number":1248,"context_line":"        self._delete_group_snapshot(target[\u0027groupSnapshotID\u0027])"},{"line_number":1249,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_ee792283","line":1246,"in_reply_to":"3a7e1126_695eb045","updated":"2016-01-05 23:51:55.000000000","message":"Done","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ec252b3a0d55b2c6e9aa8e4d0a21fd7df75c51e3","unresolved":false,"context_lines":[{"line_number":1260,"context_line":""},{"line_number":1261,"context_line":"    # Required consistency group functions"},{"line_number":1262,"context_line":"    def create_consistencygroup(self, ctxt, group):"},{"line_number":1263,"context_line":"        # SolidFire does not have a viable means for storing consisgroup volume"},{"line_number":1264,"context_line":"        # associations. So, we\u0027re just going to play along with the consisgroup"},{"line_number":1265,"context_line":"        # song and dance. There will be a lot of no-ops because of this."},{"line_number":1266,"context_line":"        return {\u0027status\u0027: \u0027available\u0027}"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_89399cf4","line":1263,"updated":"2015-12-18 22:44:39.000000000","message":"consistency group","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"23a4f55ae49c33568319570cb57e0192b3c6f767","unresolved":false,"context_lines":[{"line_number":1260,"context_line":""},{"line_number":1261,"context_line":"    # Required consistency group functions"},{"line_number":1262,"context_line":"    def create_consistencygroup(self, ctxt, group):"},{"line_number":1263,"context_line":"        # SolidFire does not have a viable means for storing consisgroup volume"},{"line_number":1264,"context_line":"        # associations. So, we\u0027re just going to play along with the consisgroup"},{"line_number":1265,"context_line":"        # song and dance. There will be a lot of no-ops because of this."},{"line_number":1266,"context_line":"        return {\u0027status\u0027: \u0027available\u0027}"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_4e894e74","line":1263,"in_reply_to":"3a7e1126_89399cf4","updated":"2016-01-05 23:51:55.000000000","message":"Done","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ec252b3a0d55b2c6e9aa8e4d0a21fd7df75c51e3","unresolved":false,"context_lines":[{"line_number":1261,"context_line":"    # Required consistency group functions"},{"line_number":1262,"context_line":"    def create_consistencygroup(self, ctxt, group):"},{"line_number":1263,"context_line":"        # SolidFire does not have a viable means for storing consisgroup volume"},{"line_number":1264,"context_line":"        # associations. So, we\u0027re just going to play along with the consisgroup"},{"line_number":1265,"context_line":"        # song and dance. There will be a lot of no-ops because of this."},{"line_number":1266,"context_line":"        return {\u0027status\u0027: \u0027available\u0027}"},{"line_number":1267,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_4928949a","line":1264,"updated":"2015-12-18 22:44:39.000000000","message":"same","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"23a4f55ae49c33568319570cb57e0192b3c6f767","unresolved":false,"context_lines":[{"line_number":1261,"context_line":"    # Required consistency group functions"},{"line_number":1262,"context_line":"    def create_consistencygroup(self, ctxt, group):"},{"line_number":1263,"context_line":"        # SolidFire does not have a viable means for storing consisgroup volume"},{"line_number":1264,"context_line":"        # associations. So, we\u0027re just going to play along with the consisgroup"},{"line_number":1265,"context_line":"        # song and dance. There will be a lot of no-ops because of this."},{"line_number":1266,"context_line":"        return {\u0027status\u0027: \u0027available\u0027}"},{"line_number":1267,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_2e841a5c","line":1264,"in_reply_to":"3a7e1126_4928949a","updated":"2016-01-05 23:51:55.000000000","message":"Done","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"89b8e96ff89dbbd2fe65a1925b3d41dfc708dfba","unresolved":false,"context_lines":[{"line_number":1265,"context_line":"        # song and dance. There will be a lot of no-ops because of this."},{"line_number":1266,"context_line":"        return {\u0027status\u0027: \u0027available\u0027}"},{"line_number":1267,"context_line":""},{"line_number":1268,"context_line":"    def create_consistencygroup_from_src(self, ctxt, group, volumes,"},{"line_number":1269,"context_line":"                                         cgsnapshot, snapshots,"},{"line_number":1270,"context_line":"                                         source_cg, source_vols):"},{"line_number":1271,"context_line":"        if cgsnapshot and snapshots:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_e91940d8","line":1268,"range":{"start_line":1268,"start_character":8,"end_line":1268,"end_character":40},"updated":"2015-12-18 22:17:57.000000000","message":"It\u0027s unfortunate that the two branches here were just different enough that I couldn\u0027t effectively prevent some duplication.","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ec252b3a0d55b2c6e9aa8e4d0a21fd7df75c51e3","unresolved":false,"context_lines":[{"line_number":1278,"context_line":"                # Find the correct SolidFire backing snapshot."},{"line_number":1279,"context_line":"                sf_src_snap \u003d self._find_linked_snapshot(snap[\u0027volume_id\u0027],"},{"line_number":1280,"context_line":"                                                         sf_group_snap)"},{"line_number":1281,"context_line":"                _data, _sfaccount, model \u003d self._do_clone_volume(snap[\u0027id\u0027],"},{"line_number":1282,"context_line":"                                                                 vol,"},{"line_number":1283,"context_line":"                                                                 sf_src_snap)"},{"line_number":1284,"context_line":"                derp \u003d copy.copy(model)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_e43e458b","line":1281,"updated":"2015-12-18 22:44:39.000000000","message":"Does \"model\" contain \u0027id\u0027 of the volume?  Each entry in vol_models needs to have a \u0027id\u0027 for the manager to update the correct volume entry in the db.  Each entry should be in this format:  {\u0027id\u0027: xxx, \u0027status\u0027: xxx, ......}\n\nBy looking at _get_model_info() which generated \"model\" in _do_clone_volume(), it does not look like it contains \u0027id\u0027.\n\nSame comment goes to other CG functions where this is used.","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"23a4f55ae49c33568319570cb57e0192b3c6f767","unresolved":false,"context_lines":[{"line_number":1278,"context_line":"                # Find the correct SolidFire backing snapshot."},{"line_number":1279,"context_line":"                sf_src_snap \u003d self._find_linked_snapshot(snap[\u0027volume_id\u0027],"},{"line_number":1280,"context_line":"                                                         sf_group_snap)"},{"line_number":1281,"context_line":"                _data, _sfaccount, model \u003d self._do_clone_volume(snap[\u0027id\u0027],"},{"line_number":1282,"context_line":"                                                                 vol,"},{"line_number":1283,"context_line":"                                                                 sf_src_snap)"},{"line_number":1284,"context_line":"                derp \u003d copy.copy(model)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_f89c8f0f","line":1281,"in_reply_to":"3a7e1126_e43e458b","updated":"2016-01-05 23:51:55.000000000","message":"Weird, I swear I addressed this as it doesn\u0027t even work without the \u0027id\u0027 k/v pair. Must have accidentally removed it towards the end. Corrected that. Thanks for digging into this review!","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"b21911b950f523c5c51232f255dfd6734ee58c06","unresolved":false,"context_lines":[{"line_number":1281,"context_line":"                _data, _sfaccount, model \u003d self._do_clone_volume(snap[\u0027id\u0027],"},{"line_number":1282,"context_line":"                                                                 vol,"},{"line_number":1283,"context_line":"                                                                 sf_src_snap)"},{"line_number":1284,"context_line":"                derp \u003d copy.copy(model)"},{"line_number":1285,"context_line":"                vol_models.append(derp)"},{"line_number":1286,"context_line":"            return {\u0027status\u0027: \u0027available\u0027}, vol_models"},{"line_number":1287,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_f55a66f1","line":1284,"range":{"start_line":1284,"start_character":16,"end_line":1284,"end_character":20},"updated":"2015-12-19 16:25:00.000000000","message":"having with with variable names? :)","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"23a4f55ae49c33568319570cb57e0192b3c6f767","unresolved":false,"context_lines":[{"line_number":1281,"context_line":"                _data, _sfaccount, model \u003d self._do_clone_volume(snap[\u0027id\u0027],"},{"line_number":1282,"context_line":"                                                                 vol,"},{"line_number":1283,"context_line":"                                                                 sf_src_snap)"},{"line_number":1284,"context_line":"                derp \u003d copy.copy(model)"},{"line_number":1285,"context_line":"                vol_models.append(derp)"},{"line_number":1286,"context_line":"            return {\u0027status\u0027: \u0027available\u0027}, vol_models"},{"line_number":1287,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_7349a05f","line":1284,"range":{"start_line":1284,"start_character":16,"end_line":1284,"end_character":20},"in_reply_to":"3a7e1126_f55a66f1","updated":"2016-01-05 23:51:55.000000000","message":"Just a little bit. Derp was applicable here, had a derp moment around appending the multiple references to the same variable and ending up with a volume model update that contained duplicates of the last volume.","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ec252b3a0d55b2c6e9aa8e4d0a21fd7df75c51e3","unresolved":false,"context_lines":[{"line_number":1302,"context_line":"                        vol,"},{"line_number":1303,"context_line":"                        sf_src_snap)"},{"line_number":1304,"context_line":"                    derp \u003d copy.copy(model)"},{"line_number":1305,"context_line":"                    vol_models.append(derp)"},{"line_number":1306,"context_line":"            finally:"},{"line_number":1307,"context_line":"                self._delete_cgsnapshot_by_name(gsnap_name)"},{"line_number":1308,"context_line":"            return {\u0027status\u0027: \u0027available\u0027}, vol_models"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_4416394d","line":1305,"updated":"2015-12-18 22:44:39.000000000","message":"Lines 1297-1305 look the same as lines 1279-1285.  Can you put it in an internal function to reduce some redundant code?","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"23a4f55ae49c33568319570cb57e0192b3c6f767","unresolved":false,"context_lines":[{"line_number":1302,"context_line":"                        vol,"},{"line_number":1303,"context_line":"                        sf_src_snap)"},{"line_number":1304,"context_line":"                    derp \u003d copy.copy(model)"},{"line_number":1305,"context_line":"                    vol_models.append(derp)"},{"line_number":1306,"context_line":"            finally:"},{"line_number":1307,"context_line":"                self._delete_cgsnapshot_by_name(gsnap_name)"},{"line_number":1308,"context_line":"            return {\u0027status\u0027: \u0027available\u0027}, vol_models"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_0b0ca839","line":1305,"in_reply_to":"3a7e1126_4416394d","updated":"2016-01-05 23:51:55.000000000","message":"I had not thrown the duplication into a helper as the space saving was trivial and I wasn\u0027t too worried about maintenance considering the close proximity. Threw it into a helper for you and verified works as intended.","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ec252b3a0d55b2c6e9aa8e4d0a21fd7df75c51e3","unresolved":false,"context_lines":[{"line_number":1317,"context_line":"        if len(snapshots) !\u003d len(target_vols):"},{"line_number":1318,"context_line":"            msg \u003d (\"Retrieved a different amount of SolidFire volumes for the\""},{"line_number":1319,"context_line":"                   \"provided Cinder snapshots. Retrieved: {}\""},{"line_number":1320,"context_line":"                   \"Desired: {}\".format(len(target_vols),"},{"line_number":1321,"context_line":"                                        len(snapshots)))"},{"line_number":1322,"context_line":"            raise exception.SolidFireDriverException(msg)"},{"line_number":1323,"context_line":"        snap_name \u003d self.configuration.sf_volume_prefix + cgsnapshot[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_443dd9c2","line":1320,"updated":"2015-12-18 22:44:39.000000000","message":"keyword parameters please.","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"23a4f55ae49c33568319570cb57e0192b3c6f767","unresolved":false,"context_lines":[{"line_number":1317,"context_line":"        if len(snapshots) !\u003d len(target_vols):"},{"line_number":1318,"context_line":"            msg \u003d (\"Retrieved a different amount of SolidFire volumes for the\""},{"line_number":1319,"context_line":"                   \"provided Cinder snapshots. Retrieved: {}\""},{"line_number":1320,"context_line":"                   \"Desired: {}\".format(len(target_vols),"},{"line_number":1321,"context_line":"                                        len(snapshots)))"},{"line_number":1322,"context_line":"            raise exception.SolidFireDriverException(msg)"},{"line_number":1323,"context_line":"        snap_name \u003d self.configuration.sf_volume_prefix + cgsnapshot[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_6e60d2cf","line":1320,"in_reply_to":"3a7e1126_443dd9c2","updated":"2016-01-05 23:51:55.000000000","message":"Done","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ec252b3a0d55b2c6e9aa8e4d0a21fd7df75c51e3","unresolved":false,"context_lines":[{"line_number":1325,"context_line":"        return None, None"},{"line_number":1326,"context_line":""},{"line_number":1327,"context_line":"    def update_consistencygroup(self, context, group,"},{"line_number":1328,"context_line":"                                add_volumes\u003dNone, remove_volumes\u003dNone):"},{"line_number":1329,"context_line":"        return None, None, None"},{"line_number":1330,"context_line":""},{"line_number":1331,"context_line":"    def delete_cgsnapshot(self, ctxt, cgsnapshot, snapshots):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_4444f948","line":1328,"updated":"2015-12-18 22:44:39.000000000","message":"Can you add some explanation here on why this just returns None, None, None without making any calls to the backend?","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"23a4f55ae49c33568319570cb57e0192b3c6f767","unresolved":false,"context_lines":[{"line_number":1325,"context_line":"        return None, None"},{"line_number":1326,"context_line":""},{"line_number":1327,"context_line":"    def update_consistencygroup(self, context, group,"},{"line_number":1328,"context_line":"                                add_volumes\u003dNone, remove_volumes\u003dNone):"},{"line_number":1329,"context_line":"        return None, None, None"},{"line_number":1330,"context_line":""},{"line_number":1331,"context_line":"    def delete_cgsnapshot(self, ctxt, cgsnapshot, snapshots):"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_ce677ee7","line":1328,"in_reply_to":"3a7e1126_4444f948","updated":"2016-01-05 23:51:55.000000000","message":"SolidFire doesn\u0027t actually have a way to track a consistency group. We only have consistent group(multi-volume) snapshots. Because of this a lot of the typical calls by other arrays end up as no-ops in our driver. There are some frustrating downsides to SolidFire\u0027s implementation as can be seen in create_consistencygroup_from_src where I have to query the array a few times to figure out what I should be cloning. I mentioned this in the comment for create_consistencygroup, if there is a better place for it let me know.","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"89b8e96ff89dbbd2fe65a1925b3d41dfc708dfba","unresolved":false,"context_lines":[{"line_number":1334,"context_line":"        return None, None"},{"line_number":1335,"context_line":""},{"line_number":1336,"context_line":"    def delete_consistencygroup(self, ctxt, group, volumes):"},{"line_number":1337,"context_line":"        for vol in volumes:"},{"line_number":1338,"context_line":"            self.delete_volume(vol)"},{"line_number":1339,"context_line":"        return None, None"},{"line_number":1340,"context_line":""},{"line_number":1341,"context_line":"    def get_volume_stats(self, refresh\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_a95d787a","line":1338,"range":{"start_line":1337,"start_character":1,"end_line":1338,"end_character":35},"updated":"2015-12-18 22:17:57.000000000","message":"This might actually be unnecessary, I think if you delete a consisgroup with --force it might call into delete anyways? Need to test, didn\u0027t think of this while I was running system tests.","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"23a4f55ae49c33568319570cb57e0192b3c6f767","unresolved":false,"context_lines":[{"line_number":1334,"context_line":"        return None, None"},{"line_number":1335,"context_line":""},{"line_number":1336,"context_line":"    def delete_consistencygroup(self, ctxt, group, volumes):"},{"line_number":1337,"context_line":"        for vol in volumes:"},{"line_number":1338,"context_line":"            self.delete_volume(vol)"},{"line_number":1339,"context_line":"        return None, None"},{"line_number":1340,"context_line":""},{"line_number":1341,"context_line":"    def get_volume_stats(self, refresh\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_0b158847","line":1338,"range":{"start_line":1337,"start_character":1,"end_line":1338,"end_character":35},"in_reply_to":"3a7e1126_556a5a82","updated":"2016-01-05 23:51:55.000000000","message":"Yup, verified, thanks!","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"b21911b950f523c5c51232f255dfd6734ee58c06","unresolved":false,"context_lines":[{"line_number":1334,"context_line":"        return None, None"},{"line_number":1335,"context_line":""},{"line_number":1336,"context_line":"    def delete_consistencygroup(self, ctxt, group, volumes):"},{"line_number":1337,"context_line":"        for vol in volumes:"},{"line_number":1338,"context_line":"            self.delete_volume(vol)"},{"line_number":1339,"context_line":"        return None, None"},{"line_number":1340,"context_line":""},{"line_number":1341,"context_line":"    def get_volume_stats(self, refresh\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_556a5a82","line":1338,"range":{"start_line":1337,"start_character":1,"end_line":1338,"end_character":35},"in_reply_to":"3a7e1126_a95d787a","updated":"2015-12-19 16:25:00.000000000","message":"This is not needed. --force will delete the volumes.","commit_id":"7064ad2d887d82ba20aabd5b273698b5058dd1ca"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"e25fd6d92c4d87bc10eb8a3ac677f16e87e14caf","unresolved":false,"context_lines":[{"line_number":1333,"context_line":""},{"line_number":1334,"context_line":"    def update_consistencygroup(self, context, group,"},{"line_number":1335,"context_line":"                                add_volumes\u003dNone, remove_volumes\u003dNone):"},{"line_number":1336,"context_line":"        return None, None, None"},{"line_number":1337,"context_line":""},{"line_number":1338,"context_line":"    def delete_cgsnapshot(self, ctxt, cgsnapshot, snapshots):"},{"line_number":1339,"context_line":"        snap_name \u003d self.configuration.sf_volume_prefix + cgsnapshot[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_c1e66f14","line":1336,"range":{"start_line":1336,"start_character":8,"end_line":1336,"end_character":31},"updated":"2016-01-06 00:12:37.000000000","message":"Can you make a comment in this function that says why it is just returning None, None, None. I saw you clarified why in the previous patch set, but I think having a comment in code would help as well.","commit_id":"d537f98fa9f8d393a1a2eb7a36d147115da0c837"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"4fba1dae11967b709f5ec2ad04c207f52d9d7e90","unresolved":false,"context_lines":[{"line_number":1333,"context_line":""},{"line_number":1334,"context_line":"    def update_consistencygroup(self, context, group,"},{"line_number":1335,"context_line":"                                add_volumes\u003dNone, remove_volumes\u003dNone):"},{"line_number":1336,"context_line":"        return None, None, None"},{"line_number":1337,"context_line":""},{"line_number":1338,"context_line":"    def delete_cgsnapshot(self, ctxt, cgsnapshot, snapshots):"},{"line_number":1339,"context_line":"        snap_name \u003d self.configuration.sf_volume_prefix + cgsnapshot[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_13083227","line":1336,"range":{"start_line":1336,"start_character":8,"end_line":1336,"end_character":31},"in_reply_to":"fa69d971_ba958833","updated":"2016-01-06 21:19:47.000000000","message":"Added the following comment:\n\nSimilar to create_consistencygroup, SolidFire\u0027s lack of a consistency group object means there is nothing to update on the cluster.","commit_id":"d537f98fa9f8d393a1a2eb7a36d147115da0c837"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"75c200aa66ee667e5638f85645c45b2b787dfaa6","unresolved":false,"context_lines":[{"line_number":1333,"context_line":""},{"line_number":1334,"context_line":"    def update_consistencygroup(self, context, group,"},{"line_number":1335,"context_line":"                                add_volumes\u003dNone, remove_volumes\u003dNone):"},{"line_number":1336,"context_line":"        return None, None, None"},{"line_number":1337,"context_line":""},{"line_number":1338,"context_line":"    def delete_cgsnapshot(self, ctxt, cgsnapshot, snapshots):"},{"line_number":1339,"context_line":"        snap_name \u003d self.configuration.sf_volume_prefix + cgsnapshot[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_ba958833","line":1336,"range":{"start_line":1336,"start_character":8,"end_line":1336,"end_character":31},"in_reply_to":"fa69d971_c1e66f14","updated":"2016-01-06 17:02:27.000000000","message":"+1","commit_id":"d537f98fa9f8d393a1a2eb7a36d147115da0c837"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"e25fd6d92c4d87bc10eb8a3ac677f16e87e14caf","unresolved":false,"context_lines":[{"line_number":1340,"context_line":"        self._delete_cgsnapshot_by_name(snap_name)"},{"line_number":1341,"context_line":"        return None, None"},{"line_number":1342,"context_line":""},{"line_number":1343,"context_line":"    def delete_consistencygroup(self, ctxt, group, volumes):"},{"line_number":1344,"context_line":"        return None, None"},{"line_number":1345,"context_line":""},{"line_number":1346,"context_line":"    def get_volume_stats(self, refresh\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_c14aef25","line":1343,"range":{"start_line":1343,"start_character":4,"end_line":1343,"end_character":60},"updated":"2016-01-06 00:12:37.000000000","message":"After looking at this again and revisiting my comment in the previous patch set, I think I was mistaken. \n\nThe manager will only delete the volume at the Cinder level. It does not call into delete_volume for the driver, which is what deletes the volume on the backend array. You will probably need to add the delete_volume call (or at least a call to the array to delete each volume) if you want the volume to be removed on the backend as well.","commit_id":"d537f98fa9f8d393a1a2eb7a36d147115da0c837"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"4fba1dae11967b709f5ec2ad04c207f52d9d7e90","unresolved":false,"context_lines":[{"line_number":1340,"context_line":"        self._delete_cgsnapshot_by_name(snap_name)"},{"line_number":1341,"context_line":"        return None, None"},{"line_number":1342,"context_line":""},{"line_number":1343,"context_line":"    def delete_consistencygroup(self, ctxt, group, volumes):"},{"line_number":1344,"context_line":"        return None, None"},{"line_number":1345,"context_line":""},{"line_number":1346,"context_line":"    def get_volume_stats(self, refresh\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_3359b635","line":1343,"range":{"start_line":1343,"start_character":4,"end_line":1343,"end_character":60},"in_reply_to":"fa69d971_bae348d8","updated":"2016-01-06 21:19:47.000000000","message":"Yup, you guys are correct. I hadn\u0027t checked on the cluster, just verified on cinder, my mistake. Reverted and verified on both cinder and the cluster.","commit_id":"d537f98fa9f8d393a1a2eb7a36d147115da0c837"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"75c200aa66ee667e5638f85645c45b2b787dfaa6","unresolved":false,"context_lines":[{"line_number":1340,"context_line":"        self._delete_cgsnapshot_by_name(snap_name)"},{"line_number":1341,"context_line":"        return None, None"},{"line_number":1342,"context_line":""},{"line_number":1343,"context_line":"    def delete_consistencygroup(self, ctxt, group, volumes):"},{"line_number":1344,"context_line":"        return None, None"},{"line_number":1345,"context_line":""},{"line_number":1346,"context_line":"    def get_volume_stats(self, refresh\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_bae348d8","line":1343,"range":{"start_line":1343,"start_character":4,"end_line":1343,"end_character":60},"in_reply_to":"fa69d971_c14aef25","updated":"2016-01-06 17:02:27.000000000","message":"Alex is right.  The volumes should be deleted from the backend when CG is deleted.  Otherwise you\u0027ll end up with unmanaged volumes.","commit_id":"d537f98fa9f8d393a1a2eb7a36d147115da0c837"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"ba5cca7c522ad08e2aa897725e0200c59cbdaea6","unresolved":false,"context_lines":[{"line_number":814,"context_line":"            sf_account \u003d self._get_account_create_availability(sf_accounts)"},{"line_number":815,"context_line":"            if not sf_account:"},{"line_number":816,"context_line":"                # TODO(jdg): We\u0027re not doing tertiaries, so fail."},{"line_number":817,"context_line":"                msg \u003d _(\u0027volumes/account exceeded on both primary and \u0027"},{"line_number":818,"context_line":"                        \u0027secondary SolidFire accounts.\u0027)"},{"line_number":819,"context_line":"                raise exception.SolidFireDriverException(msg)"},{"line_number":820,"context_line":"        return sf_account"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_a57f9913","line":817,"updated":"2016-01-06 22:02:16.000000000","message":"Start with uppercase V if you need to do another update, but not critical.","commit_id":"918f3168323d3afa7873578c484405c35d772aff"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"7b61c9268c25e82fa9e59af45456d14ca1bef8a9","unresolved":false,"context_lines":[{"line_number":814,"context_line":"            sf_account \u003d self._get_account_create_availability(sf_accounts)"},{"line_number":815,"context_line":"            if not sf_account:"},{"line_number":816,"context_line":"                # TODO(jdg): We\u0027re not doing tertiaries, so fail."},{"line_number":817,"context_line":"                msg \u003d _(\u0027volumes/account exceeded on both primary and \u0027"},{"line_number":818,"context_line":"                        \u0027secondary SolidFire accounts.\u0027)"},{"line_number":819,"context_line":"                raise exception.SolidFireDriverException(msg)"},{"line_number":820,"context_line":"        return sf_account"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_a8d450eb","line":817,"in_reply_to":"fa69d971_a57f9913","updated":"2016-01-06 22:34:16.000000000","message":"Done","commit_id":"918f3168323d3afa7873578c484405c35d772aff"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"ba5cca7c522ad08e2aa897725e0200c59cbdaea6","unresolved":false,"context_lines":[{"line_number":1203,"context_line":"        target_vols \u003d [vol for vol in active_sf_vols"},{"line_number":1204,"context_line":"                       if vol[\u0027name\u0027] in vol_names]"},{"line_number":1205,"context_line":"        if len(src_vol_ids) !\u003d len(target_vols):"},{"line_number":1206,"context_line":"            msg \u003d (\"Retrieved a different amount of SolidFire volumes for the\""},{"line_number":1207,"context_line":"                   \"provided Cinder volumes. Retrieved: %(ret)s\""},{"line_number":1208,"context_line":"                   \"Desired: %(des)s\" % {\"ret\": len(target_vols),"},{"line_number":1209,"context_line":"                                         \"des\": len(src_vol_ids)})"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_05b225e5","line":1206,"updated":"2016-01-06 22:02:16.000000000","message":"Need space at the end so it doesn\u0027t run together with the next line.\n\nAlso needs _() translation marker around the text.","commit_id":"918f3168323d3afa7873578c484405c35d772aff"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"7b61c9268c25e82fa9e59af45456d14ca1bef8a9","unresolved":false,"context_lines":[{"line_number":1203,"context_line":"        target_vols \u003d [vol for vol in active_sf_vols"},{"line_number":1204,"context_line":"                       if vol[\u0027name\u0027] in vol_names]"},{"line_number":1205,"context_line":"        if len(src_vol_ids) !\u003d len(target_vols):"},{"line_number":1206,"context_line":"            msg \u003d (\"Retrieved a different amount of SolidFire volumes for the\""},{"line_number":1207,"context_line":"                   \"provided Cinder volumes. Retrieved: %(ret)s\""},{"line_number":1208,"context_line":"                   \"Desired: %(des)s\" % {\"ret\": len(target_vols),"},{"line_number":1209,"context_line":"                                         \"des\": len(src_vol_ids)})"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_08b8fc73","line":1206,"in_reply_to":"fa69d971_05b225e5","updated":"2016-01-06 22:34:16.000000000","message":"Done","commit_id":"918f3168323d3afa7873578c484405c35d772aff"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"ba5cca7c522ad08e2aa897725e0200c59cbdaea6","unresolved":false,"context_lines":[{"line_number":1204,"context_line":"                       if vol[\u0027name\u0027] in vol_names]"},{"line_number":1205,"context_line":"        if len(src_vol_ids) !\u003d len(target_vols):"},{"line_number":1206,"context_line":"            msg \u003d (\"Retrieved a different amount of SolidFire volumes for the\""},{"line_number":1207,"context_line":"                   \"provided Cinder volumes. Retrieved: %(ret)s\""},{"line_number":1208,"context_line":"                   \"Desired: %(des)s\" % {\"ret\": len(target_vols),"},{"line_number":1209,"context_line":"                                         \"des\": len(src_vol_ids)})"},{"line_number":1210,"context_line":"            raise exception.SolidFireDriverException(msg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_a5cd5967","line":1207,"updated":"2016-01-06 22:02:16.000000000","message":"Same.","commit_id":"918f3168323d3afa7873578c484405c35d772aff"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"7b61c9268c25e82fa9e59af45456d14ca1bef8a9","unresolved":false,"context_lines":[{"line_number":1204,"context_line":"                       if vol[\u0027name\u0027] in vol_names]"},{"line_number":1205,"context_line":"        if len(src_vol_ids) !\u003d len(target_vols):"},{"line_number":1206,"context_line":"            msg \u003d (\"Retrieved a different amount of SolidFire volumes for the\""},{"line_number":1207,"context_line":"                   \"provided Cinder volumes. Retrieved: %(ret)s\""},{"line_number":1208,"context_line":"                   \"Desired: %(des)s\" % {\"ret\": len(target_vols),"},{"line_number":1209,"context_line":"                                         \"des\": len(src_vol_ids)})"},{"line_number":1210,"context_line":"            raise exception.SolidFireDriverException(msg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_e8b48882","line":1207,"in_reply_to":"fa69d971_a5cd5967","updated":"2016-01-06 22:34:16.000000000","message":"Done","commit_id":"918f3168323d3afa7873578c484405c35d772aff"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"ba5cca7c522ad08e2aa897725e0200c59cbdaea6","unresolved":false,"context_lines":[{"line_number":1244,"context_line":"        # Common function used to find and delete a snapshot."},{"line_number":1245,"context_line":"        target \u003d self._get_group_snapshot_by_name(snap_name)"},{"line_number":1246,"context_line":"        if not target:"},{"line_number":1247,"context_line":"            msg \u003d \"Failed to find group snapshot named: %s\" % snap_name"},{"line_number":1248,"context_line":"            raise exception.SolidFireDriverException(msg)"},{"line_number":1249,"context_line":"        self._delete_group_snapshot(target[\u0027groupSnapshotID\u0027])"},{"line_number":1250,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_a5d479eb","line":1247,"updated":"2016-01-06 22:02:16.000000000","message":"Needs _()","commit_id":"918f3168323d3afa7873578c484405c35d772aff"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"7b61c9268c25e82fa9e59af45456d14ca1bef8a9","unresolved":false,"context_lines":[{"line_number":1244,"context_line":"        # Common function used to find and delete a snapshot."},{"line_number":1245,"context_line":"        target \u003d self._get_group_snapshot_by_name(snap_name)"},{"line_number":1246,"context_line":"        if not target:"},{"line_number":1247,"context_line":"            msg \u003d \"Failed to find group snapshot named: %s\" % snap_name"},{"line_number":1248,"context_line":"            raise exception.SolidFireDriverException(msg)"},{"line_number":1249,"context_line":"        self._delete_group_snapshot(target[\u0027groupSnapshotID\u0027])"},{"line_number":1250,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_28bf0062","line":1247,"in_reply_to":"fa69d971_a5d479eb","updated":"2016-01-06 22:34:16.000000000","message":"Done","commit_id":"918f3168323d3afa7873578c484405c35d772aff"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"ba5cca7c522ad08e2aa897725e0200c59cbdaea6","unresolved":false,"context_lines":[{"line_number":1322,"context_line":"        target_vols \u003d [vol for vol in active_sf_vols"},{"line_number":1323,"context_line":"                       if vol[\u0027name\u0027] in vol_names]"},{"line_number":1324,"context_line":"        if len(snapshots) !\u003d len(target_vols):"},{"line_number":1325,"context_line":"            msg \u003d (\"Retrieved a different amount of SolidFire volumes for the\""},{"line_number":1326,"context_line":"                   \"provided Cinder snapshots. Retrieved: {}\""},{"line_number":1327,"context_line":"                   \"Desired: {}\".format(len(target_vols),"},{"line_number":1328,"context_line":"                                        len(snapshots)))"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_a5fb1978","line":1325,"updated":"2016-01-06 22:02:16.000000000","message":"Needs _()","commit_id":"918f3168323d3afa7873578c484405c35d772aff"},{"author":{"_account_id":16100,"name":"Chris Morrell","username":"chrismorrell","inactive":true},"change_message_id":"7b61c9268c25e82fa9e59af45456d14ca1bef8a9","unresolved":false,"context_lines":[{"line_number":1322,"context_line":"        target_vols \u003d [vol for vol in active_sf_vols"},{"line_number":1323,"context_line":"                       if vol[\u0027name\u0027] in vol_names]"},{"line_number":1324,"context_line":"        if len(snapshots) !\u003d len(target_vols):"},{"line_number":1325,"context_line":"            msg \u003d (\"Retrieved a different amount of SolidFire volumes for the\""},{"line_number":1326,"context_line":"                   \"provided Cinder snapshots. Retrieved: {}\""},{"line_number":1327,"context_line":"                   \"Desired: {}\".format(len(target_vols),"},{"line_number":1328,"context_line":"                                        len(snapshots)))"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_888dccd4","line":1325,"in_reply_to":"fa69d971_a5fb1978","updated":"2016-01-06 22:34:16.000000000","message":"Done","commit_id":"918f3168323d3afa7873578c484405c35d772aff"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"06350ac805b04c216f56df525ddda1bb84488b0f","unresolved":false,"context_lines":[{"line_number":1322,"context_line":"        target_vols \u003d [vol for vol in active_sf_vols"},{"line_number":1323,"context_line":"                       if vol[\u0027name\u0027] in vol_names]"},{"line_number":1324,"context_line":"        if len(snapshots) !\u003d len(target_vols):"},{"line_number":1325,"context_line":"            msg \u003d (_(\"Retrieved a different amount of SolidFire volumes for \""},{"line_number":1326,"context_line":"                     \"the provided Cinder snapshots. Retrieved: %(ret)s \""},{"line_number":1327,"context_line":"                     \"Desired: %(des)s\") % {\"ret\": len(target_vols),"},{"line_number":1328,"context_line":"                                            \"des\": len(snapshots)})"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_be3faab2","line":1325,"range":{"start_line":1325,"start_character":44,"end_line":1325,"end_character":50},"updated":"2016-01-06 23:07:19.000000000","message":"number than expected :)","commit_id":"d55541c4dae2f36025ea73bc63242a8bf3c592d0"}]}
