)]}'
{"nova/tests/functional/api/client.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"821255613e124b5dba32e708c781d28bafbbc563","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        self.auth_key \u003d auth_key"},{"line_number":125,"context_line":"        self.auth_uri \u003d auth_uri"},{"line_number":126,"context_line":"        self.project_id \u003d project_id"},{"line_number":127,"context_line":"        self.microversion \u003d None"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def request(self, url, method\u003d\u0027GET\u0027, body\u003dNone, headers\u003dNone):"},{"line_number":130,"context_line":"        _headers \u003d {\u0027Content-Type\u0027: \u0027application/json\u0027}"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_6c76e0d9","line":127,"updated":"2016-02-24 22:01:34.000000000","message":"We should probably be able to set this via the constructor for things that aren\u0027t extending (at some level) _IntegratedTestBase.","commit_id":"dbe8c9354dcbf9711ca449603554659c678541c5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1a28fd2333af55aa57d9cc3c766ba7364a86e856","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        self.auth_key \u003d auth_key"},{"line_number":125,"context_line":"        self.auth_uri \u003d auth_uri"},{"line_number":126,"context_line":"        self.project_id \u003d project_id"},{"line_number":127,"context_line":"        self.microversion \u003d None"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def request(self, url, method\u003d\u0027GET\u0027, body\u003dNone, headers\u003dNone):"},{"line_number":130,"context_line":"        _headers \u003d {\u0027Content-Type\u0027: \u0027application/json\u0027}"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_4c5afc51","line":127,"in_reply_to":"bae84128_6c76e0d9","updated":"2016-02-24 22:02:14.000000000","message":"Could be added later when it\u0027s actually needed though, like in my change.","commit_id":"dbe8c9354dcbf9711ca449603554659c678541c5"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"b62ee41a070aa49cff88e2d6cc68e95ee7d453d1","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        self.auth_key \u003d auth_key"},{"line_number":125,"context_line":"        self.auth_uri \u003d auth_uri"},{"line_number":126,"context_line":"        self.project_id \u003d project_id"},{"line_number":127,"context_line":"        self.microversion \u003d None"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def request(self, url, method\u003d\u0027GET\u0027, body\u003dNone, headers\u003dNone):"},{"line_number":130,"context_line":"        _headers \u003d {\u0027Content-Type\u0027: \u0027application/json\u0027}"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_cc1bac7f","line":127,"in_reply_to":"bae84128_6c76e0d9","updated":"2016-02-24 22:03:15.000000000","message":"I\u0027m happy to do that as a follow on. I get a little concerned about having a giant constructor list, but that\u0027s probably doable.","commit_id":"dbe8c9354dcbf9711ca449603554659c678541c5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9a47563a27b8829ed1221c6100ebe24d95671bd5","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        headers \u003d kwargs.setdefault(\u0027headers\u0027, {})"},{"line_number":170,"context_line":"        headers[\u0027X-Auth-Token\u0027] \u003d auth_result[\u0027x-auth-token\u0027]"},{"line_number":171,"context_line":"        if self.microversion:"},{"line_number":172,"context_line":"            headers[\u0027X-OpenStack-Nova-API-Version\u0027] \u003d self.microversion"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        response \u003d self.request(full_uri, **kwargs)"},{"line_number":175,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_55dc4674","line":172,"range":{"start_line":172,"start_character":21,"end_line":172,"end_character":49},"updated":"2016-02-24 19:33:09.000000000","message":"I\u0027m wondering if we should have some check in here such that if self.microversion isn\u0027t set but the X-OpenStack-Nova-API-Version header is in the headers from kwargs, we should raise an error because the test isn\u0027t using this properly...I\u0027m just thinking there are multiple ways now to get the X-OpenStack-Nova-API-Version header in the request and I thought we wanted things to be very explicit now.","commit_id":"dbe8c9354dcbf9711ca449603554659c678541c5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1235b793ee88008b83c5632ce4218c5d7f2aad68","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        headers \u003d kwargs.setdefault(\u0027headers\u0027, {})"},{"line_number":170,"context_line":"        headers[\u0027X-Auth-Token\u0027] \u003d auth_result[\u0027x-auth-token\u0027]"},{"line_number":171,"context_line":"        if self.microversion:"},{"line_number":172,"context_line":"            headers[\u0027X-OpenStack-Nova-API-Version\u0027] \u003d self.microversion"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        response \u003d self.request(full_uri, **kwargs)"},{"line_number":175,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_d5617613","line":172,"range":{"start_line":172,"start_character":21,"end_line":172,"end_character":49},"in_reply_to":"bae84128_55dc4674","updated":"2016-02-24 19:34:57.000000000","message":"Basically:\n\nif self.microversion and \u0027X-OpenStack-Nova-API-Version\u0027 in headers and headers[\u0027X-OpenStack-Nova-API-Version\u0027] !\u003d self.microversion:\n    self.fail(\u0027bad test setup i hate you so much\u0027)\n\nAnd:\n\nif not self.microversion and \u0027X-OpenStack-Nova-API-Version\u0027 in headers:\n    self.fail(\u0027oh you dirty bastard\u0027)","commit_id":"dbe8c9354dcbf9711ca449603554659c678541c5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"738532a6a8de82eeab69b2e4cc7d6f280a7f1e7c","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        headers \u003d kwargs.setdefault(\u0027headers\u0027, {})"},{"line_number":170,"context_line":"        headers[\u0027X-Auth-Token\u0027] \u003d auth_result[\u0027x-auth-token\u0027]"},{"line_number":171,"context_line":"        if self.microversion:"},{"line_number":172,"context_line":"            headers[\u0027X-OpenStack-Nova-API-Version\u0027] \u003d self.microversion"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        response \u003d self.request(full_uri, **kwargs)"},{"line_number":175,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_92dc1a76","line":172,"range":{"start_line":172,"start_character":21,"end_line":172,"end_character":49},"in_reply_to":"bae84128_d5617613","updated":"2016-02-24 22:07:52.000000000","message":"I wanted to see how bad the fallout from checking this would be, and it\u0027s pretty bad:\n\nhttps://gist.github.com/mriedem/0026bf03804cba4c3b43\n\nThere were 38 failed tests for this:\n\nException: Set X-OpenStack-Nova-API-Version header using microversion attribute on api client.\n\nSo yeah, shoring this up is something that can come later.","commit_id":"dbe8c9354dcbf9711ca449603554659c678541c5"}],"nova/tests/functional/api_sample_tests/test_fixed_ips.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a8f4a2a0ce80e93687df2261b728b92423b60896","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def setUp(self):"},{"line_number":40,"context_line":"        super(FixedIpTest, self).setUp()"},{"line_number":41,"context_line":"        self.api.microversion \u003d self.microversion"},{"line_number":42,"context_line":"        instance \u003d dict(test_utils.get_test_instance(),"},{"line_number":43,"context_line":"                        hostname\u003d\u0027openstack\u0027, host\u003d\u0027host\u0027)"},{"line_number":44,"context_line":"        fake_fixed_ips \u003d [{\u0027id\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_b3dfb90b","line":41,"range":{"start_line":41,"start_character":8,"end_line":41,"end_character":49},"updated":"2016-02-24 16:23:00.000000000","message":"Why can\u0027t we abstract this away to the base class?","commit_id":"dbe8c9354dcbf9711ca449603554659c678541c5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9a47563a27b8829ed1221c6100ebe24d95671bd5","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def setUp(self):"},{"line_number":40,"context_line":"        super(FixedIpTest, self).setUp()"},{"line_number":41,"context_line":"        self.api.microversion \u003d self.microversion"},{"line_number":42,"context_line":"        instance \u003d dict(test_utils.get_test_instance(),"},{"line_number":43,"context_line":"                        hostname\u003d\u0027openstack\u0027, host\u003d\u0027host\u0027)"},{"line_number":44,"context_line":"        fake_fixed_ips \u003d [{\u0027id\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_bacae118","line":41,"range":{"start_line":41,"start_character":8,"end_line":41,"end_character":49},"in_reply_to":"bae84128_69c09d2b","updated":"2016-02-24 19:33:09.000000000","message":"I guess, but the need to set self.api.microversion is magic too right? It\u0027s setting the microversion on the api attribute set wayyy up in _IntegratedTestBase.\n\nIDK, maybe we should have had an abstract base class somewhere that required the sub-classes to provide their microversion, that would be more clear to me, but it\u0027s a bigger change than just what you\u0027re doing here which I know you don\u0027t want to do.  I\u0027m just thinking out loud.","commit_id":"dbe8c9354dcbf9711ca449603554659c678541c5"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"e2722916895a92b17b19bb6da3e443f15ab8fd91","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def setUp(self):"},{"line_number":40,"context_line":"        super(FixedIpTest, self).setUp()"},{"line_number":41,"context_line":"        self.api.microversion \u003d self.microversion"},{"line_number":42,"context_line":"        instance \u003d dict(test_utils.get_test_instance(),"},{"line_number":43,"context_line":"                        hostname\u003d\u0027openstack\u0027, host\u003d\u0027host\u0027)"},{"line_number":44,"context_line":"        fake_fixed_ips \u003d [{\u0027id\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_69c09d2b","line":41,"range":{"start_line":41,"start_character":8,"end_line":41,"end_character":49},"in_reply_to":"bae84128_b3dfb90b","updated":"2016-02-24 18:26:55.000000000","message":"because magical base classes are part of the reason it just took me a day to unwind this patch. It\u0027s a terrible pattern.\n\nThis gets it out of a parameter, that\u0027s incrementally moving the ball forward. We really need to be able to do that.","commit_id":"dbe8c9354dcbf9711ca449603554659c678541c5"}],"nova/tests/functional/api_sample_tests/test_remote_consoles.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"02559cd0abdc3ecff9314ba5b66805419e4cfc6d","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class ConsolesSampleJsonTests(test_servers.ServersSampleBase):"},{"line_number":26,"context_line":"    microversion \u003d None"},{"line_number":27,"context_line":"    extension_name \u003d \"os-remote-consoles\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def _get_flags(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_96689189","line":26,"updated":"2016-02-24 21:13:11.000000000","message":"This shouldn\u0027t be necessary if this just inherited from test_servers.ServersSampleJSONTest, but perhaps that\u0027s what you were referring to about test_servers being a special case?","commit_id":"dbe8c9354dcbf9711ca449603554659c678541c5"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"43a5f653e119cbf71b3685a0c082540accaa3833","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class ConsolesSampleJsonTests(test_servers.ServersSampleBase):"},{"line_number":26,"context_line":"    microversion \u003d None"},{"line_number":27,"context_line":"    extension_name \u003d \"os-remote-consoles\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def _get_flags(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_11164b55","line":26,"in_reply_to":"bae84128_36fd456f","updated":"2016-02-24 21:46:07.000000000","message":"It might not be needed. Keeping track of everything in the test hierarchy and when it\u0027s there or not is part of the problem.\n\nDeclaring it actively in the class is a bit more explicit.","commit_id":"dbe8c9354dcbf9711ca449603554659c678541c5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f6c2bf44e04cebf86ccf69cd0ac22fdc0d6c40c8","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class ConsolesSampleJsonTests(test_servers.ServersSampleBase):"},{"line_number":26,"context_line":"    microversion \u003d None"},{"line_number":27,"context_line":"    extension_name \u003d \"os-remote-consoles\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def _get_flags(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_36fd456f","line":26,"in_reply_to":"bae84128_96689189","updated":"2016-02-24 21:17:59.000000000","message":"I don\u0027t think Sean wants anything inherited from the base class, except I guess the self.api stuff from _IntegratedTestBase.","commit_id":"dbe8c9354dcbf9711ca449603554659c678541c5"}],"nova/tests/functional/test_instance_actions.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a8f4a2a0ce80e93687df2261b728b92423b60896","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def setUp(self):"},{"line_number":71,"context_line":"        super(InstanceActionsTestV221, self).setUp()"},{"line_number":72,"context_line":"        self.api.microversion \u003d self.microversion"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def test_get_instance_actions_deleted(self):"},{"line_number":75,"context_line":"        server \u003d self._create_server()"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_b3917949","line":72,"range":{"start_line":72,"start_character":8,"end_line":72,"end_character":29},"updated":"2016-02-24 16:23:00.000000000","message":"Seems sad to me that we\u0027re still dependent on setting magic attributes used in a base class somewhere...","commit_id":"dbe8c9354dcbf9711ca449603554659c678541c5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9a47563a27b8829ed1221c6100ebe24d95671bd5","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def setUp(self):"},{"line_number":71,"context_line":"        super(InstanceActionsTestV221, self).setUp()"},{"line_number":72,"context_line":"        self.api.microversion \u003d self.microversion"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def test_get_instance_actions_deleted(self):"},{"line_number":75,"context_line":"        server \u003d self._create_server()"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_556c4636","line":72,"range":{"start_line":72,"start_character":8,"end_line":72,"end_character":29},"in_reply_to":"bae84128_292175b5","updated":"2016-02-24 19:33:09.000000000","message":"Yes...I know. Like my other comment elsewhere, maybe we can get to using an ABC mixin at some point, or even just making the self.microversion attribute an @abstractproperty.","commit_id":"dbe8c9354dcbf9711ca449603554659c678541c5"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"0c5105f4cbe3eaf3123650190911f8399dae8519","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def setUp(self):"},{"line_number":71,"context_line":"        super(InstanceActionsTestV221, self).setUp()"},{"line_number":72,"context_line":"        self.api.microversion \u003d self.microversion"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def test_get_instance_actions_deleted(self):"},{"line_number":75,"context_line":"        server \u003d self._create_server()"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_2c59788f","line":72,"range":{"start_line":72,"start_character":8,"end_line":72,"end_character":29},"in_reply_to":"bae84128_556c4636","updated":"2016-02-24 21:59:03.000000000","message":"I think where we want to be eventually is a set of Fixtures that get called in setUp, exactly what those will be need to be figured out, largely by getting some non api samples tests in here.\n\nBut if our setUp is sufficiently terse, it\u0027s fine. It also means you don\u0027t add a ton of untested code to a bunch of people\u0027s tests without them knowing it.\n\ndef setUp(self):\n   super(...)\n   cloud \u003d self.useFixture(OpenStackCloud(computes\u003d1))\n   cloud.set_microversion(self.microversion)\n   cloud.api\n   cloud.admin_api \n   cloud.services.compute1.hostname .... \n\n\nThat\u0027s where I\u0027d like to get to. As a fixture this ends up being something that\u0027s testable and documentable for behaviors.","commit_id":"dbe8c9354dcbf9711ca449603554659c678541c5"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"47a2e1e1b58047f285a33af3e876532bd454abe2","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def setUp(self):"},{"line_number":71,"context_line":"        super(InstanceActionsTestV221, self).setUp()"},{"line_number":72,"context_line":"        self.api.microversion \u003d self.microversion"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def test_get_instance_actions_deleted(self):"},{"line_number":75,"context_line":"        server \u003d self._create_server()"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_292175b5","line":72,"range":{"start_line":72,"start_character":8,"end_line":72,"end_character":29},"in_reply_to":"bae84128_b3917949","updated":"2016-02-24 18:30:16.000000000","message":"look at the class hierarchy in this file. We\u0027ll really try to get there, but we can\u0027t all in one go. Doing so would be months of effort, and basically unreviewable because how it would change everything.\n\nIf making the tests better can\u0027t be done one bit at a time, no one will do it.","commit_id":"dbe8c9354dcbf9711ca449603554659c678541c5"}]}
