)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10459,"name":"Luigi Toscano","email":"ltoscano@redhat.com","username":"ltoscano"},"change_message_id":"4003b6696e350a84483c95b43417c2b99b8df744","unresolved":false,"context_lines":[{"line_number":21,"context_line":"Now restore the snapshots one by one into volume, create instances"},{"line_number":22,"context_line":"from it and check the number of files and file content at each"},{"line_number":23,"context_line":"point snapshot was created."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Change-Id: I5c5ff6f996dd39b52fada82f3938b628e58b0a2c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"ff570b3c_2ab6ebfb","line":24,"updated":"2020-05-11 22:51:26.000000000","message":"Can you please also add a note about the import of the manager base class?","commit_id":"53e40fb289a1db5864ae44ed208425620104dbb3"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"7279f9d537ad052edc80ba30c4ab4ef3c2997bbe","unresolved":false,"context_lines":[{"line_number":21,"context_line":"Now restore the snapshots one by one into volume, create instances"},{"line_number":22,"context_line":"from it and check the number of files and file content at each"},{"line_number":23,"context_line":"point snapshot was created."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Change-Id: I5c5ff6f996dd39b52fada82f3938b628e58b0a2c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"ff570b3c_d3ab9c1a","line":24,"in_reply_to":"ff570b3c_2ab6ebfb","updated":"2020-05-12 15:22:13.000000000","message":"Done","commit_id":"53e40fb289a1db5864ae44ed208425620104dbb3"}],"cinder_tempest_plugin/scenario/manager.py":[{"author":{"_account_id":10459,"name":"Luigi Toscano","email":"ltoscano@redhat.com","username":"ltoscano"},"change_message_id":"4003b6696e350a84483c95b43417c2b99b8df744","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 OpenStack Foundation"},{"line_number":2,"context_line":"# Copyright 2013 IBM Corp."},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_aaf03bcb","line":1,"updated":"2020-05-11 22:51:26.000000000","message":"Do we need the full file? On the one hand this is a full copy of the current file, so it may makes sense. On the other hand, we are not going to use all the classes. Not sure. Maybe better keep it as it is, hopefully we will have an official stable manager base class in tempest soon.","commit_id":"53e40fb289a1db5864ae44ed208425620104dbb3"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"7279f9d537ad052edc80ba30c4ab4ef3c2997bbe","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 OpenStack Foundation"},{"line_number":2,"context_line":"# Copyright 2013 IBM Corp."},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_c7363db5","line":1,"in_reply_to":"ff570b3c_aaf03bcb","updated":"2020-05-12 15:22:13.000000000","message":"My idea of using the whole file was it should be similar to the main tempest file.\nThis i feel is temporary until we get tempest supporting importing the manager it in plugins.\nAlso addition of new tests would be easier and we won\u0027t have to modify this file again and again.","commit_id":"53e40fb289a1db5864ae44ed208425620104dbb3"},{"author":{"_account_id":11075,"name":"Benny Kopilov","email":"bkopilov@redhat.com","username":"bkopilov"},"change_message_id":"72a19e6edcec986a916c1f739a899326c3d55cfe","unresolved":true,"context_lines":[{"line_number":42,"context_line":"LATEST_MICROVERSION \u003d \u0027latest\u0027"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class ScenarioTest(tempest.test.BaseTestCase):"},{"line_number":46,"context_line":"    \"\"\"Base class for scenario tests. Uses tempest own clients. \"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    credentials \u003d [\u0027primary\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"ded4c457_b77b96d7","line":45,"updated":"2021-01-20 16:17:55.000000000","message":"Why do we import from BaseTestCase and not from ScenarioTest from manager? , you will inherits all clients and functions .\n\nI think that we should not duplicate code if we have evreything in tempest ...","commit_id":"6f1ee68ac33a084b5ce462e06eb01e90870af5ff"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"80b5ad4cc5c3b37bd321b9ffc561d1a4736cb17a","unresolved":true,"context_lines":[{"line_number":42,"context_line":"LATEST_MICROVERSION \u003d \u0027latest\u0027"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class ScenarioTest(tempest.test.BaseTestCase):"},{"line_number":46,"context_line":"    \"\"\"Base class for scenario tests. Uses tempest own clients. \"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    credentials \u003d [\u0027primary\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"51a99563_dfdb24a2","line":45,"in_reply_to":"0ad2c983_dc6068e9","updated":"2021-01-21 16:34:52.000000000","message":"yeah, work has been going on and we have merge a lot of changes but still not finished yet. Let\u0027s go with current aprpoach and later once Temepst declare it stable (may by before m-3) then we replace it.\n\nhttps://review.opendev.org/q/topic:%22bp%252Ftempest-scenario-manager-stable%22+(status:open%20OR%20status:merged)","commit_id":"6f1ee68ac33a084b5ce462e06eb01e90870af5ff"},{"author":{"_account_id":20813,"name":"Sofia Enriquez","email":"lsofia.enriquez@gmail.com","username":"enriquetaso"},"change_message_id":"760484308b42131fc63f094e8826874822aa88e7","unresolved":true,"context_lines":[{"line_number":42,"context_line":"LATEST_MICROVERSION \u003d \u0027latest\u0027"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class ScenarioTest(tempest.test.BaseTestCase):"},{"line_number":46,"context_line":"    \"\"\"Base class for scenario tests. Uses tempest own clients. \"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    credentials \u003d [\u0027primary\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"63e5443c_d31148ff","line":45,"in_reply_to":"51a99563_dfdb24a2","updated":"2021-01-23 04:45:20.000000000","message":"Sorry if this question is out of place but this means that the TestEncryptedCinderVolumes[1] should start using the manager from cinder_tempest_plugin.scenario until Tempest declare it stable?\n\n[1] https://opendev.org/openstack/cinder-tempest-plugin/src/branch/master/cinder_tempest_plugin/scenario/test_volume_encrypted.py#L18","commit_id":"6f1ee68ac33a084b5ce462e06eb01e90870af5ff"},{"author":{"_account_id":11075,"name":"Benny Kopilov","email":"bkopilov@redhat.com","username":"bkopilov"},"change_message_id":"c686e95c36104d9e2cd74e8da39910933492cad3","unresolved":true,"context_lines":[{"line_number":42,"context_line":"LATEST_MICROVERSION \u003d \u0027latest\u0027"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class ScenarioTest(tempest.test.BaseTestCase):"},{"line_number":46,"context_line":"    \"\"\"Base class for scenario tests. Uses tempest own clients. \"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    credentials \u003d [\u0027primary\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"6d9ce1c8_1b95101e","line":45,"in_reply_to":"63e5443c_d31148ff","updated":"2021-01-23 06:31:32.000000000","message":"@Ghanshyam , When tempest manager will be ready and declered stable, our code should support extentions, means that we will have our own additional functions releated to the plugin, and i think we should inherits from tempest manager anyway (so they are opening the function with **kwargs) but we will have to add our own common function to cinder_tempest_plugin.\n\nThis is my personal opionion , we are going to have many scenarios with special functions rather then calling the manager which inherits from tempest manager.\n\n\nThanks,\nBenny","commit_id":"6f1ee68ac33a084b5ce462e06eb01e90870af5ff"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"9582fcf2e702b9d97acb88a19212f5548916da91","unresolved":true,"context_lines":[{"line_number":42,"context_line":"LATEST_MICROVERSION \u003d \u0027latest\u0027"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class ScenarioTest(tempest.test.BaseTestCase):"},{"line_number":46,"context_line":"    \"\"\"Base class for scenario tests. Uses tempest own clients. \"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    credentials \u003d [\u0027primary\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"560ad45f_a8b3c282","line":45,"in_reply_to":"6d9ce1c8_1b95101e","updated":"2021-01-25 14:36:07.000000000","message":"@Sofia - yes that was the plan for scenario manager that each plugins will have their own copy (copy from tempest code) and keep their used method in that. Once tempest scenario manager is stable then we switch it to tempest one. With current usage of scenario manager in TestEncryptedCinderVolumes, there is no guarantee that Tempest interface will not be changed as that is not stable interface yet.\n\n@Benny - yeah if there are cinder plugin specific method then we can extend the tempest scenario manager by using the common one from tempest. but if there is any non-common method(even used by more than one plugin) then we can add that in tempest scenario manager itself.","commit_id":"6f1ee68ac33a084b5ce462e06eb01e90870af5ff"},{"author":{"_account_id":11075,"name":"Benny Kopilov","email":"bkopilov@redhat.com","username":"bkopilov"},"change_message_id":"0c667bbb64c31b1cd04c50e8dac9e36a0a9fe36a","unresolved":true,"context_lines":[{"line_number":42,"context_line":"LATEST_MICROVERSION \u003d \u0027latest\u0027"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class ScenarioTest(tempest.test.BaseTestCase):"},{"line_number":46,"context_line":"    \"\"\"Base class for scenario tests. Uses tempest own clients. \"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    credentials \u003d [\u0027primary\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"d142486c_5681e3de","line":45,"in_reply_to":"92b6fefd_3eeb788e","updated":"2021-01-20 18:50:04.000000000","message":"Yee , so each plugin creates his own manager and duplicate code , assume we install multiple plugin and need to work with shared resource ??  could some one explain the idea here ?\n\nif we install cinder_plugin and neutron_plugin for example , i dont understnad how its going to work ....assume cinder_plugin need access to neutron client (assume both duplicate )\n\nIs there any idea how are you going to merge your manager with stable interface ?  \n\nSo we are going to copy / paste and evrey plugin will add his own changes + clients ... so how are we going to run multiple plugins ?","commit_id":"6f1ee68ac33a084b5ce462e06eb01e90870af5ff"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"bec01e67634abd066ee9aec3823a8df1f76f1ec2","unresolved":true,"context_lines":[{"line_number":42,"context_line":"LATEST_MICROVERSION \u003d \u0027latest\u0027"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class ScenarioTest(tempest.test.BaseTestCase):"},{"line_number":46,"context_line":"    \"\"\"Base class for scenario tests. Uses tempest own clients. \"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    credentials \u003d [\u0027primary\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"0ad2c983_dc6068e9","line":45,"in_reply_to":"d142486c_5681e3de","updated":"2021-01-21 07:08:34.000000000","message":"I think it\u0027s better to discuss this with the QA team and also get update on the scenario manager stability.","commit_id":"6f1ee68ac33a084b5ce462e06eb01e90870af5ff"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"c8229caa9b5e34e532999105194a3dc28e34b1c1","unresolved":true,"context_lines":[{"line_number":42,"context_line":"LATEST_MICROVERSION \u003d \u0027latest\u0027"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class ScenarioTest(tempest.test.BaseTestCase):"},{"line_number":46,"context_line":"    \"\"\"Base class for scenario tests. Uses tempest own clients. \"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    credentials \u003d [\u0027primary\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"92b6fefd_3eeb788e","line":45,"in_reply_to":"ded4c457_b77b96d7","updated":"2021-01-20 18:36:48.000000000","message":"Initially that was being done but if you see comment from Ghanshyam Mann[1], it states that importing from tempest scenario manager is not stable and might break the plugin.\nThe same approach of copying the whole manager is done in another modules.\nI\u0027m not sure about the current situation of this but that was the intention behind adding this file.\n\n[1] https://review.opendev.org/c/openstack/cinder-tempest-plugin/+/702495/1/cinder_tempest_plugin/scenario/test_snapshots.py#17","commit_id":"6f1ee68ac33a084b5ce462e06eb01e90870af5ff"},{"author":{"_account_id":11075,"name":"Benny Kopilov","email":"bkopilov@redhat.com","username":"bkopilov"},"change_message_id":"72a19e6edcec986a916c1f739a899326c3d55cfe","unresolved":true,"context_lines":[{"line_number":107,"context_line":"                raise lib_exc.InvalidConfiguration("},{"line_number":108,"context_line":"                    \u0027Either api_v1 or api_v2 must be True in \u0027"},{"line_number":109,"context_line":"                    \u0027[image-feature-enabled].\u0027)"},{"line_number":110,"context_line":"        # Compute image client"},{"line_number":111,"context_line":"        cls.compute_images_client \u003d cls.os_primary.compute_images_client"},{"line_number":112,"context_line":"        cls.keypairs_client \u003d cls.os_primary.keypairs_client"},{"line_number":113,"context_line":"        # Nova security groups client"}],"source_content_type":"text/x-python","patch_set":8,"id":"f7eb2dd4_5201d784","line":110,"updated":"2021-01-20 16:17:55.000000000","message":"Code duplication , we have the clients already in tempest , need to inherit","commit_id":"6f1ee68ac33a084b5ce462e06eb01e90870af5ff"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"c8229caa9b5e34e532999105194a3dc28e34b1c1","unresolved":true,"context_lines":[{"line_number":107,"context_line":"                raise lib_exc.InvalidConfiguration("},{"line_number":108,"context_line":"                    \u0027Either api_v1 or api_v2 must be True in \u0027"},{"line_number":109,"context_line":"                    \u0027[image-feature-enabled].\u0027)"},{"line_number":110,"context_line":"        # Compute image client"},{"line_number":111,"context_line":"        cls.compute_images_client \u003d cls.os_primary.compute_images_client"},{"line_number":112,"context_line":"        cls.keypairs_client \u003d cls.os_primary.keypairs_client"},{"line_number":113,"context_line":"        # Nova security groups client"}],"source_content_type":"text/x-python","patch_set":8,"id":"53084722_b0e01cf0","line":110,"in_reply_to":"f7eb2dd4_5201d784","updated":"2021-01-20 18:36:48.000000000","message":"See comment above","commit_id":"6f1ee68ac33a084b5ce462e06eb01e90870af5ff"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"9582fcf2e702b9d97acb88a19212f5548916da91","unresolved":true,"context_lines":[{"line_number":137,"context_line":"    # The create_[resource] functions only return body and discard the"},{"line_number":138,"context_line":"    # resp part which is not used in scenario tests"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def create_port(self, network_id, client\u003dNone, **kwargs):"},{"line_number":141,"context_line":"        if not client:"},{"line_number":142,"context_line":"            client \u003d self.ports_client"},{"line_number":143,"context_line":"        name \u003d data_utils.rand_name(self.__class__.__name__)"},{"line_number":144,"context_line":"        if CONF.network.port_vnic_type and \u0027binding:vnic_type\u0027 not in kwargs:"}],"source_content_type":"text/x-python","patch_set":8,"id":"87462c9f_4f29cb63","line":141,"range":{"start_line":140,"start_character":0,"end_line":141,"end_character":22},"updated":"2021-01-25 14:36:07.000000000","message":"are you using this method ? You can only keep method/code which is used by cinder-tempest-plugin and remove rest all.","commit_id":"6f1ee68ac33a084b5ce462e06eb01e90870af5ff"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"928ed65f0a20d867baeae480c11ad33c54695484","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    # The create_[resource] functions only return body and discard the"},{"line_number":138,"context_line":"    # resp part which is not used in scenario tests"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def create_port(self, network_id, client\u003dNone, **kwargs):"},{"line_number":141,"context_line":"        if not client:"},{"line_number":142,"context_line":"            client \u003d self.ports_client"},{"line_number":143,"context_line":"        name \u003d data_utils.rand_name(self.__class__.__name__)"},{"line_number":144,"context_line":"        if CONF.network.port_vnic_type and \u0027binding:vnic_type\u0027 not in kwargs:"}],"source_content_type":"text/x-python","patch_set":8,"id":"54fac69c_067d5745","line":141,"range":{"start_line":140,"start_character":0,"end_line":141,"end_character":22},"in_reply_to":"87462c9f_4f29cb63","updated":"2021-01-28 11:40:13.000000000","message":"Done","commit_id":"6f1ee68ac33a084b5ce462e06eb01e90870af5ff"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"9582fcf2e702b9d97acb88a19212f5548916da91","unresolved":true,"context_lines":[{"line_number":154,"context_line":"                        client.delete_port, port[\u0027id\u0027])"},{"line_number":155,"context_line":"        return port"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def create_keypair(self, client\u003dNone):"},{"line_number":158,"context_line":"        if not client:"},{"line_number":159,"context_line":"            client \u003d self.keypairs_client"},{"line_number":160,"context_line":"        name \u003d data_utils.rand_name(self.__class__.__name__)"},{"line_number":161,"context_line":"        # We don\u0027t need to create a keypair by pubkey in scenario"}],"source_content_type":"text/x-python","patch_set":8,"id":"bbfa3d7b_e03458c1","line":158,"range":{"start_line":157,"start_character":0,"end_line":158,"end_character":22},"updated":"2021-01-25 14:36:07.000000000","message":"ditto","commit_id":"6f1ee68ac33a084b5ce462e06eb01e90870af5ff"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"928ed65f0a20d867baeae480c11ad33c54695484","unresolved":true,"context_lines":[{"line_number":154,"context_line":"                        client.delete_port, port[\u0027id\u0027])"},{"line_number":155,"context_line":"        return port"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def create_keypair(self, client\u003dNone):"},{"line_number":158,"context_line":"        if not client:"},{"line_number":159,"context_line":"            client \u003d self.keypairs_client"},{"line_number":160,"context_line":"        name \u003d data_utils.rand_name(self.__class__.__name__)"},{"line_number":161,"context_line":"        # We don\u0027t need to create a keypair by pubkey in scenario"}],"source_content_type":"text/x-python","patch_set":8,"id":"042c335b_3d851d94","line":158,"range":{"start_line":157,"start_character":0,"end_line":158,"end_character":22},"in_reply_to":"bbfa3d7b_e03458c1","updated":"2021-01-28 11:40:13.000000000","message":"This is being used in the test_snapshots file while creating/accessing VM","commit_id":"6f1ee68ac33a084b5ce462e06eb01e90870af5ff"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"9582fcf2e702b9d97acb88a19212f5548916da91","unresolved":true,"context_lines":[{"line_number":1397,"context_line":"        return self.create_volume(volume_type\u003dvolume_type[\u0027name\u0027])"},{"line_number":1398,"context_line":""},{"line_number":1399,"context_line":""},{"line_number":1400,"context_line":"class ObjectStorageScenarioTest(ScenarioTest):"},{"line_number":1401,"context_line":"    \"\"\"Provide harness to do Object Storage scenario tests."},{"line_number":1402,"context_line":""},{"line_number":1403,"context_line":"    Subclasses implement the tests that use the methods provided by this"},{"line_number":1404,"context_line":"    class."},{"line_number":1405,"context_line":"    \"\"\""},{"line_number":1406,"context_line":""},{"line_number":1407,"context_line":"    @classmethod"},{"line_number":1408,"context_line":"    def skip_checks(cls):"},{"line_number":1409,"context_line":"        super(ObjectStorageScenarioTest, cls).skip_checks()"},{"line_number":1410,"context_line":"        if not CONF.service_available.swift:"},{"line_number":1411,"context_line":"            skip_msg \u003d (\"%s skipped as swift is not available\" %"},{"line_number":1412,"context_line":"                        cls.__name__)"},{"line_number":1413,"context_line":"            raise cls.skipException(skip_msg)"},{"line_number":1414,"context_line":""},{"line_number":1415,"context_line":"    @classmethod"},{"line_number":1416,"context_line":"    def setup_credentials(cls):"},{"line_number":1417,"context_line":"        cls.set_network_resources()"},{"line_number":1418,"context_line":"        super(ObjectStorageScenarioTest, cls).setup_credentials()"},{"line_number":1419,"context_line":"        operator_role \u003d CONF.object_storage.operator_role"},{"line_number":1420,"context_line":"        cls.os_operator \u003d cls.get_client_manager(roles\u003d[operator_role])"},{"line_number":1421,"context_line":""},{"line_number":1422,"context_line":"    @classmethod"},{"line_number":1423,"context_line":"    def setup_clients(cls):"},{"line_number":1424,"context_line":"        super(ObjectStorageScenarioTest, cls).setup_clients()"},{"line_number":1425,"context_line":"        # Clients for Swift"},{"line_number":1426,"context_line":"        cls.account_client \u003d cls.os_operator.account_client"},{"line_number":1427,"context_line":"        cls.container_client \u003d cls.os_operator.container_client"},{"line_number":1428,"context_line":"        cls.object_client \u003d cls.os_operator.object_client"},{"line_number":1429,"context_line":""},{"line_number":1430,"context_line":"    def get_swift_stat(self):"},{"line_number":1431,"context_line":"        \"\"\"get swift status for our user account.\"\"\""},{"line_number":1432,"context_line":"        self.account_client.list_account_containers()"},{"line_number":1433,"context_line":"        LOG.debug(\u0027Swift status information obtained successfully\u0027)"},{"line_number":1434,"context_line":""},{"line_number":1435,"context_line":"    def create_container(self, container_name\u003dNone):"},{"line_number":1436,"context_line":"        name \u003d container_name or data_utils.rand_name("},{"line_number":1437,"context_line":"            \u0027swift-scenario-container\u0027)"},{"line_number":1438,"context_line":"        self.container_client.update_container(name)"},{"line_number":1439,"context_line":"        # look for the container to assure it is created"},{"line_number":1440,"context_line":"        self.list_and_check_container_objects(name)"},{"line_number":1441,"context_line":"        LOG.debug(\u0027Container %s created\u0027, name)"},{"line_number":1442,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":1443,"context_line":"                        self.container_client.delete_container,"},{"line_number":1444,"context_line":"                        name)"},{"line_number":1445,"context_line":"        return name"},{"line_number":1446,"context_line":""},{"line_number":1447,"context_line":"    def delete_container(self, container_name):"},{"line_number":1448,"context_line":"        self.container_client.delete_container(container_name)"},{"line_number":1449,"context_line":"        LOG.debug(\u0027Container %s deleted\u0027, container_name)"},{"line_number":1450,"context_line":""},{"line_number":1451,"context_line":"    def upload_object_to_container(self, container_name, obj_name\u003dNone):"},{"line_number":1452,"context_line":"        obj_name \u003d obj_name or data_utils.rand_name(\u0027swift-scenario-object\u0027)"},{"line_number":1453,"context_line":"        obj_data \u003d data_utils.random_bytes()"},{"line_number":1454,"context_line":"        self.object_client.create_object(container_name, obj_name, obj_data)"},{"line_number":1455,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":1456,"context_line":"                        self.object_client.delete_object,"},{"line_number":1457,"context_line":"                        container_name,"},{"line_number":1458,"context_line":"                        obj_name)"},{"line_number":1459,"context_line":"        return obj_name, obj_data"},{"line_number":1460,"context_line":""},{"line_number":1461,"context_line":"    def delete_object(self, container_name, filename):"},{"line_number":1462,"context_line":"        self.object_client.delete_object(container_name, filename)"},{"line_number":1463,"context_line":"        self.list_and_check_container_objects(container_name,"},{"line_number":1464,"context_line":"                                              not_present_obj\u003d[filename])"},{"line_number":1465,"context_line":""},{"line_number":1466,"context_line":"    def list_and_check_container_objects(self, container_name,"},{"line_number":1467,"context_line":"                                         present_obj\u003dNone,"},{"line_number":1468,"context_line":"                                         not_present_obj\u003dNone):"},{"line_number":1469,"context_line":"        # List objects for a given container and assert which are present and"},{"line_number":1470,"context_line":"        # which are not."},{"line_number":1471,"context_line":"        if present_obj is None:"},{"line_number":1472,"context_line":"            present_obj \u003d []"},{"line_number":1473,"context_line":"        if not_present_obj is None:"},{"line_number":1474,"context_line":"            not_present_obj \u003d []"},{"line_number":1475,"context_line":"        _, object_list \u003d self.container_client.list_container_objects("},{"line_number":1476,"context_line":"            container_name)"},{"line_number":1477,"context_line":"        if present_obj:"},{"line_number":1478,"context_line":"            for obj in present_obj:"},{"line_number":1479,"context_line":"                self.assertIn(obj, object_list)"},{"line_number":1480,"context_line":"        if not_present_obj:"},{"line_number":1481,"context_line":"            for obj in not_present_obj:"},{"line_number":1482,"context_line":"                self.assertNotIn(obj, object_list)"},{"line_number":1483,"context_line":""},{"line_number":1484,"context_line":"    def download_and_verify(self, container_name, obj_name, expected_data):"},{"line_number":1485,"context_line":"        _, obj \u003d self.object_client.get_object(container_name, obj_name)"},{"line_number":1486,"context_line":"        self.assertEqual(obj, expected_data)"}],"source_content_type":"text/x-python","patch_set":8,"id":"f801e786_d0f67d08","line":1486,"range":{"start_line":1400,"start_character":0,"end_line":1486,"end_character":44},"updated":"2021-01-25 14:36:07.000000000","message":"ditto. and for all above methods also","commit_id":"6f1ee68ac33a084b5ce462e06eb01e90870af5ff"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"928ed65f0a20d867baeae480c11ad33c54695484","unresolved":false,"context_lines":[{"line_number":1397,"context_line":"        return self.create_volume(volume_type\u003dvolume_type[\u0027name\u0027])"},{"line_number":1398,"context_line":""},{"line_number":1399,"context_line":""},{"line_number":1400,"context_line":"class ObjectStorageScenarioTest(ScenarioTest):"},{"line_number":1401,"context_line":"    \"\"\"Provide harness to do Object Storage scenario tests."},{"line_number":1402,"context_line":""},{"line_number":1403,"context_line":"    Subclasses implement the tests that use the methods provided by this"},{"line_number":1404,"context_line":"    class."},{"line_number":1405,"context_line":"    \"\"\""},{"line_number":1406,"context_line":""},{"line_number":1407,"context_line":"    @classmethod"},{"line_number":1408,"context_line":"    def skip_checks(cls):"},{"line_number":1409,"context_line":"        super(ObjectStorageScenarioTest, cls).skip_checks()"},{"line_number":1410,"context_line":"        if not CONF.service_available.swift:"},{"line_number":1411,"context_line":"            skip_msg \u003d (\"%s skipped as swift is not available\" %"},{"line_number":1412,"context_line":"                        cls.__name__)"},{"line_number":1413,"context_line":"            raise cls.skipException(skip_msg)"},{"line_number":1414,"context_line":""},{"line_number":1415,"context_line":"    @classmethod"},{"line_number":1416,"context_line":"    def setup_credentials(cls):"},{"line_number":1417,"context_line":"        cls.set_network_resources()"},{"line_number":1418,"context_line":"        super(ObjectStorageScenarioTest, cls).setup_credentials()"},{"line_number":1419,"context_line":"        operator_role \u003d CONF.object_storage.operator_role"},{"line_number":1420,"context_line":"        cls.os_operator \u003d cls.get_client_manager(roles\u003d[operator_role])"},{"line_number":1421,"context_line":""},{"line_number":1422,"context_line":"    @classmethod"},{"line_number":1423,"context_line":"    def setup_clients(cls):"},{"line_number":1424,"context_line":"        super(ObjectStorageScenarioTest, cls).setup_clients()"},{"line_number":1425,"context_line":"        # Clients for Swift"},{"line_number":1426,"context_line":"        cls.account_client \u003d cls.os_operator.account_client"},{"line_number":1427,"context_line":"        cls.container_client \u003d cls.os_operator.container_client"},{"line_number":1428,"context_line":"        cls.object_client \u003d cls.os_operator.object_client"},{"line_number":1429,"context_line":""},{"line_number":1430,"context_line":"    def get_swift_stat(self):"},{"line_number":1431,"context_line":"        \"\"\"get swift status for our user account.\"\"\""},{"line_number":1432,"context_line":"        self.account_client.list_account_containers()"},{"line_number":1433,"context_line":"        LOG.debug(\u0027Swift status information obtained successfully\u0027)"},{"line_number":1434,"context_line":""},{"line_number":1435,"context_line":"    def create_container(self, container_name\u003dNone):"},{"line_number":1436,"context_line":"        name \u003d container_name or data_utils.rand_name("},{"line_number":1437,"context_line":"            \u0027swift-scenario-container\u0027)"},{"line_number":1438,"context_line":"        self.container_client.update_container(name)"},{"line_number":1439,"context_line":"        # look for the container to assure it is created"},{"line_number":1440,"context_line":"        self.list_and_check_container_objects(name)"},{"line_number":1441,"context_line":"        LOG.debug(\u0027Container %s created\u0027, name)"},{"line_number":1442,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":1443,"context_line":"                        self.container_client.delete_container,"},{"line_number":1444,"context_line":"                        name)"},{"line_number":1445,"context_line":"        return name"},{"line_number":1446,"context_line":""},{"line_number":1447,"context_line":"    def delete_container(self, container_name):"},{"line_number":1448,"context_line":"        self.container_client.delete_container(container_name)"},{"line_number":1449,"context_line":"        LOG.debug(\u0027Container %s deleted\u0027, container_name)"},{"line_number":1450,"context_line":""},{"line_number":1451,"context_line":"    def upload_object_to_container(self, container_name, obj_name\u003dNone):"},{"line_number":1452,"context_line":"        obj_name \u003d obj_name or data_utils.rand_name(\u0027swift-scenario-object\u0027)"},{"line_number":1453,"context_line":"        obj_data \u003d data_utils.random_bytes()"},{"line_number":1454,"context_line":"        self.object_client.create_object(container_name, obj_name, obj_data)"},{"line_number":1455,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":1456,"context_line":"                        self.object_client.delete_object,"},{"line_number":1457,"context_line":"                        container_name,"},{"line_number":1458,"context_line":"                        obj_name)"},{"line_number":1459,"context_line":"        return obj_name, obj_data"},{"line_number":1460,"context_line":""},{"line_number":1461,"context_line":"    def delete_object(self, container_name, filename):"},{"line_number":1462,"context_line":"        self.object_client.delete_object(container_name, filename)"},{"line_number":1463,"context_line":"        self.list_and_check_container_objects(container_name,"},{"line_number":1464,"context_line":"                                              not_present_obj\u003d[filename])"},{"line_number":1465,"context_line":""},{"line_number":1466,"context_line":"    def list_and_check_container_objects(self, container_name,"},{"line_number":1467,"context_line":"                                         present_obj\u003dNone,"},{"line_number":1468,"context_line":"                                         not_present_obj\u003dNone):"},{"line_number":1469,"context_line":"        # List objects for a given container and assert which are present and"},{"line_number":1470,"context_line":"        # which are not."},{"line_number":1471,"context_line":"        if present_obj is None:"},{"line_number":1472,"context_line":"            present_obj \u003d []"},{"line_number":1473,"context_line":"        if not_present_obj is None:"},{"line_number":1474,"context_line":"            not_present_obj \u003d []"},{"line_number":1475,"context_line":"        _, object_list \u003d self.container_client.list_container_objects("},{"line_number":1476,"context_line":"            container_name)"},{"line_number":1477,"context_line":"        if present_obj:"},{"line_number":1478,"context_line":"            for obj in present_obj:"},{"line_number":1479,"context_line":"                self.assertIn(obj, object_list)"},{"line_number":1480,"context_line":"        if not_present_obj:"},{"line_number":1481,"context_line":"            for obj in not_present_obj:"},{"line_number":1482,"context_line":"                self.assertNotIn(obj, object_list)"},{"line_number":1483,"context_line":""},{"line_number":1484,"context_line":"    def download_and_verify(self, container_name, obj_name, expected_data):"},{"line_number":1485,"context_line":"        _, obj \u003d self.object_client.get_object(container_name, obj_name)"},{"line_number":1486,"context_line":"        self.assertEqual(obj, expected_data)"}],"source_content_type":"text/x-python","patch_set":8,"id":"6548a230_8c59def5","line":1486,"range":{"start_line":1400,"start_character":0,"end_line":1486,"end_character":44},"in_reply_to":"f801e786_d0f67d08","updated":"2021-01-28 11:40:13.000000000","message":"Done","commit_id":"6f1ee68ac33a084b5ce462e06eb01e90870af5ff"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0037c908ad363a21ef9cde6b0a4b046046d2d6a7","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 OpenStack Foundation"},{"line_number":2,"context_line":"# Copyright 2013 IBM Corp."},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":11,"id":"e48aebb2_89983939","line":1,"updated":"2021-01-25 14:55:28.000000000","message":"?: Should we add a todo somewhere here to remind us to remove this file once we can import it from Tempest?","commit_id":"8fa6b111386df4eb2d5d046a9c891e7d96634196"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"928ed65f0a20d867baeae480c11ad33c54695484","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 OpenStack Foundation"},{"line_number":2,"context_line":"# Copyright 2013 IBM Corp."},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":11,"id":"e673a22b_7e73ffb8","line":1,"in_reply_to":"e48aebb2_89983939","updated":"2021-01-28 11:40:13.000000000","message":"Done","commit_id":"8fa6b111386df4eb2d5d046a9c891e7d96634196"}],"cinder_tempest_plugin/scenario/test_snapshots.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"619ebf8e766cd38cbc407956baa55ef810cb8cb1","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from tempest.common import utils"},{"line_number":17,"context_line":"from tempest.scenario import manager"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class SnapshotDataIntegrityTests(manager.ScenarioTest):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_cf70d90c","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":36},"updated":"2020-01-15 23:36:42.000000000","message":"Tempest scenario manager is not stable interface yet so we do not recommend to use it outside of Tempest. If using this unstable version then there is a chance of breaking the plugin. It happened in past and we updated all plugin to maintain their own copy of the scenario manager[1]. \n\nOnce we modify this and make it stable interface then plugin can replace it with the Tempest version.\n\nYou can maintain its copy (with required stuff only) like other plugin did.\n- https://review.opendev.org/#/c/438760/\n\n[1] http://lists.openstack.org/pipermail/openstack-dev/2017-February/112938.html","commit_id":"acaf177e0e07f49058cb056c75bab913f079a004"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"8b3f441162c45f07a5cf470cfc411b2ed69bdc1d","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from tempest.common import utils"},{"line_number":17,"context_line":"from tempest.scenario import manager"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class SnapshotDataIntegrityTests(manager.ScenarioTest):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_94a95479","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":36},"in_reply_to":"3fa7e38b_cf70d90c","updated":"2020-01-21 06:33:49.000000000","message":"Done","commit_id":"acaf177e0e07f49058cb056c75bab913f079a004"},{"author":{"_account_id":10459,"name":"Luigi Toscano","email":"ltoscano@redhat.com","username":"ltoscano"},"change_message_id":"e6366204d5043b7d39eb852abed722f78a9f2f14","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                         private_key\u003dkeypair[\u0027private_key\u0027],"},{"line_number":72,"context_line":"                         server\u003dinstance_ip)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        # Create first snapshot"},{"line_number":75,"context_line":"        snapshot1 \u003d self.create_volume_snapshot(volume[\u0027id\u0027], force\u003dTrue)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        # Write data to volume"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_cdaad183","line":74,"updated":"2020-04-07 10:05:53.000000000","message":"This \"create volume from snapshot and check\" part seems to be reused for each snapshot and the differences are just the input data. Maybe a function?","commit_id":"6d39705b66de7694f407a5c1d4d370b967938943"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"54ca0baafe259afc086cfab8a561a7478aa80a25","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                         private_key\u003dkeypair[\u0027private_key\u0027],"},{"line_number":72,"context_line":"                         server\u003dinstance_ip)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        # Create first snapshot"},{"line_number":75,"context_line":"        snapshot1 \u003d self.create_volume_snapshot(volume[\u0027id\u0027], force\u003dTrue)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        # Write data to volume"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_71510c0f","line":74,"in_reply_to":"df33271e_cdaad183","updated":"2020-05-11 10:18:54.000000000","message":"Done","commit_id":"6d39705b66de7694f407a5c1d4d370b967938943"},{"author":{"_account_id":10459,"name":"Luigi Toscano","email":"ltoscano@redhat.com","username":"ltoscano"},"change_message_id":"078ee5bd5a7ce7138fb3e23ca93f1c11ebb6288a","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        return count_snap, content_snap"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    @utils.services(\u0027compute\u0027, \u0027volume\u0027, \u0027image\u0027, \u0027network\u0027)"},{"line_number":75,"context_line":"    def test_snapshot_data_integrity(self):"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        # Create a volume from image"},{"line_number":78,"context_line":"        volume \u003d self.create_volume_from_image()"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff570b3c_51916899","line":75,"updated":"2020-05-11 10:25:08.000000000","message":"The only missing thing is the test ID (through @decorators.idempotent_id)","commit_id":"705d16c3b70e441d8da0857cd9d4a7978984c11b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"ac0f7064764aba46b40ef6e243ac1d46f137ff85","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        return count_snap, content_snap"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    @utils.services(\u0027compute\u0027, \u0027volume\u0027, \u0027image\u0027, \u0027network\u0027)"},{"line_number":75,"context_line":"    def test_snapshot_data_integrity(self):"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        # Create a volume from image"},{"line_number":78,"context_line":"        volume \u003d self.create_volume_from_image()"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff570b3c_f1907c51","line":75,"in_reply_to":"ff570b3c_51916899","updated":"2020-05-11 10:43:00.000000000","message":"Done","commit_id":"705d16c3b70e441d8da0857cd9d4a7978984c11b"},{"author":{"_account_id":10459,"name":"Luigi Toscano","email":"ltoscano@redhat.com","username":"ltoscano"},"change_message_id":"4003b6696e350a84483c95b43417c2b99b8df744","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                                            server\u003dserver)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        count \u003d ssh_client.exec_command(\u0027sudo ls -l %s | wc -l\u0027 % mount_path)"},{"line_number":37,"context_line":"        content \u003d ssh_client.exec_command(\u0027sudo less %s/file-%s\u0027 %"},{"line_number":38,"context_line":"                                          (mount_path, filename))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        return int(count) - 1, content.strip(\u0027\\n\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_5f5fa340","line":37,"updated":"2020-05-11 22:51:26.000000000","message":"Less is more a pager; in this case (output to a non-terminal) it should work as cat, but then why not cat directly?\n\nAlso, why call the file \"file-\" + filename (also in the other function)? Couldn\u0027t filename be used directly?","commit_id":"53e40fb289a1db5864ae44ed208425620104dbb3"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"7279f9d537ad052edc80ba30c4ab4ef3c2997bbe","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                                            server\u003dserver)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        count \u003d ssh_client.exec_command(\u0027sudo ls -l %s | wc -l\u0027 % mount_path)"},{"line_number":37,"context_line":"        content \u003d ssh_client.exec_command(\u0027sudo less %s/file-%s\u0027 %"},{"line_number":38,"context_line":"                                          (mount_path, filename))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        return int(count) - 1, content.strip(\u0027\\n\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_93f804c5","line":37,"in_reply_to":"ff570b3c_5f5fa340","updated":"2020-05-12 15:22:13.000000000","message":"Yep, we can use cat. Don\u0027t remember why is used less here.\nThe file- is just for prefix and i think we can remove it.","commit_id":"53e40fb289a1db5864ae44ed208425620104dbb3"},{"author":{"_account_id":10459,"name":"Luigi Toscano","email":"ltoscano@redhat.com","username":"ltoscano"},"change_message_id":"4003b6696e350a84483c95b43417c2b99b8df744","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        content \u003d ssh_client.exec_command(\u0027sudo less %s/file-%s\u0027 %"},{"line_number":38,"context_line":"                                          (mount_path, filename))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        return int(count) - 1, content.strip(\u0027\\n\u0027)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def create_file(self, ip_address, filename, content\u003d\u0027\u0027,"},{"line_number":43,"context_line":"                    mount_path\u003d\u0027/mnt\u0027, private_key\u003dNone, server\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_aa1cbb6a","line":40,"updated":"2020-05-11 22:51:26.000000000","message":"I wouldn\u0027t remove the final newline and then change the count of the bytes, but use echo -n to create the file instead.","commit_id":"53e40fb289a1db5864ae44ed208425620104dbb3"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"7279f9d537ad052edc80ba30c4ab4ef3c2997bbe","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        content \u003d ssh_client.exec_command(\u0027sudo less %s/file-%s\u0027 %"},{"line_number":38,"context_line":"                                          (mount_path, filename))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        return int(count) - 1, content.strip(\u0027\\n\u0027)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def create_file(self, ip_address, filename, content\u003d\u0027\u0027,"},{"line_number":43,"context_line":"                    mount_path\u003d\u0027/mnt\u0027, private_key\u003dNone, server\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_f3d7c022","line":40,"in_reply_to":"ff570b3c_aa1cbb6a","updated":"2020-05-12 15:22:13.000000000","message":"This isn\u0027t for counting bytes but for counting files.\nthe ls command produces extra line that\u0027s why we\u0027re doing -1 here.","commit_id":"53e40fb289a1db5864ae44ed208425620104dbb3"},{"author":{"_account_id":10459,"name":"Luigi Toscano","email":"ltoscano@redhat.com","username":"ltoscano"},"change_message_id":"8f89ae6222afcdce69dbeacc5785d9e7c5dee4a8","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        content \u003d ssh_client.exec_command(\u0027sudo less %s/file-%s\u0027 %"},{"line_number":38,"context_line":"                                          (mount_path, filename))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        return int(count) - 1, content.strip(\u0027\\n\u0027)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def create_file(self, ip_address, filename, content\u003d\u0027\u0027,"},{"line_number":43,"context_line":"                    mount_path\u003d\u0027/mnt\u0027, private_key\u003dNone, server\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_59d16dcd","line":40,"in_reply_to":"ff570b3c_f3d7c022","updated":"2020-05-12 16:05:17.000000000","message":"The first returned value is the number of files, but the second one is the content of filename.","commit_id":"53e40fb289a1db5864ae44ed208425620104dbb3"},{"author":{"_account_id":10459,"name":"Luigi Toscano","email":"ltoscano@redhat.com","username":"ltoscano"},"change_message_id":"4003b6696e350a84483c95b43417c2b99b8df744","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        ssh_client.exec_command(\u0027sudo touch /%s/file-%s\u0027 %"},{"line_number":49,"context_line":"                                (mount_path, filename))"},{"line_number":50,"context_line":"        if content:"},{"line_number":51,"context_line":"            ssh_client.exec_command(\u0027echo \"%s\" | sudo tee %s/file-%s\u0027 %"},{"line_number":52,"context_line":"                                    (content, mount_path, filename))"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        ssh_client.exec_command(\u0027sudo sync\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_8a19f77a","line":51,"updated":"2020-05-11 22:51:26.000000000","message":"echo -n (see above)","commit_id":"53e40fb289a1db5864ae44ed208425620104dbb3"},{"author":{"_account_id":10459,"name":"Luigi Toscano","email":"ltoscano@redhat.com","username":"ltoscano"},"change_message_id":"4003b6696e350a84483c95b43417c2b99b8df744","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    @decorators.idempotent_id(\u0027ff10644e-5a70-4a9f-9801-8204bb81fb61\u0027)"},{"line_number":76,"context_line":"    @utils.services(\u0027compute\u0027, \u0027volume\u0027, \u0027image\u0027, \u0027network\u0027)"},{"line_number":77,"context_line":"    def test_snapshot_data_integrity(self):"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        # Create a volume from image"},{"line_number":80,"context_line":"        volume \u003d self.create_volume_from_image()"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_ead19359","line":77,"updated":"2020-05-11 22:51:26.000000000","message":"Can you please add a description of what the test does?\nSee for example (in the test):\n\nhttps://opendev.org/openstack/tempest/src/commit/006e8d175ea16413a06e06813b498d2da15e69f1/tempest/scenario/test_volume_backup_restore.py#L26\n\nBasically the content of the commit message would do.","commit_id":"53e40fb289a1db5864ae44ed208425620104dbb3"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"7279f9d537ad052edc80ba30c4ab4ef3c2997bbe","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    @decorators.idempotent_id(\u0027ff10644e-5a70-4a9f-9801-8204bb81fb61\u0027)"},{"line_number":76,"context_line":"    @utils.services(\u0027compute\u0027, \u0027volume\u0027, \u0027image\u0027, \u0027network\u0027)"},{"line_number":77,"context_line":"    def test_snapshot_data_integrity(self):"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        # Create a volume from image"},{"line_number":80,"context_line":"        volume \u003d self.create_volume_from_image()"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_f32fc0f3","line":77,"in_reply_to":"ff570b3c_ead19359","updated":"2020-05-12 15:22:13.000000000","message":"Done","commit_id":"53e40fb289a1db5864ae44ed208425620104dbb3"},{"author":{"_account_id":11075,"name":"Benny Kopilov","email":"bkopilov@redhat.com","username":"bkopilov"},"change_message_id":"64e8a6b7b7aab7245f8aff1c0b1734c0047a6e60","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    def files_count_and_content(self, ip_address, filename,"},{"line_number":29,"context_line":"                                mount_path\u003d\u0027/mnt\u0027, private_key\u003dNone,"},{"line_number":30,"context_line":"                                server\u003dNone):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        ssh_client \u003d self.get_remote_client(ip_address,"},{"line_number":33,"context_line":"                                            private_key\u003dprivate_key,"},{"line_number":34,"context_line":"                                            server\u003dserver)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff570b3c_ff613e3b","line":31,"updated":"2020-05-12 19:04:15.000000000","message":"Here we pass a filename and return the content with \\n, you can use here md5 ... my problem here is that you count all files under the same function and return content for a single file. Please consider splitting the function.\n_get_file_md5 ... \n_count_files ...","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"bec01e67634abd066ee9aec3823a8df1f76f1ec2","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    def files_count_and_content(self, ip_address, filename,"},{"line_number":29,"context_line":"                                mount_path\u003d\u0027/mnt\u0027, private_key\u003dNone,"},{"line_number":30,"context_line":"                                server\u003dNone):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        ssh_client \u003d self.get_remote_client(ip_address,"},{"line_number":33,"context_line":"                                            private_key\u003dprivate_key,"},{"line_number":34,"context_line":"                                            server\u003dserver)"}],"source_content_type":"text/x-python","patch_set":7,"id":"929bf1b1_dc2fc1e4","line":31,"in_reply_to":"ff570b3c_ff613e3b","updated":"2021-01-21 07:08:34.000000000","message":"Done","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":11075,"name":"Benny Kopilov","email":"bkopilov@redhat.com","username":"bkopilov"},"change_message_id":"64e8a6b7b7aab7245f8aff1c0b1734c0047a6e60","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        return int(count) - 1, content.strip(\u0027\\n\u0027)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def create_file(self, ip_address, filename, content\u003d\u0027\u0027,"},{"line_number":43,"context_line":"                    mount_path\u003d\u0027/mnt\u0027, private_key\u003dNone, server\u003dNone):"},{"line_number":44,"context_line":"        ssh_client \u003d self.get_remote_client(ip_address,"},{"line_number":45,"context_line":"                                            private_key\u003dprivate_key,"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff570b3c_dfed5a26","line":42,"updated":"2020-05-12 19:04:15.000000000","message":"You are doing similar to create_timestamp in scenario manager but the file name there is hardcoded (maybe we can change it and you will not need to rewrite the function.\nMy approach is a little bit different:\n-\u003e You should add the device to it, if this class will grow with more tests, we will need to mount to it ...  and unmount\n-\u003e I think we should create a write function that returns a value and better will be return md5 from a file. \nsomething like :\n md5 \u003d ssh_client.run_command(\n            \u0027sudo md5sum %s/%s|cut -c 1-32\u0027 % (mount_path, file_name))\nreturn md5.\n\nThis function is not only create_file, but i would also suggest to call it :\ndef create_md5_new_file(...)   you will store the md5 value for re-using, this function creates a single file and always will return md5 for a file. we assume that we always have content inside.","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"bec01e67634abd066ee9aec3823a8df1f76f1ec2","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        return int(count) - 1, content.strip(\u0027\\n\u0027)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def create_file(self, ip_address, filename, content\u003d\u0027\u0027,"},{"line_number":43,"context_line":"                    mount_path\u003d\u0027/mnt\u0027, private_key\u003dNone, server\u003dNone):"},{"line_number":44,"context_line":"        ssh_client \u003d self.get_remote_client(ip_address,"},{"line_number":45,"context_line":"                                            private_key\u003dprivate_key,"}],"source_content_type":"text/x-python","patch_set":7,"id":"a722f207_5d942271","line":42,"in_reply_to":"ff570b3c_dfed5a26","updated":"2021-01-21 07:08:34.000000000","message":"Done","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":11075,"name":"Benny Kopilov","email":"bkopilov@redhat.com","username":"bkopilov"},"change_message_id":"64e8a6b7b7aab7245f8aff1c0b1734c0047a6e60","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        ssh_client.exec_command(\u0027sudo sync\u0027)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def check_data_integrity(self, snap, filename):"},{"line_number":57,"context_line":"        volume_snap \u003d self.create_volume(snapshot_id\u003dsnap[\u0027id\u0027],"},{"line_number":58,"context_line":"                                         size\u003dsnap[\u0027size\u0027])"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        server_snap \u003d self.boot_instance_from_resource("}],"source_content_type":"text/x-python","patch_set":7,"id":"ff570b3c_5fe30a06","line":57,"range":{"start_line":57,"start_character":0,"end_line":57,"end_character":8},"updated":"2020-05-12 19:04:15.000000000","message":"Honestly, I don\u0027t think you need to create here the volume snapshot or boot the instance, this function should be simple and maybe reused by new tests.\nHere you don\u0027t check the integrity, you return the data for verification.\n\nThe function might be:\nget_md5_from_file()\nYou can pass to this function the instance.\nHere you should return the md5 for the existing file and compare it.\nThis function should get an instance (we assume that accessing to volume done from instances)","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"bec01e67634abd066ee9aec3823a8df1f76f1ec2","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        ssh_client.exec_command(\u0027sudo sync\u0027)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def check_data_integrity(self, snap, filename):"},{"line_number":57,"context_line":"        volume_snap \u003d self.create_volume(snapshot_id\u003dsnap[\u0027id\u0027],"},{"line_number":58,"context_line":"                                         size\u003dsnap[\u0027size\u0027])"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        server_snap \u003d self.boot_instance_from_resource("}],"source_content_type":"text/x-python","patch_set":7,"id":"3e0262ef_8e757e65","line":57,"range":{"start_line":57,"start_character":0,"end_line":57,"end_character":8},"in_reply_to":"ff570b3c_5fe30a06","updated":"2021-01-21 07:08:34.000000000","message":"Done","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":11075,"name":"Benny Kopilov","email":"bkopilov@redhat.com","username":"bkopilov"},"change_message_id":"64e8a6b7b7aab7245f8aff1c0b1734c0047a6e60","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        volume_snap \u003d self.create_volume(snapshot_id\u003dsnap[\u0027id\u0027],"},{"line_number":58,"context_line":"                                         size\u003dsnap[\u0027size\u0027])"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        server_snap \u003d self.boot_instance_from_resource("},{"line_number":61,"context_line":"            source_id\u003dvolume_snap[\u0027id\u0027],"},{"line_number":62,"context_line":"            source_type\u003d\u0027volume\u0027,"},{"line_number":63,"context_line":"            keypair\u003dself.keypair,"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff570b3c_7f7d2e1b","line":60,"updated":"2020-05-12 19:04:15.000000000","message":"This is confusing, a function that should check date integrity creates a volume and boot instance inside ...","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"bec01e67634abd066ee9aec3823a8df1f76f1ec2","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        volume_snap \u003d self.create_volume(snapshot_id\u003dsnap[\u0027id\u0027],"},{"line_number":58,"context_line":"                                         size\u003dsnap[\u0027size\u0027])"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        server_snap \u003d self.boot_instance_from_resource("},{"line_number":61,"context_line":"            source_id\u003dvolume_snap[\u0027id\u0027],"},{"line_number":62,"context_line":"            source_type\u003d\u0027volume\u0027,"},{"line_number":63,"context_line":"            keypair\u003dself.keypair,"}],"source_content_type":"text/x-python","patch_set":7,"id":"7b23dda4_512fd51b","line":60,"in_reply_to":"ff570b3c_7f7d2e1b","updated":"2021-01-21 07:08:34.000000000","message":"Done","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"54e9c9639c5ab9bdadb90f633d9d321704af340e","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    @decorators.idempotent_id(\u0027ff10644e-5a70-4a9f-9801-8204bb81fb61\u0027)"},{"line_number":76,"context_line":"    @utils.services(\u0027compute\u0027, \u0027volume\u0027, \u0027image\u0027, \u0027network\u0027)"},{"line_number":77,"context_line":"    def test_snapshot_data_integrity(self):"},{"line_number":78,"context_line":"        \"\"\"This test checks the data integrity after creating and restoring"},{"line_number":79,"context_line":"        snapshots. The procedure is as follows:"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        1) create a volume from image"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff570b3c_8b60bda7","line":78,"updated":"2020-05-13 00:40:23.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"54e9c9639c5ab9bdadb90f633d9d321704af340e","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    @utils.services(\u0027compute\u0027, \u0027volume\u0027, \u0027image\u0027, \u0027network\u0027)"},{"line_number":77,"context_line":"    def test_snapshot_data_integrity(self):"},{"line_number":78,"context_line":"        \"\"\"This test checks the data integrity after creating and restoring"},{"line_number":79,"context_line":"        snapshots. The procedure is as follows:"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        1) create a volume from image"},{"line_number":82,"context_line":"        2) Boot an instance from the volume"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff570b3c_6b63a9b2","line":79,"updated":"2020-05-13 00:40:23.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"54e9c9639c5ab9bdadb90f633d9d321704af340e","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def test_snapshot_data_integrity(self):"},{"line_number":78,"context_line":"        \"\"\"This test checks the data integrity after creating and restoring"},{"line_number":79,"context_line":"        snapshots. The procedure is as follows:"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        1) create a volume from image"},{"line_number":82,"context_line":"        2) Boot an instance from the volume"},{"line_number":83,"context_line":"        3) create file on vm and write data into it"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff570b3c_cb5ab5f1","line":80,"updated":"2020-05-13 00:40:23.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"54e9c9639c5ab9bdadb90f633d9d321704af340e","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        \"\"\"This test checks the data integrity after creating and restoring"},{"line_number":79,"context_line":"        snapshots. The procedure is as follows:"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        1) create a volume from image"},{"line_number":82,"context_line":"        2) Boot an instance from the volume"},{"line_number":83,"context_line":"        3) create file on vm and write data into it"},{"line_number":84,"context_line":"        4) create snapshot"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff570b3c_ab5dc1ea","line":81,"updated":"2020-05-13 00:40:23.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"54e9c9639c5ab9bdadb90f633d9d321704af340e","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        snapshots. The procedure is as follows:"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        1) create a volume from image"},{"line_number":82,"context_line":"        2) Boot an instance from the volume"},{"line_number":83,"context_line":"        3) create file on vm and write data into it"},{"line_number":84,"context_line":"        4) create snapshot"},{"line_number":85,"context_line":"        5) repeat 3 and 4 two more times (simply creating 3 snapshots)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff570b3c_0b74ad67","line":82,"updated":"2020-05-13 00:40:23.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"54e9c9639c5ab9bdadb90f633d9d321704af340e","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        1) create a volume from image"},{"line_number":82,"context_line":"        2) Boot an instance from the volume"},{"line_number":83,"context_line":"        3) create file on vm and write data into it"},{"line_number":84,"context_line":"        4) create snapshot"},{"line_number":85,"context_line":"        5) repeat 3 and 4 two more times (simply creating 3 snapshots)"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ff570b3c_eb6e9994","line":83,"updated":"2020-05-13 00:40:23.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"54e9c9639c5ab9bdadb90f633d9d321704af340e","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        1) create a volume from image"},{"line_number":82,"context_line":"        2) Boot an instance from the volume"},{"line_number":83,"context_line":"        3) create file on vm and write data into it"},{"line_number":84,"context_line":"        4) create snapshot"},{"line_number":85,"context_line":"        5) repeat 3 and 4 two more times (simply creating 3 snapshots)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        Now restore the snapshots one by one into volume, create instances"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff570b3c_4b6ea595","line":84,"updated":"2020-05-13 00:40:23.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"54e9c9639c5ab9bdadb90f633d9d321704af340e","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        2) Boot an instance from the volume"},{"line_number":83,"context_line":"        3) create file on vm and write data into it"},{"line_number":84,"context_line":"        4) create snapshot"},{"line_number":85,"context_line":"        5) repeat 3 and 4 two more times (simply creating 3 snapshots)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        Now restore the snapshots one by one into volume, create instances"},{"line_number":88,"context_line":"        from it and check the number of files and file content at each"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff570b3c_2b69b18a","line":85,"updated":"2020-05-13 00:40:23.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"54e9c9639c5ab9bdadb90f633d9d321704af340e","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        3) create file on vm and write data into it"},{"line_number":84,"context_line":"        4) create snapshot"},{"line_number":85,"context_line":"        5) repeat 3 and 4 two more times (simply creating 3 snapshots)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        Now restore the snapshots one by one into volume, create instances"},{"line_number":88,"context_line":"        from it and check the number of files and file content at each"},{"line_number":89,"context_line":"        point when snapshot was created."}],"source_content_type":"text/x-python","patch_set":7,"id":"ff570b3c_8b055dc5","line":86,"updated":"2020-05-13 00:40:23.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"54e9c9639c5ab9bdadb90f633d9d321704af340e","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        4) create snapshot"},{"line_number":85,"context_line":"        5) repeat 3 and 4 two more times (simply creating 3 snapshots)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        Now restore the snapshots one by one into volume, create instances"},{"line_number":88,"context_line":"        from it and check the number of files and file content at each"},{"line_number":89,"context_line":"        point when snapshot was created."},{"line_number":90,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"ff570b3c_6b08c9d8","line":87,"updated":"2020-05-13 00:40:23.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"54e9c9639c5ab9bdadb90f633d9d321704af340e","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        5) repeat 3 and 4 two more times (simply creating 3 snapshots)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        Now restore the snapshots one by one into volume, create instances"},{"line_number":88,"context_line":"        from it and check the number of files and file content at each"},{"line_number":89,"context_line":"        point when snapshot was created."},{"line_number":90,"context_line":"        \"\"\""},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ff570b3c_cb0f55df","line":88,"updated":"2020-05-13 00:40:23.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"54e9c9639c5ab9bdadb90f633d9d321704af340e","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        Now restore the snapshots one by one into volume, create instances"},{"line_number":88,"context_line":"        from it and check the number of files and file content at each"},{"line_number":89,"context_line":"        point when snapshot was created."},{"line_number":90,"context_line":"        \"\"\""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        # Create a volume from image"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff570b3c_ab12e107","line":89,"updated":"2020-05-13 00:40:23.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"54e9c9639c5ab9bdadb90f633d9d321704af340e","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        Now restore the snapshots one by one into volume, create instances"},{"line_number":88,"context_line":"        from it and check the number of files and file content at each"},{"line_number":89,"context_line":"        point when snapshot was created."},{"line_number":90,"context_line":"        \"\"\""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        # Create a volume from image"},{"line_number":93,"context_line":"        volume \u003d self.create_volume_from_image()"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff570b3c_0bf94dc7","line":90,"updated":"2020-05-13 00:40:23.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"8e70ed4a2f597b4eb0b7fa62f8967b9e82ca6325"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0037c908ad363a21ef9cde6b0a4b046046d2d6a7","unresolved":true,"context_lines":[{"line_number":61,"context_line":"                                            private_key\u003dprivate_key,"},{"line_number":62,"context_line":"                                            server\u003dserver)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        ssh_client.exec_command(\u0027sudo touch /%s/%s\u0027 %"},{"line_number":65,"context_line":"                                (mount_path, filename))"},{"line_number":66,"context_line":"        md5 \u003d ssh_client.exec_command("},{"line_number":67,"context_line":"            \u0027sudo md5sum %s/%s|cut -c 1-32\u0027 % (mount_path, filename))"}],"source_content_type":"text/x-python","patch_set":11,"id":"41ad0b38_675c445b","line":64,"range":{"start_line":64,"start_character":0,"end_line":64,"end_character":53},"updated":"2021-01-25 14:55:28.000000000","message":"-1: Creating an empty file seems insufficient, I feel like we should at least write some data:\n\n  ssh_client.exec_command(\u0027sudo dd bs\u003d1024 count\u003d100 if\u003d/dev/urandom of\u003d/%s/%s\u0027 %\n\nIf we do this we should pass `-b` to the md5sum call","commit_id":"8fa6b111386df4eb2d5d046a9c891e7d96634196"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"928ed65f0a20d867baeae480c11ad33c54695484","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                                            private_key\u003dprivate_key,"},{"line_number":62,"context_line":"                                            server\u003dserver)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        ssh_client.exec_command(\u0027sudo touch /%s/%s\u0027 %"},{"line_number":65,"context_line":"                                (mount_path, filename))"},{"line_number":66,"context_line":"        md5 \u003d ssh_client.exec_command("},{"line_number":67,"context_line":"            \u0027sudo md5sum %s/%s|cut -c 1-32\u0027 % (mount_path, filename))"}],"source_content_type":"text/x-python","patch_set":11,"id":"825bba7f_dac33533","line":64,"range":{"start_line":64,"start_character":0,"end_line":64,"end_character":53},"in_reply_to":"41ad0b38_675c445b","updated":"2021-01-28 11:40:13.000000000","message":"Done","commit_id":"8fa6b111386df4eb2d5d046a9c891e7d96634196"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7df2d3c01b5682f31ba86e1007632daa342f48cc","unresolved":true,"context_lines":[{"line_number":61,"context_line":"                                            private_key\u003dprivate_key,"},{"line_number":62,"context_line":"                                            server\u003dserver)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        ssh_client.exec_command(\u0027sudo touch /%s/%s\u0027 %"},{"line_number":65,"context_line":"                                (mount_path, filename))"},{"line_number":66,"context_line":"        ssh_client.exec_command("},{"line_number":67,"context_line":"            \u0027sudo dd bs\u003d1024 count\u003d100 if\u003d/dev/urandom of\u003d/%s/%s\u0027 %"},{"line_number":68,"context_line":"            (mount_path, filename))"}],"source_content_type":"text/x-python","patch_set":14,"id":"882edfae_da2a3d44","line":65,"range":{"start_line":64,"start_character":0,"end_line":65,"end_character":55},"updated":"2021-01-29 16:58:04.000000000","message":"nit: This command is not really necessary, the dd will already create the file.","commit_id":"c547ac05b9c5915462e8870bb7180d0cd1f301e2"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"c84165368be297bbf0dd625a04ff39a20a41096a","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                                            private_key\u003dprivate_key,"},{"line_number":62,"context_line":"                                            server\u003dserver)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        ssh_client.exec_command(\u0027sudo touch /%s/%s\u0027 %"},{"line_number":65,"context_line":"                                (mount_path, filename))"},{"line_number":66,"context_line":"        ssh_client.exec_command("},{"line_number":67,"context_line":"            \u0027sudo dd bs\u003d1024 count\u003d100 if\u003d/dev/urandom of\u003d/%s/%s\u0027 %"},{"line_number":68,"context_line":"            (mount_path, filename))"}],"source_content_type":"text/x-python","patch_set":14,"id":"28e238cb_e0d9f9e4","line":65,"range":{"start_line":64,"start_character":0,"end_line":65,"end_character":55},"in_reply_to":"882edfae_da2a3d44","updated":"2021-01-29 17:18:27.000000000","message":"Done","commit_id":"c547ac05b9c5915462e8870bb7180d0cd1f301e2"}]}
