)]}'
{"tempest/api/volume/admin/test_groups.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"1b7fca4460ca06efe079a4e14c074500c0cb60c5","unresolved":false,"context_lines":[{"line_number":142,"context_line":"            self.admin_groups_client, grp[\u0027id\u0027], \u0027available\u0027)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        # Create volume"},{"line_number":145,"context_line":"        vol_name \u003d data_utils.rand_name(\"volume\")"},{"line_number":146,"context_line":"        params \u003d {\u0027name\u0027: vol_name,"},{"line_number":147,"context_line":"                  \u0027volume_type\u0027: volume_type[\u0027id\u0027],"},{"line_number":148,"context_line":"                  \u0027group_id\u0027: grp[\u0027id\u0027],"},{"line_number":149,"context_line":"                  \u0027size\u0027: CONF.volume.volume_size}"},{"line_number":150,"context_line":"        vol \u003d self.admin_volume_client.create_volume(**params)[\u0027volume\u0027]"},{"line_number":151,"context_line":"        waiters.wait_for_volume_resource_status("},{"line_number":152,"context_line":"            self.admin_volume_client, vol[\u0027id\u0027], \u0027available\u0027)"},{"line_number":153,"context_line":"        self.addCleanup(self._delete_group, grp[\u0027id\u0027])"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        # Create group snapshot"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f1d235d_0db47e34","line":152,"range":{"start_line":145,"start_character":8,"end_line":152,"end_character":61},"updated":"2017-07-02 07:08:29.000000000","message":"Why not use create_volume in base volume class?","commit_id":"63b259e31b7f659110a304a484b9e13ca4179077"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b711e2dcce0c967de37aeea8222b15513999d8e8","unresolved":false,"context_lines":[{"line_number":142,"context_line":"            self.admin_groups_client, grp[\u0027id\u0027], \u0027available\u0027)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        # Create volume"},{"line_number":145,"context_line":"        vol_name \u003d data_utils.rand_name(\"volume\")"},{"line_number":146,"context_line":"        params \u003d {\u0027name\u0027: vol_name,"},{"line_number":147,"context_line":"                  \u0027volume_type\u0027: volume_type[\u0027id\u0027],"},{"line_number":148,"context_line":"                  \u0027group_id\u0027: grp[\u0027id\u0027],"},{"line_number":149,"context_line":"                  \u0027size\u0027: CONF.volume.volume_size}"},{"line_number":150,"context_line":"        vol \u003d self.admin_volume_client.create_volume(**params)[\u0027volume\u0027]"},{"line_number":151,"context_line":"        waiters.wait_for_volume_resource_status("},{"line_number":152,"context_line":"            self.admin_volume_client, vol[\u0027id\u0027], \u0027available\u0027)"},{"line_number":153,"context_line":"        self.addCleanup(self._delete_group, grp[\u0027id\u0027])"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        # Create group snapshot"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f1d235d_dafb3ebb","line":152,"range":{"start_line":145,"start_character":8,"end_line":152,"end_character":61},"in_reply_to":"3f1d235d_0db47e34","updated":"2017-07-08 01:53:02.000000000","message":"I tried using create_volume in the base volume class but it didn\u0027t work because create_volume in the base class and self.admin_groups_client.create_group are sending requests using different tenant ids.  As a result, in create_volume, Cinder can\u0027t find the group_id passed in because it is created by a different tenant.\n\nPOST http://192.168.92.129:8776/v3/ad8434c603a447f7b9a182686b91d847/groups\n\nPOST http://192.168.92.129:8776/v3/0926adc461f240eeb673c959a6721a8c/volumes","commit_id":"63b259e31b7f659110a304a484b9e13ca4179077"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"5e3e06af34bc107d2cf3cbedbf34af62ec837424","unresolved":false,"context_lines":[{"line_number":142,"context_line":"            self.admin_groups_client, grp[\u0027id\u0027], \u0027available\u0027)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        # Create volume"},{"line_number":145,"context_line":"        vol_name \u003d data_utils.rand_name(\"volume\")"},{"line_number":146,"context_line":"        params \u003d {\u0027name\u0027: vol_name,"},{"line_number":147,"context_line":"                  \u0027volume_type\u0027: volume_type[\u0027id\u0027],"},{"line_number":148,"context_line":"                  \u0027group_id\u0027: grp[\u0027id\u0027],"},{"line_number":149,"context_line":"                  \u0027size\u0027: CONF.volume.volume_size}"},{"line_number":150,"context_line":"        vol \u003d self.admin_volume_client.create_volume(**params)[\u0027volume\u0027]"},{"line_number":151,"context_line":"        waiters.wait_for_volume_resource_status("},{"line_number":152,"context_line":"            self.admin_volume_client, vol[\u0027id\u0027], \u0027available\u0027)"},{"line_number":153,"context_line":"        self.addCleanup(self._delete_group, grp[\u0027id\u0027])"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        # Create group snapshot"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f1d235d_f53380f5","line":152,"range":{"start_line":145,"start_character":8,"end_line":152,"end_character":61},"in_reply_to":"3f1d235d_dafb3ebb","updated":"2017-07-08 02:08:04.000000000","message":"I believe you can get around that by doing:\n\n@classmethod\ndef skip_checks(cls):\n    super(...).skip_checks()\n    cls.volumes_client \u003d cls.admin_volume_client\n\nThat will ensure that cls.volumes_client.create_volume() in create_volume in the base volume class will use the admin tenant id.","commit_id":"63b259e31b7f659110a304a484b9e13ca4179077"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"7f560fb3c1178b7f3e812eaded7897795bea8e57","unresolved":false,"context_lines":[{"line_number":142,"context_line":"            self.admin_groups_client, grp[\u0027id\u0027], \u0027available\u0027)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        # Create volume"},{"line_number":145,"context_line":"        vol_name \u003d data_utils.rand_name(\"volume\")"},{"line_number":146,"context_line":"        params \u003d {\u0027name\u0027: vol_name,"},{"line_number":147,"context_line":"                  \u0027volume_type\u0027: volume_type[\u0027id\u0027],"},{"line_number":148,"context_line":"                  \u0027group_id\u0027: grp[\u0027id\u0027],"},{"line_number":149,"context_line":"                  \u0027size\u0027: CONF.volume.volume_size}"},{"line_number":150,"context_line":"        vol \u003d self.admin_volume_client.create_volume(**params)[\u0027volume\u0027]"},{"line_number":151,"context_line":"        waiters.wait_for_volume_resource_status("},{"line_number":152,"context_line":"            self.admin_volume_client, vol[\u0027id\u0027], \u0027available\u0027)"},{"line_number":153,"context_line":"        self.addCleanup(self._delete_group, grp[\u0027id\u0027])"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        # Create group snapshot"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f1d235d_4d6f4c92","line":152,"range":{"start_line":145,"start_character":8,"end_line":152,"end_character":61},"in_reply_to":"3f1d235d_f53380f5","updated":"2017-07-08 13:17:52.000000000","message":"I tried but got the following error:\n\nERROR: setUpClass (tempest.api.volume.admin.test_groups.GroupsTest)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n  File \"tempest/test.py\", line 228, in setUpClass\n    cls.skip_checks()\n  File \"tempest/api/volume/admin/test_groups.py\", line 33, in skip_checks\n    cls.volumes_client \u003d cls.admin_volume_client\nAttributeError: type object \u0027GroupsTest\u0027 has no attribute \u0027admin_volume_client\u0027\n\nSo skip_checks is called before the volume_client is initialized.  Changed to resource_setup and that worked.","commit_id":"63b259e31b7f659110a304a484b9e13ca4179077"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"1b7fca4460ca06efe079a4e14c074500c0cb60c5","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        vol \u003d self.admin_volume_client.create_volume(**params)[\u0027volume\u0027]"},{"line_number":151,"context_line":"        waiters.wait_for_volume_resource_status("},{"line_number":152,"context_line":"            self.admin_volume_client, vol[\u0027id\u0027], \u0027available\u0027)"},{"line_number":153,"context_line":"        self.addCleanup(self._delete_group, grp[\u0027id\u0027])"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        # Create group snapshot"},{"line_number":156,"context_line":"        group_snapshot_name \u003d data_utils.rand_name(\u0027group_snapshot\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f1d235d_ed84a260","line":153,"range":{"start_line":153,"start_character":8,"end_line":153,"end_character":54},"updated":"2017-07-02 07:08:29.000000000","message":"Should be on L143.","commit_id":"63b259e31b7f659110a304a484b9e13ca4179077"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"5e3e06af34bc107d2cf3cbedbf34af62ec837424","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        vol \u003d self.admin_volume_client.create_volume(**params)[\u0027volume\u0027]"},{"line_number":151,"context_line":"        waiters.wait_for_volume_resource_status("},{"line_number":152,"context_line":"            self.admin_volume_client, vol[\u0027id\u0027], \u0027available\u0027)"},{"line_number":153,"context_line":"        self.addCleanup(self._delete_group, grp[\u0027id\u0027])"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        # Create group snapshot"},{"line_number":156,"context_line":"        group_snapshot_name \u003d data_utils.rand_name(\u0027group_snapshot\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f1d235d_9579ec94","line":153,"range":{"start_line":153,"start_character":8,"end_line":153,"end_character":54},"in_reply_to":"3f1d235d_1a6776eb","updated":"2017-07-08 02:08:04.000000000","message":"Well, the way it is now has 2 cases:\n\n1) You create a group and then you have an error before L153 -- unfortunately, the group isn\u0027t cleaned up because L153 was never executed. This is bad.\n\n2) You create a group and everything works until L153. This is good.\n\nThe way I\u0027m suggesting has 2 cases:\n\n1) You create a group, execute addCleanup for the group on L140 and then create the volumes. At the end of the test, the clean up is run as usual. So this is good.\n\n2) You create a group, execute addCleanup for the group on L140 and then an error happens before volumes are created. This is also good because the group is cleaned up anyway.\n\nSo the 2nd scenario is better.","commit_id":"63b259e31b7f659110a304a484b9e13ca4179077"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"7f560fb3c1178b7f3e812eaded7897795bea8e57","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        vol \u003d self.admin_volume_client.create_volume(**params)[\u0027volume\u0027]"},{"line_number":151,"context_line":"        waiters.wait_for_volume_resource_status("},{"line_number":152,"context_line":"            self.admin_volume_client, vol[\u0027id\u0027], \u0027available\u0027)"},{"line_number":153,"context_line":"        self.addCleanup(self._delete_group, grp[\u0027id\u0027])"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        # Create group snapshot"},{"line_number":156,"context_line":"        group_snapshot_name \u003d data_utils.rand_name(\u0027group_snapshot\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f1d235d_8d5d64eb","line":153,"range":{"start_line":153,"start_character":8,"end_line":153,"end_character":54},"in_reply_to":"3f1d235d_9579ec94","updated":"2017-07-08 13:17:52.000000000","message":"Done","commit_id":"63b259e31b7f659110a304a484b9e13ca4179077"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b711e2dcce0c967de37aeea8222b15513999d8e8","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        vol \u003d self.admin_volume_client.create_volume(**params)[\u0027volume\u0027]"},{"line_number":151,"context_line":"        waiters.wait_for_volume_resource_status("},{"line_number":152,"context_line":"            self.admin_volume_client, vol[\u0027id\u0027], \u0027available\u0027)"},{"line_number":153,"context_line":"        self.addCleanup(self._delete_group, grp[\u0027id\u0027])"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        # Create group snapshot"},{"line_number":156,"context_line":"        group_snapshot_name \u003d data_utils.rand_name(\u0027group_snapshot\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f1d235d_1a6776eb","line":153,"range":{"start_line":153,"start_character":8,"end_line":153,"end_character":54},"in_reply_to":"3f1d235d_ccebb775","updated":"2017-07-08 01:53:02.000000000","message":"So when delete_group is called, it will actually delete the group as well as all the volumes in the group.  That\u0027s why I thought I should addCleanup after all volumes have been created in the group.","commit_id":"63b259e31b7f659110a304a484b9e13ca4179077"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"41c435829696d42857f2b379cf14957a92962d18","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        vol \u003d self.admin_volume_client.create_volume(**params)[\u0027volume\u0027]"},{"line_number":151,"context_line":"        waiters.wait_for_volume_resource_status("},{"line_number":152,"context_line":"            self.admin_volume_client, vol[\u0027id\u0027], \u0027available\u0027)"},{"line_number":153,"context_line":"        self.addCleanup(self._delete_group, grp[\u0027id\u0027])"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        # Create group snapshot"},{"line_number":156,"context_line":"        group_snapshot_name \u003d data_utils.rand_name(\u0027group_snapshot\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f1d235d_ccebb775","line":153,"range":{"start_line":153,"start_character":8,"end_line":153,"end_character":54},"in_reply_to":"3f1d235d_ed84a260","updated":"2017-07-06 02:25:48.000000000","message":"I meant L140 -- right after resource creation.","commit_id":"63b259e31b7f659110a304a484b9e13ca4179077"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c51ac8e1980735f19e75427c1eca14654d94a90b","unresolved":false,"context_lines":[{"line_number":142,"context_line":"            group_type\u003dgroup_type[\u0027id\u0027],"},{"line_number":143,"context_line":"            volume_types\u003d[volume_type[\u0027id\u0027]],"},{"line_number":144,"context_line":"            name\u003dgrp_name)[\u0027group\u0027]"},{"line_number":145,"context_line":"        self.assertEqual(grp_name, grp[\u0027name\u0027])"},{"line_number":146,"context_line":"        waiters.wait_for_volume_resource_status("},{"line_number":147,"context_line":"            self.admin_groups_client, grp[\u0027id\u0027], \u0027available\u0027)"},{"line_number":148,"context_line":"        self.addCleanup(self._delete_group, grp[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_018d9b7a","line":145,"range":{"start_line":145,"start_character":8,"end_line":145,"end_character":47},"updated":"2017-07-09 16:23:28.000000000","message":"nit: It\u0027s safer to do this assertion after the addCleanup on L148.","commit_id":"69734c44f93b1a35cc3e4729cf736e90fb468f7d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2d38ab0d0f76a89ccd9f3c539852b2dfa7bb44a1","unresolved":false,"context_lines":[{"line_number":142,"context_line":"            group_type\u003dgroup_type[\u0027id\u0027],"},{"line_number":143,"context_line":"            volume_types\u003d[volume_type[\u0027id\u0027]],"},{"line_number":144,"context_line":"            name\u003dgrp_name)[\u0027group\u0027]"},{"line_number":145,"context_line":"        self.assertEqual(grp_name, grp[\u0027name\u0027])"},{"line_number":146,"context_line":"        waiters.wait_for_volume_resource_status("},{"line_number":147,"context_line":"            self.admin_groups_client, grp[\u0027id\u0027], \u0027available\u0027)"},{"line_number":148,"context_line":"        self.addCleanup(self._delete_group, grp[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"1f1a1f67_e013b465","line":145,"range":{"start_line":145,"start_character":8,"end_line":145,"end_character":47},"in_reply_to":"3f1d235d_018d9b7a","updated":"2017-07-13 03:28:23.000000000","message":"Done","commit_id":"69734c44f93b1a35cc3e4729cf736e90fb468f7d"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c51ac8e1980735f19e75427c1eca14654d94a90b","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        self.addCleanup(self._delete_group, grp[\u0027id\u0027])"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        # Create volume"},{"line_number":151,"context_line":"        vol \u003d self.create_volume(name\u003ddata_utils.rand_name(\"volume\"),"},{"line_number":152,"context_line":"                                 volume_type\u003dvolume_type[\u0027id\u0027],"},{"line_number":153,"context_line":"                                 group_id\u003dgrp[\u0027id\u0027],"},{"line_number":154,"context_line":"                                 size\u003dCONF.volume.volume_size)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_f24a6baa","line":151,"range":{"start_line":151,"start_character":33,"end_line":151,"end_character":68},"updated":"2017-07-09 16:23:28.000000000","message":"nit: This is automatically done in create_volume if name isn\u0027t specified.","commit_id":"69734c44f93b1a35cc3e4729cf736e90fb468f7d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2d38ab0d0f76a89ccd9f3c539852b2dfa7bb44a1","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        self.addCleanup(self._delete_group, grp[\u0027id\u0027])"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        # Create volume"},{"line_number":151,"context_line":"        vol \u003d self.create_volume(name\u003ddata_utils.rand_name(\"volume\"),"},{"line_number":152,"context_line":"                                 volume_type\u003dvolume_type[\u0027id\u0027],"},{"line_number":153,"context_line":"                                 group_id\u003dgrp[\u0027id\u0027],"},{"line_number":154,"context_line":"                                 size\u003dCONF.volume.volume_size)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1f1a1f67_6007a41e","line":151,"range":{"start_line":151,"start_character":33,"end_line":151,"end_character":68},"in_reply_to":"3f1d235d_f24a6baa","updated":"2017-07-13 03:28:23.000000000","message":"Done","commit_id":"69734c44f93b1a35cc3e4729cf736e90fb468f7d"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c51ac8e1980735f19e75427c1eca14654d94a90b","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        vol \u003d self.create_volume(name\u003ddata_utils.rand_name(\"volume\"),"},{"line_number":152,"context_line":"                                 volume_type\u003dvolume_type[\u0027id\u0027],"},{"line_number":153,"context_line":"                                 group_id\u003dgrp[\u0027id\u0027],"},{"line_number":154,"context_line":"                                 size\u003dCONF.volume.volume_size)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Create group snapshot"},{"line_number":157,"context_line":"        group_snapshot_name \u003d data_utils.rand_name(\u0027group_snapshot\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_124e07c1","line":154,"range":{"start_line":154,"start_character":33,"end_line":154,"end_character":61},"updated":"2017-07-09 16:23:28.000000000","message":"nit: This is used automatically in create_volume if size isn\u0027t specified.","commit_id":"69734c44f93b1a35cc3e4729cf736e90fb468f7d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2d38ab0d0f76a89ccd9f3c539852b2dfa7bb44a1","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        vol \u003d self.create_volume(name\u003ddata_utils.rand_name(\"volume\"),"},{"line_number":152,"context_line":"                                 volume_type\u003dvolume_type[\u0027id\u0027],"},{"line_number":153,"context_line":"                                 group_id\u003dgrp[\u0027id\u0027],"},{"line_number":154,"context_line":"                                 size\u003dCONF.volume.volume_size)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Create group snapshot"},{"line_number":157,"context_line":"        group_snapshot_name \u003d data_utils.rand_name(\u0027group_snapshot\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1f1a1f67_2bff4d02","line":154,"range":{"start_line":154,"start_character":33,"end_line":154,"end_character":61},"in_reply_to":"3f1d235d_124e07c1","updated":"2017-07-13 03:28:23.000000000","message":"Done","commit_id":"69734c44f93b1a35cc3e4729cf736e90fb468f7d"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c51ac8e1980735f19e75427c1eca14654d94a90b","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        self._delete_group_snapshot(group_snapshot[\u0027id\u0027], grp[\u0027id\u0027])"},{"line_number":186,"context_line":"        group_snapshots \u003d ("},{"line_number":187,"context_line":"            self.admin_group_snapshots_client.list_group_snapshots("},{"line_number":188,"context_line":"                detail\u003dTrue)[\u0027group_snapshots\u0027])"},{"line_number":189,"context_line":"        self.assertEmpty(group_snapshots)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_419393a4","line":188,"range":{"start_line":188,"start_character":16,"end_line":188,"end_character":27},"updated":"2017-07-09 16:23:28.000000000","message":"nit: Technically you don\u0027t need detail\u003dTrue, but L127-128 above already does it.","commit_id":"69734c44f93b1a35cc3e4729cf736e90fb468f7d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2d38ab0d0f76a89ccd9f3c539852b2dfa7bb44a1","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        self._delete_group_snapshot(group_snapshot[\u0027id\u0027], grp[\u0027id\u0027])"},{"line_number":186,"context_line":"        group_snapshots \u003d ("},{"line_number":187,"context_line":"            self.admin_group_snapshots_client.list_group_snapshots("},{"line_number":188,"context_line":"                detail\u003dTrue)[\u0027group_snapshots\u0027])"},{"line_number":189,"context_line":"        self.assertEmpty(group_snapshots)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1f1a1f67_8b38a1d3","line":188,"range":{"start_line":188,"start_character":16,"end_line":188,"end_character":27},"in_reply_to":"3f1d235d_419393a4","updated":"2017-07-13 03:28:23.000000000","message":"I do need this one because \"detail\u003dFalse\" by default.","commit_id":"69734c44f93b1a35cc3e4729cf736e90fb468f7d"}],"tempest/common/waiters.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"1b7fca4460ca06efe079a4e14c074500c0cb60c5","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    # the \"group_snapshot\" resource won\u0027t be found."},{"line_number":191,"context_line":"    resource_name \u003d re.findall("},{"line_number":192,"context_line":"        r\u0027(Volume|Snapshot|Backup|Group_Snapshot|Group)\u0027,"},{"line_number":193,"context_line":"        client.__class__.__name__)[0].lower()"},{"line_number":194,"context_line":"    show_resource \u003d getattr(client, \u0027show_\u0027 + resource_name)"},{"line_number":195,"context_line":"    resource_status \u003d show_resource(resource_id)[resource_name][\u0027status\u0027]"},{"line_number":196,"context_line":"    start \u003d int(time.time())"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f1d235d_cdd56645","line":193,"range":{"start_line":193,"start_character":25,"end_line":193,"end_character":33},"updated":"2017-07-02 07:08:29.000000000","message":"I\u0027m wondering if it\u0027s possible to use resource_type here, which returns volume, snapshot, backup, group_snapshot and group. So that would enable you to then name the class to GroupSnapshotClient.","commit_id":"63b259e31b7f659110a304a484b9e13ca4179077"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b711e2dcce0c967de37aeea8222b15513999d8e8","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    # the \"group_snapshot\" resource won\u0027t be found."},{"line_number":191,"context_line":"    resource_name \u003d re.findall("},{"line_number":192,"context_line":"        r\u0027(Volume|Snapshot|Backup|Group_Snapshot|Group)\u0027,"},{"line_number":193,"context_line":"        client.__class__.__name__)[0].lower()"},{"line_number":194,"context_line":"    show_resource \u003d getattr(client, \u0027show_\u0027 + resource_name)"},{"line_number":195,"context_line":"    resource_status \u003d show_resource(resource_id)[resource_name][\u0027status\u0027]"},{"line_number":196,"context_line":"    start \u003d int(time.time())"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f1d235d_95020c09","line":193,"range":{"start_line":193,"start_character":25,"end_line":193,"end_character":33},"in_reply_to":"3f1d235d_cdd56645","updated":"2017-07-08 01:53:02.000000000","message":"I tried using resource_type but it didn\u0027t work.","commit_id":"63b259e31b7f659110a304a484b9e13ca4179077"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c51ac8e1980735f19e75427c1eca14654d94a90b","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        statuses \u003d [statuses]"},{"line_number":191,"context_line":"    # NOTE(xyang): Group_Snapshot has to be before Group, otherwise"},{"line_number":192,"context_line":"    # the \"group_snapshot\" resource won\u0027t be found."},{"line_number":193,"context_line":"    resource_name \u003d re.findall("},{"line_number":194,"context_line":"        r\u0027(Volume|Snapshot|Backup|Group_Snapshot|Group)\u0027,"},{"line_number":195,"context_line":"        client.__class__.__name__)[0].lower()"},{"line_number":196,"context_line":"    show_resource \u003d getattr(client, \u0027show_\u0027 + resource_name)"},{"line_number":197,"context_line":"    resource_status \u003d show_resource(resource_id)[resource_name][\u0027status\u0027]"},{"line_number":198,"context_line":"    start \u003d int(time.time())"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_3831e5ed","line":195,"range":{"start_line":193,"start_character":4,"end_line":195,"end_character":45},"updated":"2017-07-09 16:23:28.000000000","message":"I think it\u0027s possible to use the following code to get resource_type to work:\n\n    resource_name \u003d re.findall(\n        r\u0027(volume|group-snapshot|snapshot|backup|group)\u0027,\n        client.resource_type)[-1].replace(\u0027-\u0027, \u0027_\u0027)\n\n-1 will return the following:\n\nresource_name resource_type     class_name\n--------------------------------------\n              \nvolume         volume           VolumesClient\nsnapshot       volume-snapshot  SnapshotsClient\nsnapshot       group-snapshot   Group_SnapshotsClient\ngroup          group            GroupsClient\n\nWhich will result in:\n\nshow_volume, show_snapshot, show_group_snapshot and show_group for the show_resource functions.\n\nHowever, I think a core reviewer\u0027s opinion here would be nice. I\u0027m sure this code could be cleaner. This would also require adding:\n\n    @property\n    def resource_type(self):\n        \"\"\"Returns the primary type of resource this client works with.\"\"\"\n        return \u0027backup\u0027\n\nto all the backup clients.","commit_id":"69734c44f93b1a35cc3e4729cf736e90fb468f7d"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"3d5a69fb22f2aedab463ae21dabe8a5ac224f2eb","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        statuses \u003d [statuses]"},{"line_number":191,"context_line":"    # NOTE(xyang): Group_Snapshot has to be before Group, otherwise"},{"line_number":192,"context_line":"    # the \"group_snapshot\" resource won\u0027t be found."},{"line_number":193,"context_line":"    resource_name \u003d re.findall("},{"line_number":194,"context_line":"        r\u0027(Volume|Snapshot|Backup|Group_Snapshot|Group)\u0027,"},{"line_number":195,"context_line":"        client.__class__.__name__)[0].lower()"},{"line_number":196,"context_line":"    show_resource \u003d getattr(client, \u0027show_\u0027 + resource_name)"},{"line_number":197,"context_line":"    resource_status \u003d show_resource(resource_id)[resource_name][\u0027status\u0027]"},{"line_number":198,"context_line":"    start \u003d int(time.time())"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_d8a31100","line":195,"range":{"start_line":193,"start_character":4,"end_line":195,"end_character":45},"in_reply_to":"3f1d235d_3831e5ed","updated":"2017-07-09 16:25:16.000000000","message":"1st col, 3rd row above will be group_snapshot","commit_id":"69734c44f93b1a35cc3e4729cf736e90fb468f7d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2d38ab0d0f76a89ccd9f3c539852b2dfa7bb44a1","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        statuses \u003d [statuses]"},{"line_number":191,"context_line":"    # NOTE(xyang): Group_Snapshot has to be before Group, otherwise"},{"line_number":192,"context_line":"    # the \"group_snapshot\" resource won\u0027t be found."},{"line_number":193,"context_line":"    resource_name \u003d re.findall("},{"line_number":194,"context_line":"        r\u0027(Volume|Snapshot|Backup|Group_Snapshot|Group)\u0027,"},{"line_number":195,"context_line":"        client.__class__.__name__)[0].lower()"},{"line_number":196,"context_line":"    show_resource \u003d getattr(client, \u0027show_\u0027 + resource_name)"},{"line_number":197,"context_line":"    resource_status \u003d show_resource(resource_id)[resource_name][\u0027status\u0027]"},{"line_number":198,"context_line":"    start \u003d int(time.time())"}],"source_content_type":"text/x-python","patch_set":8,"id":"1f1a1f67_eb6f15c3","line":195,"range":{"start_line":193,"start_character":4,"end_line":195,"end_character":45},"in_reply_to":"3f1d235d_613448df","updated":"2017-07-13 03:28:23.000000000","message":"I think I need to submit a separate patch to propose this and see how it goes.","commit_id":"69734c44f93b1a35cc3e4729cf736e90fb468f7d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d82a7c6825a6b94f6ace818500cc201bfdb4395e","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        statuses \u003d [statuses]"},{"line_number":191,"context_line":"    # NOTE(xyang): Group_Snapshot has to be before Group, otherwise"},{"line_number":192,"context_line":"    # the \"group_snapshot\" resource won\u0027t be found."},{"line_number":193,"context_line":"    resource_name \u003d re.findall("},{"line_number":194,"context_line":"        r\u0027(Volume|Snapshot|Backup|Group_Snapshot|Group)\u0027,"},{"line_number":195,"context_line":"        client.__class__.__name__)[0].lower()"},{"line_number":196,"context_line":"    show_resource \u003d getattr(client, \u0027show_\u0027 + resource_name)"},{"line_number":197,"context_line":"    resource_status \u003d show_resource(resource_id)[resource_name][\u0027status\u0027]"},{"line_number":198,"context_line":"    start \u003d int(time.time())"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_613448df","line":195,"range":{"start_line":193,"start_character":4,"end_line":195,"end_character":45},"in_reply_to":"3f1d235d_d8a31100","updated":"2017-07-10 02:21:19.000000000","message":"With this proposal, the class name still has to be Group_snapshotsClient?","commit_id":"69734c44f93b1a35cc3e4729cf736e90fb468f7d"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"68bb7f6009dc5efc6127f0b3fe4d9f1991b46945","unresolved":false,"context_lines":[{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    if not isinstance(statuses, list):"},{"line_number":190,"context_line":"        statuses \u003d [statuses]"},{"line_number":191,"context_line":"    # NOTE(xyang): Group_Snapshot has to be before Group, otherwise"},{"line_number":192,"context_line":"    # the \"group_snapshot\" resource won\u0027t be found."},{"line_number":193,"context_line":"    resource_name \u003d re.findall("},{"line_number":194,"context_line":"        r\u0027(Volume|Snapshot|Backup|Group_Snapshot|Group)\u0027,"},{"line_number":195,"context_line":"        client.__class__.__name__)[0].lower()"},{"line_number":196,"context_line":"    show_resource \u003d getattr(client, \u0027show_\u0027 + resource_name)"},{"line_number":197,"context_line":"    resource_status \u003d show_resource(resource_id)[resource_name][\u0027status\u0027]"}],"source_content_type":"text/x-python","patch_set":14,"id":"ff346bd7_9818fd75","line":194,"range":{"start_line":191,"start_character":0,"end_line":194,"end_character":57},"updated":"2017-07-21 18:38:08.000000000","message":"I think we need to put some specific handling for the resource which includes Upper case in the middle of the name here instead of defining inconsistent service clients which are not CamelCase.\n\nOne easy way is just coding like\n\n resource_name \u003d re.findall(\n     r\u0027(Volume|Snapshot|Backup|Group_Snapshot|Group)\u0027,\n     client.__class__.__name__)[0]\n if resource_name \u003d\u003d \"GroupSnapshot\":\n     resource_name \u003d \"group_snapshot\"\n else:\n     resource_name \u003d \"resource_name\".lower()","commit_id":"8b7788d9785b87d0c6afb64d29c3155ffca51d29"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"a291a4a2454fe264a9a5b168ea201bb0a23dcc80","unresolved":false,"context_lines":[{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    if not isinstance(statuses, list):"},{"line_number":190,"context_line":"        statuses \u003d [statuses]"},{"line_number":191,"context_line":"    # NOTE(xyang): Group_Snapshot has to be before Group, otherwise"},{"line_number":192,"context_line":"    # the \"group_snapshot\" resource won\u0027t be found."},{"line_number":193,"context_line":"    resource_name \u003d re.findall("},{"line_number":194,"context_line":"        r\u0027(Volume|Snapshot|Backup|Group_Snapshot|Group)\u0027,"},{"line_number":195,"context_line":"        client.__class__.__name__)[0].lower()"},{"line_number":196,"context_line":"    show_resource \u003d getattr(client, \u0027show_\u0027 + resource_name)"},{"line_number":197,"context_line":"    resource_status \u003d show_resource(resource_id)[resource_name][\u0027status\u0027]"}],"source_content_type":"text/x-python","patch_set":14,"id":"ff346bd7_7b05537a","line":194,"range":{"start_line":191,"start_character":0,"end_line":194,"end_character":57},"in_reply_to":"ff346bd7_9818fd75","updated":"2017-07-21 19:33:52.000000000","message":"Done","commit_id":"8b7788d9785b87d0c6afb64d29c3155ffca51d29"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"91c7b445f1456817bfe727708dd7d7102be01f9c","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        r\u0027(Volume|Snapshot|Backup|GroupSnapshot|Group)\u0027,"},{"line_number":197,"context_line":"        client.__class__.__name__)[0]"},{"line_number":198,"context_line":"    if resource_name \u003d\u003d \"GroupSnapshot\":"},{"line_number":199,"context_line":"        resource_name \u003d \"group_snapshot\""},{"line_number":200,"context_line":"    else:"},{"line_number":201,"context_line":"        resource_name \u003d resource_name.lower()"},{"line_number":202,"context_line":"    show_resource \u003d getattr(client, \u0027show_\u0027 + resource_name)"}],"source_content_type":"text/x-python","patch_set":16,"id":"ff346bd7_5e7c6fea","line":199,"range":{"start_line":199,"start_character":8,"end_line":199,"end_character":40},"updated":"2017-07-25 12:00:05.000000000","message":"why not use the \"resource_type\" property?","commit_id":"20cfe6710ec96e200cdd48630f3b01be6d005565"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"fd08652ffe3303a3c6d452b67c16b7ed63984589","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        r\u0027(Volume|Snapshot|Backup|GroupSnapshot|Group)\u0027,"},{"line_number":197,"context_line":"        client.__class__.__name__)[0]"},{"line_number":198,"context_line":"    if resource_name \u003d\u003d \"GroupSnapshot\":"},{"line_number":199,"context_line":"        resource_name \u003d \"group_snapshot\""},{"line_number":200,"context_line":"    else:"},{"line_number":201,"context_line":"        resource_name \u003d resource_name.lower()"},{"line_number":202,"context_line":"    show_resource \u003d getattr(client, \u0027show_\u0027 + resource_name)"}],"source_content_type":"text/x-python","patch_set":16,"id":"ff346bd7_0e958a40","line":199,"range":{"start_line":199,"start_character":8,"end_line":199,"end_character":40},"in_reply_to":"ff346bd7_5e7c6fea","updated":"2017-07-25 16:40:28.000000000","message":"Done","commit_id":"20cfe6710ec96e200cdd48630f3b01be6d005565"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"8e021e64f1f637351871e29dc279bb7702bcb6c6","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    This function is a common function for volume, snapshot and backup"},{"line_number":186,"context_line":"    resources. The function extracts the name of the desired resource from"},{"line_number":187,"context_line":"    the client class name of the resource."},{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    if not isinstance(statuses, list):"},{"line_number":190,"context_line":"        statuses \u003d [statuses]"},{"line_number":191,"context_line":"    # NOTE(xyang): GroupSnapshot has to be before Group, otherwise"},{"line_number":192,"context_line":"    # the \"group\" resource will be found instead of \"group_snapshot\"."},{"line_number":193,"context_line":"    # Also need to handle \"group_snapshot\" specially because the"},{"line_number":194,"context_line":"    # automatic way will find \"groupsnapshot\" instead of \"group_snapshot\"."},{"line_number":195,"context_line":"    resource_name \u003d re.findall("},{"line_number":196,"context_line":"        r\u0027(Volume|Snapshot|Backup|GroupSnapshot|Group)\u0027,"},{"line_number":197,"context_line":"        client.__class__.__name__)[0]"},{"line_number":198,"context_line":"    if resource_name \u003d\u003d \"GroupSnapshot\":"},{"line_number":199,"context_line":"        resource_name \u003d \"group_snapshot\""},{"line_number":200,"context_line":"    else:"},{"line_number":201,"context_line":"        resource_name \u003d resource_name.lower()"},{"line_number":202,"context_line":"    show_resource \u003d getattr(client, \u0027show_\u0027 + resource_name)"},{"line_number":203,"context_line":"    resource_status \u003d show_resource(resource_id)[resource_name][\u0027status\u0027]"},{"line_number":204,"context_line":"    start \u003d int(time.time())"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    while resource_status not in statuses:"},{"line_number":207,"context_line":"        time.sleep(client.build_interval)"}],"source_content_type":"text/x-python","patch_set":16,"id":"ff346bd7_675a0d2b","line":204,"range":{"start_line":188,"start_character":0,"end_line":204,"end_character":28},"updated":"2017-07-25 07:39:25.000000000","message":"too magical things happening here, i wanted to remove this but you added more :). anyways i will refactor this later and ok as of now.","commit_id":"20cfe6710ec96e200cdd48630f3b01be6d005565"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ff6cbaca72cc2c2ec3a068fa44089feac7a79750","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    This function is a common function for volume, snapshot and backup"},{"line_number":186,"context_line":"    resources. The function extracts the name of the desired resource from"},{"line_number":187,"context_line":"    the client class name of the resource."},{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    if not isinstance(statuses, list):"},{"line_number":190,"context_line":"        statuses \u003d [statuses]"},{"line_number":191,"context_line":"    # NOTE(xyang): GroupSnapshot has to be before Group, otherwise"},{"line_number":192,"context_line":"    # the \"group\" resource will be found instead of \"group_snapshot\"."},{"line_number":193,"context_line":"    # Also need to handle \"group_snapshot\" specially because the"},{"line_number":194,"context_line":"    # automatic way will find \"groupsnapshot\" instead of \"group_snapshot\"."},{"line_number":195,"context_line":"    resource_name \u003d re.findall("},{"line_number":196,"context_line":"        r\u0027(Volume|Snapshot|Backup|GroupSnapshot|Group)\u0027,"},{"line_number":197,"context_line":"        client.__class__.__name__)[0]"},{"line_number":198,"context_line":"    if resource_name \u003d\u003d \"GroupSnapshot\":"},{"line_number":199,"context_line":"        resource_name \u003d \"group_snapshot\""},{"line_number":200,"context_line":"    else:"},{"line_number":201,"context_line":"        resource_name \u003d resource_name.lower()"},{"line_number":202,"context_line":"    show_resource \u003d getattr(client, \u0027show_\u0027 + resource_name)"},{"line_number":203,"context_line":"    resource_status \u003d show_resource(resource_id)[resource_name][\u0027status\u0027]"},{"line_number":204,"context_line":"    start \u003d int(time.time())"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    while resource_status not in statuses:"},{"line_number":207,"context_line":"        time.sleep(client.build_interval)"}],"source_content_type":"text/x-python","patch_set":16,"id":"df3967d1_964aee24","line":204,"range":{"start_line":188,"start_character":0,"end_line":204,"end_character":28},"in_reply_to":"ff346bd7_3ee76be7","updated":"2017-07-31 09:30:55.000000000","message":"With this magic things, Its hard to debug. I have encountered this situation and it was hard to find why 404 for exiting volumes.\n\nI am going to add a etherpad on this for possible approach and then we can see the best way.","commit_id":"20cfe6710ec96e200cdd48630f3b01be6d005565"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"91c7b445f1456817bfe727708dd7d7102be01f9c","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    This function is a common function for volume, snapshot and backup"},{"line_number":186,"context_line":"    resources. The function extracts the name of the desired resource from"},{"line_number":187,"context_line":"    the client class name of the resource."},{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    if not isinstance(statuses, list):"},{"line_number":190,"context_line":"        statuses \u003d [statuses]"},{"line_number":191,"context_line":"    # NOTE(xyang): GroupSnapshot has to be before Group, otherwise"},{"line_number":192,"context_line":"    # the \"group\" resource will be found instead of \"group_snapshot\"."},{"line_number":193,"context_line":"    # Also need to handle \"group_snapshot\" specially because the"},{"line_number":194,"context_line":"    # automatic way will find \"groupsnapshot\" instead of \"group_snapshot\"."},{"line_number":195,"context_line":"    resource_name \u003d re.findall("},{"line_number":196,"context_line":"        r\u0027(Volume|Snapshot|Backup|GroupSnapshot|Group)\u0027,"},{"line_number":197,"context_line":"        client.__class__.__name__)[0]"},{"line_number":198,"context_line":"    if resource_name \u003d\u003d \"GroupSnapshot\":"},{"line_number":199,"context_line":"        resource_name \u003d \"group_snapshot\""},{"line_number":200,"context_line":"    else:"},{"line_number":201,"context_line":"        resource_name \u003d resource_name.lower()"},{"line_number":202,"context_line":"    show_resource \u003d getattr(client, \u0027show_\u0027 + resource_name)"},{"line_number":203,"context_line":"    resource_status \u003d show_resource(resource_id)[resource_name][\u0027status\u0027]"},{"line_number":204,"context_line":"    start \u003d int(time.time())"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    while resource_status not in statuses:"},{"line_number":207,"context_line":"        time.sleep(client.build_interval)"}],"source_content_type":"text/x-python","patch_set":16,"id":"ff346bd7_3ee76be7","line":204,"range":{"start_line":188,"start_character":0,"end_line":204,"end_character":28},"in_reply_to":"ff346bd7_675a0d2b","updated":"2017-07-25 12:00:05.000000000","message":"This code relies on naming conventions that are not really defined as a stable interface.\n\nThe proper wait to handle this would be to have a common client that defines the interface for all the methods, like list, show etc and have those implemented in all the clients. But I think that\u0027s way too much work now to do.\n\nStill I understand the will to avoid repeated code.\nSince the resources are not so many, I wonder if we could simply have an if/elif statement here instead.","commit_id":"20cfe6710ec96e200cdd48630f3b01be6d005565"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"57e963b8b7633f66349332e9d5bcc5127da5531d","unresolved":false,"context_lines":[{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    if not isinstance(statuses, list):"},{"line_number":190,"context_line":"        statuses \u003d [statuses]"},{"line_number":191,"context_line":"    resource_name \u003d re.findall("},{"line_number":192,"context_line":"        r\u0027(volume|group-snapshot|snapshot|backup|group)\u0027,"},{"line_number":193,"context_line":"        client.resource_type)[-1].replace(\u0027-\u0027, \u0027_\u0027)"},{"line_number":194,"context_line":"    show_resource \u003d getattr(client, \u0027show_\u0027 + resource_name)"},{"line_number":195,"context_line":"    resource_status \u003d show_resource(resource_id)[resource_name][\u0027status\u0027]"},{"line_number":196,"context_line":"    start \u003d int(time.time())"}],"source_content_type":"text/x-python","patch_set":20,"id":"df3967d1_8bc66116","line":193,"range":{"start_line":191,"start_character":0,"end_line":193,"end_character":51},"updated":"2017-07-28 20:47:28.000000000","message":"Do you really need the regex matching still?","commit_id":"41ed715c2306b701fea19adfc9e0f187a5dcf381"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"54caa77622bf69ef6eb95c5cbb255c78b043e20c","unresolved":false,"context_lines":[{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    if not isinstance(statuses, list):"},{"line_number":190,"context_line":"        statuses \u003d [statuses]"},{"line_number":191,"context_line":"    resource_name \u003d re.findall("},{"line_number":192,"context_line":"        r\u0027(volume|group-snapshot|snapshot|backup|group)\u0027,"},{"line_number":193,"context_line":"        client.resource_type)[-1].replace(\u0027-\u0027, \u0027_\u0027)"},{"line_number":194,"context_line":"    show_resource \u003d getattr(client, \u0027show_\u0027 + resource_name)"},{"line_number":195,"context_line":"    resource_status \u003d show_resource(resource_id)[resource_name][\u0027status\u0027]"},{"line_number":196,"context_line":"    start \u003d int(time.time())"}],"source_content_type":"text/x-python","patch_set":20,"id":"df3967d1_fac13882","line":193,"range":{"start_line":191,"start_character":0,"end_line":193,"end_character":51},"in_reply_to":"df3967d1_1a407c35","updated":"2017-07-28 21:15:33.000000000","message":"Sure.  Thanks!","commit_id":"41ed715c2306b701fea19adfc9e0f187a5dcf381"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"f80a34e9648f4cd3048fa161473e4ce18dfa3ff5","unresolved":false,"context_lines":[{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    if not isinstance(statuses, list):"},{"line_number":190,"context_line":"        statuses \u003d [statuses]"},{"line_number":191,"context_line":"    resource_name \u003d re.findall("},{"line_number":192,"context_line":"        r\u0027(volume|group-snapshot|snapshot|backup|group)\u0027,"},{"line_number":193,"context_line":"        client.resource_type)[-1].replace(\u0027-\u0027, \u0027_\u0027)"},{"line_number":194,"context_line":"    show_resource \u003d getattr(client, \u0027show_\u0027 + resource_name)"},{"line_number":195,"context_line":"    resource_status \u003d show_resource(resource_id)[resource_name][\u0027status\u0027]"},{"line_number":196,"context_line":"    start \u003d int(time.time())"}],"source_content_type":"text/x-python","patch_set":20,"id":"df3967d1_1a407c35","line":193,"range":{"start_line":191,"start_character":0,"end_line":193,"end_character":51},"in_reply_to":"df3967d1_4b13d967","updated":"2017-07-28 21:10:14.000000000","message":"NIT: if snapshot is the only exception we could have an if / else, or change the volume client, but this is fine as well. A comment would help, you way want to add one in a follow-up patch.","commit_id":"41ed715c2306b701fea19adfc9e0f187a5dcf381"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"625ded2ce92a6325f7949613155380806d95a091","unresolved":false,"context_lines":[{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    if not isinstance(statuses, list):"},{"line_number":190,"context_line":"        statuses \u003d [statuses]"},{"line_number":191,"context_line":"    resource_name \u003d re.findall("},{"line_number":192,"context_line":"        r\u0027(volume|group-snapshot|snapshot|backup|group)\u0027,"},{"line_number":193,"context_line":"        client.resource_type)[-1].replace(\u0027-\u0027, \u0027_\u0027)"},{"line_number":194,"context_line":"    show_resource \u003d getattr(client, \u0027show_\u0027 + resource_name)"},{"line_number":195,"context_line":"    resource_status \u003d show_resource(resource_id)[resource_name][\u0027status\u0027]"},{"line_number":196,"context_line":"    start \u003d int(time.time())"}],"source_content_type":"text/x-python","patch_set":20,"id":"df3967d1_4b13d967","line":193,"range":{"start_line":191,"start_character":0,"end_line":193,"end_character":51},"in_reply_to":"df3967d1_8bc66116","updated":"2017-07-28 21:01:19.000000000","message":"Looks like I still need to use regex because the resource type for snapshot is \u0027volume-snapshot\u0027 but the show function is \u0027show_snapshot\u0027.","commit_id":"41ed715c2306b701fea19adfc9e0f187a5dcf381"}],"tempest/lib/services/volume/v3/group_snapshots_client.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"1b7fca4460ca06efe079a4e14c074500c0cb60c5","unresolved":false,"context_lines":[{"line_number":29,"context_line":"# will also form the function name \"show_groupsnapshot\"."},{"line_number":30,"context_line":"# The correct resource name is \"group_snapshot\"."},{"line_number":31,"context_line":"class Group_SnapshotsClient(base_client.BaseClient):"},{"line_number":32,"context_line":"    \"\"\"Client class to send CRUD Volume Group API requests\"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def create_group_snapshot(self, group_id, **kwargs):"},{"line_number":35,"context_line":"        \"\"\"Creates a group snapshot."}],"source_content_type":"text/x-python","patch_set":3,"id":"3f1d235d_8dcf6eaf","line":32,"range":{"start_line":32,"start_character":40,"end_line":32,"end_character":45},"updated":"2017-07-02 07:08:29.000000000","message":"Group Snapshot","commit_id":"63b259e31b7f659110a304a484b9e13ca4179077"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b711e2dcce0c967de37aeea8222b15513999d8e8","unresolved":false,"context_lines":[{"line_number":29,"context_line":"# will also form the function name \"show_groupsnapshot\"."},{"line_number":30,"context_line":"# The correct resource name is \"group_snapshot\"."},{"line_number":31,"context_line":"class Group_SnapshotsClient(base_client.BaseClient):"},{"line_number":32,"context_line":"    \"\"\"Client class to send CRUD Volume Group API requests\"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def create_group_snapshot(self, group_id, **kwargs):"},{"line_number":35,"context_line":"        \"\"\"Creates a group snapshot."}],"source_content_type":"text/x-python","patch_set":3,"id":"3f1d235d_5ade0e3e","line":32,"range":{"start_line":32,"start_character":40,"end_line":32,"end_character":45},"in_reply_to":"3f1d235d_8dcf6eaf","updated":"2017-07-08 01:53:02.000000000","message":"Done","commit_id":"63b259e31b7f659110a304a484b9e13ca4179077"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"1b7fca4460ca06efe079a4e14c074500c0cb60c5","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    def delete_group_snapshot(self, group_snapshot_id):"},{"line_number":53,"context_line":"        \"\"\"Deletes a group snapshot."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        For a full list of available parameters, please refer to the official"},{"line_number":56,"context_line":"        API reference:"},{"line_number":57,"context_line":"        https://developer.openstack.org/api-ref/block-storage/v3/#delete-group-snapshot"},{"line_number":58,"context_line":"        \"\"\""},{"line_number":59,"context_line":"        resp, body \u003d self.delete(\u0027group_snapshots/%s\u0027 % ("}],"source_content_type":"text/x-python","patch_set":3,"id":"3f1d235d_ad410a0e","line":56,"range":{"start_line":55,"start_character":8,"end_line":56,"end_character":22},"updated":"2017-07-02 07:08:29.000000000","message":"nit: This is only meaningful for **kwargs, **params. So you can instead use:\n\nFor more information, please refer to the official API reference:","commit_id":"63b259e31b7f659110a304a484b9e13ca4179077"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b711e2dcce0c967de37aeea8222b15513999d8e8","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    def delete_group_snapshot(self, group_snapshot_id):"},{"line_number":53,"context_line":"        \"\"\"Deletes a group snapshot."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        For a full list of available parameters, please refer to the official"},{"line_number":56,"context_line":"        API reference:"},{"line_number":57,"context_line":"        https://developer.openstack.org/api-ref/block-storage/v3/#delete-group-snapshot"},{"line_number":58,"context_line":"        \"\"\""},{"line_number":59,"context_line":"        resp, body \u003d self.delete(\u0027group_snapshots/%s\u0027 % ("}],"source_content_type":"text/x-python","patch_set":3,"id":"3f1d235d_fac71a63","line":56,"range":{"start_line":55,"start_character":8,"end_line":56,"end_character":22},"in_reply_to":"3f1d235d_ad410a0e","updated":"2017-07-08 01:53:02.000000000","message":"Done","commit_id":"63b259e31b7f659110a304a484b9e13ca4179077"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"1b7fca4460ca06efe079a4e14c074500c0cb60c5","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    def show_group_snapshot(self, group_snapshot_id):"},{"line_number":65,"context_line":"        \"\"\"Returns the details of a single group snapshot."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        For a full list of available parameters, please refer to the official"},{"line_number":68,"context_line":"        API reference:"},{"line_number":69,"context_line":"        https://developer.openstack.org/api-ref/block-storage/v3/#show-group-snapshot-details"},{"line_number":70,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f1d235d_4d46f623","line":67,"updated":"2017-07-02 07:08:29.000000000","message":"See above.","commit_id":"63b259e31b7f659110a304a484b9e13ca4179077"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b711e2dcce0c967de37aeea8222b15513999d8e8","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    def show_group_snapshot(self, group_snapshot_id):"},{"line_number":65,"context_line":"        \"\"\"Returns the details of a single group snapshot."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        For a full list of available parameters, please refer to the official"},{"line_number":68,"context_line":"        API reference:"},{"line_number":69,"context_line":"        https://developer.openstack.org/api-ref/block-storage/v3/#show-group-snapshot-details"},{"line_number":70,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f1d235d_3a97d24a","line":67,"in_reply_to":"3f1d235d_4d46f623","updated":"2017-07-08 01:53:02.000000000","message":"Done","commit_id":"63b259e31b7f659110a304a484b9e13ca4179077"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"1b7fca4460ca06efe079a4e14c074500c0cb60c5","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def list_group_snapshots(self, detail\u003dFalse):"},{"line_number":78,"context_line":"        \"\"\"Information for all the tenant\u0027s group snapshots."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        For a full list of available parameters, please refer to the official"},{"line_number":81,"context_line":"        API reference:"},{"line_number":82,"context_line":"        https://developer.openstack.org/api-ref/block-storage/v3/#list-group-snapshots"},{"line_number":83,"context_line":"        https://developer.openstack.org/api-ref/block-storage/v3/#list-group-snapshots-with-details"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f1d235d_2d55fac6","line":80,"updated":"2017-07-02 07:08:29.000000000","message":"See above.","commit_id":"63b259e31b7f659110a304a484b9e13ca4179077"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b711e2dcce0c967de37aeea8222b15513999d8e8","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def list_group_snapshots(self, detail\u003dFalse):"},{"line_number":78,"context_line":"        \"\"\"Information for all the tenant\u0027s group snapshots."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        For a full list of available parameters, please refer to the official"},{"line_number":81,"context_line":"        API reference:"},{"line_number":82,"context_line":"        https://developer.openstack.org/api-ref/block-storage/v3/#list-group-snapshots"},{"line_number":83,"context_line":"        https://developer.openstack.org/api-ref/block-storage/v3/#list-group-snapshots-with-details"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f1d235d_1a92d657","line":80,"in_reply_to":"3f1d235d_2d55fac6","updated":"2017-07-08 01:53:02.000000000","message":"Done","commit_id":"63b259e31b7f659110a304a484b9e13ca4179077"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c51ac8e1980735f19e75427c1eca14654d94a90b","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    @property"},{"line_number":98,"context_line":"    def resource_type(self):"},{"line_number":99,"context_line":"        \"\"\"Returns the primary type of resource this client works with.\"\"\""},{"line_number":100,"context_line":"        return \u0027group_snapshot\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_f2026b0b","line":100,"range":{"start_line":100,"start_character":16,"end_line":100,"end_character":30},"updated":"2017-07-09 16:23:28.000000000","message":"This should be group-snapshot to be consistent with: https://github.com/openstack/tempest/blob/138c0fb79f783e8c6a4b151ee921282c99203ee0/tempest/lib/services/volume/v2/snapshots_client.py#L104","commit_id":"69734c44f93b1a35cc3e4729cf736e90fb468f7d"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"336e4729b03083e921f496d4218f352cc9551834","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        API reference:"},{"line_number":39,"context_line":"        https://developer.openstack.org/api-ref/block-storage/v3/#create-group-snapshot"},{"line_number":40,"context_line":"        \"\"\""},{"line_number":41,"context_line":"        post_body \u003d {\u0027group_id\u0027: group_id}"},{"line_number":42,"context_line":"        if kwargs.get(\u0027name\u0027):"},{"line_number":43,"context_line":"            post_body[\u0027name\u0027] \u003d kwargs.get(\u0027name\u0027)"},{"line_number":44,"context_line":"        if kwargs.get(\u0027description\u0027):"},{"line_number":45,"context_line":"            post_body[\u0027description\u0027] \u003d kwargs.get(\u0027description\u0027)"},{"line_number":46,"context_line":"        post_body \u003d json.dumps({\u0027group_snapshot\u0027: post_body})"},{"line_number":47,"context_line":"        resp, body \u003d self.post(\u0027group_snapshots\u0027, post_body)"},{"line_number":48,"context_line":"        body \u003d json.loads(body)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f1a1f67_0dc78998","line":45,"range":{"start_line":41,"start_character":0,"end_line":45,"end_character":64},"updated":"2017-07-17 20:26:54.000000000","message":"Why don\u0027t we pass kwargs to post_body directly like\n\n post_body \u003d json.dumps({\u0027group_snapshot\u0027: kwargs})\n\nlike most other service clients?","commit_id":"e1cdfcea14fb007b23f4d7b761a232654a243cc3"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"f99bf9e1d3f0a0a48f677b5012a18bd4adc60d24","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        API reference:"},{"line_number":39,"context_line":"        https://developer.openstack.org/api-ref/block-storage/v3/#create-group-snapshot"},{"line_number":40,"context_line":"        \"\"\""},{"line_number":41,"context_line":"        post_body \u003d {\u0027group_id\u0027: group_id}"},{"line_number":42,"context_line":"        if kwargs.get(\u0027name\u0027):"},{"line_number":43,"context_line":"            post_body[\u0027name\u0027] \u003d kwargs.get(\u0027name\u0027)"},{"line_number":44,"context_line":"        if kwargs.get(\u0027description\u0027):"},{"line_number":45,"context_line":"            post_body[\u0027description\u0027] \u003d kwargs.get(\u0027description\u0027)"},{"line_number":46,"context_line":"        post_body \u003d json.dumps({\u0027group_snapshot\u0027: post_body})"},{"line_number":47,"context_line":"        resp, body \u003d self.post(\u0027group_snapshots\u0027, post_body)"},{"line_number":48,"context_line":"        body \u003d json.loads(body)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f1a1f67_ada53549","line":45,"range":{"start_line":41,"start_character":0,"end_line":45,"end_character":64},"in_reply_to":"1f1a1f67_0dc78998","updated":"2017-07-17 20:51:02.000000000","message":"Done","commit_id":"e1cdfcea14fb007b23f4d7b761a232654a243cc3"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"9478463cdeba720c10ad3782ffe2af4a4d4030e7","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        https://developer.openstack.org/api-ref/block-storage/v3/#delete-group-snapshot"},{"line_number":52,"context_line":"        \"\"\""},{"line_number":53,"context_line":"        resp, body \u003d self.delete(\u0027group_snapshots/%s\u0027 % ("},{"line_number":54,"context_line":"            str(group_snapshot_id)))"},{"line_number":55,"context_line":"        self.expected_success(202, resp.status)"},{"line_number":56,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1f1a1f67_9dab3574","line":54,"range":{"start_line":54,"start_character":12,"end_line":54,"end_character":15},"updated":"2017-07-21 09:04:53.000000000","message":"Nit, but since this is being formatted into a string with %s, casting to str() is a little redundant.","commit_id":"fbf056ef6ba8c58f00b963caed88f7268ff8b9dd"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"9113f9df55c00204c4cd605ffa741d7a502e6086","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        https://developer.openstack.org/api-ref/block-storage/v3/#delete-group-snapshot"},{"line_number":52,"context_line":"        \"\"\""},{"line_number":53,"context_line":"        resp, body \u003d self.delete(\u0027group_snapshots/%s\u0027 % ("},{"line_number":54,"context_line":"            str(group_snapshot_id)))"},{"line_number":55,"context_line":"        self.expected_success(202, resp.status)"},{"line_number":56,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1f1a1f67_085920fd","line":54,"range":{"start_line":54,"start_character":12,"end_line":54,"end_character":15},"in_reply_to":"1f1a1f67_9dab3574","updated":"2017-07-21 12:27:21.000000000","message":"Done","commit_id":"fbf056ef6ba8c58f00b963caed88f7268ff8b9dd"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"68bb7f6009dc5efc6127f0b3fe4d9f1991b46945","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from tempest.lib.services.volume.v3 import base_client"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"# NOTE(xyang): Have to name this class \"Group_SnapshotsClient\" instead of"},{"line_number":24,"context_line":"# \"GroupSnapshotsClient\" so we can use wait_for_volume_resource_status in"},{"line_number":25,"context_line":"# waiters.py which automatically forms the resource name \"group_snapshot\""},{"line_number":26,"context_line":"# and function name \"show_group_snapshot\"."},{"line_number":27,"context_line":"# If this class is named \"GroupSnapshotsClient\", the wait function will"},{"line_number":28,"context_line":"# look for a resource name \"groupsnapshot\" which does not exist and it"},{"line_number":29,"context_line":"# will also form the function name \"show_groupsnapshot\"."},{"line_number":30,"context_line":"# The correct resource name is \"group_snapshot\"."},{"line_number":31,"context_line":"class Group_SnapshotsClient(base_client.BaseClient):"},{"line_number":32,"context_line":"    \"\"\"Client class to send CRUD Volume Group Snapshot API requests\"\"\""},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ff346bd7_78831958","line":30,"range":{"start_line":23,"start_character":0,"end_line":30,"end_character":48},"updated":"2017-07-21 18:38:08.000000000","message":"I really don\u0027t want to define inconsistent service clients because they are library interfaces.\nI put a comment for solving it, could you check it?","commit_id":"8b7788d9785b87d0c6afb64d29c3155ffca51d29"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"a291a4a2454fe264a9a5b168ea201bb0a23dcc80","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from tempest.lib.services.volume.v3 import base_client"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"# NOTE(xyang): Have to name this class \"Group_SnapshotsClient\" instead of"},{"line_number":24,"context_line":"# \"GroupSnapshotsClient\" so we can use wait_for_volume_resource_status in"},{"line_number":25,"context_line":"# waiters.py which automatically forms the resource name \"group_snapshot\""},{"line_number":26,"context_line":"# and function name \"show_group_snapshot\"."},{"line_number":27,"context_line":"# If this class is named \"GroupSnapshotsClient\", the wait function will"},{"line_number":28,"context_line":"# look for a resource name \"groupsnapshot\" which does not exist and it"},{"line_number":29,"context_line":"# will also form the function name \"show_groupsnapshot\"."},{"line_number":30,"context_line":"# The correct resource name is \"group_snapshot\"."},{"line_number":31,"context_line":"class Group_SnapshotsClient(base_client.BaseClient):"},{"line_number":32,"context_line":"    \"\"\"Client class to send CRUD Volume Group Snapshot API requests\"\"\""},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ff346bd7_fbf8237d","line":30,"range":{"start_line":23,"start_character":0,"end_line":30,"end_character":48},"in_reply_to":"ff346bd7_78831958","updated":"2017-07-21 19:33:52.000000000","message":"Yes, I tested your approach and it worked.  Thanks!","commit_id":"8b7788d9785b87d0c6afb64d29c3155ffca51d29"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"8e021e64f1f637351871e29dc279bb7702bcb6c6","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from tempest.lib.common import rest_client"},{"line_number":19,"context_line":"from tempest.lib import exceptions as lib_exc"},{"line_number":20,"context_line":"from tempest.lib.services.volume.v3 import base_client"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class GroupSnapshotsClient(base_client.BaseClient):"}],"source_content_type":"text/x-python","patch_set":16,"id":"ff346bd7_79e75be6","line":20,"range":{"start_line":20,"start_character":0,"end_line":20,"end_character":54},"updated":"2017-07-25 07:39:25.000000000","message":"this is moved class and should not be used.\n\nuse this - from tempest.lib.services.volume import base_client","commit_id":"20cfe6710ec96e200cdd48630f3b01be6d005565"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"fd08652ffe3303a3c6d452b67c16b7ed63984589","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from tempest.lib.common import rest_client"},{"line_number":19,"context_line":"from tempest.lib import exceptions as lib_exc"},{"line_number":20,"context_line":"from tempest.lib.services.volume.v3 import base_client"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class GroupSnapshotsClient(base_client.BaseClient):"}],"source_content_type":"text/x-python","patch_set":16,"id":"ff346bd7_e2fdbd3a","line":20,"range":{"start_line":20,"start_character":0,"end_line":20,"end_character":54},"in_reply_to":"ff346bd7_79e75be6","updated":"2017-07-25 16:40:28.000000000","message":"Done","commit_id":"20cfe6710ec96e200cdd48630f3b01be6d005565"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"8e021e64f1f637351871e29dc279bb7702bcb6c6","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        self.expected_success(200, resp.status)"},{"line_number":59,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def list_group_snapshots(self, detail\u003dFalse):"},{"line_number":62,"context_line":"        \"\"\"Information for all the tenant\u0027s group snapshots."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        For more information, please refer to the official API reference:"}],"source_content_type":"text/x-python","patch_set":16,"id":"ff346bd7_d9d527e7","line":61,"range":{"start_line":61,"start_character":8,"end_line":61,"end_character":48},"updated":"2017-07-25 07:39:25.000000000","message":"this should accept **param to add query things on API call","commit_id":"20cfe6710ec96e200cdd48630f3b01be6d005565"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"91c7b445f1456817bfe727708dd7d7102be01f9c","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        self.expected_success(200, resp.status)"},{"line_number":59,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def list_group_snapshots(self, detail\u003dFalse):"},{"line_number":62,"context_line":"        \"\"\"Information for all the tenant\u0027s group snapshots."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        For more information, please refer to the official API reference:"}],"source_content_type":"text/x-python","patch_set":16,"id":"ff346bd7_3e0e4b8d","line":61,"range":{"start_line":61,"start_character":8,"end_line":61,"end_character":48},"in_reply_to":"ff346bd7_d9d527e7","updated":"2017-07-25 12:00:05.000000000","message":"All the params are new in 3.29 - but I guess we won\u0027t change the method definition with micro versions.","commit_id":"20cfe6710ec96e200cdd48630f3b01be6d005565"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"fd08652ffe3303a3c6d452b67c16b7ed63984589","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        self.expected_success(200, resp.status)"},{"line_number":59,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def list_group_snapshots(self, detail\u003dFalse):"},{"line_number":62,"context_line":"        \"\"\"Information for all the tenant\u0027s group snapshots."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        For more information, please refer to the official API reference:"}],"source_content_type":"text/x-python","patch_set":16,"id":"ff346bd7_cef0a2cc","line":61,"range":{"start_line":61,"start_character":8,"end_line":61,"end_character":48},"in_reply_to":"ff346bd7_d9d527e7","updated":"2017-07-25 16:40:28.000000000","message":"Done","commit_id":"20cfe6710ec96e200cdd48630f3b01be6d005565"}],"tempest/lib/services/volume/v3/snapshots_client.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c51ac8e1980735f19e75427c1eca14654d94a90b","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class SnapshotsClient(base_client.BaseClient,"},{"line_number":21,"context_line":"                      snapshots_client.SnapshotsClient):"},{"line_number":22,"context_line":"    \"\"\"Client class to send CRUD Volume V3 API requests\"\"\""},{"line_number":23,"context_line":"    api_version \u003d \"v3\""}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_e1829f52","line":22,"range":{"start_line":22,"start_character":33,"end_line":22,"end_character":39},"updated":"2017-07-09 16:23:28.000000000","message":"Snapshot","commit_id":"69734c44f93b1a35cc3e4729cf736e90fb468f7d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2d38ab0d0f76a89ccd9f3c539852b2dfa7bb44a1","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class SnapshotsClient(base_client.BaseClient,"},{"line_number":21,"context_line":"                      snapshots_client.SnapshotsClient):"},{"line_number":22,"context_line":"    \"\"\"Client class to send CRUD Volume V3 API requests\"\"\""},{"line_number":23,"context_line":"    api_version \u003d \"v3\""}],"source_content_type":"text/x-python","patch_set":8,"id":"1f1a1f67_ab947d45","line":22,"range":{"start_line":22,"start_character":33,"end_line":22,"end_character":39},"in_reply_to":"3f1d235d_e1829f52","updated":"2017-07-13 03:28:23.000000000","message":"Done","commit_id":"69734c44f93b1a35cc3e4729cf736e90fb468f7d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"8e021e64f1f637351871e29dc279bb7702bcb6c6","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from tempest.lib.services.volume.v2 import snapshots_client"},{"line_number":17,"context_line":"from tempest.lib.services.volume.v3 import base_client"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class SnapshotsClient(base_client.BaseClient,"}],"source_content_type":"text/x-python","patch_set":16,"id":"ff346bd7_b9ddc315","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":54},"updated":"2017-07-25 07:39:25.000000000","message":"this is moved class we should not use.","commit_id":"20cfe6710ec96e200cdd48630f3b01be6d005565"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"fd08652ffe3303a3c6d452b67c16b7ed63984589","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from tempest.lib.services.volume.v2 import snapshots_client"},{"line_number":17,"context_line":"from tempest.lib.services.volume.v3 import base_client"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class SnapshotsClient(base_client.BaseClient,"}],"source_content_type":"text/x-python","patch_set":16,"id":"ff346bd7_e2ab7d1a","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":54},"in_reply_to":"ff346bd7_b9ddc315","updated":"2017-07-25 16:40:28.000000000","message":"Done","commit_id":"20cfe6710ec96e200cdd48630f3b01be6d005565"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"8e021e64f1f637351871e29dc279bb7702bcb6c6","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from tempest.lib.services.volume.v3 import base_client"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class SnapshotsClient(base_client.BaseClient,"},{"line_number":21,"context_line":"                      snapshots_client.SnapshotsClient):"},{"line_number":22,"context_line":"    \"\"\"Client class to send CRUD Volume Snapshot V3 API requests.\"\"\""},{"line_number":23,"context_line":"    api_version \u003d \"v3\""}],"source_content_type":"text/x-python","patch_set":16,"id":"ff346bd7_79b2bbe8","line":21,"range":{"start_line":20,"start_character":22,"end_line":21,"end_character":54},"updated":"2017-07-25 07:39:25.000000000","message":"instead of multiple inheritance, we can use single now.\n\nvolume.v2 import snapshots_client can be inherited from tempest.lib.services.volume import base_client which will have all microversion things present.\nand this class can be inherited from snapshots_client.SnapshotsClient\n\nlike done in volumes_client.py","commit_id":"20cfe6710ec96e200cdd48630f3b01be6d005565"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"fd08652ffe3303a3c6d452b67c16b7ed63984589","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from tempest.lib.services.volume.v3 import base_client"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class SnapshotsClient(base_client.BaseClient,"},{"line_number":21,"context_line":"                      snapshots_client.SnapshotsClient):"},{"line_number":22,"context_line":"    \"\"\"Client class to send CRUD Volume Snapshot V3 API requests.\"\"\""},{"line_number":23,"context_line":"    api_version \u003d \"v3\""}],"source_content_type":"text/x-python","patch_set":16,"id":"ff346bd7_752bc981","line":21,"range":{"start_line":20,"start_character":22,"end_line":21,"end_character":54},"in_reply_to":"ff346bd7_79b2bbe8","updated":"2017-07-25 16:40:28.000000000","message":"Done","commit_id":"20cfe6710ec96e200cdd48630f3b01be6d005565"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"61e95944ff53a74d458c47e70cd4fe1117ffd496","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from tempest.lib.services.volume.v2 import snapshots_client"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class SnapshotsClient(snapshots_client.SnapshotsClient):"},{"line_number":20,"context_line":"    \"\"\"Client class to send CRUD Volume Snapshot V3 API requests.\"\"\""},{"line_number":21,"context_line":"    api_version \u003d \"v3\""}],"source_content_type":"text/x-python","patch_set":20,"id":"df3967d1_967d4e1e","line":21,"range":{"start_line":19,"start_character":0,"end_line":21,"end_character":22},"updated":"2017-07-31 09:30:13.000000000","message":"honestly saying, i do not like this much but as we do not have common framework for v2 and v3 client yet so not blocking it.","commit_id":"41ed715c2306b701fea19adfc9e0f187a5dcf381"}],"tempest/tests/lib/services/volume/v3/test_group_snapshots_client.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c51ac8e1980735f19e75427c1eca14654d94a90b","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            bytes_body,"},{"line_number":94,"context_line":"            group_snapshot_id\u003d\"3fbbcccf-d058-4502-8844-6feeffdf4cb5\")"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _test_list_group_snapshots(self, bytes_body\u003dFalse):"},{"line_number":97,"context_line":"        self.check_service_client_function("},{"line_number":98,"context_line":"            self.client.list_group_snapshots,"},{"line_number":99,"context_line":"            \u0027tempest.lib.common.rest_client.RestClient.get\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_01b47b34","line":96,"range":{"start_line":96,"start_character":8,"end_line":96,"end_character":34},"updated":"2017-07-09 16:23:28.000000000","message":"This also supports detail\u003dTrue, so you can add a test for that too. See this for an example: https://github.com/openstack/tempest/blob/21dd8a5ee2ab5a068cbb20d0468bd5f444fef59a/tempest/tests/lib/services/volume/v2/test_scheduler_stats_client.py#L59","commit_id":"69734c44f93b1a35cc3e4729cf736e90fb468f7d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2d38ab0d0f76a89ccd9f3c539852b2dfa7bb44a1","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            bytes_body,"},{"line_number":94,"context_line":"            group_snapshot_id\u003d\"3fbbcccf-d058-4502-8844-6feeffdf4cb5\")"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _test_list_group_snapshots(self, bytes_body\u003dFalse):"},{"line_number":97,"context_line":"        self.check_service_client_function("},{"line_number":98,"context_line":"            self.client.list_group_snapshots,"},{"line_number":99,"context_line":"            \u0027tempest.lib.common.rest_client.RestClient.get\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1f1a1f67_cbafb992","line":96,"range":{"start_line":96,"start_character":8,"end_line":96,"end_character":34},"in_reply_to":"3f1d235d_01b47b34","updated":"2017-07-13 03:28:23.000000000","message":"Done","commit_id":"69734c44f93b1a35cc3e4729cf736e90fb468f7d"}]}
