)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"74f9abac30f6e341379dac737ab050f161d9857a","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Matt Riedemann \u003cmriedem@us.ibm.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-09-28 13:44:56 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add scenario test for swap volume"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change adds a test for the swap volume API in"},{"line_number":10,"context_line":"the compute service (updating a volume attachment)."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a98d1f4_231b1074","line":7,"updated":"2016-09-28 21:28:32.000000000","message":"Probably a good idea","commit_id":"62e1b81ac8a783801adff57c40e60c883e11f8aa"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"457093764751c34591c8d89b36c07c66e2e9e7fa","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Matt Riedemann \u003cmriedem@us.ibm.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-09-28 13:44:56 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add scenario test for swap volume"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change adds a test for the swap volume API in"},{"line_number":10,"context_line":"the compute service (updating a volume attachment)."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a98d1f4_8e6892bc","line":7,"range":{"start_line":7,"start_character":4,"end_line":7,"end_character":12},"updated":"2016-09-28 18:52:43.000000000","message":"We should probably update this.","commit_id":"62e1b81ac8a783801adff57c40e60c883e11f8aa"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4c4ca71ff8eaa112379f93125dc31f700ca3bed1","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Matt Riedemann \u003cmriedem@us.ibm.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-09-28 13:44:56 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add scenario test for swap volume"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change adds a test for the swap volume API in"},{"line_number":10,"context_line":"the compute service (updating a volume attachment)."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a98d1f4_00809445","line":7,"in_reply_to":"3a98d1f4_231b1074","updated":"2016-09-29 17:09:05.000000000","message":"Done","commit_id":"62e1b81ac8a783801adff57c40e60c883e11f8aa"}],"tempest/api/compute/admin/test_volume_swap.py":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"e3d28c5783c5e1a223cbc9f1fc6b084320ddaba0","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def _create_volume(self):"},{"line_number":54,"context_line":"        # Create a volume and wait for it to become ready"},{"line_number":55,"context_line":"        vol_name \u003d data_utils.rand_name(self.__class__.__name__ + \u0027-volume\u0027)"},{"line_number":56,"context_line":"        volume \u003d self.volumes_admin_client.create_volume("},{"line_number":57,"context_line":"            size\u003dCONF.volume.volume_size, display_name\u003dvol_name)[\u0027volume\u0027]"},{"line_number":58,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":59,"context_line":"                        self.volumes_admin_client.delete_volume, volume[\u0027id\u0027])"},{"line_number":60,"context_line":"        waiters.wait_for_volume_status(self.volumes_admin_client,"},{"line_number":61,"context_line":"                                       volume[\u0027id\u0027], \u0027available\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_5a4ab984","line":58,"range":{"start_line":55,"start_character":0,"end_line":58,"end_character":64},"updated":"2016-09-29 00:55:35.000000000","message":"How about using normal clients for most API calls except update_attached_volume() call instead of admin_client?\n\nTBH, I didn\u0027t realize why we need to use admin_client in this case in this first looking. And I can understand the nova code of https://github.com/openstack/nova/blob/master/nova/policies/volumes_attachments.py#L37\n\nThat seems a little hard to understand from this test code if using admin clients for all API calls..","commit_id":"62e1b81ac8a783801adff57c40e60c883e11f8aa"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"74f9abac30f6e341379dac737ab050f161d9857a","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        vol_name \u003d data_utils.rand_name(self.__class__.__name__ + \u0027-volume\u0027)"},{"line_number":56,"context_line":"        volume \u003d self.volumes_admin_client.create_volume("},{"line_number":57,"context_line":"            size\u003dCONF.volume.volume_size, display_name\u003dvol_name)[\u0027volume\u0027]"},{"line_number":58,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":59,"context_line":"                        self.volumes_admin_client.delete_volume, volume[\u0027id\u0027])"},{"line_number":60,"context_line":"        waiters.wait_for_volume_status(self.volumes_admin_client,"},{"line_number":61,"context_line":"                                       volume[\u0027id\u0027], \u0027available\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_43265cbb","line":58,"updated":"2016-09-28 21:28:32.000000000","message":"Shouldn\u0027t we have a wait loop add cleanup before this?","commit_id":"62e1b81ac8a783801adff57c40e60c883e11f8aa"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"885d58c6973f0e06a9d61c868186a3731a6c3746","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        vol_name \u003d data_utils.rand_name(self.__class__.__name__ + \u0027-volume\u0027)"},{"line_number":56,"context_line":"        volume \u003d self.volumes_admin_client.create_volume("},{"line_number":57,"context_line":"            size\u003dCONF.volume.volume_size, display_name\u003dvol_name)[\u0027volume\u0027]"},{"line_number":58,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":59,"context_line":"                        self.volumes_admin_client.delete_volume, volume[\u0027id\u0027])"},{"line_number":60,"context_line":"        waiters.wait_for_volume_status(self.volumes_admin_client,"},{"line_number":61,"context_line":"                                       volume[\u0027id\u0027], \u0027available\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_5b4fedbc","line":58,"in_reply_to":"3a98d1f4_43265cbb","updated":"2016-09-29 17:17:17.000000000","message":"Done","commit_id":"62e1b81ac8a783801adff57c40e60c883e11f8aa"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4c4ca71ff8eaa112379f93125dc31f700ca3bed1","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def _create_volume(self):"},{"line_number":54,"context_line":"        # Create a volume and wait for it to become ready"},{"line_number":55,"context_line":"        vol_name \u003d data_utils.rand_name(self.__class__.__name__ + \u0027-volume\u0027)"},{"line_number":56,"context_line":"        volume \u003d self.volumes_admin_client.create_volume("},{"line_number":57,"context_line":"            size\u003dCONF.volume.volume_size, display_name\u003dvol_name)[\u0027volume\u0027]"},{"line_number":58,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":59,"context_line":"                        self.volumes_admin_client.delete_volume, volume[\u0027id\u0027])"},{"line_number":60,"context_line":"        waiters.wait_for_volume_status(self.volumes_admin_client,"},{"line_number":61,"context_line":"                                       volume[\u0027id\u0027], \u0027available\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_5b6d2d97","line":58,"range":{"start_line":55,"start_character":0,"end_line":58,"end_character":64},"in_reply_to":"3a98d1f4_5a4ab984","updated":"2016-09-29 17:09:05.000000000","message":"Done","commit_id":"62e1b81ac8a783801adff57c40e60c883e11f8aa"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1a5eb77582a84253e2815c460b0e0a9093cb2ff6","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def _create_volume(self):"},{"line_number":54,"context_line":"        # Create a volume and wait for it to become ready"},{"line_number":55,"context_line":"        vol_name \u003d data_utils.rand_name(self.__class__.__name__ + \u0027-volume\u0027)"},{"line_number":56,"context_line":"        volume \u003d self.volumes_admin_client.create_volume("},{"line_number":57,"context_line":"            size\u003dCONF.volume.volume_size, display_name\u003dvol_name)[\u0027volume\u0027]"},{"line_number":58,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":59,"context_line":"                        self.volumes_admin_client.delete_volume, volume[\u0027id\u0027])"},{"line_number":60,"context_line":"        waiters.wait_for_volume_status(self.volumes_admin_client,"},{"line_number":61,"context_line":"                                       volume[\u0027id\u0027], \u0027available\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_ddba27e1","line":58,"range":{"start_line":55,"start_character":0,"end_line":58,"end_character":64},"in_reply_to":"3a98d1f4_5a4ab984","updated":"2016-09-29 12:34:16.000000000","message":"The swap volume (update volume attachment) API itself is an admin API, but I guess the volumes and server could be created by a non-admin tenant and do the attach, then the admin client would swap the volumes.","commit_id":"62e1b81ac8a783801adff57c40e60c883e11f8aa"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"74f9abac30f6e341379dac737ab050f161d9857a","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                                       volume[\u0027id\u0027], \u0027available\u0027)"},{"line_number":62,"context_line":"        return volume"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def _create_server(self):"},{"line_number":65,"context_line":"        server \u003d compute.create_test_server(self.os_adm, wait_until\u003d\u0027ACTIVE\u0027)"},{"line_number":66,"context_line":"        self.addCleanup(waiters.wait_for_server_termination,"},{"line_number":67,"context_line":"                        self.servers_admin_client, server[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_632b5883","line":64,"updated":"2016-09-28 21:28:32.000000000","message":"We probably can delete this method and just call:\n\n  https://github.com/openstack/tempest/blob/master/tempest/api/compute/base.py#L210","commit_id":"62e1b81ac8a783801adff57c40e60c883e11f8aa"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4c4ca71ff8eaa112379f93125dc31f700ca3bed1","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                                       volume[\u0027id\u0027], \u0027available\u0027)"},{"line_number":62,"context_line":"        return volume"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def _create_server(self):"},{"line_number":65,"context_line":"        server \u003d compute.create_test_server(self.os_adm, wait_until\u003d\u0027ACTIVE\u0027)"},{"line_number":66,"context_line":"        self.addCleanup(waiters.wait_for_server_termination,"},{"line_number":67,"context_line":"                        self.servers_admin_client, server[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_40e37c05","line":64,"in_reply_to":"3a98d1f4_5d96174d","updated":"2016-09-29 17:09:05.000000000","message":"Done","commit_id":"62e1b81ac8a783801adff57c40e60c883e11f8aa"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1a5eb77582a84253e2815c460b0e0a9093cb2ff6","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                                       volume[\u0027id\u0027], \u0027available\u0027)"},{"line_number":62,"context_line":"        return volume"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def _create_server(self):"},{"line_number":65,"context_line":"        server \u003d compute.create_test_server(self.os_adm, wait_until\u003d\u0027ACTIVE\u0027)"},{"line_number":66,"context_line":"        self.addCleanup(waiters.wait_for_server_termination,"},{"line_number":67,"context_line":"                        self.servers_admin_client, server[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_5d96174d","line":64,"in_reply_to":"3a98d1f4_632b5883","updated":"2016-09-29 12:34:16.000000000","message":"Yeah if I\u0027m not using the admin client, sure.","commit_id":"62e1b81ac8a783801adff57c40e60c883e11f8aa"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1751da87cd282d5079035f5de9cb2707f1f54084","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            server[\u0027id\u0027], volumeId\u003dvolume[\u0027id\u0027])"},{"line_number":75,"context_line":"        waiters.wait_for_volume_status(self.volumes_admin_client,"},{"line_number":76,"context_line":"                                       volume[\u0027id\u0027], \u0027in-use\u0027)"},{"line_number":77,"context_line":"        self.addCleanup(self.servers_admin_client.detach_volume,"},{"line_number":78,"context_line":"                        server[\u0027id\u0027], volume[\u0027id\u0027])"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    @test.idempotent_id(\u00271769f00d-a693-4d67-a631-6a3496773813\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_a349ead2","line":77,"updated":"2016-09-28 17:47:19.000000000","message":"This should probably come before waiting for the volume to go to in-use in case that times out or fails on the compute for some reason.","commit_id":"62e1b81ac8a783801adff57c40e60c883e11f8aa"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"74f9abac30f6e341379dac737ab050f161d9857a","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            server[\u0027id\u0027], volumeId\u003dvolume[\u0027id\u0027])"},{"line_number":75,"context_line":"        waiters.wait_for_volume_status(self.volumes_admin_client,"},{"line_number":76,"context_line":"                                       volume[\u0027id\u0027], \u0027in-use\u0027)"},{"line_number":77,"context_line":"        self.addCleanup(self.servers_admin_client.detach_volume,"},{"line_number":78,"context_line":"                        server[\u0027id\u0027], volume[\u0027id\u0027])"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    @test.idempotent_id(\u00271769f00d-a693-4d67-a631-6a3496773813\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_8320649d","line":77,"updated":"2016-09-28 21:28:32.000000000","message":"Yes it should","commit_id":"62e1b81ac8a783801adff57c40e60c883e11f8aa"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"885d58c6973f0e06a9d61c868186a3731a6c3746","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            server[\u0027id\u0027], volumeId\u003dvolume[\u0027id\u0027])"},{"line_number":75,"context_line":"        waiters.wait_for_volume_status(self.volumes_admin_client,"},{"line_number":76,"context_line":"                                       volume[\u0027id\u0027], \u0027in-use\u0027)"},{"line_number":77,"context_line":"        self.addCleanup(self.servers_admin_client.detach_volume,"},{"line_number":78,"context_line":"                        server[\u0027id\u0027], volume[\u0027id\u0027])"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    @test.idempotent_id(\u00271769f00d-a693-4d67-a631-6a3496773813\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_dbd13dcf","line":77,"in_reply_to":"3a98d1f4_8320649d","updated":"2016-09-29 17:17:17.000000000","message":"Done","commit_id":"62e1b81ac8a783801adff57c40e60c883e11f8aa"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"db5b69906bebb71cf403c2e106867d7a5184426e","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        # We need the admin client for performing the update (swap) volume call"},{"line_number":46,"context_line":"        cls.servers_admin_client \u003d cls.os_adm.servers_client"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def _create_volume(self):"},{"line_number":49,"context_line":"        # Create a volume and wait for it to become ready"},{"line_number":50,"context_line":"        vol_name \u003d data_utils.rand_name(self.__class__.__name__ + \u0027-volume\u0027)"},{"line_number":51,"context_line":"        volume \u003d self.volumes_client.create_volume("},{"line_number":52,"context_line":"            size\u003dCONF.volume.volume_size, display_name\u003dvol_name)[\u0027volume\u0027]"},{"line_number":53,"context_line":"        self.addCleanup(self.volumes_client.wait_for_resource_deletion,"},{"line_number":54,"context_line":"                        volume[\u0027id\u0027])"},{"line_number":55,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":56,"context_line":"                        self.volumes_client.delete_volume, volume[\u0027id\u0027])"},{"line_number":57,"context_line":"        waiters.wait_for_volume_status(self.volumes_client,"},{"line_number":58,"context_line":"                                       volume[\u0027id\u0027], \u0027available\u0027)"},{"line_number":59,"context_line":"        return volume"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _attach_volume(self, server, volume):"},{"line_number":62,"context_line":"        self.servers_client.attach_volume("}],"source_content_type":"text/x-python","patch_set":6,"id":"3a98d1f4_326a341b","line":59,"range":{"start_line":48,"start_character":0,"end_line":59,"end_character":21},"updated":"2016-09-29 22:31:38.000000000","message":"nit: Volume base test class has the same method, but the class is different from this test. So current patch is good for me, and we will be able to cleanup these duplicated code later.","commit_id":"9041b19262e79f4af6406a3bd9c526b1822a4af2"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"7f23dad204a14472f70b93e1fc9b7af520dce554","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        # We need the admin client for performing the update (swap) volume call"},{"line_number":46,"context_line":"        cls.servers_admin_client \u003d cls.os_adm.servers_client"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def _create_volume(self):"},{"line_number":49,"context_line":"        # Create a volume and wait for it to become ready"},{"line_number":50,"context_line":"        vol_name \u003d data_utils.rand_name(self.__class__.__name__ + \u0027-volume\u0027)"},{"line_number":51,"context_line":"        volume \u003d self.volumes_client.create_volume("},{"line_number":52,"context_line":"            size\u003dCONF.volume.volume_size, display_name\u003dvol_name)[\u0027volume\u0027]"},{"line_number":53,"context_line":"        self.addCleanup(self.volumes_client.wait_for_resource_deletion,"},{"line_number":54,"context_line":"                        volume[\u0027id\u0027])"},{"line_number":55,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":56,"context_line":"                        self.volumes_client.delete_volume, volume[\u0027id\u0027])"},{"line_number":57,"context_line":"        waiters.wait_for_volume_status(self.volumes_client,"},{"line_number":58,"context_line":"                                       volume[\u0027id\u0027], \u0027available\u0027)"},{"line_number":59,"context_line":"        return volume"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _attach_volume(self, server, volume):"},{"line_number":62,"context_line":"        self.servers_client.attach_volume("}],"source_content_type":"text/x-python","patch_set":6,"id":"3a98d1f4_7824765f","line":59,"range":{"start_line":48,"start_character":0,"end_line":59,"end_character":21},"in_reply_to":"3a98d1f4_326a341b","updated":"2016-09-30 14:04:34.000000000","message":"No, not latter. We have at least 3 similar methods in Tempest code base. We don\u0027t want to duplicate code like this and we should have one generic \u0027create_volume\u0027 method and use it everywhere.","commit_id":"9041b19262e79f4af6406a3bd9c526b1822a4af2"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"b905546b7f6a30b7c366996393e01f85dbbf654a","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        # We need the admin client for performing the update (swap) volume call"},{"line_number":46,"context_line":"        cls.servers_admin_client \u003d cls.os_adm.servers_client"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def _create_volume(self):"},{"line_number":49,"context_line":"        # Create a volume and wait for it to become ready"},{"line_number":50,"context_line":"        vol_name \u003d data_utils.rand_name(self.__class__.__name__ + \u0027-volume\u0027)"},{"line_number":51,"context_line":"        volume \u003d self.volumes_client.create_volume("},{"line_number":52,"context_line":"            size\u003dCONF.volume.volume_size, display_name\u003dvol_name)[\u0027volume\u0027]"},{"line_number":53,"context_line":"        self.addCleanup(self.volumes_client.wait_for_resource_deletion,"},{"line_number":54,"context_line":"                        volume[\u0027id\u0027])"},{"line_number":55,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":56,"context_line":"                        self.volumes_client.delete_volume, volume[\u0027id\u0027])"},{"line_number":57,"context_line":"        waiters.wait_for_volume_status(self.volumes_client,"},{"line_number":58,"context_line":"                                       volume[\u0027id\u0027], \u0027available\u0027)"},{"line_number":59,"context_line":"        return volume"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _attach_volume(self, server, volume):"},{"line_number":62,"context_line":"        self.servers_client.attach_volume("}],"source_content_type":"text/x-python","patch_set":6,"id":"3a98d1f4_771b8bca","line":59,"range":{"start_line":48,"start_character":0,"end_line":59,"end_character":21},"in_reply_to":"3a98d1f4_3fcc7f69","updated":"2016-09-30 23:16:59.000000000","message":"The base compute class would be nice.\n\n(I could have sworn there was an existing function for this already, but I\u0027ve checked and apparently there isn\u0027t)","commit_id":"9041b19262e79f4af6406a3bd9c526b1822a4af2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"678fb434cec060683583d19f54a356cc171a38f4","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        # We need the admin client for performing the update (swap) volume call"},{"line_number":46,"context_line":"        cls.servers_admin_client \u003d cls.os_adm.servers_client"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def _create_volume(self):"},{"line_number":49,"context_line":"        # Create a volume and wait for it to become ready"},{"line_number":50,"context_line":"        vol_name \u003d data_utils.rand_name(self.__class__.__name__ + \u0027-volume\u0027)"},{"line_number":51,"context_line":"        volume \u003d self.volumes_client.create_volume("},{"line_number":52,"context_line":"            size\u003dCONF.volume.volume_size, display_name\u003dvol_name)[\u0027volume\u0027]"},{"line_number":53,"context_line":"        self.addCleanup(self.volumes_client.wait_for_resource_deletion,"},{"line_number":54,"context_line":"                        volume[\u0027id\u0027])"},{"line_number":55,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":56,"context_line":"                        self.volumes_client.delete_volume, volume[\u0027id\u0027])"},{"line_number":57,"context_line":"        waiters.wait_for_volume_status(self.volumes_client,"},{"line_number":58,"context_line":"                                       volume[\u0027id\u0027], \u0027available\u0027)"},{"line_number":59,"context_line":"        return volume"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _attach_volume(self, server, volume):"},{"line_number":62,"context_line":"        self.servers_client.attach_volume("}],"source_content_type":"text/x-python","patch_set":6,"id":"3a98d1f4_08f06166","line":59,"range":{"start_line":48,"start_character":0,"end_line":59,"end_character":21},"in_reply_to":"3a98d1f4_771b8bca","updated":"2016-10-01 17:07:07.000000000","message":"OK, I\u0027ll add something generic in the base class and use that in this patch, and then lay one on top that refactors any other usage in the compute API tests.","commit_id":"9041b19262e79f4af6406a3bd9c526b1822a4af2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f835cec55e80d30d059378b8b17523576e4d6bfa","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        # We need the admin client for performing the update (swap) volume call"},{"line_number":46,"context_line":"        cls.servers_admin_client \u003d cls.os_adm.servers_client"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def _create_volume(self):"},{"line_number":49,"context_line":"        # Create a volume and wait for it to become ready"},{"line_number":50,"context_line":"        vol_name \u003d data_utils.rand_name(self.__class__.__name__ + \u0027-volume\u0027)"},{"line_number":51,"context_line":"        volume \u003d self.volumes_client.create_volume("},{"line_number":52,"context_line":"            size\u003dCONF.volume.volume_size, display_name\u003dvol_name)[\u0027volume\u0027]"},{"line_number":53,"context_line":"        self.addCleanup(self.volumes_client.wait_for_resource_deletion,"},{"line_number":54,"context_line":"                        volume[\u0027id\u0027])"},{"line_number":55,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":56,"context_line":"                        self.volumes_client.delete_volume, volume[\u0027id\u0027])"},{"line_number":57,"context_line":"        waiters.wait_for_volume_status(self.volumes_client,"},{"line_number":58,"context_line":"                                       volume[\u0027id\u0027], \u0027available\u0027)"},{"line_number":59,"context_line":"        return volume"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _attach_volume(self, server, volume):"},{"line_number":62,"context_line":"        self.servers_client.attach_volume("}],"source_content_type":"text/x-python","patch_set":6,"id":"3a98d1f4_3fcc7f69","line":59,"range":{"start_line":48,"start_character":0,"end_line":59,"end_character":21},"in_reply_to":"3a98d1f4_7824765f","updated":"2016-09-30 21:29:28.000000000","message":"Where do you want these? The base compute test class or some utility / common helper code?","commit_id":"9041b19262e79f4af6406a3bd9c526b1822a4af2"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"7f23dad204a14472f70b93e1fc9b7af520dce554","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                                       volume[\u0027id\u0027], \u0027available\u0027)"},{"line_number":59,"context_line":"        return volume"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _attach_volume(self, server, volume):"},{"line_number":62,"context_line":"        self.servers_client.attach_volume("},{"line_number":63,"context_line":"            server[\u0027id\u0027], volumeId\u003dvolume[\u0027id\u0027])"},{"line_number":64,"context_line":"        self.addCleanup(self.servers_client.detach_volume,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a98d1f4_d8e66a14","line":61,"updated":"2016-09-30 14:04:34.000000000","message":"Same here. We have several \"attach_volume\" method, why do we need one more ?","commit_id":"9041b19262e79f4af6406a3bd9c526b1822a4af2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6bd8ba5365a3025dac037fae1991eabe91581118","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                                       volume[\u0027id\u0027], \u0027available\u0027)"},{"line_number":59,"context_line":"        return volume"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _attach_volume(self, server, volume):"},{"line_number":62,"context_line":"        self.servers_client.attach_volume("},{"line_number":63,"context_line":"            server[\u0027id\u0027], volumeId\u003dvolume[\u0027id\u0027])"},{"line_number":64,"context_line":"        self.addCleanup(self.servers_client.detach_volume,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a98d1f4_cb8e7378","line":61,"in_reply_to":"3a98d1f4_d8e66a14","updated":"2016-10-01 17:58:36.000000000","message":"What do you want to do about some tests that go through nova to create/delete a volume rather than cinder?  For example:\n\nhttps://github.com/openstack/tempest/blob/ec1ba4f25a95ed984d11417c36a15447665ce947/tempest/api/compute/servers/test_delete_server.py#L113\n\nThat\u0027s using the os-volumes extension from the compute API to create and delete the volume, do you want to continue testing that? Note that proxying volume CRUD operations through nova is deprecated so I think this will have to be changed in Tempest at some point, but do you want that to happen along with this cleanup?  I\u0027m going to go forward with that and if people want to keep testing the proxy they can point it out and I\u0027ll update the patch.","commit_id":"9041b19262e79f4af6406a3bd9c526b1822a4af2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"763927b2dd9cd29af8ee9a54f5f59bff6d07e837","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        self.servers_admin_client.update_attached_volume("},{"line_number":61,"context_line":"            server[\u0027id\u0027], volume1[\u0027id\u0027], volumeId\u003dvolume2[\u0027id\u0027])"},{"line_number":62,"context_line":"        waiters.wait_for_volume_status(self.volumes_client,"},{"line_number":63,"context_line":"                                       volume1[\u0027id\u0027], \u0027available\u0027)"},{"line_number":64,"context_line":"        waiters.wait_for_volume_status(self.volumes_client,"},{"line_number":65,"context_line":"                                       volume2[\u0027id\u0027], \u0027in-use\u0027)"},{"line_number":66,"context_line":"        self.addCleanup(self.servers_client.detach_volume,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a98d1f4_5115b046","line":63,"updated":"2016-10-02 00:49:41.000000000","message":"This is timing out:\n\nhttp://logs.openstack.org/73/374373/1/check/gate-tempest-dsvm-full-ubuntu-xenial/fdbe68e/console.html#_2016-10-02_00_45_14_890022\n\nAnd this is why:\n\nhttp://logs.openstack.org/73/374373/1/check/gate-tempest-dsvm-full-ubuntu-xenial/fdbe68e/logs/screen-n-cpu.txt.gz?level\u003dTRACE#_2016-10-02_00_26_34_671","commit_id":"0fdb73fdf5e4f866c518569fd62852b5a6b81cd9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"493c36a40d80e2290449ea406cf7c2bf6b57dcc7","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        self.servers_admin_client.update_attached_volume("},{"line_number":61,"context_line":"            server[\u0027id\u0027], volume1[\u0027id\u0027], volumeId\u003dvolume2[\u0027id\u0027])"},{"line_number":62,"context_line":"        waiters.wait_for_volume_status(self.volumes_client,"},{"line_number":63,"context_line":"                                       volume1[\u0027id\u0027], \u0027available\u0027)"},{"line_number":64,"context_line":"        waiters.wait_for_volume_status(self.volumes_client,"},{"line_number":65,"context_line":"                                       volume2[\u0027id\u0027], \u0027in-use\u0027)"},{"line_number":66,"context_line":"        self.addCleanup(self.servers_client.detach_volume,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a98d1f4_5f7936c7","line":63,"in_reply_to":"3a98d1f4_5115b046","updated":"2016-10-02 14:24:56.000000000","message":"So we\u0027re probably not waiting long enough for the block rebase job to complete, which means we should probably depend on this change:\n\nI2d0daa32b1d37fa60412ad7a374ee38cebdeb579","commit_id":"0fdb73fdf5e4f866c518569fd62852b5a6b81cd9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dd955d3495e3e9cdc742b9926da138747871454f","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        self.servers_admin_client.update_attached_volume("},{"line_number":61,"context_line":"            server[\u0027id\u0027], volume1[\u0027id\u0027], volumeId\u003dvolume2[\u0027id\u0027])"},{"line_number":62,"context_line":"        waiters.wait_for_volume_status(self.volumes_client,"},{"line_number":63,"context_line":"                                       volume1[\u0027id\u0027], \u0027available\u0027)"},{"line_number":64,"context_line":"        waiters.wait_for_volume_status(self.volumes_client,"},{"line_number":65,"context_line":"                                       volume2[\u0027id\u0027], \u0027in-use\u0027)"},{"line_number":66,"context_line":"        self.addCleanup(self.servers_client.detach_volume,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a98d1f4_2e7fda66","line":63,"in_reply_to":"3a98d1f4_5f7936c7","updated":"2016-10-03 00:11:21.000000000","message":"I added the dependency, and the test got through swap-volume but then failed on teardown because when the cleanup runs for the first volume attachment, which is no longer attached, it fails:\n\nhttp://logs.openstack.org/73/374373/2/check/gate-tempest-dsvm-neutron-full-ubuntu-xenial/92ed669/console.html#_2016-10-02_15_13_30_005685\n\nSo the attach_volume cleanup needs to handle 404.","commit_id":"0fdb73fdf5e4f866c518569fd62852b5a6b81cd9"}],"tempest/api/compute/base.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7a38be606e58bb1f5a47ef30676885fb368270f0","unresolved":false,"context_lines":[{"line_number":408,"context_line":"        \"\"\"Attaches volume to server and waits for \u0027in-use\u0027 volume status.\"\"\""},{"line_number":409,"context_line":"        self.servers_client.attach_volume("},{"line_number":410,"context_line":"            server[\u0027id\u0027], volumeId\u003dvolume[\u0027id\u0027])"},{"line_number":411,"context_line":"        self.addCleanup(self.servers_client.detach_volume,"},{"line_number":412,"context_line":"                        server[\u0027id\u0027], volume[\u0027id\u0027])"},{"line_number":413,"context_line":"        waiters.wait_for_volume_status(self.volumes_client,"},{"line_number":414,"context_line":"                                       volume[\u0027id\u0027], \u0027in-use\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a98d1f4_ab94c742","line":411,"updated":"2016-10-01 18:39:57.000000000","message":"I suppose we should wait for the volume status to go back to \u0027available\u0027.","commit_id":"cb1b1bc3a3dd7e5cbfc619aea8433994ae67654e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"70c5ca4cbc59fb97cba3aee876225dcedeb5acd0","unresolved":false,"context_lines":[{"line_number":408,"context_line":"        \"\"\"Attaches volume to server and waits for \u0027in-use\u0027 volume status.\"\"\""},{"line_number":409,"context_line":"        self.servers_client.attach_volume("},{"line_number":410,"context_line":"            server[\u0027id\u0027], volumeId\u003dvolume[\u0027id\u0027])"},{"line_number":411,"context_line":"        self.addCleanup(self.servers_client.detach_volume,"},{"line_number":412,"context_line":"                        server[\u0027id\u0027], volume[\u0027id\u0027])"},{"line_number":413,"context_line":"        waiters.wait_for_volume_status(self.volumes_client,"},{"line_number":414,"context_line":"                                       volume[\u0027id\u0027], \u0027in-use\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a98d1f4_2b96f73e","line":411,"in_reply_to":"3a98d1f4_ab94c742","updated":"2016-10-01 18:49:54.000000000","message":"Otherwise we could race with a teardown where cleanup_volumes fails because the volume is currently detaching.","commit_id":"cb1b1bc3a3dd7e5cbfc619aea8433994ae67654e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dd955d3495e3e9cdc742b9926da138747871454f","unresolved":false,"context_lines":[{"line_number":413,"context_line":"        # teardown."},{"line_number":414,"context_line":"        self.addCleanup(waiters.wait_for_volume_status,"},{"line_number":415,"context_line":"                        self.volumes_client, volume[\u0027id\u0027], \u0027available\u0027)"},{"line_number":416,"context_line":"        self.addCleanup(self.servers_client.detach_volume,"},{"line_number":417,"context_line":"                        server[\u0027id\u0027], volume[\u0027id\u0027])"},{"line_number":418,"context_line":"        waiters.wait_for_volume_status(self.volumes_client,"},{"line_number":419,"context_line":"                                       volume[\u0027id\u0027], \u0027in-use\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a98d1f4_ae8bea66","line":416,"updated":"2016-10-03 00:11:21.000000000","message":"This needs to ignore 404 in case the volume isn\u0027t attached or the server is deleted.\n\nhttp://logs.openstack.org/73/374373/2/check/gate-tempest-dsvm-neutron-full-ubuntu-xenial/92ed669/console.html#_2016-10-02_15_13_30_005685","commit_id":"0fdb73fdf5e4f866c518569fd62852b5a6b81cd9"}],"tempest/config.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"74f9abac30f6e341379dac737ab050f161d9857a","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                     \"available list of filters is in nova.conf: \""},{"line_number":416,"context_line":"                     \"DEFAULT.scheduler_available_filters\"),"},{"line_number":417,"context_line":"    cfg.BoolOpt(\u0027swap_volume\u0027,"},{"line_number":418,"context_line":"                default\u003dFalse,"},{"line_number":419,"context_line":"                help\u003d\u0027Does the test environment support in-place swapping of \u0027"},{"line_number":420,"context_line":"                     \u0027volumes attached to a server instance?\u0027),"},{"line_number":421,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_a32560ac","line":418,"updated":"2016-09-28 21:28:32.000000000","message":"Do we have a devstack patch to turn this on?","commit_id":"62e1b81ac8a783801adff57c40e60c883e11f8aa"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1a5eb77582a84253e2815c460b0e0a9093cb2ff6","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                     \"available list of filters is in nova.conf: \""},{"line_number":416,"context_line":"                     \"DEFAULT.scheduler_available_filters\"),"},{"line_number":417,"context_line":"    cfg.BoolOpt(\u0027swap_volume\u0027,"},{"line_number":418,"context_line":"                default\u003dFalse,"},{"line_number":419,"context_line":"                help\u003d\u0027Does the test environment support in-place swapping of \u0027"},{"line_number":420,"context_line":"                     \u0027volumes attached to a server instance?\u0027),"},{"line_number":421,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_7dc6734a","line":418,"in_reply_to":"3a98d1f4_a32560ac","updated":"2016-09-29 12:34:16.000000000","message":"You bet I do: https://review.openstack.org/#/c/374373/","commit_id":"62e1b81ac8a783801adff57c40e60c883e11f8aa"}],"tempest/scenario/manager.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"28c59e8fa713d93ab99401d749d184b8db28328c","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        server \u003d clients.servers_client.show_server(body[\u0027id\u0027])[\u0027server\u0027]"},{"line_number":262,"context_line":"        return server"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def _get_volume_clients(self, clients):"},{"line_number":265,"context_line":"        volumes_client \u003d clients.volumes_v2_client"},{"line_number":266,"context_line":"        if CONF.volume_feature_enabled.api_v1:"},{"line_number":267,"context_line":"            volumes_client \u003d clients.volumes_client"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_e3b60ff8","line":264,"range":{"start_line":264,"start_character":8,"end_line":264,"end_character":27},"updated":"2016-09-21 15:15:47.000000000","message":"The name on this method makes it sound like you\u0027re going to get a list back, it should be named \u0027_get_volumes_client\u0027 instead.","commit_id":"51d83488241e0d483d4386cd2896986f9e8f8aa0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"28c59e8fa713d93ab99401d749d184b8db28328c","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        return server"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def _get_volume_clients(self, clients):"},{"line_number":265,"context_line":"        volumes_client \u003d clients.volumes_v2_client"},{"line_number":266,"context_line":"        if CONF.volume_feature_enabled.api_v1:"},{"line_number":267,"context_line":"            volumes_client \u003d clients.volumes_client"},{"line_number":268,"context_line":"        return volumes_client"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    def create_volume(self, size\u003dNone, name\u003dNone, snapshot_id\u003dNone,"},{"line_number":271,"context_line":"                      imageRef\u003dNone, volume_type\u003dNone, clients\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_23f7178c","line":268,"range":{"start_line":265,"start_character":8,"end_line":268,"end_character":29},"updated":"2016-09-21 15:15:47.000000000","message":"I don\u0027t really understand why this is even needed, it\u0027s duplicating what\u0027s done in the setUp to set self.volumes_client.\n\n(later)\n\nOh I guess this is because we have to pass in the admin client manager for the swap-volume test, which will be different from what is created in setUp.","commit_id":"51d83488241e0d483d4386cd2896986f9e8f8aa0"}],"tempest/scenario/test_volume_swap.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f90d08783e943bf3ee7136d30b54f28a8b285719","unresolved":false,"context_lines":[{"line_number":21,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class TestVolumeSwap(manager.ScenarioTest):"},{"line_number":25,"context_line":"    \"\"\"The test suite for swapping of volume with admin and non-admin users."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    The following is the scenario outline:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_c26f54fa","line":24,"range":{"start_line":24,"start_character":29,"end_line":24,"end_character":41},"updated":"2016-09-21 14:12:10.000000000","message":"Why don\u0027t we just make this a compute admin API test rather than a scenario test?","commit_id":"51d83488241e0d483d4386cd2896986f9e8f8aa0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c8477d10699d7ca49d065f798f4267a33bd8e9c7","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    3. Boot an instance \"instance1\""},{"line_number":31,"context_line":"    4. Attach \"volume1\" to \"instance1\""},{"line_number":32,"context_line":"    5. Swap volume from \"volume1\" to \"volume2\""},{"line_number":33,"context_line":"    6. Check the swap volume is successful and \"volume2\""},{"line_number":34,"context_line":"       is attached to \"instance1\" and \"volume1\" is in available state."},{"line_number":35,"context_line":"    7. Perform above steps for admin and non-admin users."},{"line_number":36,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_d021de4e","line":33,"updated":"2016-09-21 14:29:19.000000000","message":"We have a known bug in nova where if you try to swap back from volume2 to volume1 it fails. That could be added later as an additional part of the test scenario.","commit_id":"51d83488241e0d483d4386cd2896986f9e8f8aa0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0bf657e0af807f631788de1d9e29f738e001e8a5","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    5. Swap volume from \"volume1\" to \"volume2\""},{"line_number":33,"context_line":"    6. Check the swap volume is successful and \"volume2\""},{"line_number":34,"context_line":"       is attached to \"instance1\" and \"volume1\" is in available state."},{"line_number":35,"context_line":"    7. Perform above steps for admin and non-admin users."},{"line_number":36,"context_line":"    \"\"\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    credentials \u003d [\u0027primary\u0027, \u0027admin\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a061dce_f05e1d11","line":35,"updated":"2016-04-08 20:14:59.000000000","message":"You might want to note that it\u0027s expected to fail for non-admins given the default policy is for admins.","commit_id":"51d83488241e0d483d4386cd2896986f9e8f8aa0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f90d08783e943bf3ee7136d30b54f28a8b285719","unresolved":false,"context_lines":[{"line_number":34,"context_line":"       is attached to \"instance1\" and \"volume1\" is in available state."},{"line_number":35,"context_line":"    7. Perform above steps for admin and non-admin users."},{"line_number":36,"context_line":"    \"\"\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    credentials \u003d [\u0027primary\u0027, \u0027admin\u0027]"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _test_volume_swap(self, clients):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_4518ae75","line":37,"updated":"2016-09-21 14:12:10.000000000","message":"We should have a skip check in here and add a feature flag for this, since swap_volume is only implemented for the libvirt driver in nova.","commit_id":"51d83488241e0d483d4386cd2896986f9e8f8aa0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"28c59e8fa713d93ab99401d749d184b8db28328c","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    7. Perform above steps for admin and non-admin users."},{"line_number":36,"context_line":"    \"\"\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    credentials \u003d [\u0027primary\u0027, \u0027admin\u0027]"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _test_volume_swap(self, clients):"},{"line_number":41,"context_line":"        # Create two volumes."}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_83c8eb23","line":38,"range":{"start_line":38,"start_character":20,"end_line":38,"end_character":27},"updated":"2016-09-21 15:15:47.000000000","message":"I don\u0027t think we want this, it\u0027s only for a negative scenario.","commit_id":"51d83488241e0d483d4386cd2896986f9e8f8aa0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0bf657e0af807f631788de1d9e29f738e001e8a5","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    @test.idempotent_id(\u00276bc1ed94-022e-40fa-bdb8-1e1d4b22deef\u0027)"},{"line_number":76,"context_line":"    @test.services(\u0027compute\u0027, \u0027volume\u0027)"},{"line_number":77,"context_line":"    def test_volume_swap_with_non_admin(self):"},{"line_number":78,"context_line":"        self._test_volume_swap(self.manager)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a061dce_b092e59d","line":77,"updated":"2016-04-08 20:14:59.000000000","message":"This will fail by default.","commit_id":"51d83488241e0d483d4386cd2896986f9e8f8aa0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f90d08783e943bf3ee7136d30b54f28a8b285719","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    @test.idempotent_id(\u00276bc1ed94-022e-40fa-bdb8-1e1d4b22deef\u0027)"},{"line_number":76,"context_line":"    @test.services(\u0027compute\u0027, \u0027volume\u0027)"},{"line_number":77,"context_line":"    def test_volume_swap_with_non_admin(self):"},{"line_number":78,"context_line":"        self._test_volume_swap(self.manager)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_222d58a8","line":77,"in_reply_to":"9a061dce_b092e59d","updated":"2016-09-21 14:12:10.000000000","message":"I think we should just remove this one, it\u0027s a negative scenario by default - you have to configure not only nova but also cinder policy to be non-admin to make this work.","commit_id":"51d83488241e0d483d4386cd2896986f9e8f8aa0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5b1167ced6ddd90a05d5a459b27e4bd2f3f59662","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from tempest import test"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"CONF \u003d config.CONF"},{"line_number":21,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class TestVolumeSwap(manager.ScenarioTest):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a8ec9b2_ef27c260","line":21,"updated":"2016-09-21 20:22:04.000000000","message":"This isn\u0027t used anywhere.","commit_id":"0bc9268fef247a2686f7f357587df80b99214454"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fd4a6674e373d074070bd0b4b0d1d2af1ff5f497","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        clients.servers_client.update_attached_volume(server[\u0027id\u0027],"},{"line_number":65,"context_line":"                                                      volume1[\u0027id\u0027],"},{"line_number":66,"context_line":"                                                      volumeId\u003dvolume2[\u0027id\u0027])"},{"line_number":67,"context_line":"        volumes_client \u003d self._get_volume_clients(clients)"},{"line_number":68,"context_line":"        waiters.wait_for_volume_status(volumes_client,"},{"line_number":69,"context_line":"                                       volume1[\u0027id\u0027], \u0027available\u0027)"},{"line_number":70,"context_line":"        waiters.wait_for_volume_status(volumes_client,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a8ec9b2_e81c1868","line":67,"updated":"2016-09-21 21:25:09.000000000","message":"Ah I renamed this and that\u0027s why it\u0027s broken:\n\nhttp://logs.openstack.org/73/374373/1/check/gate-tempest-dsvm-neutron-full-ubuntu-xenial/5be89d9/console.html#_2016-09-21_21_12_20_501953\n\nThis is why we should avoid calling private methods from the subclass.","commit_id":"0bc9268fef247a2686f7f357587df80b99214454"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"851888d05614f61e27d6062570a3f9596910b745","unresolved":false,"context_lines":[{"line_number":18,"context_line":"CONF \u003d config.CONF"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class TestVolumeSwap(manager.ScenarioTest):"},{"line_number":22,"context_line":"    \"\"\"The test suite for swapping of volume with admin user."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    The following is the scenario outline:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a8ec9b2_e62e048b","line":21,"range":{"start_line":21,"start_character":29,"end_line":21,"end_character":41},"updated":"2016-09-21 23:34:15.000000000","message":"I\u0027m still not really sure if this should be a scenario test or just a compute API admin test, but will let others decide. It\u0027s passing at least.","commit_id":"ab25215c5d249276ee99f3b7d7f90c5eeb2a0dcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"654c32d6a1949797f5aed44fcaf904d000fc28a2","unresolved":false,"context_lines":[{"line_number":18,"context_line":"CONF \u003d config.CONF"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class TestVolumeSwap(manager.ScenarioTest):"},{"line_number":22,"context_line":"    \"\"\"The test suite for swapping of volume with admin user."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    The following is the scenario outline:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a98d1f4_bd52e9db","line":21,"range":{"start_line":21,"start_character":29,"end_line":21,"end_character":41},"in_reply_to":"5a8bc5a2_3995f6e3","updated":"2016-09-28 17:05:02.000000000","message":"I talked to mtreinish and he thought this should be a compute API admin test too, so I\u0027ll work on making that change.","commit_id":"ab25215c5d249276ee99f3b7d7f90c5eeb2a0dcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"412fe75c9971b07c37c5b643d12dc84627bf87da","unresolved":false,"context_lines":[{"line_number":18,"context_line":"CONF \u003d config.CONF"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class TestVolumeSwap(manager.ScenarioTest):"},{"line_number":22,"context_line":"    \"\"\"The test suite for swapping of volume with admin user."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    The following is the scenario outline:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a8bc5a2_3995f6e3","line":21,"range":{"start_line":21,"start_character":29,"end_line":21,"end_character":41},"in_reply_to":"5a8bc5a2_e92a007e","updated":"2016-09-22 18:11:23.000000000","message":"It also exercises cinder to an extent, but yeah it\u0027s mostly just nova API testing.","commit_id":"ab25215c5d249276ee99f3b7d7f90c5eeb2a0dcf"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"03c0c836223ac3c0d22f8009c678f4285c3afb74","unresolved":false,"context_lines":[{"line_number":18,"context_line":"CONF \u003d config.CONF"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class TestVolumeSwap(manager.ScenarioTest):"},{"line_number":22,"context_line":"    \"\"\"The test suite for swapping of volume with admin user."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    The following is the scenario outline:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a8bc5a2_e92a007e","line":21,"range":{"start_line":21,"start_character":29,"end_line":21,"end_character":41},"in_reply_to":"7a8ec9b2_e62e048b","updated":"2016-09-22 08:40:18.000000000","message":"Yeah, I don\"t feel this should be a scenario. It only exercises Nova, and only one Nova route (update_attached_volume)","commit_id":"ab25215c5d249276ee99f3b7d7f90c5eeb2a0dcf"}]}
