)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7227,"name":"Timur Nurlygayanov","email":"tnurlygayanov@mirantis.com","username":"tnurlygayanov"},"change_message_id":"38ccbf0a5c9e9d638f943ef02402b86016fcc94a","unresolved":false,"context_lines":[{"line_number":13,"context_line":"Add get_table_headers() method that allows to"},{"line_number":14,"context_line":"get table header from cmd output."},{"line_number":15,"context_line":"Add \u0027utils\u0027 module"},{"line_number":16,"context_line":"Table structure tests have been updated."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: If60b3720e9ce9a6a6c7e35880bf3f9c661d6f259"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":38,"id":"ba8a016a_cd3e5eda","line":16,"updated":"2015-11-20 13:45:56.000000000","message":"Do we have blueprint/spec/bug for this change?","commit_id":"1e396683b12aafcf6afc161b4eae1f202b1f12db"}],"ironicclient/tests/functional/base.py":[{"author":{"_account_id":9068,"name":"Yuriy Yekovenko","email":"yyekovenko@mirantis.com","username":"yyekovenko"},"change_message_id":"74507b34e532b00a323da10ee5112ed5a124b709","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            return self.parser.listing(output_with_auth)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def get_table_header(self, action, flags\u003d\u0027\u0027, params\u003d\u0027\u0027):"},{"line_number":125,"context_line":"        \"\"\"Executes ironic command for the given action."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        :param action: the cli command to run using Ironic"},{"line_number":128,"context_line":"        :type action: string"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a26ad4f_e1c76810","line":125,"updated":"2015-10-29 15:30:12.000000000","message":"The doc string looks like a copy-paste from ironic method.","commit_id":"3081d4fb2705f8b6f1e721279bc3253d8b8a7fdc"},{"author":{"_account_id":9068,"name":"Yuriy Yekovenko","email":"yyekovenko@mirantis.com","username":"yyekovenko"},"change_message_id":"74507b34e532b00a323da10ee5112ed5a124b709","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        :type flags: string"},{"line_number":131,"context_line":"        :param params: any optional positional args to use"},{"line_number":132,"context_line":"        :type params: string"},{"line_number":133,"context_line":"        \"\"\""},{"line_number":134,"context_line":"        flags +\u003d \u0027 --os-endpoint-type publicURL\u0027"},{"line_number":135,"context_line":"        if hasattr(self, \u0027os_auth_token\u0027):"},{"line_number":136,"context_line":"            output_no_auth \u003d self._cmd_no_auth(\u0027ironic\u0027, action, flags, params)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a26ad4f_1c30c700","line":133,"updated":"2015-10-29 15:30:12.000000000","message":"Suggest to move common code of ironic() and get_table_header() methods to new method.","commit_id":"3081d4fb2705f8b6f1e721279bc3253d8b8a7fdc"},{"author":{"_account_id":9068,"name":"Yuriy Yekovenko","email":"yyekovenko@mirantis.com","username":"yyekovenko"},"change_message_id":"74507b34e532b00a323da10ee5112ed5a124b709","unresolved":false,"context_lines":[{"line_number":151,"context_line":"            if node_show[\u0027provision_state\u0027] !\u003d \u0027available\u0027:"},{"line_number":152,"context_line":"                self.ironic(\u0027node-set-provision-state\u0027,"},{"line_number":153,"context_line":"                            params\u003d\u0027{0} deleted\u0027.format(node_id))"},{"line_number":154,"context_line":"            if node_show[\u0027power_state\u0027] !\u003d \u0027None\u0027 or \u0027off\u0027:"},{"line_number":155,"context_line":"                self.ironic(\u0027node-set-power-state\u0027,"},{"line_number":156,"context_line":"                            params\u003d\u0027{0} off\u0027.format(node_id))"},{"line_number":157,"context_line":"            self.ironic(\u0027node-delete\u0027, params\u003dnode_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a26ad4f_a1997070","line":154,"updated":"2015-10-29 15:30:12.000000000","message":"I assume you meant the following:\nif node_show[\u0027power_state\u0027] not in (\u0027None\u0027, \u0027off\u0027):\n\nOtherwise your IF returns result of OR between \u0027off\u0027 string and power_state!\u003d\u0027None\u0027 expression.","commit_id":"3081d4fb2705f8b6f1e721279bc3253d8b8a7fdc"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"0aa3ff1cbcd4e075aa609a0e9e0ffe9f09d28429","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import os"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import six"},{"line_number":16,"context_line":"import six.moves.configparser as config_parser"},{"line_number":17,"context_line":"from tempest_lib.cli import base"}],"source_content_type":"text/x-python","patch_set":23,"id":"da85f559_f2a7e208","side":"PARENT","line":14,"updated":"2015-11-11 13:23:26.000000000","message":"please, get back black line between  os and six: http://docs.openstack.org/developer/hacking/#import-order-template","commit_id":"b66f5e8dd60c023d6d216c3bbc5ec22d837623c3"},{"author":{"_account_id":9068,"name":"Yuriy Yekovenko","email":"yyekovenko@mirantis.com","username":"yyekovenko"},"change_message_id":"0f73c99aafa22f14a7c37036fa6c893993c89f5e","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        output \u003d self._ironic(action\u003daction, flags\u003dflags, params\u003dparams)"},{"line_number":125,"context_line":"        return self.parser.listing(output)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def get_table_heades(self, action, flags\u003d\u0027\u0027, params\u003d\u0027\u0027):"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        output \u003d self._ironic(action\u003daction, flags\u003dflags, params\u003dparams)"},{"line_number":130,"context_line":"        table \u003d self.parser.table(output)"}],"source_content_type":"text/x-python","patch_set":27,"id":"da85f559_cd92c69f","line":127,"updated":"2015-11-13 11:05:11.000000000","message":"Fix misprint: should be \u0027header\u0027, not \u0027heades\u0027.","commit_id":"222fe817a47179253cc389a8b87b320bc3a3e8c7"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b7c2ec8893f9dec99c9e80b8a6b237b74ffe31dc","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        :param table_heades: table headers output from cmd"},{"line_number":138,"context_line":"        \"\"\""},{"line_number":139,"context_line":"        for field in field_names:"},{"line_number":140,"context_line":"            self.assertIn(field, table_headers)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def _try_delete_node(self, node_id):"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"da85f559_41aa1e87","line":140,"updated":"2015-11-13 12:45:33.000000000","message":"One more thing that might be worth fixing - why not to use assertEqual here:\n\n self.assertEqual(sorted(field_names), sorted(table_headers))","commit_id":"222fe817a47179253cc389a8b87b320bc3a3e8c7"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b7c2ec8893f9dec99c9e80b8a6b237b74ffe31dc","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        for field in field_names:"},{"line_number":140,"context_line":"            self.assertIn(field, table_headers)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def _try_delete_node(self, node_id):"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        node_list \u003d self.list_nodes()"},{"line_number":145,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"da85f559_f6f8bac6","line":142,"updated":"2015-11-13 12:45:33.000000000","message":"I see this method used in tests, so I think it\u0027s worth making it public (i.e. remove _ from the name)","commit_id":"222fe817a47179253cc389a8b87b320bc3a3e8c7"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b7c2ec8893f9dec99c9e80b8a6b237b74ffe31dc","unresolved":false,"context_lines":[{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        if self.get_object(node_list, node_id):"},{"line_number":147,"context_line":"            node_show \u003d self.show_node(node_id)"},{"line_number":148,"context_line":"            if node_show[\u0027provision_state\u0027] !\u003d \u0027available\u0027:"},{"line_number":149,"context_line":"                self.ironic(\u0027node-set-provision-state\u0027,"},{"line_number":150,"context_line":"                            params\u003d\u0027{0} deleted\u0027.format(node_id))"},{"line_number":151,"context_line":"            if node_show[\u0027power_state\u0027] not in (\u0027None\u0027, \u0027off\u0027):"}],"source_content_type":"text/x-python","patch_set":27,"id":"da85f559_9cd4ed47","line":148,"updated":"2015-11-13 12:45:33.000000000","message":"This will work only with fake driver, might be worth adding a docstring to this method that clarifies it.","commit_id":"222fe817a47179253cc389a8b87b320bc3a3e8c7"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b7c2ec8893f9dec99c9e80b8a6b237b74ffe31dc","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        self.addCleanup(self._try_delete_node, node[\u0027uuid\u0027])"},{"line_number":192,"context_line":"        return node"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def show_node(self, params):"},{"line_number":195,"context_line":"        node_show \u003d self.ironic(\u0027node-show\u0027, params\u003dparams)"},{"line_number":196,"context_line":"        return self.get_dict_from_output(node_show)"},{"line_number":197,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"da85f559_d6c49660","line":194,"updated":"2015-11-13 12:45:33.000000000","message":"For consistency, might be worth adding node_id as a separate parameter here so as not to construct params string manually in tests.","commit_id":"222fe817a47179253cc389a8b87b320bc3a3e8c7"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b1464b85d55e35e44e78370f4974784f9c886ae5","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        self.assertEqual(sorted(field_names), sorted(table_headers))"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    @staticmethod"},{"line_number":142,"context_line":"    def get_dict_from_output(output):"},{"line_number":143,"context_line":"        \"\"\"Create a dictionary from an output"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        :param output: the output of the cmd"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba8a016a_813fbd24","line":142,"updated":"2015-11-16 13:58:15.000000000","message":"This would be better to move to a separate module, smth like utils.","commit_id":"1777626523b9a0eb874dafa287345f1ac3283d1e"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b1464b85d55e35e44e78370f4974784f9c886ae5","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        return obj"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    @staticmethod"},{"line_number":153,"context_line":"    def get_object(object_list, object_value):"},{"line_number":154,"context_line":"        \"\"\"\"Get Ironic object by value from list of Ironic objects."},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        :param object_list: the output of the cmd"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba8a016a_e11009ab","line":153,"updated":"2015-11-16 13:58:15.000000000","message":"ditto","commit_id":"1777626523b9a0eb874dafa287345f1ac3283d1e"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b1464b85d55e35e44e78370f4974784f9c886ae5","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        return [x[\u0027UUID\u0027] for x in node_list]"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    @staticmethod"},{"line_number":214,"context_line":"    def generate_name(prefix):"},{"line_number":215,"context_line":"        \"\"\"Generate name for objects.\"\"\""},{"line_number":216,"context_line":"        suffix \u003d uuid.uuid4().hex[:4]"},{"line_number":217,"context_line":"        return \"{0}-{1}\".format(prefix, suffix)"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba8a016a_a123e104","line":214,"updated":"2015-11-16 13:58:15.000000000","message":"ditto","commit_id":"1777626523b9a0eb874dafa287345f1ac3283d1e"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b8659b1f6177132f26d33e71aedecfda0f3be817","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import os"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import ironicclient.tests.functional.utils as utils"},{"line_number":16,"context_line":"import six.moves.configparser as config_parser"},{"line_number":17,"context_line":"from tempest_lib.cli import base"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"ba8a016a_5e11fd5b","line":15,"updated":"2015-11-19 11:50:26.000000000","message":"This should be in a separate group of imports: \n\n import os\n\n import six.moves.configparser as config_parser\n from tempest_lib.cli import base\n\n import ironicclient.tests.functional.utils as utils","commit_id":"7c480697f593f08f9bbfca4735ae43a2e0fcaa64"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b8659b1f6177132f26d33e71aedecfda0f3be817","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        self.assertEqual(sorted(field_names), sorted(table_headers))"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def assertNodeStates(self, node_show, node_show_states):"},{"line_number":140,"context_line":"        \"\"\"Verify that states of node conform to actual."},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        :param node_show: output from node-show cmd"},{"line_number":143,"context_line":"        :param node_show_states: output from node-show-states cmd"}],"source_content_type":"text/x-python","patch_set":33,"id":"ba8a016a_bed90959","line":140,"updated":"2015-11-19 11:50:26.000000000","message":"... returned by node-show and node-show-states are the same.","commit_id":"7c480697f593f08f9bbfca4735ae43a2e0fcaa64"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b8659b1f6177132f26d33e71aedecfda0f3be817","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        :param node_show_states: output from node-show-states cmd"},{"line_number":144,"context_line":"        \"\"\""},{"line_number":145,"context_line":"        for key in node_show_states.keys():"},{"line_number":146,"context_line":"            if key in node_show:"},{"line_number":147,"context_line":"                self.assertEqual(node_show_states[key], node_show[key])"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def delete_node(self, node_id):"}],"source_content_type":"text/x-python","patch_set":33,"id":"ba8a016a_deac0d8e","line":146,"updated":"2015-11-19 11:50:26.000000000","message":"There is no need in this if, everything in node-show-states should be in node-show output.","commit_id":"7c480697f593f08f9bbfca4735ae43a2e0fcaa64"},{"author":{"_account_id":7227,"name":"Timur Nurlygayanov","email":"tnurlygayanov@mirantis.com","username":"tnurlygayanov"},"change_message_id":"38ccbf0a5c9e9d638f943ef02402b86016fcc94a","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        node \u003d self.ironic(\u0027node-create\u0027, params\u003dparams)"},{"line_number":176,"context_line":"        node \u003d utils.get_dict_from_output(node)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        if not node.get(\u0027uuid\u0027):"},{"line_number":179,"context_line":"            self.fail(\u0027Ironic node has not been created!\u0027)"},{"line_number":180,"context_line":"        self.addCleanup(self.delete_node, node[\u0027uuid\u0027])"},{"line_number":181,"context_line":"        return node"}],"source_content_type":"text/x-python","patch_set":38,"id":"ba8a016a_1051d90e","line":178,"updated":"2015-11-20 13:45:56.000000000","message":"It is better to use \n\nif node.get(\u0027uuid\u0027) is None\n\nhere.","commit_id":"1e396683b12aafcf6afc161b4eae1f202b1f12db"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"88e1d307a371e43a8333bd54efe1f0f240badf42","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        else:"},{"line_number":123,"context_line":"            return self.client.cmd_with_auth(\u0027ironic\u0027, action, flags, params)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def ironic(self, action, flags\u003d\u0027\u0027, params\u003d\u0027\u0027):"},{"line_number":126,"context_line":"        output \u003d self._ironic(action\u003daction, flags\u003dflags, params\u003dparams)"},{"line_number":127,"context_line":"        return self.parser.listing(output)"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_0838943c","line":125,"updated":"2015-11-23 13:45:37.000000000","message":"Please, add doc string here","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4e10b9fb926eb8bff720c21107af9304521d0f67","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        self.assertEqual(sorted(field_names), sorted(table_headers))"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def assertNodeStates(self, node_show, node_show_states):"},{"line_number":143,"context_line":"        \"\"\"Verify that returned by node-show and node-show-states are the same."},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        :param node_show: output from node-show cmd"},{"line_number":146,"context_line":"        :param node_show_states: output from node-show-states cmd"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_ff8096f9","line":143,"updated":"2015-11-20 18:12:30.000000000","message":"nit - verify that _states_ returned by...","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"52fd8d09a05607c439bcbae6cfd4b9e140d21e90","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                          .format(node_id))"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def create_node(self, params\u003d\u0027\u0027):"},{"line_number":175,"context_line":"        if not any(dr in params for dr in (\u0027--driver\u0027, \u0027-d\u0027)):"},{"line_number":176,"context_line":"            params +\u003d \u0027--driver fake\u0027"},{"line_number":177,"context_line":"        node \u003d self.ironic(\u0027node-create\u0027, params\u003dparams)"},{"line_number":178,"context_line":"        node \u003d utils.get_dict_from_output(node)"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_43c3d657","line":175,"updated":"2015-11-23 13:39:07.000000000","message":"After looking at the port patch, could you also update this function to add new driver parameter to function (with \u0027fake\u0027 as default) so as to not look for it inside params?","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"afc8bf9ec9b42bd20763fcdc441aac86fe54165d","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        self.assertEqual(sorted(field_names), sorted(table_headers))"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def assertNodeStates(self, node_show, node_show_states):"},{"line_number":152,"context_line":"        \"\"\"Verify that states returned by node-show and node-show-states"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        are the same."},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"ba8a016a_0fcdc184","line":152,"updated":"2015-11-24 10:05:04.000000000","message":"This is not done like that :) You should come up with one-line description that will go here, and describe details further inside the docstring. ditto for other docstrings.","commit_id":"ceec02bbdf4ee745ff50b198f981a2df22c30d58"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"afc8bf9ec9b42bd20763fcdc441aac86fe54165d","unresolved":false,"context_lines":[{"line_number":163,"context_line":"    def assertNodeValidate(self, node_validate):"},{"line_number":164,"context_line":"        \"\"\"Verify that states returned by node-validate results"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        are equals True."},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        :param node_validate: output from node-validate cmd"},{"line_number":169,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":44,"id":"ba8a016a_0f53816c","line":166,"updated":"2015-11-24 10:05:04.000000000","message":"You check here that they are not False, another possible value is None which means interface is not defined. It may be ok like this but please update the docstring.","commit_id":"ceec02bbdf4ee745ff50b198f981a2df22c30d58"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"afc8bf9ec9b42bd20763fcdc441aac86fe54165d","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                self.fail(\u0027Ironic node {0} has not been deleted!\u0027"},{"line_number":192,"context_line":"                          .format(node_id))"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def create_node(self, params\u003d\u0027--driver fake\u0027):"},{"line_number":195,"context_line":"        node \u003d self.ironic(\u0027node-create\u0027, params\u003dparams)"},{"line_number":196,"context_line":"        node \u003d utils.get_dict_from_output(node)"},{"line_number":197,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"ba8a016a_2f3e858b","line":194,"updated":"2015-11-24 10:05:04.000000000","message":"Actually what I meant here was:\n\n def create_node(self, driver\u003d\u0027fake\u0027, params\u003d\u0027\u0027):\n     node \u003d self.ironic(\u0027node-create\u0027, params\u003d\u0027--driver {0} {1}\u0027.format(driver, params))\n     ...","commit_id":"ceec02bbdf4ee745ff50b198f981a2df22c30d58"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"afc8bf9ec9b42bd20763fcdc441aac86fe54165d","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        node_list \u003d self.list_nodes()"},{"line_number":218,"context_line":"        return [x[\u0027UUID\u0027] for x in node_list]"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def show_node_states(self, node_id, params\u003d\u0027\u0027):"},{"line_number":221,"context_line":"        show_node_states \u003d self.ironic("},{"line_number":222,"context_line":"            \u0027node-show-states\u0027, params\u003d\u0027{0} {1}\u0027.format(node_id, params))"},{"line_number":223,"context_line":"        return utils.get_dict_from_output(show_node_states)"}],"source_content_type":"text/x-python","patch_set":44,"id":"ba8a016a_3a1d6162","line":220,"updated":"2015-11-24 10:05:04.000000000","message":"also no params needed as the only argument is node_id.","commit_id":"ceec02bbdf4ee745ff50b198f981a2df22c30d58"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"afc8bf9ec9b42bd20763fcdc441aac86fe54165d","unresolved":false,"context_lines":[{"line_number":222,"context_line":"            \u0027node-show-states\u0027, params\u003d\u0027{0} {1}\u0027.format(node_id, params))"},{"line_number":223,"context_line":"        return utils.get_dict_from_output(show_node_states)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    def set_node_maintenance(self, node_id, params):"},{"line_number":226,"context_line":"        self.ironic(\u0027node-set-maintenance\u0027,"},{"line_number":227,"context_line":"                    params\u003d\u0027{0} {1}\u0027.format(node_id, params))"},{"line_number":228,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"ba8a016a_8ff4515b","line":225,"updated":"2015-11-24 10:05:04.000000000","message":"++ good stuff :) But as in other places, please add required things as argument to function, this makes code clearer I think. Here maintenance_mode is required.\n\n def set_node_maintenance(self, node_id, maintenance_mode, params\u003d\u0027\u0027):\n     ...","commit_id":"ceec02bbdf4ee745ff50b198f981a2df22c30d58"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"afc8bf9ec9b42bd20763fcdc441aac86fe54165d","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        self.ironic(\u0027node-set-maintenance\u0027,"},{"line_number":227,"context_line":"                    params\u003d\u0027{0} {1}\u0027.format(node_id, params))"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def set_node_power_state(self, node_id, params):"},{"line_number":230,"context_line":"        self.ironic(\u0027node-set-power-state\u0027,"},{"line_number":231,"context_line":"                    params\u003d\u0027{0} {1}\u0027.format(node_id, params))"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"ba8a016a_7a00c901","line":229,"updated":"2015-11-24 10:05:04.000000000","message":"The only thing apart from node_id that is required is power state to set, so I\u0027d suggest:\n\n def set_node_power_state(self, node_id, power_state):\n     ...","commit_id":"ceec02bbdf4ee745ff50b198f981a2df22c30d58"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"afc8bf9ec9b42bd20763fcdc441aac86fe54165d","unresolved":false,"context_lines":[{"line_number":230,"context_line":"        self.ironic(\u0027node-set-power-state\u0027,"},{"line_number":231,"context_line":"                    params\u003d\u0027{0} {1}\u0027.format(node_id, params))"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    def set_node_provision_state(self, node_id, params):"},{"line_number":234,"context_line":"        self.ironic(\u0027node-set-provision-state\u0027,"},{"line_number":235,"context_line":"                    params\u003d\u0027{0} {1}\u0027.format(node_id, params))"},{"line_number":236,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"ba8a016a_1a95fd85","line":233,"updated":"2015-11-24 10:05:04.000000000","message":"ditto please add provision_state as an argument\n\n def set_node_provision_state(self, node_id, provision_state, params\u003d\u0027\u0027):\n     ...","commit_id":"ceec02bbdf4ee745ff50b198f981a2df22c30d58"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"afc8bf9ec9b42bd20763fcdc441aac86fe54165d","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        self.ironic(\u0027node-set-provision-state\u0027,"},{"line_number":235,"context_line":"                    params\u003d\u0027{0} {1}\u0027.format(node_id, params))"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def validate_node(self, node_id, params\u003d\u0027\u0027):"},{"line_number":238,"context_line":"        return self.ironic(\u0027node-validate\u0027,"},{"line_number":239,"context_line":"                           params\u003d\u0027{0} {1}\u0027.format(node_id, params))"}],"source_content_type":"text/x-python","patch_set":44,"id":"ba8a016a_0f5dc146","line":237,"updated":"2015-11-24 10:05:04.000000000","message":"No need for params, node_id is the only argument for node-validate.","commit_id":"ceec02bbdf4ee745ff50b198f981a2df22c30d58"},{"author":{"_account_id":14810,"name":"Kan","email":"sofaopenstack@gmail.com","username":"Kan"},"change_message_id":"8a37ce74037667971b169d6e3871d5ddafe8395b","unresolved":false,"context_lines":[{"line_number":194,"context_line":"    def create_node(self, driver\u003d\u0027fake\u0027, params\u003d\u0027\u0027):"},{"line_number":195,"context_line":"        node \u003d self.ironic(\u0027node-create\u0027,"},{"line_number":196,"context_line":"                           params\u003d\u0027--driver {0} {1}\u0027.format(driver, params))"},{"line_number":197,"context_line":"        node \u003d utils.get_dict_from_output(node)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        if not node.get(\u0027uuid\u0027):"},{"line_number":200,"context_line":"            self.fail(\u0027Ironic node has not been created!\u0027)"}],"source_content_type":"text/x-python","patch_set":46,"id":"9a8ffd7b_8609ee2e","line":197,"updated":"2015-11-25 05:07:33.000000000","message":"Got inspiration from your chassis patch: Error might happen when creating node, please change this the same way as commented in your chassis patch.","commit_id":"2ba9d05939ce230e139928ec5fcb92f66e06fe88"}],"ironicclient/tests/functional/test_ironicclient.py":[{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"0aa3ff1cbcd4e075aa609a0e9e0ffe9f09d28429","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        \"\"\""},{"line_number":29,"context_line":"        node \u003d self.create_node()"},{"line_number":30,"context_line":"        self.assertIn(node[\u0027uuid\u0027], self.get_nodes_uuids_from_node_list())"},{"line_number":31,"context_line":"        self._try_delete_node(node[\u0027uuid\u0027])"},{"line_number":32,"context_line":"        self.assertNotIn(node[\u0027uuid\u0027], self.get_nodes_uuids_from_node_list())"}],"source_content_type":"text/x-python","patch_set":23,"id":"da85f559_320c8aec","line":31,"updated":"2015-11-11 13:23:26.000000000","message":"why do you need try_delete_node here, looks like you check above that node has been created?","commit_id":"9d5ea6d098d4f7f35de8af092d9f3a23fdfda173"},{"author":{"_account_id":9068,"name":"Yuriy Yekovenko","email":"yyekovenko@mirantis.com","username":"yyekovenko"},"change_message_id":"0f73c99aafa22f14a7c37036fa6c893993c89f5e","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class TestIronicClient(base.FunctionalTestBase):"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    def test_node_create_get_delete(self):"},{"line_number":22,"context_line":"        \"\"\"Test scenario:"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"            1) create node"}],"source_content_type":"text/x-python","patch_set":27,"id":"da85f559_6d05da12","line":21,"updated":"2015-11-13 11:05:11.000000000","message":"Looks like this test duplicates the test from test_node module.","commit_id":"222fe817a47179253cc389a8b87b320bc3a3e8c7"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b7c2ec8893f9dec99c9e80b8a6b237b74ffe31dc","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class TestIronicClient(base.FunctionalTestBase):"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    def test_node_create_get_delete(self):"},{"line_number":22,"context_line":"        \"\"\"Test scenario:"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"            1) create node"}],"source_content_type":"text/x-python","patch_set":27,"id":"da85f559_7c81094d","line":21,"in_reply_to":"da85f559_6d05da12","updated":"2015-11-13 12:45:33.000000000","message":"++ Now this file can be removed.","commit_id":"222fe817a47179253cc389a8b87b320bc3a3e8c7"}],"ironicclient/tests/functional/test_node.py":[{"author":{"_account_id":14810,"name":"Kan","email":"sofaopenstack@gmail.com","username":"Kan"},"change_message_id":"02ce934ce61d2019ab4c6988a3d00344480dc43f","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        2) delete node"},{"line_number":47,"context_line":"        3) check that node has been successfully deleted"},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":"        node \u003d self.create_node()"},{"line_number":50,"context_line":"        self._try_delete_node(node[\u0027uuid\u0027])"},{"line_number":51,"context_line":"        self.assertNotIn(node[\u0027uuid\u0027], self.get_nodes_uuids_from_node_list())"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"da85f559_e2332661","line":49,"updated":"2015-11-13 04:05:55.000000000","message":"Still have concern here, I think checking the created node is existed firstly here to compare the result before and after deleting node, may be more suitable. The simple check can just add a assert like:\n\nself.assertIn(node[\u0027uuid\u0027], self.get_nodes_uuids_from_node_list())","commit_id":"433d1b08d4e1f76ea148eba40c39a6fe44a7c01c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b7c2ec8893f9dec99c9e80b8a6b237b74ffe31dc","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        3) check that node name has been successfully updated"},{"line_number":60,"context_line":"        \"\"\""},{"line_number":61,"context_line":"        node \u003d self.create_node()"},{"line_number":62,"context_line":"        updated_node \u003d self.update_node(node[\u0027uuid\u0027], \u0027add name\u003dtestnode\u0027)"},{"line_number":63,"context_line":"        self.assertNotEqual(node[\u0027name\u0027], updated_node[\u0027name\u0027])"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_node_set_console_mode(self):"}],"source_content_type":"text/x-python","patch_set":27,"id":"da85f559_a17d0ae9","line":62,"updated":"2015-11-13 12:45:33.000000000","message":"You should generate some random name here, as names are unique and this test may result in conflict.","commit_id":"222fe817a47179253cc389a8b87b320bc3a3e8c7"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b7c2ec8893f9dec99c9e80b8a6b237b74ffe31dc","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        \"\"\""},{"line_number":61,"context_line":"        node \u003d self.create_node()"},{"line_number":62,"context_line":"        updated_node \u003d self.update_node(node[\u0027uuid\u0027], \u0027add name\u003dtestnode\u0027)"},{"line_number":63,"context_line":"        self.assertNotEqual(node[\u0027name\u0027], updated_node[\u0027name\u0027])"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_node_set_console_mode(self):"},{"line_number":66,"context_line":"        \"\"\"Test scenario:"}],"source_content_type":"text/x-python","patch_set":27,"id":"da85f559_e1731214","line":63,"updated":"2015-11-13 12:45:33.000000000","message":"Also worth asserting that new value is equal to requested one.","commit_id":"222fe817a47179253cc389a8b87b320bc3a3e8c7"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b7c2ec8893f9dec99c9e80b8a6b237b74ffe31dc","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        \"\"\""},{"line_number":163,"context_line":"        node \u003d self.create_node()"},{"line_number":164,"context_line":"        node_validate \u003d self.ironic(\u0027node-validate\u0027, params\u003dnode[\u0027uuid\u0027])"},{"line_number":165,"context_line":"        validate_result \u003d [x[\u0027Result\u0027] for x in node_validate]"},{"line_number":166,"context_line":"        self.assertNotIn(\u0027False\u0027, validate_result)"}],"source_content_type":"text/x-python","patch_set":27,"id":"da85f559_9c786d91","line":165,"updated":"2015-11-13 12:45:33.000000000","message":"None is also a possible value in the result, so I\u0027d suggest self.asertIs(True, all(validate_result))","commit_id":"222fe817a47179253cc389a8b87b320bc3a3e8c7"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"2d8547dc1fc8acddc6d49a31ea6e89899ef246c3","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        3) check that node name has been successfully updated"},{"line_number":60,"context_line":"        \"\"\""},{"line_number":61,"context_line":"        node \u003d self.create_node()"},{"line_number":62,"context_line":"        updated_node \u003d self.update_node(node[\u0027uuid\u0027], \u0027add name\u003dtestnode\u0027)"},{"line_number":63,"context_line":"        self.assertNotEqual(node[\u0027name\u0027], updated_node[\u0027name\u0027])"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_node_set_console_mode(self):"}],"source_content_type":"text/x-python","patch_set":28,"id":"da85f559_b549b690","line":62,"updated":"2015-11-13 17:50:12.000000000","message":"Please check my comments on this test from previous patchset.","commit_id":"1679e455037c7690040af56e40ea1698c1556ba7"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b1464b85d55e35e44e78370f4974784f9c886ae5","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        node_name \u003d self.generate_name(\u0027test\u0027)"},{"line_number":63,"context_line":"        updated_node \u003d self.update_node(node[\u0027uuid\u0027],"},{"line_number":64,"context_line":"                                        \u0027add name\u003d{0}\u0027.format(node_name))"},{"line_number":65,"context_line":"        self.assertEqual(updated_node[\u0027name\u0027], node_name)"},{"line_number":66,"context_line":"        self.assertNotEqual(node[\u0027name\u0027], updated_node[\u0027name\u0027])"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def test_node_set_console_mode(self):"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba8a016a_4676cb3f","line":65,"updated":"2015-11-16 13:58:15.000000000","message":"expected value should be the first argument in assertEqual, please check all other places too.","commit_id":"1777626523b9a0eb874dafa287345f1ac3283d1e"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b1464b85d55e35e44e78370f4974784f9c886ae5","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        self.assertEqual(node_show[\u0027maintenance\u0027], \u0027False\u0027)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        self.ironic(\u0027node-set-maintenance\u0027,"},{"line_number":117,"context_line":"                    params\u003d\u0027{0} true\u0027.format(node[\u0027uuid\u0027]))"},{"line_number":118,"context_line":"        node_show \u003d self.show_node(node[\u0027uuid\u0027])"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        self.assertEqual(node_show[\u0027maintenance\u0027], \u0027True\u0027)"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba8a016a_e6b49fd2","line":117,"updated":"2015-11-16 13:58:15.000000000","message":"Would be nice to also test reason here (i.e. adding --reason \u0027some message\u0027) and assert that it was set too.","commit_id":"1777626523b9a0eb874dafa287345f1ac3283d1e"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b8659b1f6177132f26d33e71aedecfda0f3be817","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        \"\"\"Test scenario:"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        1) create node"},{"line_number":38,"context_line":"        2) check that node values exist in node-show object"},{"line_number":39,"context_line":"        \"\"\""},{"line_number":40,"context_line":"        node \u003d self.create_node()"},{"line_number":41,"context_line":"        node_show \u003d self.show_node(node[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":33,"id":"ba8a016a_9ebf6560","line":38,"updated":"2015-11-19 11:50:26.000000000","message":"check that created node UUID equals to the one present in node-show output","commit_id":"7c480697f593f08f9bbfca4735ae43a2e0fcaa64"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b8659b1f6177132f26d33e71aedecfda0f3be817","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    def test_node_delete(self):"},{"line_number":45,"context_line":"        \"\"\"Test scenario:"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        1) create node"},{"line_number":48,"context_line":"        2) delete node"},{"line_number":49,"context_line":"        3) check that node has been successfully deleted"},{"line_number":50,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":33,"id":"ba8a016a_5e59fd8c","line":47,"updated":"2015-11-19 11:50:26.000000000","message":"2) check that it was created.","commit_id":"7c480697f593f08f9bbfca4735ae43a2e0fcaa64"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b8659b1f6177132f26d33e71aedecfda0f3be817","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        1) create node"},{"line_number":93,"context_line":"        2) check console mode using node-show"},{"line_number":94,"context_line":"        3) get console mode node-get-console"},{"line_number":95,"context_line":"        4) check that node-get-console value equals node-show value"},{"line_number":96,"context_line":"        \"\"\""},{"line_number":97,"context_line":"        node \u003d self.create_node()"}],"source_content_type":"text/x-python","patch_set":33,"id":"ba8a016a_5e0b3d7d","line":94,"updated":"2015-11-19 11:50:26.000000000","message":"console mode using node-get-console","commit_id":"7c480697f593f08f9bbfca4735ae43a2e0fcaa64"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b8659b1f6177132f26d33e71aedecfda0f3be817","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        \"\"\"Test scenario:"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        1) create node"},{"line_number":177,"context_line":"        2) check that node-states of node conform to actual"},{"line_number":178,"context_line":"        \"\"\""},{"line_number":179,"context_line":"        node \u003d self.create_node()"},{"line_number":180,"context_line":"        node_show \u003d self.show_node(node[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":33,"id":"ba8a016a_9e076581","line":177,"updated":"2015-11-19 11:50:26.000000000","message":"ditto as in base class docstring.","commit_id":"7c480697f593f08f9bbfca4735ae43a2e0fcaa64"},{"author":{"_account_id":7227,"name":"Timur Nurlygayanov","email":"tnurlygayanov@mirantis.com","username":"tnurlygayanov"},"change_message_id":"38ccbf0a5c9e9d638f943ef02402b86016fcc94a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":38,"id":"ba8a016a_10ed5925","line":1,"updated":"2015-11-20 13:45:56.000000000","message":"If you created this file and it is create by youself, without copy-paste from other files, please, add Mirantis (c) here, like\n\n# Copyright 2015 Mirantis, Inc.\n\nexample: \n\nhttps://review.openstack.org/#/c/187577/18/murano-ci/scripts/start_gate.sh,unified","commit_id":"1e396683b12aafcf6afc161b4eae1f202b1f12db"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4e10b9fb926eb8bff720c21107af9304521d0f67","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import ironicclient.tests.functional.utils as utils"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from ironicclient.tests.functional import base"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class NodeSanityTestIronicClient(base.FunctionalTestBase):"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_dfc6f248","line":17,"updated":"2015-11-20 18:12:30.000000000","message":"These imports should be in the same group (no need for empty line between them)","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"66a73615c5a30704d0514e57525d02f7f4123bc1","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    \"\"\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def test_node_create(self):"},{"line_number":28,"context_line":"        \"\"\"Test scenario:"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        1) create node"},{"line_number":31,"context_line":"        2) check that node has been successfully created"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_56cf3db3","line":28,"updated":"2015-11-21 02:57:11.000000000","message":"s/scenario/steps?","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"66a73615c5a30704d0514e57525d02f7f4123bc1","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \"\"\""},{"line_number":43,"context_line":"        node \u003d self.create_node()"},{"line_number":44,"context_line":"        node_show \u003d self.show_node(node[\u0027uuid\u0027])"},{"line_number":45,"context_line":"        self.assertEqual(node_show[\u0027uuid\u0027], node[\u0027uuid\u0027])"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def test_node_delete(self):"},{"line_number":48,"context_line":"        \"\"\"Test scenario:"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_f6d99184","line":45,"updated":"2015-11-21 02:57:11.000000000","message":"The first param of assertEqual should be the expected value:\n\n    self.assertEqual(node_show[\u0027uuid\u0027], node[\u0027uuid\u0027])","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"88e1d307a371e43a8333bd54efe1f0f240badf42","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        2) update node name"},{"line_number":65,"context_line":"        3) check that node name has been successfully updated"},{"line_number":66,"context_line":"        \"\"\""},{"line_number":67,"context_line":"        node \u003d self.create_node()"},{"line_number":68,"context_line":"        node_name \u003d utils.generate_name(\u0027test\u0027)"},{"line_number":69,"context_line":"        updated_node \u003d self.update_node(node[\u0027uuid\u0027],"},{"line_number":70,"context_line":"                                        \u0027add name\u003d{0}\u0027.format(node_name))"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_a0b5d87e","line":67,"updated":"2015-11-23 13:45:37.000000000","message":"imo it would be better to create node with some name, otherwise assert  \n\nself.assertNotEqual(updated_node[\u0027name\u0027], node[\u0027name\u0027]) isn\u0027t useful","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"66a73615c5a30704d0514e57525d02f7f4123bc1","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        updated_node \u003d self.update_node(node[\u0027uuid\u0027],"},{"line_number":70,"context_line":"                                        \u0027add name\u003d{0}\u0027.format(node_name))"},{"line_number":71,"context_line":"        self.assertEqual(updated_node[\u0027name\u0027], node_name)"},{"line_number":72,"context_line":"        self.assertNotEqual(updated_node[\u0027name\u0027], node[\u0027name\u0027])"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def test_node_set_console_mode(self):"},{"line_number":75,"context_line":"        \"\"\"Test scenario:"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_36ce39b5","line":72,"updated":"2015-11-21 02:57:11.000000000","message":"ditto","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"66a73615c5a30704d0514e57525d02f7f4123bc1","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        node_get \u003d utils.get_dict_from_output(node_get)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        self.assertEqual(node_get[\u0027console_enabled\u0027],"},{"line_number":107,"context_line":"                         node_show[\u0027console_enabled\u0027])"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def test_node_set_maintenance(self):"},{"line_number":110,"context_line":"        \"\"\"Test scenario:"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_1640d506","line":107,"updated":"2015-11-21 02:57:11.000000000","message":"ditto","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4e10b9fb926eb8bff720c21107af9304521d0f67","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        1) create node"},{"line_number":113,"context_line":"        2) check that maintenance is False"},{"line_number":114,"context_line":"        3) enable maintenance"},{"line_number":115,"context_line":"        4) check that maintenance is successfully enabled"},{"line_number":116,"context_line":"        \"\"\""},{"line_number":117,"context_line":"        node \u003d self.create_node()"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_ff33b660","line":114,"updated":"2015-11-20 18:12:30.000000000","message":"nit - put node to maintenance","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4e10b9fb926eb8bff720c21107af9304521d0f67","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        1) create node"},{"line_number":113,"context_line":"        2) check that maintenance is False"},{"line_number":114,"context_line":"        3) enable maintenance"},{"line_number":115,"context_line":"        4) check that maintenance is successfully enabled"},{"line_number":116,"context_line":"        \"\"\""},{"line_number":117,"context_line":"        node \u003d self.create_node()"},{"line_number":118,"context_line":"        node_show \u003d self.show_node(node[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_bf3e8e27","line":115,"updated":"2015-11-20 18:12:30.000000000","message":"check that node is in maintenance","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"aadbf267cfe36391089e51fa6068dc382798248d","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        self.assertEqual(\u0027False\u0027, node_show[\u0027maintenance\u0027])"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        self.ironic(\u0027node-set-maintenance\u0027,"},{"line_number":123,"context_line":"                    params\u003d\u0027{0} true\u0027.format(node[\u0027uuid\u0027]))"},{"line_number":124,"context_line":"        node_show \u003d self.show_node(node[\u0027uuid\u0027])"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        self.assertEqual(\u0027True\u0027, node_show[\u0027maintenance\u0027])"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_3d2aa6e8","line":123,"updated":"2015-11-20 18:54:51.000000000","message":"Oh, actually there is still one issue - I think I mentioned previously to add maintenance reason to this test, please fix it.","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4e10b9fb926eb8bff720c21107af9304521d0f67","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        1) create node"},{"line_number":132,"context_line":"        2) check that power state is None"},{"line_number":133,"context_line":"        3) set power state to On"},{"line_number":134,"context_line":"        4) check that power state is successfully changed"},{"line_number":135,"context_line":"        \"\"\""},{"line_number":136,"context_line":"        node \u003d self.create_node()"},{"line_number":137,"context_line":"        node_show \u003d self.show_node(node[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_ff8176c4","line":134,"updated":"2015-11-20 18:12:30.000000000","message":"nit - ...power state has changed successfully.","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4e10b9fb926eb8bff720c21107af9304521d0f67","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        1) create node"},{"line_number":151,"context_line":"        2) check that provision state is \u0027available\u0027"},{"line_number":152,"context_line":"        3) set new provision state to the node"},{"line_number":153,"context_line":"        4) check that provision state is successfully updated"},{"line_number":154,"context_line":"        \"\"\""},{"line_number":155,"context_line":"        node \u003d self.create_node()"},{"line_number":156,"context_line":"        node_show \u003d self.show_node(node[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_7f4d86c3","line":153,"updated":"2015-11-20 18:12:30.000000000","message":"...has been updated successfully","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"88e1d307a371e43a8333bd54efe1f0f240badf42","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        \"\"\""},{"line_number":172,"context_line":"        node \u003d self.create_node()"},{"line_number":173,"context_line":"        node_validate \u003d self.ironic(\u0027node-validate\u0027, params\u003dnode[\u0027uuid\u0027])"},{"line_number":174,"context_line":"        validate_result \u003d [x[\u0027Result\u0027] for x in node_validate]"},{"line_number":175,"context_line":"        self.assertIs(True, all(validate_result))"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def test_show_node_states(self):"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_234ed2c1","line":174,"updated":"2015-11-23 13:45:37.000000000","message":"Looks like validate_result is list of bool\u0027s string representation , so it would be always true, please correct me if I\u0027m wrong","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b5eeeae25da7d236dbfbfee3778b28e2843bbeb6","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        \"\"\""},{"line_number":172,"context_line":"        node \u003d self.create_node()"},{"line_number":173,"context_line":"        node_validate \u003d self.ironic(\u0027node-validate\u0027, params\u003dnode[\u0027uuid\u0027])"},{"line_number":174,"context_line":"        validate_result \u003d [x[\u0027Result\u0027] for x in node_validate]"},{"line_number":175,"context_line":"        self.assertIs(True, all(validate_result))"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def test_show_node_states(self):"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_ceb92dee","line":174,"in_reply_to":"ba8a016a_234ed2c1","updated":"2015-11-23 13:55:47.000000000","message":"++ good catch.","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"88e1d307a371e43a8333bd54efe1f0f240badf42","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        node \u003d self.create_node()"},{"line_number":173,"context_line":"        node_validate \u003d self.ironic(\u0027node-validate\u0027, params\u003dnode[\u0027uuid\u0027])"},{"line_number":174,"context_line":"        validate_result \u003d [x[\u0027Result\u0027] for x in node_validate]"},{"line_number":175,"context_line":"        self.assertIs(True, all(validate_result))"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def test_show_node_states(self):"},{"line_number":178,"context_line":"        \"\"\"Test scenario:"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_23c81274","line":175,"updated":"2015-11-23 13:45:37.000000000","message":"assertTrue","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b5eeeae25da7d236dbfbfee3778b28e2843bbeb6","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        node \u003d self.create_node()"},{"line_number":173,"context_line":"        node_validate \u003d self.ironic(\u0027node-validate\u0027, params\u003dnode[\u0027uuid\u0027])"},{"line_number":174,"context_line":"        validate_result \u003d [x[\u0027Result\u0027] for x in node_validate]"},{"line_number":175,"context_line":"        self.assertIs(True, all(validate_result))"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def test_show_node_states(self):"},{"line_number":178,"context_line":"        \"\"\"Test scenario:"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_ae84e90a","line":175,"in_reply_to":"ba8a016a_23c81274","updated":"2015-11-23 13:55:47.000000000","message":"I think it\u0027s better to assertIs, as assertTrue will pass with e.g. \u0027string\u0027 or 1 as an argument, but here it does not matter much as all() returns only bool.","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4e10b9fb926eb8bff720c21107af9304521d0f67","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        \"\"\"Test scenario:"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        1) create node"},{"line_number":181,"context_line":"        2) check that returned by node-show and node-show-states are the same"},{"line_number":182,"context_line":"        \"\"\""},{"line_number":183,"context_line":"        node \u003d self.create_node()"},{"line_number":184,"context_line":"        node_show \u003d self.show_node(node[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_9fe14a9d","line":181,"updated":"2015-11-20 18:12:30.000000000","message":"..check that _states_ returned by..","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"afc8bf9ec9b42bd20763fcdc441aac86fe54165d","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    \"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def test_node_create(self):"},{"line_number":27,"context_line":"        \"\"\"Tests scenario steps:"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        1) create node"},{"line_number":30,"context_line":"        2) check that node has been successfully created"}],"source_content_type":"text/x-python","patch_set":44,"id":"ba8a016a_efcb9d51","line":27,"updated":"2015-11-24 10:05:04.000000000","message":"Haomeng meant to replace scenario with steps: \u0027Test steps:\u0027, although I\u0027m fine with either steps or scenario, but not both together :)","commit_id":"ceec02bbdf4ee745ff50b198f981a2df22c30d58"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"32c274c9b87e228d5885ca8177bdbfa7476b5544","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        1) create node"},{"line_number":30,"context_line":"        2) check that node has been successfully created"},{"line_number":31,"context_line":"        \"\"\""},{"line_number":32,"context_line":"        node \u003d self.create_node()"},{"line_number":33,"context_line":"        self.assertIn(node[\u0027uuid\u0027], self.get_nodes_uuids_from_node_list())"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_node_show(self):"}],"source_content_type":"text/x-python","patch_set":47,"id":"9a8ffd7b_c6a232fd","line":32,"updated":"2015-11-26 15:29:36.000000000","message":"This should go to setUp, then it can be removed from all methods:\n\n def setUp(self):\n     self.node \u003d self.create_node()","commit_id":"0841a2a7f787695394dfa518b2f78e14609e155c"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"085d474a2e59b06d2703f2f110a61edfc93b598e","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        4) check that node has been successfully deleted"},{"line_number":55,"context_line":"        \"\"\""},{"line_number":56,"context_line":"        self.assertIn(self.node[\u0027uuid\u0027], self.get_nodes_uuids_from_node_list())"},{"line_number":57,"context_line":"        self.delete_node(self.node[\u0027uuid\u0027])"},{"line_number":58,"context_line":"        self.assertNotIn(self.node[\u0027uuid\u0027],"},{"line_number":59,"context_line":"                         self.get_nodes_uuids_from_node_list())"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":48,"id":"9a8ffd7b_448b8b68","line":57,"updated":"2015-11-27 01:40:48.000000000","message":"nit:we support delete node with multi node as input, so can you add more code to cover the multi-node case?","commit_id":"41d0f8ff830020be37404b4d17cc2ef53f2cfac8"},{"author":{"_account_id":17270,"name":"Sergii Turivnyi","email":"sturivnyi@mirantis.com","username":"sturivnyi"},"change_message_id":"dbe7e84debf9bc98c9790cafa2572586d355d7d6","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        4) check that node has been successfully deleted"},{"line_number":55,"context_line":"        \"\"\""},{"line_number":56,"context_line":"        self.assertIn(self.node[\u0027uuid\u0027], self.get_nodes_uuids_from_node_list())"},{"line_number":57,"context_line":"        self.delete_node(self.node[\u0027uuid\u0027])"},{"line_number":58,"context_line":"        self.assertNotIn(self.node[\u0027uuid\u0027],"},{"line_number":59,"context_line":"                         self.get_nodes_uuids_from_node_list())"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":48,"id":"9a8ffd7b_4fc15253","line":57,"in_reply_to":"9a8ffd7b_448b8b68","updated":"2015-11-30 14:39:51.000000000","message":"Actually I have another patch for this:\nhttps://review.openstack.org/#/c/242464/\n`Advanced test for the Ironic CLI commands which checks actions with node command like attach port to the node, update node, delete updated node etc`.\n\nAlso link on a blueprint: https://blueprints.launchpad.net/python-ironicclient/+spec/ironic-client-advanced-functional-tests\n\nEtherpad link: https://etherpad.openstack.org/p/ironic-client-node-advanced-functional-tests where described ideas for test-cases","commit_id":"41d0f8ff830020be37404b4d17cc2ef53f2cfac8"},{"author":{"_account_id":17270,"name":"Sergii Turivnyi","email":"sturivnyi@mirantis.com","username":"sturivnyi"},"change_message_id":"79786be7def2e15d832aee159a10facba44bb7c3","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \"\"\""},{"line_number":56,"context_line":"        self.assertIn(self.node[\u0027uuid\u0027], self.get_nodes_uuids_from_node_list())"},{"line_number":57,"context_line":"        self.delete_node(self.node[\u0027uuid\u0027])"},{"line_number":58,"context_line":"        self.assertNotIn(self.node[\u0027uuid\u0027],"},{"line_number":59,"context_line":"                         self.get_nodes_uuids_from_node_list())"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def test_node_update(self):"}],"source_content_type":"text/x-python","patch_set":48,"id":"9a8ffd7b_c210675c","line":58,"updated":"2015-11-30 16:30:54.000000000","message":"I\u0027ve added new path to cover the multi-node case\nhttps://review.openstack.org/#/c/251458/","commit_id":"41d0f8ff830020be37404b4d17cc2ef53f2cfac8"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"ea6afd2e547a64978134275036e0b4b9c824614d","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \"\"\""},{"line_number":56,"context_line":"        self.assertIn(self.node[\u0027uuid\u0027], self.get_nodes_uuids_from_node_list())"},{"line_number":57,"context_line":"        self.delete_node(self.node[\u0027uuid\u0027])"},{"line_number":58,"context_line":"        self.assertNotIn(self.node[\u0027uuid\u0027],"},{"line_number":59,"context_line":"                         self.get_nodes_uuids_from_node_list())"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def test_node_update(self):"}],"source_content_type":"text/x-python","patch_set":48,"id":"9a8ffd7b_55fde16c","line":58,"in_reply_to":"9a8ffd7b_c210675c","updated":"2015-12-01 12:02:57.000000000","message":"ok, good thanks for your update.","commit_id":"41d0f8ff830020be37404b4d17cc2ef53f2cfac8"}],"ironicclient/tests/functional/test_node_ironicclient.py":[{"author":{"_account_id":14810,"name":"Kan","email":"sofaopenstack@gmail.com","username":"Kan"},"change_message_id":"cc033d72808eebaf07a452296e59397bf5b22ff2","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    def test_node_delete(self):"},{"line_number":48,"context_line":"        \"\"\"Test scenario:"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        1) create node"},{"line_number":51,"context_line":"        2) delete node"},{"line_number":52,"context_line":"        3) check that node has been successfully deleted"},{"line_number":53,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"1a26ad4f_1bd1c357","line":50,"updated":"2015-10-29 02:39:24.000000000","message":"I think we should check the created node is existed firstly, and then go on the following operations.","commit_id":"416c9b7928476a8057178c3113118c90cad5f88a"},{"author":{"_account_id":14810,"name":"Kan","email":"sofaopenstack@gmail.com","username":"Kan"},"change_message_id":"cc033d72808eebaf07a452296e59397bf5b22ff2","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    def test_node_update(self):"},{"line_number":61,"context_line":"        \"\"\"Test scenario:"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        1) create node"},{"line_number":64,"context_line":"        2) update node name"},{"line_number":65,"context_line":"        3) check that node name has been successfully updated"},{"line_number":66,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"1a26ad4f_5bbf3bfb","line":63,"updated":"2015-10-29 02:39:24.000000000","message":"I think we should check the created node is existed with the previous name firstly, and then go on the following operations.","commit_id":"416c9b7928476a8057178c3113118c90cad5f88a"},{"author":{"_account_id":9068,"name":"Yuriy Yekovenko","email":"yyekovenko@mirantis.com","username":"yyekovenko"},"change_message_id":"74507b34e532b00a323da10ee5112ed5a124b709","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        \"\"\""},{"line_number":54,"context_line":"        node \u003d self.create_node()"},{"line_number":55,"context_line":"        self._try_delete_node(node[\u0027uuid\u0027])"},{"line_number":56,"context_line":"        node_list \u003d self.ironic(\u0027node-list\u0027)"},{"line_number":57,"context_line":"        node_list_uuid \u003d map(lambda item: item[\u0027UUID\u0027], node_list)"},{"line_number":58,"context_line":"        self.assertNotIn(node[\u0027uuid\u0027], node_list_uuid)"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a26ad4f_01862465","line":56,"updated":"2015-10-29 15:30:12.000000000","message":"Minor suggestion: create list_nodes() method in base.py to keep the same style for all ironic calls.","commit_id":"3081d4fb2705f8b6f1e721279bc3253d8b8a7fdc"},{"author":{"_account_id":13962,"name":"Victor Ryzhenkin","email":"vryzhenkin@mirantis.com","username":"vryzhenkin"},"change_message_id":"184555e4cf7839cd7df0ef8a6878b40b897d4df7","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        1) create node"},{"line_number":30,"context_line":"        2) check that node has been successfully created"},{"line_number":31,"context_line":"        \"\"\""},{"line_number":32,"context_line":"        node \u003d self.create_node()"},{"line_number":33,"context_line":"        node_list \u003d self.list_nodes()"},{"line_number":34,"context_line":"        node_list_uuid \u003d map(lambda item: item[\u0027UUID\u0027], node_list)"},{"line_number":35,"context_line":"        self.assertIn(node[\u0027uuid\u0027], node_list_uuid)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a26ad4f_1b30c49d","line":32,"updated":"2015-10-29 22:54:21.000000000","message":"Serg, maybe I missing something, but where cleanups for resources, which you creating here?\nThe same for all tests, where you creating node.","commit_id":"74a4bc5cfa41b656d2f58e85b278b42bac71da8a"},{"author":{"_account_id":13962,"name":"Victor Ryzhenkin","email":"vryzhenkin@mirantis.com","username":"vryzhenkin"},"change_message_id":"b656590d8bdf0091cbd03552db8d0059b3dff424","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        1) create node"},{"line_number":30,"context_line":"        2) check that node has been successfully created"},{"line_number":31,"context_line":"        \"\"\""},{"line_number":32,"context_line":"        node \u003d self.create_node()"},{"line_number":33,"context_line":"        node_list \u003d self.list_nodes()"},{"line_number":34,"context_line":"        node_list_uuid \u003d map(lambda item: item[\u0027UUID\u0027], node_list)"},{"line_number":35,"context_line":"        self.assertIn(node[\u0027uuid\u0027], node_list_uuid)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a26ad4f_3bf260d3","line":32,"in_reply_to":"1a26ad4f_1b30c49d","updated":"2015-10-29 22:58:35.000000000","message":"Sorry, I found it.","commit_id":"74a4bc5cfa41b656d2f58e85b278b42bac71da8a"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"57ce9fcb2c471467d3d5dfe962056eecf81c7a5e","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        node \u003d self.create_node()"},{"line_number":65,"context_line":"        updated_node \u003d self.ironic("},{"line_number":66,"context_line":"            \u0027node-update\u0027, params\u003d\u0027{0} add name\u003dtestnode\u0027.format(node[\u0027uuid\u0027]))"},{"line_number":67,"context_line":"        updated_node \u003d self.get_dict_from_output(updated_node)"},{"line_number":68,"context_line":"        self.assertNotEqual(node[\u0027name\u0027], updated_node[\u0027name\u0027])"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def test_node_set_console_mode(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa80f949_7d06f221","line":67,"updated":"2015-11-03 19:06:34.000000000","message":"nit: it would be better to encapsulate this parsing stuff in base class in future.","commit_id":"fc3b526edfcd01f7253b314b90a42ef8337ac5c7"}],"ironicclient/tests/functional/test_table_structure.py":[{"author":{"_account_id":7227,"name":"Timur Nurlygayanov","email":"tnurlygayanov@mirantis.com","username":"tnurlygayanov"},"change_message_id":"b3ca49ff1938ab273b8d2b17ef2d103547347429","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Mirantis, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_c10dc5e9","line":1,"updated":"2015-11-20 14:29:46.000000000","message":"looks like we need to add other contributors to this list as well, but we can do this in the separate commit (if we know who contributed).","commit_id":"333b9d17e6c12c634ebec162fd8d01eaea252ba0"}],"ironicclient/tests/functional/test_table_structure_ironicclient.py":[{"author":{"_account_id":14810,"name":"Kan","email":"sofaopenstack@gmail.com","username":"Kan"},"change_message_id":"cc033d72808eebaf07a452296e59397bf5b22ff2","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def test_port_headers_table_structure(self):"},{"line_number":46,"context_line":"        \"\"\"Test scenario:"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"            1) get port-slist"},{"line_number":49,"context_line":"            2) check table structure"},{"line_number":50,"context_line":"        \"\"\""},{"line_number":51,"context_line":"        port_list \u003d self.get_table_header(\u0027port-list\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a26ad4f_3bf27f70","line":48,"updated":"2015-10-29 02:39:24.000000000","message":"s/port-slist/port-list","commit_id":"416c9b7928476a8057178c3113118c90cad5f88a"},{"author":{"_account_id":9068,"name":"Yuriy Yekovenko","email":"yyekovenko@mirantis.com","username":"yyekovenko"},"change_message_id":"74507b34e532b00a323da10ee5112ed5a124b709","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"1a26ad4f_b6e774e3","updated":"2015-10-29 15:30:12.000000000","message":"Let\u0027s remove these unnecessary lines.","commit_id":"3081d4fb2705f8b6f1e721279bc3253d8b8a7fdc"},{"author":{"_account_id":9068,"name":"Yuriy Yekovenko","email":"yyekovenko@mirantis.com","username":"yyekovenko"},"change_message_id":"74507b34e532b00a323da10ee5112ed5a124b709","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    which do not require creating or modifying ironic objects."},{"line_number":24,"context_line":"    \"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def test_chassis_headers_table_structure(self):"},{"line_number":27,"context_line":"        \"\"\"Test scenario:"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"            1) get chassis-list"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a26ad4f_96911855","line":26,"updated":"2015-10-29 15:30:12.000000000","message":"Suggest to change method names to something like: test_chassis_table_headers(self) to make it more clear.","commit_id":"3081d4fb2705f8b6f1e721279bc3253d8b8a7fdc"}],"ironicclient/tests/functional/utils.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b8659b1f6177132f26d33e71aedecfda0f3be817","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import six"},{"line_number":14,"context_line":"import uuid"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"ba8a016a_e13374f4","line":13,"updated":"2015-11-19 11:50:26.000000000","message":"This should be also regrouped as:\n\n import uuid\n\n import six","commit_id":"7c480697f593f08f9bbfca4735ae43a2e0fcaa64"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b8659b1f6177132f26d33e71aedecfda0f3be817","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def generate_name(prefix):"},{"line_number":40,"context_line":"    \"\"\"Generate name for objects.\"\"\""},{"line_number":41,"context_line":"    suffix \u003d uuid.uuid4().hex[:4]"},{"line_number":42,"context_line":"    return \"{0}-{1}\".format(prefix, suffix)"}],"source_content_type":"text/x-python","patch_set":33,"id":"ba8a016a_81f5c8ed","line":40,"updated":"2015-11-19 11:50:26.000000000","message":":param prefix: prefix to use.\n\nAlso might be worth providing a default, maybe \u0027temp\u0027?","commit_id":"7c480697f593f08f9bbfca4735ae43a2e0fcaa64"},{"author":{"_account_id":7227,"name":"Timur Nurlygayanov","email":"tnurlygayanov@mirantis.com","username":"tnurlygayanov"},"change_message_id":"38ccbf0a5c9e9d638f943ef02402b86016fcc94a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":38,"id":"ba8a016a_b0c80daa","line":1,"updated":"2015-11-20 13:45:56.000000000","message":"The same here.","commit_id":"1e396683b12aafcf6afc161b4eae1f202b1f12db"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"88e1d307a371e43a8333bd54efe1f0f240badf42","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"def get_dict_from_output(output):"},{"line_number":21,"context_line":"    \"\"\"Create a dictionary from an output"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    :param output: the output of the cmd"},{"line_number":24,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_03bf0e61","line":21,"updated":"2015-11-23 13:45:37.000000000","message":"Please add output format to doc string","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"},{"author":{"_account_id":14614,"name":"Kyrylo Romanenko","display_name":"K.Romanenko","email":"romanenko-kv@hotmail.com","username":"kromanenko"},"change_message_id":"51da5883397d96efb478f3454ba10e579b49fc07","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    :param prefix: prefix of the generated name"},{"line_number":46,"context_line":"    \"\"\""},{"line_number":47,"context_line":"    suffix \u003d uuid.uuid4().hex[:4]"},{"line_number":48,"context_line":"    return \"{0}-{1}\".format(prefix, suffix)"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_2ee23930","line":47,"updated":"2015-11-23 13:50:28.000000000","message":"Sergii, better not to truncate UUIDs. I`ll pass you argumentation by Kevin L. Mitchell about this issue:\n\"The thing I\u0027m most concerned about with truncating a UUID is the potential decrease in uniqueness that would occur as a result. That may or may not be an issue in this case, but it\u0027s worth remembering that UUIDs are structured; depending on the flavor you\u0027re using (here, flavor 4), different parts of the UUID come from different, possibly non-random sources (I believe a timestamp factors into one part of the UUID, for instance). All of that argues for using either a full UUID or a randomly generated string.\"","commit_id":"61001c2cc76f69df9e0499a64e530c7eb2d5cc28"}]}
