)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16907,"name":"Diana Clarke","email":"diana.joan.clarke@gmail.com","username":"diana-clarke"},"change_message_id":"162a46220296accee4e1bd64dc84b4b901319ece","unresolved":false,"context_lines":[{"line_number":21,"context_line":"changed to call other functions since the \"list\" function now needs"},{"line_number":22,"context_line":"to be able to check the API version and that\u0027s not available in the"},{"line_number":23,"context_line":"existing testcases."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Change-Id: Ic00ec95485485dff0fd4dcf8cad6ca56a481d512"},{"line_number":26,"context_line":"Implements: blueprint instance-flavor-api"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9a30ddce_db7305b0","line":24,"updated":"2017-03-07 18:35:19.000000000","message":"This needs a \"Depends-on: \u003cchange-id\u003e\", referencing the following patch in nova, so that this python-novaclient patch doesn\u0027t accidentally get merged before the nova patch (a mistake I\u0027ve made before).\n\n- show flavor info in server details\n- https://review.openstack.org/#/c/434514/","commit_id":"b560b24e1e2c1e3c97f3b601259d39402a590473"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"7e2599b09b2fe864f4c571dd1cb1fae92671be19","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Chris Friesen \u003cchris.friesen@windriver.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2017-05-05 11:03:35 -0600"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"2.46: Show flavor info in server details"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This adds suport for microversion 2.46 which directly embeds the"},{"line_number":10,"context_line":"flavor information in the server details.  With this change, CLI"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"df140735_6a13de5d","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":4},"updated":"2017-05-31 07:29:47.000000000","message":"this need to be updated and along with others ..","commit_id":"9ca3ed9defe9e3bb2b87b9f1cb63d94c85ea8589"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5cf571f5d504a9542d284239248dcf25caf987bb","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"2.47: Show flavor info in server details"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This adds suport for microversion 2.47 which directly embeds the"},{"line_number":10,"context_line":"flavor information in the server details.  With this change, CLI"},{"line_number":11,"context_line":"requests with microversion \u003e\u003d 2.47 will no longer need to do"},{"line_number":12,"context_line":"additional queries to get the flavor and flavor extra_specs"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"df140735_c7af2128","line":9,"range":{"start_line":9,"start_character":10,"end_line":9,"end_character":16},"updated":"2017-06-02 20:06:49.000000000","message":"support","commit_id":"3a769cee03aa2f5704df6a9ca0986bdde8190525"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"67db3ee04bd185fd3f70fb89dd337acada3ba74d","unresolved":false,"context_lines":[{"line_number":12,"context_line":"additional queries to get the flavor and flavor extra_specs"},{"line_number":13,"context_line":"information."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"As part of this change, the Fixture class gains the ability"},{"line_number":16,"context_line":"to take an api_version.  The base class doesn\u0027t do anything"},{"line_number":17,"context_line":"with it, that\u0027s up to any child classes.  The Base child class"},{"line_number":18,"context_line":"is updated in this commit in order to handle the 2.47 API version."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Lastly, a number of testcases that called the \"list\" function were"},{"line_number":21,"context_line":"changed to call other functions since the \"list\" function now needs"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"df140735_963fe685","line":18,"range":{"start_line":15,"start_character":0,"end_line":18,"end_character":66},"updated":"2017-06-05 23:28:21.000000000","message":"Is this old?","commit_id":"7f8a17d143ef1568067ac47d07283240d72274d5"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"92a390f75f72e2de5e05d1d7885346fe12b93f9d","unresolved":false,"context_lines":[{"line_number":12,"context_line":"additional queries to get the flavor and flavor extra_specs"},{"line_number":13,"context_line":"information."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"As part of this change, the Fixture class gains the ability"},{"line_number":16,"context_line":"to take an api_version.  The base class doesn\u0027t do anything"},{"line_number":17,"context_line":"with it, that\u0027s up to any child classes.  The Base child class"},{"line_number":18,"context_line":"is updated in this commit in order to handle the 2.47 API version."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Lastly, a number of testcases that called the \"list\" function were"},{"line_number":21,"context_line":"changed to call other functions since the \"list\" function now needs"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"bf091321_a42a87e4","line":18,"range":{"start_line":15,"start_character":0,"end_line":18,"end_character":66},"in_reply_to":"df140735_963fe685","updated":"2017-06-08 05:42:38.000000000","message":"whoops, yes.","commit_id":"7f8a17d143ef1568067ac47d07283240d72274d5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"67db3ee04bd185fd3f70fb89dd337acada3ba74d","unresolved":false,"context_lines":[{"line_number":17,"context_line":"with it, that\u0027s up to any child classes.  The Base child class"},{"line_number":18,"context_line":"is updated in this commit in order to handle the 2.47 API version."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Lastly, a number of testcases that called the \"list\" function were"},{"line_number":21,"context_line":"changed to call other functions since the \"list\" function now needs"},{"line_number":22,"context_line":"to be able to check the API version and that\u0027s not available in the"},{"line_number":23,"context_line":"existing testcases."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Change-Id: Ic00ec95485485dff0fd4dcf8cad6ca56a481d512"},{"line_number":26,"context_line":"Implements: blueprint instance-flavor-api"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"df140735_36481a2b","line":23,"range":{"start_line":20,"start_character":0,"end_line":23,"end_character":19},"updated":"2017-06-05 23:28:21.000000000","message":"Rather than change all of those tests, why not just set a default microversion in whatever test fixture is doing these tests? Default it to 2.1 or something?","commit_id":"7f8a17d143ef1568067ac47d07283240d72274d5"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"ce9a59319a07f00565b48784aa6e51a46674ce84","unresolved":false,"context_lines":[{"line_number":17,"context_line":"with it, that\u0027s up to any child classes.  The Base child class"},{"line_number":18,"context_line":"is updated in this commit in order to handle the 2.47 API version."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Lastly, a number of testcases that called the \"list\" function were"},{"line_number":21,"context_line":"changed to call other functions since the \"list\" function now needs"},{"line_number":22,"context_line":"to be able to check the API version and that\u0027s not available in the"},{"line_number":23,"context_line":"existing testcases."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Change-Id: Ic00ec95485485dff0fd4dcf8cad6ca56a481d512"},{"line_number":26,"context_line":"Implements: blueprint instance-flavor-api"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"bf091321_6d74539a","line":23,"range":{"start_line":20,"start_character":0,"end_line":23,"end_character":19},"in_reply_to":"df140735_36481a2b","updated":"2017-06-08 06:36:49.000000000","message":"The tests in question mock.MagickMock for novaclient.client.Client.  I haven\u0027t been able to figure out how to get it to properly report the \"api_version\".  If you\u0027ve got any suggestions I\u0027m all ears.","commit_id":"7f8a17d143ef1568067ac47d07283240d72274d5"}],"novaclient/tests/functional/v2/test_servers.py":[{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"7e2599b09b2fe864f4c571dd1cb1fae92671be19","unresolved":false,"context_lines":[{"line_number":207,"context_line":"    def _find_network_in_table(self, table):"},{"line_number":208,"context_line":"        # Example:"},{"line_number":209,"context_line":"        # +-----------------+-----------------------------------+"},{"line_number":210,"context_line":"        #   Property                    Value               |"},{"line_number":211,"context_line":"        # +-----------------+-----------------------------------+"},{"line_number":212,"context_line":"        # private network          192.168.154.128          |"},{"line_number":213,"context_line":"        # +-----------------+-----------------------------------+"},{"line_number":214,"context_line":"        for line in table.split(\u0027\\n\u0027):"},{"line_number":215,"context_line":"            if \u0027|\u0027 in line:"}],"source_content_type":"text/x-python","patch_set":7,"id":"df140735_8a73d2b1","line":212,"range":{"start_line":210,"start_character":11,"end_line":212,"end_character":59},"updated":"2017-05-31 07:29:47.000000000","message":"unrelated change?","commit_id":"9ca3ed9defe9e3bb2b87b9f1cb63d94c85ea8589"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"44105db7ecd5dbbbc8f51a3b08fdc38b1a284bff","unresolved":false,"context_lines":[{"line_number":207,"context_line":"    def _find_network_in_table(self, table):"},{"line_number":208,"context_line":"        # Example:"},{"line_number":209,"context_line":"        # +-----------------+-----------------------------------+"},{"line_number":210,"context_line":"        #   Property                    Value               |"},{"line_number":211,"context_line":"        # +-----------------+-----------------------------------+"},{"line_number":212,"context_line":"        # private network          192.168.154.128          |"},{"line_number":213,"context_line":"        # +-----------------+-----------------------------------+"},{"line_number":214,"context_line":"        for line in table.split(\u0027\\n\u0027):"},{"line_number":215,"context_line":"            if \u0027|\u0027 in line:"}],"source_content_type":"text/x-python","patch_set":7,"id":"df140735_a49b0b71","line":212,"range":{"start_line":210,"start_character":11,"end_line":212,"end_character":59},"in_reply_to":"df140735_8a73d2b1","updated":"2017-06-02 19:41:49.000000000","message":"whoops, good catch.","commit_id":"9ca3ed9defe9e3bb2b87b9f1cb63d94c85ea8589"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"7e2599b09b2fe864f4c571dd1cb1fae92671be19","unresolved":false,"context_lines":[{"line_number":308,"context_line":"                                             \u0027key\u0027: EXTRA_SPEC_KEY}))"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def test_show_minimal(self):"},{"line_number":311,"context_line":"        uuid \u003d self._create_server().id"},{"line_number":312,"context_line":"        server_output \u003d self.nova(\"show --minimal %s\" % uuid)"},{"line_number":313,"context_line":"        flavor_output \u003d self.nova(\"flavor-show %s\" % self.flavor.id)"},{"line_number":314,"context_line":"        flavor_name \u003d self._get_value_from_the_table(flavor_output,"}],"source_content_type":"text/x-python","patch_set":7,"id":"df140735_ea848e60","line":311,"range":{"start_line":311,"start_character":8,"end_line":311,"end_character":39},"updated":"2017-05-31 07:29:47.000000000","message":"not very sure ,but do we need some clean up action here?","commit_id":"9ca3ed9defe9e3bb2b87b9f1cb63d94c85ea8589"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"44105db7ecd5dbbbc8f51a3b08fdc38b1a284bff","unresolved":false,"context_lines":[{"line_number":308,"context_line":"                                             \u0027key\u0027: EXTRA_SPEC_KEY}))"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def test_show_minimal(self):"},{"line_number":311,"context_line":"        uuid \u003d self._create_server().id"},{"line_number":312,"context_line":"        server_output \u003d self.nova(\"show --minimal %s\" % uuid)"},{"line_number":313,"context_line":"        flavor_output \u003d self.nova(\"flavor-show %s\" % self.flavor.id)"},{"line_number":314,"context_line":"        flavor_name \u003d self._get_value_from_the_table(flavor_output,"}],"source_content_type":"text/x-python","patch_set":7,"id":"df140735_e4d103fd","line":311,"range":{"start_line":311,"start_character":8,"end_line":311,"end_character":39},"in_reply_to":"df140735_ea848e60","updated":"2017-06-02 19:41:49.000000000","message":"The highlighted function adds the cleanup routine.","commit_id":"9ca3ed9defe9e3bb2b87b9f1cb63d94c85ea8589"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2da60ee9771066d40ef8e66c013fdb1b9083155b","unresolved":false,"context_lines":[{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    COMPUTE_API_VERSION \u003d \u00272.47\u0027"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    def _validate_flavor_details(self, flavor_details, server_flavor_details):"},{"line_number":270,"context_line":"        flavor_key_mapping \u003d {"},{"line_number":271,"context_line":"            \"OS-FLV-EXT-DATA:ephemeral\": \"ephemeral\","},{"line_number":272,"context_line":"            \"disk\": \"disk\","}],"source_content_type":"text/x-python","patch_set":10,"id":"df140735_9620069d","line":269,"updated":"2017-06-05 23:26:43.000000000","message":"In general, comments to document the validation method and tests would be nice.","commit_id":"7f8a17d143ef1568067ac47d07283240d72274d5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2da60ee9771066d40ef8e66c013fdb1b9083155b","unresolved":false,"context_lines":[{"line_number":276,"context_line":"            \"swap\": \"swap\","},{"line_number":277,"context_line":"            \"vcpus\": \"vcpus\","},{"line_number":278,"context_line":"        }"},{"line_number":279,"context_line":"        server_flavor_details \u003d eval(server_flavor_details)"},{"line_number":280,"context_line":"        for key in flavor_key_mapping:"},{"line_number":281,"context_line":"            flavor_val \u003d self._get_value_from_the_table(flavor_details,"},{"line_number":282,"context_line":"                                                        key)"}],"source_content_type":"text/x-python","patch_set":10,"id":"df140735_563eeec0","line":279,"range":{"start_line":279,"start_character":32,"end_line":279,"end_character":36},"updated":"2017-06-05 23:26:43.000000000","message":"Why is this needed? Are we dumping json to the output table rather than formatting it as a table? If so, I think that might be a bad idea.","commit_id":"7f8a17d143ef1568067ac47d07283240d72274d5"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"61e7621f42a7e3ba124069221fb09e5229497d7c","unresolved":false,"context_lines":[{"line_number":276,"context_line":"            \"swap\": \"swap\","},{"line_number":277,"context_line":"            \"vcpus\": \"vcpus\","},{"line_number":278,"context_line":"        }"},{"line_number":279,"context_line":"        server_flavor_details \u003d eval(server_flavor_details)"},{"line_number":280,"context_line":"        for key in flavor_key_mapping:"},{"line_number":281,"context_line":"            flavor_val \u003d self._get_value_from_the_table(flavor_details,"},{"line_number":282,"context_line":"                                                        key)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf091321_cd580958","line":279,"range":{"start_line":279,"start_character":32,"end_line":279,"end_character":36},"in_reply_to":"df140735_563eeec0","updated":"2017-06-08 00:03:08.000000000","message":"Yes, we dump the json representation of the dict as the value for the \"flavor\" key in the server details.\n\nDo we have any cases where we embed a table inside another table?\n\nThe \"os-extended-volumes:volumes_attached\" key in the server details is already a JSON blob, I think...the value in the output of \"nova show \u003cinstance\u003e\" looks like:\n\n[{\"id\": \"dac14aeb-9da9-41b2-aab3-6ea744470f3b\", \"delete_on_termination\": false}]\n\nSimilarly, the \"extra_specs\" key in the flavor details is shown as a JSON blob.","commit_id":"7f8a17d143ef1568067ac47d07283240d72274d5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2da60ee9771066d40ef8e66c013fdb1b9083155b","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        for key in flavor_key_mapping:"},{"line_number":281,"context_line":"            flavor_val \u003d self._get_value_from_the_table(flavor_details,"},{"line_number":282,"context_line":"                                                        key)"},{"line_number":283,"context_line":"            if key is not \"name\":"},{"line_number":284,"context_line":"                if key is \"swap\" and flavor_val is \"\":"},{"line_number":285,"context_line":"                    flavor_val \u003d 0"},{"line_number":286,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":10,"id":"df140735_1649965e","line":283,"range":{"start_line":283,"start_character":12,"end_line":283,"end_character":33},"updated":"2017-06-05 23:26:43.000000000","message":"Why? Document this please.","commit_id":"7f8a17d143ef1568067ac47d07283240d72274d5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2da60ee9771066d40ef8e66c013fdb1b9083155b","unresolved":false,"context_lines":[{"line_number":284,"context_line":"                if key is \"swap\" and flavor_val is \"\":"},{"line_number":285,"context_line":"                    flavor_val \u003d 0"},{"line_number":286,"context_line":"                else:"},{"line_number":287,"context_line":"                    flavor_val \u003d eval(flavor_val)"},{"line_number":288,"context_line":"            server_flavor_val \u003d server_flavor_details.get("},{"line_number":289,"context_line":"                flavor_key_mapping[key])"},{"line_number":290,"context_line":"            self.assertEqual(flavor_val, server_flavor_val)"}],"source_content_type":"text/x-python","patch_set":10,"id":"df140735_d64f9e68","line":287,"range":{"start_line":287,"start_character":33,"end_line":287,"end_character":37},"updated":"2017-06-05 23:26:43.000000000","message":"same","commit_id":"7f8a17d143ef1568067ac47d07283240d72274d5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2da60ee9771066d40ef8e66c013fdb1b9083155b","unresolved":false,"context_lines":[{"line_number":330,"context_line":"            self._validate_flavor_details(flavor_output,"},{"line_number":331,"context_line":"                                          server_flavor_details)"},{"line_number":332,"context_line":"        finally:"},{"line_number":333,"context_line":"            self.nova(\u0027flavor-key\u0027, params\u003d(\u0027%(flavor)s unset %(key)s\u0027 %"},{"line_number":334,"context_line":"                                            {\u0027flavor\u0027: self.flavor.id,"},{"line_number":335,"context_line":"                                             \u0027key\u0027: EXTRA_SPEC_KEY}))"}],"source_content_type":"text/x-python","patch_set":10,"id":"df140735_b62d4a96","line":335,"range":{"start_line":333,"start_character":12,"end_line":335,"end_character":69},"updated":"2017-06-05 23:26:43.000000000","message":"This should probably be done in a cleanup method, and then call that method right after doing flavor-key and use addCleanup, e.g.:\n\ndef unset_flavor_key(flavor_id, extra_spec_key):\n   ...\n\n...\n\nself.nova(\u0027flavor-key\u0027...)\nself.addCleanup(self.unset_flavor_key, self.flavor.id, EXTRA_SPEC_KEY)\n...\n\n(this applies to all tests)","commit_id":"7f8a17d143ef1568067ac47d07283240d72274d5"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"61e7621f42a7e3ba124069221fb09e5229497d7c","unresolved":false,"context_lines":[{"line_number":330,"context_line":"            self._validate_flavor_details(flavor_output,"},{"line_number":331,"context_line":"                                          server_flavor_details)"},{"line_number":332,"context_line":"        finally:"},{"line_number":333,"context_line":"            self.nova(\u0027flavor-key\u0027, params\u003d(\u0027%(flavor)s unset %(key)s\u0027 %"},{"line_number":334,"context_line":"                                            {\u0027flavor\u0027: self.flavor.id,"},{"line_number":335,"context_line":"                                             \u0027key\u0027: EXTRA_SPEC_KEY}))"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf091321_5ffffc66","line":335,"range":{"start_line":333,"start_character":12,"end_line":335,"end_character":69},"in_reply_to":"df140735_b62d4a96","updated":"2017-06-08 00:03:08.000000000","message":"what about something like this?\n\ndef _setup_extra_specs(self, flavor_id):\n    EXTRA_SPEC_KEY \u003d \"dummykey\"\n    self.nova(\u0027flavor-key\u0027, params\u003d(\u0027%(flavor)s set %(key)s\u003ddummyval\u0027 %\n                                    {\u0027flavor\u0027: self.flavor.id,\n                                    {\u0027flavor\u0027: flavor_id,\n                                     \u0027key\u0027: EXTRA_SPEC_KEY}))\n    unset_params \u003d (\u0027%(flavor)s unset %(key)s\u0027 %\n                    {\u0027flavor\u0027: flavor_id, \u0027key\u0027: EXTRA_SPEC_KEY})\n    self.addCleanup(self.nova, \u0027flavor-key\u0027, params\u003dunset_params)","commit_id":"7f8a17d143ef1568067ac47d07283240d72274d5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fa8c5ba2323578fbb30417b94b407e9cdc8c2f72","unresolved":false,"context_lines":[{"line_number":294,"context_line":"            self.assertEqual(flavor_val, server_flavor_val)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    def _setup_extra_specs(self, flavor_id):"},{"line_number":297,"context_line":"        EXTRA_SPEC_KEY \u003d \"dummykey\""},{"line_number":298,"context_line":"        self.nova(\u0027flavor-key\u0027, params\u003d(\u0027%(flavor)s set %(key)s\u003ddummyval\u0027 %"},{"line_number":299,"context_line":"                                        {\u0027flavor\u0027: flavor_id,"},{"line_number":300,"context_line":"                                         \u0027key\u0027: EXTRA_SPEC_KEY}))"}],"source_content_type":"text/x-python","patch_set":15,"id":"7f231b9d_c4ac9fee","line":297,"range":{"start_line":297,"start_character":8,"end_line":297,"end_character":22},"updated":"2017-06-16 15:43:45.000000000","message":"This doesn\u0027t really need to be all caps...","commit_id":"a0b99996c6a1f59c7a99ab0f35e73a5ca295e7ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fa8c5ba2323578fbb30417b94b407e9cdc8c2f72","unresolved":false,"context_lines":[{"line_number":313,"context_line":"        uuid \u003d self._create_server().id"},{"line_number":314,"context_line":"        server_output \u003d self.nova(\"show --minimal %s\" % uuid)"},{"line_number":315,"context_line":"        flavor_output \u003d self.nova(\"flavor-show %s\" % self.flavor.id)"},{"line_number":316,"context_line":"        self._validate_flavor_details(flavor_output, server_output)"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"    def test_list(self):"},{"line_number":319,"context_line":"        self._setup_extra_specs(self.flavor.id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7f231b9d_64bf0bd1","line":316,"updated":"2017-06-16 15:43:45.000000000","message":"I would expect --minimal to not dump the entire flavor, only the original_name.","commit_id":"a0b99996c6a1f59c7a99ab0f35e73a5ca295e7ad"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"0672d37f2c36491f19ebc7b079b1cce413ac69bc","unresolved":false,"context_lines":[{"line_number":313,"context_line":"        uuid \u003d self._create_server().id"},{"line_number":314,"context_line":"        server_output \u003d self.nova(\"show --minimal %s\" % uuid)"},{"line_number":315,"context_line":"        flavor_output \u003d self.nova(\"flavor-show %s\" % self.flavor.id)"},{"line_number":316,"context_line":"        self._validate_flavor_details(flavor_output, server_output)"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"    def test_list(self):"},{"line_number":319,"context_line":"        self._setup_extra_specs(self.flavor.id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7f231b9d_9a4722bd","line":316,"in_reply_to":"7f231b9d_64bf0bd1","updated":"2017-06-16 16:47:14.000000000","message":"The point of --minimal (according to the help blurb) is that it doesn\u0027t do additional flavor/image lookups.  Since we already have the data I figured we could just show it.   I can artificially restrict the output though if we want.","commit_id":"a0b99996c6a1f59c7a99ab0f35e73a5ca295e7ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fa8c5ba2323578fbb30417b94b407e9cdc8c2f72","unresolved":false,"context_lines":[{"line_number":315,"context_line":"        flavor_output \u003d self.nova(\"flavor-show %s\" % self.flavor.id)"},{"line_number":316,"context_line":"        self._validate_flavor_details(flavor_output, server_output)"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"    def test_list(self):"},{"line_number":319,"context_line":"        self._setup_extra_specs(self.flavor.id)"},{"line_number":320,"context_line":"        self._create_server().id"},{"line_number":321,"context_line":"        server_output \u003d self.nova(\"list --fields flavor:disk\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"7f231b9d_04df373a","line":318,"updated":"2017-06-16 15:43:45.000000000","message":"You should also have a test for nova list with --minimal.","commit_id":"a0b99996c6a1f59c7a99ab0f35e73a5ca295e7ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fa8c5ba2323578fbb30417b94b407e9cdc8c2f72","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        self._create_server().id"},{"line_number":321,"context_line":"        server_output \u003d self.nova(\"list --fields flavor:disk\")"},{"line_number":322,"context_line":"        server_flavor_val \u003d self._get_column_value_from_single_row_table("},{"line_number":323,"context_line":"            server_output, \u0027flavor: Disk\u0027)"},{"line_number":324,"context_line":"        flavor_output \u003d self.nova(\"flavor-show %s\" % self.flavor.id)"},{"line_number":325,"context_line":"        flavor_val \u003d self._get_value_from_the_table(flavor_output, \u0027disk\u0027)"},{"line_number":326,"context_line":"        self.assertEqual(flavor_val, server_flavor_val)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7f231b9d_e4d2fb27","line":323,"range":{"start_line":323,"start_character":28,"end_line":323,"end_character":40},"updated":"2017-06-16 15:43:45.000000000","message":"Why is it \"flavor: Disk\" instead of \"flavor:disk\"?","commit_id":"a0b99996c6a1f59c7a99ab0f35e73a5ca295e7ad"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"0672d37f2c36491f19ebc7b079b1cce413ac69bc","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        self._create_server().id"},{"line_number":321,"context_line":"        server_output \u003d self.nova(\"list --fields flavor:disk\")"},{"line_number":322,"context_line":"        server_flavor_val \u003d self._get_column_value_from_single_row_table("},{"line_number":323,"context_line":"            server_output, \u0027flavor: Disk\u0027)"},{"line_number":324,"context_line":"        flavor_output \u003d self.nova(\"flavor-show %s\" % self.flavor.id)"},{"line_number":325,"context_line":"        flavor_val \u003d self._get_value_from_the_table(flavor_output, \u0027disk\u0027)"},{"line_number":326,"context_line":"        self.assertEqual(flavor_val, server_flavor_val)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7f231b9d_7f1b18c9","line":323,"range":{"start_line":323,"start_character":28,"end_line":323,"end_character":40},"in_reply_to":"7f231b9d_e4d2fb27","updated":"2017-06-16 16:47:14.000000000","message":"Something down in the guts does that.  The same thing happens if you specify one of the other namespaced fields.  For example, \"nova list  --fields \u0027OS-EXT-STS:vm_state\u0027\" gives a column name of \"OS-EXT-STS: Vm State\".","commit_id":"a0b99996c6a1f59c7a99ab0f35e73a5ca295e7ad"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"0519e3dd5465245f4982eb3cdebeba5e1666a30c","unresolved":false,"context_lines":[{"line_number":327,"context_line":"        flavor_val \u003d self._get_value_from_the_table(flavor_output, \u0027disk\u0027)"},{"line_number":328,"context_line":"        self.assertEqual(flavor_val, server_flavor_val)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    # No change in this microversion, just make sure we didn\u0027t break it."},{"line_number":331,"context_line":"    def test_list_minimal(self):"},{"line_number":332,"context_line":"        server_name \u003d \u0027dummyname\u0027"},{"line_number":333,"context_line":"        self._setup_extra_specs(self.flavor.id)"},{"line_number":334,"context_line":"        uuid \u003d self._create_server(name\u003dserver_name).id"},{"line_number":335,"context_line":"        server_output \u003d self.nova(\"list --minimal\")"},{"line_number":336,"context_line":"        # The only fields output are \"ID\" and \"Name\""},{"line_number":337,"context_line":"        output_uuid \u003d self._get_column_value_from_single_row_table("},{"line_number":338,"context_line":"            server_output, \u0027ID\u0027)"},{"line_number":339,"context_line":"        output_name \u003d self._get_column_value_from_single_row_table("},{"line_number":340,"context_line":"            server_output, \u0027Name\u0027)"},{"line_number":341,"context_line":"        self.assertEqual(output_uuid, uuid)"},{"line_number":342,"context_line":"        self.assertEqual(output_name, server_name)"}],"source_content_type":"text/x-python","patch_set":18,"id":"5f201791_b5571303","line":342,"range":{"start_line":330,"start_character":4,"end_line":342,"end_character":50},"updated":"2017-06-22 15:00:16.000000000","message":"let\u0027s move this test to https://github.com/openstack/python-novaclient/blob/master/novaclient/tests/functional/v2/legacy/test_servers.py . It should be prove that v2.47 doesn\u0027t break anything (if the same check is executed in the same way in legacy and 2.47)","commit_id":"52a0ae4aa21052287e5b3195d3a62ff2d1102f9a"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"732262e2083bae06ff381010e97cf1079edcc9d8","unresolved":false,"context_lines":[{"line_number":327,"context_line":"        flavor_val \u003d self._get_value_from_the_table(flavor_output, \u0027disk\u0027)"},{"line_number":328,"context_line":"        self.assertEqual(flavor_val, server_flavor_val)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    # No change in this microversion, just make sure we didn\u0027t break it."},{"line_number":331,"context_line":"    def test_list_minimal(self):"},{"line_number":332,"context_line":"        server_name \u003d \u0027dummyname\u0027"},{"line_number":333,"context_line":"        self._setup_extra_specs(self.flavor.id)"},{"line_number":334,"context_line":"        uuid \u003d self._create_server(name\u003dserver_name).id"},{"line_number":335,"context_line":"        server_output \u003d self.nova(\"list --minimal\")"},{"line_number":336,"context_line":"        # The only fields output are \"ID\" and \"Name\""},{"line_number":337,"context_line":"        output_uuid \u003d self._get_column_value_from_single_row_table("},{"line_number":338,"context_line":"            server_output, \u0027ID\u0027)"},{"line_number":339,"context_line":"        output_name \u003d self._get_column_value_from_single_row_table("},{"line_number":340,"context_line":"            server_output, \u0027Name\u0027)"},{"line_number":341,"context_line":"        self.assertEqual(output_uuid, uuid)"},{"line_number":342,"context_line":"        self.assertEqual(output_name, server_name)"}],"source_content_type":"text/x-python","patch_set":18,"id":"5f201791_ee78152c","line":342,"range":{"start_line":330,"start_character":4,"end_line":342,"end_character":50},"in_reply_to":"5f201791_b5571303","updated":"2017-06-22 16:53:17.000000000","message":"Moving this under TestServersListNovaClient in the legacy tests, that way it\u0027ll automatically get run again with COMPUTE_API_VERSION \u003d \"2.latest\" in tests/functional/v2/test_servers.","commit_id":"52a0ae4aa21052287e5b3195d3a62ff2d1102f9a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7bd36d5924d0d6c77bbcd26474849cd40d2a2f53","unresolved":false,"context_lines":[{"line_number":314,"context_line":"        server_output \u003d self.nova(\"show --minimal %s\" % uuid)"},{"line_number":315,"context_line":"        server_output_flavor \u003d self._get_value_from_the_table("},{"line_number":316,"context_line":"            server_output, \u0027flavor\u0027)"},{"line_number":317,"context_line":"        self.assertEqual(server_output_flavor, self.flavor.name)"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    def test_list(self):"},{"line_number":320,"context_line":"        self._setup_extra_specs(self.flavor.id)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f201791_44a8e675","line":317,"updated":"2017-06-23 18:18:26.000000000","message":"nit: swap the args since they should be (expected, actual)","commit_id":"f844f96ab5670dc893252d9c0912ee53d81354c8"}],"novaclient/tests/unit/fixture_data/servers.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f0f22bfe75400135a1969332e98c035211cf49fa","unresolved":false,"context_lines":[{"line_number":151,"context_line":"            }"},{"line_number":152,"context_line":"        }"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        def reformat_flavor_details(flavor):"},{"line_number":155,"context_line":"            newflavor \u003d {"},{"line_number":156,"context_line":"                \"extra_specs\": {},"},{"line_number":157,"context_line":"                \"rxtx_factor\": 1.0,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5ff73747_842c7f02","line":154,"updated":"2017-04-27 23:48:10.000000000","message":"Rather than all of this fixture stuff, it\u0027d probably just be easier than doing unit tests with these fixtures, to just add a functional test.","commit_id":"79f65366a9440f46fc198e6ad9d9798c583859a3"}],"novaclient/tests/unit/test_shell.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2da60ee9771066d40ef8e66c013fdb1b9083155b","unresolved":false,"context_lines":[{"line_number":525,"context_line":"    def test_nova_endpoint_type(self, mock_client, m_requests):"},{"line_number":526,"context_line":"        self.make_env(fake_env\u003dFAKE_ENV3)"},{"line_number":527,"context_line":"        self.register_keystone_discovery_fixture(m_requests)"},{"line_number":528,"context_line":"        self.shell(\u0027flavor-list\u0027)"},{"line_number":529,"context_line":"        client_kwargs \u003d mock_client.call_args_list[0][1]"},{"line_number":530,"context_line":"        self.assertEqual(client_kwargs[\u0027endpoint_type\u0027], \u0027novaURL\u0027)"},{"line_number":531,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"df140735_767fb265","line":528,"updated":"2017-06-05 23:26:43.000000000","message":"Why does this need to change? Same for the tests below.","commit_id":"7f8a17d143ef1568067ac47d07283240d72274d5"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"92a390f75f72e2de5e05d1d7885346fe12b93f9d","unresolved":false,"context_lines":[{"line_number":525,"context_line":"    def test_nova_endpoint_type(self, mock_client, m_requests):"},{"line_number":526,"context_line":"        self.make_env(fake_env\u003dFAKE_ENV3)"},{"line_number":527,"context_line":"        self.register_keystone_discovery_fixture(m_requests)"},{"line_number":528,"context_line":"        self.shell(\u0027flavor-list\u0027)"},{"line_number":529,"context_line":"        client_kwargs \u003d mock_client.call_args_list[0][1]"},{"line_number":530,"context_line":"        self.assertEqual(client_kwargs[\u0027endpoint_type\u0027], \u0027novaURL\u0027)"},{"line_number":531,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"bf091321_04c25386","line":528,"in_reply_to":"df140735_767fb265","updated":"2017-06-08 05:42:38.000000000","message":"novaclient.v2.shell.do_list() now checks cs.api_version to determine how to represent the flavor.  These tests mock novaclient.client.Client, and I was unable to figure out a way to cause it to return a useful value for the api_version.  I get an error like this:\n\n      File \"novaclient/v2/shell.py\", line 1476, in do_list\n        if cs.api_version \u003c api_versions.APIVersion(\u00272.47\u0027):\n      File \"novaclient/api_versions.py\", line 117, in __gt__\n        \"cls\": self.__class__})\n    TypeError: \u0027\u003cMagicMock name\u003d\u0027Client().api_version\u0027 id\u003d\u002764721552\u0027\u003e\u0027 should be an instance of \u0027\u003cclass \u0027novaclient.api_versions.APIVersion\u0027\u003e\u0027","commit_id":"7f8a17d143ef1568067ac47d07283240d72274d5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2da60ee9771066d40ef8e66c013fdb1b9083155b","unresolved":false,"context_lines":[{"line_number":576,"context_line":"            ])"},{"line_number":577,"context_line":"        self.make_env(exclude\u003d\u0027OS_PASSWORD\u0027)"},{"line_number":578,"context_line":"        self.register_keystone_discovery_fixture(m_requests)"},{"line_number":579,"context_line":"        stdout, stderr \u003d self.shell(\u0027hypervisor-list\u0027)"},{"line_number":580,"context_line":"        self.assertEqual((stdout + stderr), ex)"},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"    @mock.patch(\u0027sys.stdin\u0027, side_effect\u003dmock.MagicMock)"}],"source_content_type":"text/x-python","patch_set":10,"id":"df140735_3695ba87","line":579,"updated":"2017-06-05 23:26:43.000000000","message":"Why is this changing?","commit_id":"7f8a17d143ef1568067ac47d07283240d72274d5"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"92a390f75f72e2de5e05d1d7885346fe12b93f9d","unresolved":false,"context_lines":[{"line_number":576,"context_line":"            ])"},{"line_number":577,"context_line":"        self.make_env(exclude\u003d\u0027OS_PASSWORD\u0027)"},{"line_number":578,"context_line":"        self.register_keystone_discovery_fixture(m_requests)"},{"line_number":579,"context_line":"        stdout, stderr \u003d self.shell(\u0027hypervisor-list\u0027)"},{"line_number":580,"context_line":"        self.assertEqual((stdout + stderr), ex)"},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"    @mock.patch(\u0027sys.stdin\u0027, side_effect\u003dmock.MagicMock)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf091321_846423bb","line":579,"in_reply_to":"df140735_3695ba87","updated":"2017-06-08 05:42:38.000000000","message":"Same reason as above, the \"list\" command now needs to be able to check cs.api_version.  I get this:\n\n      File \"novaclient/v2/shell.py\", line 1476, in do_list\n        if cs.api_version \u003c api_versions.APIVersion(\u00272.47\u0027):\n      File \"novaclient/api_versions.py\", line 117, in __gt__\n        \"cls\": self.__class__})\n    TypeError: \u0027\u003cMagicMock name\u003d\u0027mock().api_version\u0027 id\u003d\u002762620240\u0027\u003e\u0027 should be an instance of \u0027\u003cclass \u0027novaclient.api_versions.APIVersion\u0027\u003e\u0027","commit_id":"7f8a17d143ef1568067ac47d07283240d72274d5"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"d121e0dca4af1674bdc0f20f7ef5eb3c8c02ea42","unresolved":false,"context_lines":[{"line_number":365,"context_line":"        super(ShellTest, self).setUp()"},{"line_number":366,"context_line":"        self.useFixture(fixtures.MonkeyPatch("},{"line_number":367,"context_line":"                        \u0027novaclient.client.Client\u0027,"},{"line_number":368,"context_line":"                        mock.MagicMock()))"},{"line_number":369,"context_line":"        self.nc_util \u003d mock.patch(\u0027novaclient.utils.isunauthenticated\u0027).start()"},{"line_number":370,"context_line":"        self.nc_util.return_value \u003d False"},{"line_number":371,"context_line":"        self.mock_server_version_range \u003d mock.patch("}],"source_content_type":"text/x-python","patch_set":11,"id":"bf091321_b07d1ee9","line":368,"range":{"start_line":368,"start_character":24,"end_line":368,"end_character":40},"updated":"2017-06-08 07:31:45.000000000","message":"Is there a way I can make it so that this gets an \"api_version\" of novaclient.API_MIN_VERSION and have it get used everywhere, including tests that do:\n\n@mock.patch(\u0027novaclient.client.Client\u0027)\n\nOtherwise I can set the mock_client return code to something that has the api_version set, but that\u0027s arguably messier than changing from \"list\" to \"flavor-list\".","commit_id":"d61596cdea6ebe874d5145ce0a7964a6c9f4b37a"}],"novaclient/v2/shell.py":[{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"edd687db34e8f11e331f8d95b0006aa983fbd508","unresolved":false,"context_lines":[{"line_number":1676,"context_line":"            search_opts[arg] \u003d getattr(args, arg)"},{"line_number":1677,"context_line":""},{"line_number":1678,"context_line":"    filters \u003d {\u0027security_groups\u0027: utils.format_security_groups}"},{"line_number":1679,"context_line":"    if (not isinstance(cs.api_version, api_versions.APIVersion) or"},{"line_number":1680,"context_line":"            cs.api_version \u003c api_versions.APIVersion(\u00272.43\u0027)):"},{"line_number":1681,"context_line":"        filters[\u0027flavor\u0027] \u003d lambda f: f[\u0027id\u0027]"},{"line_number":1682,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_9ae862e4","line":1679,"updated":"2017-02-22 16:10:50.000000000","message":"This is gross, but I couldn\u0027t figure out how to properly handle the API version in the tests.","commit_id":"99ed4280583bf2f02c37cabb3d9ec120091dbd4c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5cf571f5d504a9542d284239248dcf25caf987bb","unresolved":false,"context_lines":[{"line_number":1473,"context_line":"            search_opts[arg] \u003d getattr(args, arg)"},{"line_number":1474,"context_line":""},{"line_number":1475,"context_line":"    filters \u003d {\u0027security_groups\u0027: utils.format_security_groups}"},{"line_number":1476,"context_line":"    if cs.api_version \u003c api_versions.APIVersion(\u00272.47\u0027):"},{"line_number":1477,"context_line":"        filters[\u0027flavor\u0027] \u003d lambda f: f[\u0027id\u0027]"},{"line_number":1478,"context_line":""},{"line_number":1479,"context_line":"    id_col \u003d \u0027ID\u0027"},{"line_number":1480,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_87536939","line":1477,"range":{"start_line":1476,"start_character":4,"end_line":1477,"end_character":45},"updated":"2017-06-02 20:06:49.000000000","message":"Why are you changing this? We can still filter servers by flavor id in 2.47.","commit_id":"3a769cee03aa2f5704df6a9ca0986bdde8190525"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"f4bd47faf4b7cc52031e9e924250ddb05d8fd49a","unresolved":false,"context_lines":[{"line_number":1473,"context_line":"            search_opts[arg] \u003d getattr(args, arg)"},{"line_number":1474,"context_line":""},{"line_number":1475,"context_line":"    filters \u003d {\u0027security_groups\u0027: utils.format_security_groups}"},{"line_number":1476,"context_line":"    if cs.api_version \u003c api_versions.APIVersion(\u00272.47\u0027):"},{"line_number":1477,"context_line":"        filters[\u0027flavor\u0027] \u003d lambda f: f[\u0027id\u0027]"},{"line_number":1478,"context_line":""},{"line_number":1479,"context_line":"    id_col \u003d \u0027ID\u0027"},{"line_number":1480,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_bd731e16","line":1477,"range":{"start_line":1476,"start_character":4,"end_line":1477,"end_character":45},"in_reply_to":"df140735_87536939","updated":"2017-06-02 21:24:33.000000000","message":"I think this is an output filter, used down at line 1523 for displaying the output.","commit_id":"3a769cee03aa2f5704df6a9ca0986bdde8190525"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2da60ee9771066d40ef8e66c013fdb1b9083155b","unresolved":false,"context_lines":[{"line_number":1474,"context_line":""},{"line_number":1475,"context_line":"    filters \u003d {\u0027security_groups\u0027: utils.format_security_groups}"},{"line_number":1476,"context_line":"    if cs.api_version \u003c api_versions.APIVersion(\u00272.47\u0027):"},{"line_number":1477,"context_line":"        filters[\u0027flavor\u0027] \u003d lambda f: f[\u0027id\u0027]"},{"line_number":1478,"context_line":""},{"line_number":1479,"context_line":"    id_col \u003d \u0027ID\u0027"},{"line_number":1480,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"df140735_36da5a77","line":1477,"range":{"start_line":1477,"start_character":8,"end_line":1477,"end_character":45},"updated":"2017-06-05 23:26:43.000000000","message":"Leave a comment about what goes into the output if it\u0027s microversion \u003e\u003d 2.47. I\u0027m curious because I\u0027m thinking it\u0027s a json blob.","commit_id":"7f8a17d143ef1568067ac47d07283240d72274d5"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"92a390f75f72e2de5e05d1d7885346fe12b93f9d","unresolved":false,"context_lines":[{"line_number":1474,"context_line":""},{"line_number":1475,"context_line":"    filters \u003d {\u0027security_groups\u0027: utils.format_security_groups}"},{"line_number":1476,"context_line":"    if cs.api_version \u003c api_versions.APIVersion(\u00272.47\u0027):"},{"line_number":1477,"context_line":"        filters[\u0027flavor\u0027] \u003d lambda f: f[\u0027id\u0027]"},{"line_number":1478,"context_line":""},{"line_number":1479,"context_line":"    id_col \u003d \u0027ID\u0027"},{"line_number":1480,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"bf091321_44ba8bde","line":1477,"range":{"start_line":1477,"start_character":8,"end_line":1477,"end_character":45},"in_reply_to":"df140735_36da5a77","updated":"2017-06-08 05:42:38.000000000","message":"Will do.\n\nIt is a JSON blob, representing the dict of the flavor information.  Did we want to limit it?  The only useful single piece of information would be the original flavor name since we no longer have the flavor ID available.","commit_id":"7f8a17d143ef1568067ac47d07283240d72274d5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2da60ee9771066d40ef8e66c013fdb1b9083155b","unresolved":false,"context_lines":[{"line_number":2101,"context_line":"        info[\u0027%s network\u0027 % network_label] \u003d \u0027, \u0027.join(address_list)"},{"line_number":2102,"context_line":""},{"line_number":2103,"context_line":"    flavor \u003d info.get(\u0027flavor\u0027, {})"},{"line_number":2104,"context_line":"    if cs.api_version \u003e\u003d api_versions.APIVersion(\u00272.47\u0027):"},{"line_number":2105,"context_line":"        if minimal:"},{"line_number":2106,"context_line":"            info[\u0027flavor\u0027] \u003d flavor.get(\u0027original_name\u0027, \u0027\u0027)"},{"line_number":2107,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":10,"id":"df140735_f6df4263","line":2104,"updated":"2017-06-05 23:26:43.000000000","message":"A comment here would be nice, i.e. what\u0027s different about 2.47? I know, but john doe in 2 years might not.","commit_id":"7f8a17d143ef1568067ac47d07283240d72274d5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"68496c9d7aa400542a5b474a02150c4d9d07f750","unresolved":false,"context_lines":[{"line_number":1486,"context_line":""},{"line_number":1487,"context_line":"    filters \u003d {\u0027security_groups\u0027: utils.format_security_groups}"},{"line_number":1488,"context_line":"    # If the api version is less than 2.47 then we only report the flavor id."},{"line_number":1489,"context_line":"    # If the api version is 2.47 or more then we output the JSON blob"},{"line_number":1490,"context_line":"    # representing the dict of the flavor information."},{"line_number":1491,"context_line":"    if cs.api_version \u003c api_versions.APIVersion(\u00272.47\u0027):"},{"line_number":1492,"context_line":"        filters[\u0027flavor\u0027] \u003d lambda f: f[\u0027id\u0027]"},{"line_number":1493,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"7f231b9d_164a387f","line":1490,"range":{"start_line":1489,"start_character":6,"end_line":1490,"end_character":54},"updated":"2017-06-13 19:23:39.000000000","message":"As discussed in IRC, rather than dump a json blob, let\u0027s turn it into a key/value set with namespaced keys like flavor:ephemeral, flavor:ram, etc.","commit_id":"12bcb1d070ffcd6fd5c01e81f78b97e97c94689e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fa8c5ba2323578fbb30417b94b407e9cdc8c2f72","unresolved":false,"context_lines":[{"line_number":972,"context_line":""},{"line_number":973,"context_line":""},{"line_number":974,"context_line":"# Replace a key whose value is a dictionary with a set of namespaced keys"},{"line_number":975,"context_line":"# representing each key in the dictionary value,"},{"line_number":976,"context_line":"def _expand_dict_key(collection, key):"},{"line_number":977,"context_line":"    for item in collection:"},{"line_number":978,"context_line":"        field \u003d getattr(item, key)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7f231b9d_e4979b47","line":975,"range":{"start_line":975,"start_character":47,"end_line":975,"end_character":48},"updated":"2017-06-16 15:43:45.000000000","message":".","commit_id":"a0b99996c6a1f59c7a99ab0f35e73a5ca295e7ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fa8c5ba2323578fbb30417b94b407e9cdc8c2f72","unresolved":false,"context_lines":[{"line_number":2148,"context_line":"        info[\u0027%s network\u0027 % network_label] \u003d \u0027, \u0027.join(address_list)"},{"line_number":2149,"context_line":""},{"line_number":2150,"context_line":"    flavor \u003d info.get(\u0027flavor\u0027, {})"},{"line_number":2151,"context_line":"    if cs.api_version \u003e\u003d api_versions.APIVersion(\u00272.47\u0027):"},{"line_number":2152,"context_line":"        # The \"flavor\" field is a JSON representation of a dict containing the"},{"line_number":2153,"context_line":"        # flavor information used at boot.  Replace it with namespaced keys."},{"line_number":2154,"context_line":"        del info[\u0027flavor\u0027]"},{"line_number":2155,"context_line":"        for key in flavor.keys():"},{"line_number":2156,"context_line":"            info[\u0027flavor:\u0027 + key] \u003d flavor[key]"},{"line_number":2157,"context_line":"    else:"},{"line_number":2158,"context_line":"        # Prior to microversion 2.47 we just have the ID of the flavor so we"},{"line_number":2159,"context_line":"        # need to retrieve the flavor information (which may have changed"}],"source_content_type":"text/x-python","patch_set":15,"id":"7f231b9d_a41ac313","line":2156,"range":{"start_line":2151,"start_character":0,"end_line":2156,"end_character":47},"updated":"2017-06-16 15:43:45.000000000","message":"Shouldn\u0027t this take into account if --minimal is specified and if so, only print out the original flavor name?","commit_id":"a0b99996c6a1f59c7a99ab0f35e73a5ca295e7ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7bd36d5924d0d6c77bbcd26474849cd40d2a2f53","unresolved":false,"context_lines":[{"line_number":971,"context_line":"        time.sleep(poll_period)"},{"line_number":972,"context_line":""},{"line_number":973,"context_line":""},{"line_number":974,"context_line":"# Replace a key whose value is a dictionary with a set of namespaced keys"},{"line_number":975,"context_line":"# representing each key in the dictionary value,"},{"line_number":976,"context_line":"def _expand_dict_key(collection, key):"},{"line_number":977,"context_line":"    for item in collection:"},{"line_number":978,"context_line":"        field \u003d getattr(item, key)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f201791_e4e7f2e3","line":975,"range":{"start_line":974,"start_character":1,"end_line":975,"end_character":48},"updated":"2017-06-23 18:18:26.000000000","message":"nit: this would be better as a proper docstring","commit_id":"f844f96ab5670dc893252d9c0912ee53d81354c8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7bd36d5924d0d6c77bbcd26474849cd40d2a2f53","unresolved":false,"context_lines":[{"line_number":1562,"context_line":""},{"line_number":1563,"context_line":"    # For detailed lists, if the api version is 2.47 or more then the flavor"},{"line_number":1564,"context_line":"    # info will be a dict and we want to expand it."},{"line_number":1565,"context_line":"    if detailed and cs.api_version \u003e\u003d api_versions.APIVersion(\u00272.47\u0027):"},{"line_number":1566,"context_line":"        _expand_dict_key(servers, \u0027flavor\u0027)"},{"line_number":1567,"context_line":""},{"line_number":1568,"context_line":"    if servers:"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f201791_64f40287","line":1565,"range":{"start_line":1565,"start_character":20,"end_line":1565,"end_character":69},"updated":"2017-06-23 18:18:26.000000000","message":"nit: we could do the version check once and store the result in a variable at the top so we don\u0027t have to do this again.","commit_id":"f844f96ab5670dc893252d9c0912ee53d81354c8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7bd36d5924d0d6c77bbcd26474849cd40d2a2f53","unresolved":false,"context_lines":[{"line_number":2156,"context_line":"            # \u0027flavor\u0027 field name but just output the original name."},{"line_number":2157,"context_line":"            info[\u0027flavor\u0027] \u003d flavor[\u0027original_name\u0027]"},{"line_number":2158,"context_line":"        else:"},{"line_number":2159,"context_line":"            # Replace the \"flavor\" field with individual namespaced fields.."},{"line_number":2160,"context_line":"            del info[\u0027flavor\u0027]"},{"line_number":2161,"context_line":"            for key in flavor.keys():"},{"line_number":2162,"context_line":"                info[\u0027flavor:\u0027 + key] \u003d flavor[key]"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f201791_e40ed28b","line":2159,"range":{"start_line":2159,"start_character":74,"end_line":2159,"end_character":76},"updated":"2017-06-23 18:18:26.000000000","message":"One too many periods or is there more to the mystery....","commit_id":"f844f96ab5670dc893252d9c0912ee53d81354c8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7bd36d5924d0d6c77bbcd26474849cd40d2a2f53","unresolved":false,"context_lines":[{"line_number":2157,"context_line":"            info[\u0027flavor\u0027] \u003d flavor[\u0027original_name\u0027]"},{"line_number":2158,"context_line":"        else:"},{"line_number":2159,"context_line":"            # Replace the \"flavor\" field with individual namespaced fields.."},{"line_number":2160,"context_line":"            del info[\u0027flavor\u0027]"},{"line_number":2161,"context_line":"            for key in flavor.keys():"},{"line_number":2162,"context_line":"                info[\u0027flavor:\u0027 + key] \u003d flavor[key]"},{"line_number":2163,"context_line":"    else:"},{"line_number":2164,"context_line":"        # Prior to microversion 2.47 we just have the ID of the flavor so we"},{"line_number":2165,"context_line":"        # need to retrieve the flavor information (which may have changed"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f201791_441d86bb","line":2162,"range":{"start_line":2160,"start_character":12,"end_line":2162,"end_character":51},"updated":"2017-06-23 18:18:26.000000000","message":"Can\u0027t you re-use _expand_dict_key by calling it as:\n\n_expand_dict_key([info], \u0027flavor\u0027)\n\n?","commit_id":"f844f96ab5670dc893252d9c0912ee53d81354c8"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"cf662b2bc6e77cf18a0b94714c65cc772959a9d9","unresolved":false,"context_lines":[{"line_number":2157,"context_line":"            info[\u0027flavor\u0027] \u003d flavor[\u0027original_name\u0027]"},{"line_number":2158,"context_line":"        else:"},{"line_number":2159,"context_line":"            # Replace the \"flavor\" field with individual namespaced fields.."},{"line_number":2160,"context_line":"            del info[\u0027flavor\u0027]"},{"line_number":2161,"context_line":"            for key in flavor.keys():"},{"line_number":2162,"context_line":"                info[\u0027flavor:\u0027 + key] \u003d flavor[key]"},{"line_number":2163,"context_line":"    else:"},{"line_number":2164,"context_line":"        # Prior to microversion 2.47 we just have the ID of the flavor so we"},{"line_number":2165,"context_line":"        # need to retrieve the flavor information (which may have changed"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f201791_afbf69a8","line":2162,"range":{"start_line":2160,"start_character":12,"end_line":2162,"end_character":51},"in_reply_to":"5f201791_441d86bb","updated":"2017-06-26 15:55:26.000000000","message":"No, I tried that.  Turns out getattr/setattr/delattr doesn\u0027t work on a dict.","commit_id":"f844f96ab5670dc893252d9c0912ee53d81354c8"}],"releasenotes/notes/microversion-v2_47-4aa54fbbd519e421.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5cf571f5d504a9542d284239248dcf25caf987bb","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adding support for microversion 2.47 which returns the flavor details"},{"line_number":5,"context_line":"    directly embedded in the server details when listing or showing servers."}],"source_content_type":"text/x-yaml","patch_set":9,"id":"df140735_076f59fc","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":10},"updated":"2017-06-02 20:06:49.000000000","message":"Added","commit_id":"3a769cee03aa2f5704df6a9ca0986bdde8190525"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fa8c5ba2323578fbb30417b94b407e9cdc8c2f72","unresolved":false,"context_lines":[{"line_number":7,"context_line":"    need to do additional queries to get the flavor and flavor extra_specs"},{"line_number":8,"context_line":"    information.  Instead, the flavor information will be output as"},{"line_number":9,"context_line":"    separate key/value pairs with the keys namespaced with the"},{"line_number":10,"context_line":"    \"flavor:\" prefix.  As one would expect, these keys can also be"},{"line_number":11,"context_line":"    specified as output fields when listing servers."}],"source_content_type":"text/x-yaml","patch_set":15,"id":"7f231b9d_c4c93f59","line":11,"range":{"start_line":10,"start_character":23,"end_line":11,"end_character":52},"updated":"2017-06-16 15:43:45.000000000","message":"Maybe give an example here for context?","commit_id":"a0b99996c6a1f59c7a99ab0f35e73a5ca295e7ad"}]}
