)]}'
{"etc/tempest.conf.sample":[{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"0ffe68efc5f5207052b4e4ebae93646d37e79cc2","unresolved":false,"context_lines":[{"line_number":829,"context_line":""},{"line_number":830,"context_line":"# Name of minimal (e.g cirros) image to use when launching"},{"line_number":831,"context_line":"# test instances. (string value)"},{"line_number":832,"context_line":"#minimal_image_ref\u003d\u003cNone\u003e"},{"line_number":833,"context_line":""},{"line_number":834,"context_line":"# Name of existing keypair to launch servers with. (string"},{"line_number":835,"context_line":"# value)"}],"source_content_type":"application/octet-stream","patch_set":17,"id":"baada198_d71dd663","line":832,"updated":"2014-07-11 09:39:16.000000000","message":"Do you have a corresponding devstack change ?\n\nWhy not to use the image ref configured at the compute section already ?","commit_id":"4ceb24d5ef22e6f3fb1947b5d9cb8fd79f7fdf80"},{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"adbb971d2471ff26aa8eb3fcc632d193216a7fd8","unresolved":false,"context_lines":[{"line_number":829,"context_line":""},{"line_number":830,"context_line":"# Name of minimal (e.g cirros) image to use when launching"},{"line_number":831,"context_line":"# test instances. (string value)"},{"line_number":832,"context_line":"#minimal_image_ref\u003d\u003cNone\u003e"},{"line_number":833,"context_line":""},{"line_number":834,"context_line":"# Name of existing keypair to launch servers with. (string"},{"line_number":835,"context_line":"# value)"}],"source_content_type":"application/octet-stream","patch_set":17,"id":"baada198_622c4aad","line":832,"in_reply_to":"baada198_b73782fe","updated":"2014-07-11 10:45:53.000000000","message":"ok","commit_id":"4ceb24d5ef22e6f3fb1947b5d9cb8fd79f7fdf80"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"c41dd2a6d8f42d427dba29b26aeec97e3d7643e9","unresolved":false,"context_lines":[{"line_number":829,"context_line":""},{"line_number":830,"context_line":"# Name of minimal (e.g cirros) image to use when launching"},{"line_number":831,"context_line":"# test instances. (string value)"},{"line_number":832,"context_line":"#minimal_image_ref\u003d\u003cNone\u003e"},{"line_number":833,"context_line":""},{"line_number":834,"context_line":"# Name of existing keypair to launch servers with. (string"},{"line_number":835,"context_line":"# value)"}],"source_content_type":"application/octet-stream","patch_set":17,"id":"baada198_b73782fe","line":832,"in_reply_to":"baada198_d71dd663","updated":"2014-07-11 10:09:57.000000000","message":"That\u0027s what I was doing until Andrea Frittoli asked for a new option in patch set 10...\n\nThere\u0027s no requirement for a corresponding devstack change, as in the manager we default to the compute image ref if the config is not set.","commit_id":"4ceb24d5ef22e6f3fb1947b5d9cb8fd79f7fdf80"}],"tempest/api/orchestration/stacks/templates/cinder_create_from_backup.yaml":[{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"4e9fb9188b4a5126c7a1df6c6d0bb69191d2b1c1","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    description: backup_id to create volume from"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"resources:"},{"line_number":36,"context_line":"    volume:"},{"line_number":37,"context_line":"        type: OS::Cinder::Volume"},{"line_number":38,"context_line":"        properties:"},{"line_number":39,"context_line":"            backup_id: { get_param: backup_id }"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"AAAAXX%2F%2FtIQ%3D","line":36,"updated":"2014-04-28 15:21:36.000000000","message":"So really just a nit: indentation is 4 here but only 2 above","commit_id":"e300c736fe8df0f49d8a32ba28f0ae61380d31a3"}],"tempest/config.py":[{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"f4691a4918a76be7e9cd3b296caa82f85666ec02","unresolved":false,"context_lines":[{"line_number":630,"context_line":"                    \"launching test instances.\"),"},{"line_number":631,"context_line":"    cfg.StrOpt(\u0027minimal_image_ref\u0027,"},{"line_number":632,"context_line":"               default\u003dNone,"},{"line_number":633,"context_line":"               help\u003d\"Name of minimal (e.g cirros) image to use when \""},{"line_number":634,"context_line":"                    \"launching test instances.\"),"},{"line_number":635,"context_line":"    cfg.StrOpt(\u0027keypair_name\u0027,"},{"line_number":636,"context_line":"               default\u003dNone,"}],"source_content_type":"text/x-python","patch_set":11,"id":"dab895d6_0ebb370f","line":633,"updated":"2014-06-29 14:31:01.000000000","message":"Thanks for adding this config option.\n\nIt may be nice to have a list of min features, e.g. ssh, key injection or so?","commit_id":"4ff5d4c4ac7ba7de753432e1596cab235803b56b"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"482edfa4c3512865d965659590857346ac9995a0","unresolved":false,"context_lines":[{"line_number":630,"context_line":"                    \"launching test instances.\"),"},{"line_number":631,"context_line":"    cfg.StrOpt(\u0027minimal_image_ref\u0027,"},{"line_number":632,"context_line":"               default\u003dNone,"},{"line_number":633,"context_line":"               help\u003d\"Name of minimal (e.g cirros) image to use when \""},{"line_number":634,"context_line":"                    \"launching test instances.\"),"},{"line_number":635,"context_line":"    cfg.StrOpt(\u0027keypair_name\u0027,"},{"line_number":636,"context_line":"               default\u003dNone,"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_a9aa42d2","line":633,"in_reply_to":"dab895d6_0ebb370f","updated":"2014-06-30 20:37:21.000000000","message":"I don\u0027t see that on any other *image_ref options?  \n\nAlso it\u0027s hard to be specific, because although in theory this test should work on any image which will execute the user-data script, I\u0027ve only tested it on cirros, and any future tests using this image_ref will only ever be tested (in the gate) using cirros.\n\nSo I personally would rather just leave the two image_ref\u0027s as being one which contains heat-cfntools (the non-minimal image), and one which is a cirros image (the minimal image), since that\u0027s a fairly explicit definition of what is actually expected/known to work.","commit_id":"4ff5d4c4ac7ba7de753432e1596cab235803b56b"}],"tempest/scenario/manager.py":[{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"f4691a4918a76be7e9cd3b296caa82f85666ec02","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"        super(OrchestrationScenarioTest, cls).setUpClass()"},{"line_number":1178,"context_line":"        if not CONF.service_available.heat:"},{"line_number":1179,"context_line":"            raise cls.skipException(\"Heat support is required\")"},{"line_number":1180,"context_line":"        cls.minimal_image_ref \u003d CONF.orchestration.minimal_image_ref"},{"line_number":1181,"context_line":"        if CONF.orchestration.minimal_image_ref:"},{"line_number":1182,"context_line":"            cls.minimal_image_ref \u003d CONF.orchestration.minimal_image_ref"},{"line_number":1183,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":11,"id":"dab895d6_ae95eb89","line":1180,"updated":"2014-06-29 14:31:01.000000000","message":"So if the setting is available you\u0027re assigning it twice into the class variable. Either remove L1180 or simplify the if else.\n\nThis could actually go into config.py directly (there are already config options defaulting other ones in there); but fair enough to have it in here, any orchestration scenario test will go through here anyways.","commit_id":"4ff5d4c4ac7ba7de753432e1596cab235803b56b"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"482edfa4c3512865d965659590857346ac9995a0","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"        super(OrchestrationScenarioTest, cls).setUpClass()"},{"line_number":1178,"context_line":"        if not CONF.service_available.heat:"},{"line_number":1179,"context_line":"            raise cls.skipException(\"Heat support is required\")"},{"line_number":1180,"context_line":"        cls.minimal_image_ref \u003d CONF.orchestration.minimal_image_ref"},{"line_number":1181,"context_line":"        if CONF.orchestration.minimal_image_ref:"},{"line_number":1182,"context_line":"            cls.minimal_image_ref \u003d CONF.orchestration.minimal_image_ref"},{"line_number":1183,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_a981624c","line":1180,"in_reply_to":"dab895d6_ae95eb89","updated":"2014-06-30 20:37:21.000000000","message":"Oops, yes cut/paste error, thanks!","commit_id":"4ff5d4c4ac7ba7de753432e1596cab235803b56b"}],"tempest/scenario/orchestration/test_volumes.py":[{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"03f4326f302ab832cf6191520e955bbb2864ec80","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        # for manual post-mortums"},{"line_number":76,"context_line":"        if not CONF.orchestration.keypair_name:"},{"line_number":77,"context_line":"            self.set_resource(\u0027stack\u0027, stack)"},{"line_number":78,"context_line":"        self._wait_for_stack_status(stack_identifier, \u0027CREATE_COMPLETE\u0027)"},{"line_number":79,"context_line":"        return stack, stack_identifier"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    @test.attr(type\u003d\u0027slow\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_bb7275e3","line":78,"updated":"2014-05-08 02:31:06.000000000","message":"This should also work:\n        self.status_timeout(self.client.stacks, stack_identifier, \u0027COMPLETE\u0027,\n                            error_status\u003d\u0027FAILED\u0027)","commit_id":"38004b4eb66e12907a300e13728787c09957f05d"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"5468f3005e7f4ada7db1b404329e4afe94d9bafd","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        # for manual post-mortums"},{"line_number":76,"context_line":"        if not CONF.orchestration.keypair_name:"},{"line_number":77,"context_line":"            self.set_resource(\u0027stack\u0027, stack)"},{"line_number":78,"context_line":"        self._wait_for_stack_status(stack_identifier, \u0027CREATE_COMPLETE\u0027)"},{"line_number":79,"context_line":"        return stack, stack_identifier"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    @test.attr(type\u003d\u0027slow\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_04923d4b","line":78,"in_reply_to":"7adec928_bb7275e3","updated":"2014-05-20 15:34:25.000000000","message":"Actually this doesn\u0027t work too well, because we check only for status, not $action_$status, so this will evaluate true for any action, e.g if we expect CREATE_COMPLETE and get DELETE_COMPLETE, this will still work.","commit_id":"38004b4eb66e12907a300e13728787c09957f05d"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"03f4326f302ab832cf6191520e955bbb2864ec80","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        # Delete the stack and ensure a backup is created for volume_id"},{"line_number":104,"context_line":"        # but the volume itself is gone"},{"line_number":105,"context_line":"        self.client.stacks.delete(stack_identifier)"},{"line_number":106,"context_line":"        self._wait_for_stack_status(stack_identifier, \u0027DELETE_COMPLETE\u0027)"},{"line_number":107,"context_line":"        self.assertRaises(cinder_exceptions.NotFound,"},{"line_number":108,"context_line":"                          self.volume_client.volumes.get,"},{"line_number":109,"context_line":"                          volume_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_3b9025ec","line":106,"updated":"2014-05-08 02:31:06.000000000","message":"self.delete_timeout could replace _wait_for_stack_status here","commit_id":"38004b4eb66e12907a300e13728787c09957f05d"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"5468f3005e7f4ada7db1b404329e4afe94d9bafd","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        # Delete the stack and ensure a backup is created for volume_id"},{"line_number":104,"context_line":"        # but the volume itself is gone"},{"line_number":105,"context_line":"        self.client.stacks.delete(stack_identifier)"},{"line_number":106,"context_line":"        self._wait_for_stack_status(stack_identifier, \u0027DELETE_COMPLETE\u0027)"},{"line_number":107,"context_line":"        self.assertRaises(cinder_exceptions.NotFound,"},{"line_number":108,"context_line":"                          self.volume_client.volumes.get,"},{"line_number":109,"context_line":"                          volume_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_649b0166","line":106,"in_reply_to":"7adec928_09d33860","updated":"2014-05-20 15:34:25.000000000","message":"Oh, no it won\u0027t, due to the issue mentioned above..","commit_id":"38004b4eb66e12907a300e13728787c09957f05d"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"4000ab158d60ea7f07f84c1954dbf1472c86c407","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        # Delete the stack and ensure a backup is created for volume_id"},{"line_number":104,"context_line":"        # but the volume itself is gone"},{"line_number":105,"context_line":"        self.client.stacks.delete(stack_identifier)"},{"line_number":106,"context_line":"        self._wait_for_stack_status(stack_identifier, \u0027DELETE_COMPLETE\u0027)"},{"line_number":107,"context_line":"        self.assertRaises(cinder_exceptions.NotFound,"},{"line_number":108,"context_line":"                          self.volume_client.volumes.get,"},{"line_number":109,"context_line":"                          volume_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_09d33860","line":106,"in_reply_to":"7adec928_3b9025ec","updated":"2014-05-20 15:02:28.000000000","message":"Actually it can\u0027t, because we don\u0027t 404 on a get for a stack after delete, only for resources:\n\nhttps://github.com/openstack/heat/blob/master/heat/engine/service.py#L391\n\nstatus_timeout should work though.","commit_id":"38004b4eb66e12907a300e13728787c09957f05d"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"03f4326f302ab832cf6191520e955bbb2864ec80","unresolved":false,"context_lines":[{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        # Delete the stack and ensure the volume is gone"},{"line_number":134,"context_line":"        self.client.stacks.delete(stack_identifier2)"},{"line_number":135,"context_line":"        self._wait_for_stack_status(stack_identifier2, \u0027DELETE_COMPLETE\u0027)"},{"line_number":136,"context_line":"        self.assertRaises(cinder_exceptions.NotFound,"},{"line_number":137,"context_line":"                          self.volume_client.volumes.get,"},{"line_number":138,"context_line":"                          volume_id2)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_1b81a98f","line":135,"updated":"2014-05-08 02:31:06.000000000","message":"same here","commit_id":"38004b4eb66e12907a300e13728787c09957f05d"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"a3cdb5209c14a2067156db22f0745eb4ad463189","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        template \u003d self._load_template(__file__, template_name)"},{"line_number":59,"context_line":"        parameters \u003d {\u0027key_name\u0027: self.keypair_name,"},{"line_number":60,"context_line":"                      \u0027instance_type\u0027: CONF.orchestration.instance_type,"},{"line_number":61,"context_line":"                      # Note use the compute.image_ref to use the cirros image"},{"line_number":62,"context_line":"                      \u0027image_id\u0027: CONF.compute.image_ref,"},{"line_number":63,"context_line":"                      \u0027timeout\u0027: CONF.orchestration.build_timeout}"},{"line_number":64,"context_line":"        parameters.update(add_parameters)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_6a445974","line":61,"updated":"2014-05-22 21:54:45.000000000","message":"If this test relies on image_ref being cirros, you should verify this assumption, and skip if applicable.\nIf there is no dependency to cirros I would delete this comment.","commit_id":"3bfb286b3375b80c81e9e323a27b96fa42a77bc8"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"9fd33495d9c1dad89329c1e5d64b53415ec60dc6","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        template \u003d self._load_template(__file__, template_name)"},{"line_number":59,"context_line":"        parameters \u003d {\u0027key_name\u0027: self.keypair_name,"},{"line_number":60,"context_line":"                      \u0027instance_type\u0027: CONF.orchestration.instance_type,"},{"line_number":61,"context_line":"                      # Note use the compute.image_ref to use the cirros image"},{"line_number":62,"context_line":"                      \u0027image_id\u0027: CONF.compute.image_ref,"},{"line_number":63,"context_line":"                      \u0027timeout\u0027: CONF.orchestration.build_timeout}"},{"line_number":64,"context_line":"        parameters.update(add_parameters)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_a3683c22","line":61,"in_reply_to":"7adec928_6a445974","updated":"2014-05-23 11:28:37.000000000","message":"I\u0027m justifying/explaining the use of compute.image_ref (which in the gate is cirros) instead of orchestration.image_ref (which given this is an orchestration test, might be expected, but I\u0027ve implemented the test to work with the cirros image for performance reasons)","commit_id":"3bfb286b3375b80c81e9e323a27b96fa42a77bc8"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"a3cdb5209c14a2067156db22f0745eb4ad463189","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            stack_name\u003dstack_name,"},{"line_number":67,"context_line":"            template\u003dtemplate,"},{"line_number":68,"context_line":"            parameters\u003dparameters)"},{"line_number":69,"context_line":"        stack_id \u003d ret_stack[\u0027stack\u0027][\u0027id\u0027]"},{"line_number":70,"context_line":"        stack \u003d self.client.stacks.get(stack_id)"},{"line_number":71,"context_line":"        self.assertIsNotNone(stack)"},{"line_number":72,"context_line":"        stack_identifier \u003d \u0027%s/%s\u0027 % (stack_name, stack.id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_6d09d32b","line":69,"updated":"2014-05-22 21:54:45.000000000","message":"This is safe as long as the heat client either returns a stack or raises an exception. Else you should assert that the stack is not None before accessing its fields.","commit_id":"3bfb286b3375b80c81e9e323a27b96fa42a77bc8"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"a3cdb5209c14a2067156db22f0745eb4ad463189","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        # if a keypair was set, do not delete the stack on exit to allow"},{"line_number":75,"context_line":"        # for manual post-mortums"},{"line_number":76,"context_line":"        if not CONF.orchestration.keypair_name:"},{"line_number":77,"context_line":"            self.set_resource(\u0027stack\u0027, stack)"},{"line_number":78,"context_line":"        self._wait_for_stack_status(stack_identifier, \u0027CREATE_COMPLETE\u0027)"},{"line_number":79,"context_line":"        return stack, stack_identifier"}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_ad959b89","line":76,"updated":"2014-05-22 21:54:45.000000000","message":"It is not obvious from the config documentation that setting a keypair causes resources to be left around.\nI think a dedicated boolean option would be more appropriate here. If the only purpose of this option is to allow debug, this should be documented in config.py (in a separate patch).","commit_id":"3bfb286b3375b80c81e9e323a27b96fa42a77bc8"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"9fd33495d9c1dad89329c1e5d64b53415ec60dc6","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        # if a keypair was set, do not delete the stack on exit to allow"},{"line_number":75,"context_line":"        # for manual post-mortums"},{"line_number":76,"context_line":"        if not CONF.orchestration.keypair_name:"},{"line_number":77,"context_line":"            self.set_resource(\u0027stack\u0027, stack)"},{"line_number":78,"context_line":"        self._wait_for_stack_status(stack_identifier, \u0027CREATE_COMPLETE\u0027)"},{"line_number":79,"context_line":"        return stack, stack_identifier"}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_23f26c6f","line":76,"in_reply_to":"7adec928_ad959b89","updated":"2014-05-23 11:28:37.000000000","message":"Ok, I\u0027m happy to just remove this logic completely - I was copying what already exists in the autoscaling test, thus assumed it was the established convention.","commit_id":"3bfb286b3375b80c81e9e323a27b96fa42a77bc8"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"a3cdb5209c14a2067156db22f0745eb4ad463189","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        # if a keypair was set, do not delete the stack on exit to allow"},{"line_number":75,"context_line":"        # for manual post-mortums"},{"line_number":76,"context_line":"        if not CONF.orchestration.keypair_name:"},{"line_number":77,"context_line":"            self.set_resource(\u0027stack\u0027, stack)"},{"line_number":78,"context_line":"        self._wait_for_stack_status(stack_identifier, \u0027CREATE_COMPLETE\u0027)"},{"line_number":79,"context_line":"        return stack, stack_identifier"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_0d504fd3","line":77,"updated":"2014-05-22 21:54:45.000000000","message":"I would prefer using addCleanup rather than set_resource to control cleanup. See https://review.openstack.org/#/c/62101/ for example.","commit_id":"3bfb286b3375b80c81e9e323a27b96fa42a77bc8"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"9fd33495d9c1dad89329c1e5d64b53415ec60dc6","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        # if a keypair was set, do not delete the stack on exit to allow"},{"line_number":75,"context_line":"        # for manual post-mortums"},{"line_number":76,"context_line":"        if not CONF.orchestration.keypair_name:"},{"line_number":77,"context_line":"            self.set_resource(\u0027stack\u0027, stack)"},{"line_number":78,"context_line":"        self._wait_for_stack_status(stack_identifier, \u0027CREATE_COMPLETE\u0027)"},{"line_number":79,"context_line":"        return stack, stack_identifier"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_c3fc6841","line":77,"in_reply_to":"7adec928_0d504fd3","updated":"2014-05-23 11:28:37.000000000","message":"Again, just copying existing stuff, I can move to addCleanup if that\u0027s the direction things are headed.","commit_id":"3bfb286b3375b80c81e9e323a27b96fa42a77bc8"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"07e6533d66c6689da8f19739642d765b186b407a","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        # Note we use the compute.image_ref in this test, not"},{"line_number":28,"context_line":"        # orchestration.image_ref, because this test is expected to work"},{"line_number":29,"context_line":"        # with the cirros image compute.image_ref normally refers to"},{"line_number":30,"context_line":"        if not CONF.compute.image_ref:"},{"line_number":31,"context_line":"            raise self.skipException(\"No image available to test\")"},{"line_number":32,"context_line":"        if not CONF.service_available.cinder:"},{"line_number":33,"context_line":"            raise self.skipException(\u0027Cinder support is required\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3ae8d1ca_7289c7c9","line":30,"updated":"2014-05-28 12:22:52.000000000","message":"IMO, this should be in a setUpClass method.\n\nIn that case, setup \u003d\u003d setUpClass because you have only one test, but that might change in the future.","commit_id":"73081bb1fc8f5ed3f22db872f182b95a38c8c8cf"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"07e6533d66c6689da8f19739642d765b186b407a","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        if not CONF.compute.image_ref:"},{"line_number":31,"context_line":"            raise self.skipException(\"No image available to test\")"},{"line_number":32,"context_line":"        if not CONF.service_available.cinder:"},{"line_number":33,"context_line":"            raise self.skipException(\u0027Cinder support is required\u0027)"},{"line_number":34,"context_line":"        self.client \u003d self.orchestration_client"},{"line_number":35,"context_line":"        if CONF.orchestration.keypair_name:"},{"line_number":36,"context_line":"            self.keypair_name \u003d CONF.orchestration.keypair_name"}],"source_content_type":"text/x-python","patch_set":6,"id":"3ae8d1ca_32b73f88","line":33,"updated":"2014-05-28 12:22:52.000000000","message":"same.\n\nAnd you must also check that CONF.volume_feature_enabled.backup is True.","commit_id":"73081bb1fc8f5ed3f22db872f182b95a38c8c8cf"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"07e6533d66c6689da8f19739642d765b186b407a","unresolved":false,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        backups \u003d self.volume_client.backups.list()"},{"line_number":111,"context_line":"        self.assertIsNotNone(backups)"},{"line_number":112,"context_line":"        backup \u003d [b for b in backups if b.volume_id \u003d\u003d volume_id][0]"},{"line_number":113,"context_line":"        self.assertIsNotNone(backup.id)"},{"line_number":114,"context_line":"        self.addCleanup(self.volume_client.backups.delete, backup.id)"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3ae8d1ca_ed4dfc73","line":112,"updated":"2014-05-28 12:22:52.000000000","message":"This won\u0027t work if the backup is not found, for some reason. You would get something like \u0027array out of range\u0027 because there would not be an index 0.\n\nIMO you could do :\nbackups_filtered \u003d [b.volume_id for b in backups]\nself.assertIn(volume_id, backups_filtered)","commit_id":"73081bb1fc8f5ed3f22db872f182b95a38c8c8cf"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"07e6533d66c6689da8f19739642d765b186b407a","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        self.assertIsNotNone(backups)"},{"line_number":112,"context_line":"        backup \u003d [b for b in backups if b.volume_id \u003d\u003d volume_id][0]"},{"line_number":113,"context_line":"        self.assertIsNotNone(backup.id)"},{"line_number":114,"context_line":"        self.addCleanup(self.volume_client.backups.delete, backup.id)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        # Now, we create another stack where the volume is created from the"},{"line_number":117,"context_line":"        # backup created by the previous stack"}],"source_content_type":"text/x-python","patch_set":6,"id":"3ae8d1ca_cdbbe00c","line":114,"updated":"2014-05-28 12:22:52.000000000","message":"This should be put before, maybe right after line 93. If something went wrong then the addCleanup() won\u0027t be called thus the backup won\u0027t be deleted.","commit_id":"73081bb1fc8f5ed3f22db872f182b95a38c8c8cf"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"0b60f0fdc03c4d299d25b74917c7d057293a8e09","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        self.assertIsNotNone(backups)"},{"line_number":112,"context_line":"        backup \u003d [b for b in backups if b.volume_id \u003d\u003d volume_id][0]"},{"line_number":113,"context_line":"        self.assertIsNotNone(backup.id)"},{"line_number":114,"context_line":"        self.addCleanup(self.volume_client.backups.delete, backup.id)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        # Now, we create another stack where the volume is created from the"},{"line_number":117,"context_line":"        # backup created by the previous stack"}],"source_content_type":"text/x-python","patch_set":6,"id":"3ae8d1ca_b416d853","line":114,"in_reply_to":"3ae8d1ca_cdbbe00c","updated":"2014-05-28 14:01:30.000000000","message":"It can\u0027t go after line 93, because the backup is only created on stack delete, e.g after line 104, and the lines since then have been used to obtain the backup.id (which we need to add the cleanup)","commit_id":"73081bb1fc8f5ed3f22db872f182b95a38c8c8cf"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"7cb84aabe31fc0b760d23615896063101b9ab27c","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        return stack, stack_identifier"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    @test.attr(type\u003d\u0027slow\u0027)"},{"line_number":82,"context_line":"    def test_cinder_volume_create_backup_restore(self):"},{"line_number":83,"context_line":"        \"\"\"Ensure the \u0027Snapshot\u0027 deletion policy works."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"           This requires a more complex test, but it tests several aspects"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_76eea08c","line":82,"updated":"2014-06-19 14:15:05.000000000","message":"You need a service tag here. I need to fix the hacking check to catch subdirs...","commit_id":"698c166fc1739f8245592bcad7b3d0560cfeab73"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"63cf52551a43d3ef989c1c821d92030a57ec6127","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def setUp(self):"},{"line_number":26,"context_line":"        super(VolumeBackupRestoreScenarioTest, self).setUp()"},{"line_number":27,"context_line":"        # Note use the compute.image_ref to use the cirros image"},{"line_number":28,"context_line":"        if not CONF.compute.image_ref:"},{"line_number":29,"context_line":"            raise self.skipException(\"No image available to test\")"},{"line_number":30,"context_line":"        if not CONF.service_available.cinder:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ae5cdf2_3b083c90","line":27,"updated":"2014-06-24 08:56:32.000000000","message":"You cannot rely on image_ref being cirros. \nIf you need a lightweight image for heat scenario, there should be a configuration setting for it.\nIt could default to the compute image_ref so that no additional devstack change is required.","commit_id":"62115467f83c6d73547c40402b0f61d67f04607a"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"7aa1b39bcc5e511566ee2d0de2a22a3f92a46180","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        volume \u003d self.volume_client.volumes.get(volume_id)"},{"line_number":42,"context_line":"        self.assertIsNotNone(volume)"},{"line_number":43,"context_line":"        self.assertEqual(expected_status, volume.status)"},{"line_number":44,"context_line":"        self.assertEqual(1, volume.size)"},{"line_number":45,"context_line":"        self.assertEqual(\u0027a descriptive description\u0027,"},{"line_number":46,"context_line":"                         volume.display_description)"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"1ae5cdf2_e5060e85","line":44,"updated":"2014-06-23 21:30:37.000000000","message":"While this is hard coded in the templates, there is a config option CONF.volume.volume_size which is used for doing the default volume create size. I think we should probably be using that here too. (It defaults to 1)","commit_id":"62115467f83c6d73547c40402b0f61d67f04607a"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"7aa1b39bcc5e511566ee2d0de2a22a3f92a46180","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        self.assertEqual(expected_status, volume.status)"},{"line_number":44,"context_line":"        self.assertEqual(1, volume.size)"},{"line_number":45,"context_line":"        self.assertEqual(\u0027a descriptive description\u0027,"},{"line_number":46,"context_line":"                         volume.display_description)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def _outputs_verify(self, stack, expected_status\u003d\u0027available\u0027):"},{"line_number":49,"context_line":"        self.assertEqual(expected_status,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ae5cdf2_c576720c","line":46,"updated":"2014-06-23 21:30:37.000000000","message":"I think for things hardcoded in the templates we probably should have a \ncomment indicating that. It\u0027s a little weird to just see a string here. Is there a \nmethod we could have to pull the value from the template, that might make it a \nbit easier to read.\n\nBut, I\u0027m fine with it hardcoded as long as there is a comment.","commit_id":"62115467f83c6d73547c40402b0f61d67f04607a"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"4395411e85d2ce5df596c9b9eef40ab57fc66feb","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        self.assertEqual(expected_status, volume.status)"},{"line_number":44,"context_line":"        self.assertEqual(1, volume.size)"},{"line_number":45,"context_line":"        self.assertEqual(\u0027a descriptive description\u0027,"},{"line_number":46,"context_line":"                         volume.display_description)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def _outputs_verify(self, stack, expected_status\u003d\u0027available\u0027):"},{"line_number":49,"context_line":"        self.assertEqual(expected_status,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ae5cdf2_bdbcadb6","line":46,"in_reply_to":"1ae5cdf2_c576720c","updated":"2014-06-26 08:53:35.000000000","message":"I think hardcoded is easier - otherwise I\u0027ll have to have a function which parses the template which IMO introduces undue complexity.  \n\nI could use a function from python-heatclient, but because that\u0027s one of the things we\u0027re testing here, I\u0027d prefer to keep the hard-coded string with a comment, of if you prefer I could pass a description string in as a parameter to the template?","commit_id":"62115467f83c6d73547c40402b0f61d67f04607a"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"7aa1b39bcc5e511566ee2d0de2a22a3f92a46180","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                         self._stack_output(stack, \u0027status\u0027))"},{"line_number":51,"context_line":"        self.assertEqual(\u00271\u0027,"},{"line_number":52,"context_line":"                         self._stack_output(stack, \u0027size\u0027))"},{"line_number":53,"context_line":"        self.assertEqual(\u0027a descriptive description\u0027,"},{"line_number":54,"context_line":"                         self._stack_output(stack, \u0027display_description\u0027))"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _create_stack(self, template_name, add_parameters\u003d{}):"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ae5cdf2_05813ac3","line":53,"updated":"2014-06-23 21:30:37.000000000","message":"Same here","commit_id":"62115467f83c6d73547c40402b0f61d67f04607a"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"7aa1b39bcc5e511566ee2d0de2a22a3f92a46180","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.assertEqual(\u0027a descriptive description\u0027,"},{"line_number":54,"context_line":"                         self._stack_output(stack, \u0027display_description\u0027))"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _create_stack(self, template_name, add_parameters\u003d{}):"},{"line_number":57,"context_line":"        net \u003d self._get_default_network()"},{"line_number":58,"context_line":"        stack_name \u003d self._stack_rand_name()"},{"line_number":59,"context_line":"        template \u003d self._load_template(__file__, template_name)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ae5cdf2_050dbae8","line":56,"updated":"2014-06-23 21:30:37.000000000","message":"This feels like it could be a common method in the base test class. Not saying it\u0027s a hard req for this patch. (it would be out of scope in this patch) But, something for future patches.","commit_id":"62115467f83c6d73547c40402b0f61d67f04607a"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"63cf52551a43d3ef989c1c821d92030a57ec6127","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        template \u003d self._load_template(__file__, template_name)"},{"line_number":60,"context_line":"        parameters \u003d {\u0027key_name\u0027: self.keypair_name,"},{"line_number":61,"context_line":"                      \u0027instance_type\u0027: CONF.orchestration.instance_type,"},{"line_number":62,"context_line":"                      # Note use the compute.image_ref to use the cirros image"},{"line_number":63,"context_line":"                      \u0027image_id\u0027: CONF.compute.image_ref,"},{"line_number":64,"context_line":"                      \u0027timeout\u0027: CONF.orchestration.build_timeout,"},{"line_number":65,"context_line":"                      \u0027network\u0027: net[\u0027id\u0027]}"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ae5cdf2_5b098882","line":62,"updated":"2014-06-24 08:56:32.000000000","message":"See L27","commit_id":"62115467f83c6d73547c40402b0f61d67f04607a"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"7aa1b39bcc5e511566ee2d0de2a22a3f92a46180","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                          volume_id)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        backups \u003d self.volume_client.backups.list()"},{"line_number":115,"context_line":"        self.assertIsNotNone(backups)"},{"line_number":116,"context_line":"        backup \u003d [b for b in backups if b.volume_id \u003d\u003d volume_id][0]"},{"line_number":117,"context_line":"        self.assertIsNotNone(backup.id)"},{"line_number":118,"context_line":"        self.addCleanup(self.volume_client.backups.delete, backup.id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ae5cdf2_65c83e76","line":115,"updated":"2014-06-23 21:30:37.000000000","message":"Does an empty list return None or []? Because this won\u0027t do what is expected if it\u0027s an empty list.","commit_id":"62115467f83c6d73547c40402b0f61d67f04607a"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"7aa1b39bcc5e511566ee2d0de2a22a3f92a46180","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        backups \u003d self.volume_client.backups.list()"},{"line_number":115,"context_line":"        self.assertIsNotNone(backups)"},{"line_number":116,"context_line":"        backup \u003d [b for b in backups if b.volume_id \u003d\u003d volume_id][0]"},{"line_number":117,"context_line":"        self.assertIsNotNone(backup.id)"},{"line_number":118,"context_line":"        self.addCleanup(self.volume_client.backups.delete, backup.id)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        # Now, we create another stack where the volume is created from the"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ae5cdf2_a5c24651","line":117,"updated":"2014-06-23 21:30:37.000000000","message":"Can this even be none? If the comprehension above is [] won\u0027t it raise an exception that entry 0 is invalid.","commit_id":"62115467f83c6d73547c40402b0f61d67f04607a"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"4395411e85d2ce5df596c9b9eef40ab57fc66feb","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        backups \u003d self.volume_client.backups.list()"},{"line_number":115,"context_line":"        self.assertIsNotNone(backups)"},{"line_number":116,"context_line":"        backup \u003d [b for b in backups if b.volume_id \u003d\u003d volume_id][0]"},{"line_number":117,"context_line":"        self.assertIsNotNone(backup.id)"},{"line_number":118,"context_line":"        self.addCleanup(self.volume_client.backups.delete, backup.id)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        # Now, we create another stack where the volume is created from the"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ae5cdf2_5daf292b","line":117,"in_reply_to":"1ae5cdf2_a5c24651","updated":"2014-06-26 08:53:35.000000000","message":"Hmm, yes you\u0027re probably right - I was trying to avoid doing the addCleanup if for any reason we didn\u0027t have a valid ID.","commit_id":"62115467f83c6d73547c40402b0f61d67f04607a"}],"tempest/scenario/orchestration/test_volumes_delete_snapshot.yaml":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"7aa1b39bcc5e511566ee2d0de2a22a3f92a46180","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    type: OS::Cinder::Volume"},{"line_number":43,"context_line":"    properties:"},{"line_number":44,"context_line":"      size: 1"},{"line_number":45,"context_line":"      description: a descriptive description"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"  volume_attachment:"},{"line_number":48,"context_line":"    type: OS::Cinder::VolumeAttachment"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"1ae5cdf2_05c85aa7","line":45,"updated":"2014-06-23 21:30:37.000000000","message":"Couldn\u0027t it be more descriptive :)","commit_id":"62115467f83c6d73547c40402b0f61d67f04607a"}]}
