)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"06a47c25e907a9d70ac9f70b2dd41ad2797e5e36","unresolved":false,"context_lines":[{"line_number":11,"context_line":"GET /v1/node_transitions which lists transitions."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Ie10375a88eddaf189c67f674f39109775691676e"},{"line_number":14,"context_line":"Implements: blueprint state-api"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3a7e1126_6cfe226d","line":14,"updated":"2015-12-17 12:37:14.000000000","message":"Hi Yuiko, please use bug 1526761 instead of blueprint in commit messages.","commit_id":"21a9cd1c07ecfe8bf2f183e787e901c6dd175746"}],"ironic/api/controllers/v1/node_transitions.py":[{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"30d6e9ad55e31fd9f4932b8357440997f85cbce2","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class NodeTransitions(base.APIBase):"},{"line_number":28,"context_line":"    \"\"\"API representation of a port."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    This class enforces type checking and value constraints, and converts"},{"line_number":31,"context_line":"    between the internal object model and the API representation of"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a7e1126_c128c2e4","line":28,"range":{"start_line":28,"start_character":35,"end_line":28,"end_character":36},"updated":"2015-12-21 02:01:52.000000000","message":"port?","commit_id":"73dc84cb32701ba1fa45d81af84e37ebe8d72901"},{"author":{"_account_id":7882,"name":"Yuiko Takada Mori","email":"yuiko-mori@nec.com","username":"YuikoTakada"},"change_message_id":"9928acb70a09cb22c958e6ebfa67653c476baa1c","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class NodeTransitions(base.APIBase):"},{"line_number":28,"context_line":"    \"\"\"API representation of a port."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    This class enforces type checking and value constraints, and converts"},{"line_number":31,"context_line":"    between the internal object model and the API representation of"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a7e1126_2d185fd2","line":28,"range":{"start_line":28,"start_character":35,"end_line":28,"end_character":36},"in_reply_to":"3a7e1126_c128c2e4","updated":"2015-12-22 08:20:46.000000000","message":"Done. I\u0027ve copied some part of ports.py and forgot to fix them.","commit_id":"73dc84cb32701ba1fa45d81af84e37ebe8d72901"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"30d6e9ad55e31fd9f4932b8357440997f85cbce2","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class NodeTransitionsCollection(collection.Collection):"},{"line_number":58,"context_line":"    \"\"\"API representation of a collection of ports.\"\"\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    node_transitions \u003d [NodeTransitions]"},{"line_number":61,"context_line":"    \"\"\"A list containing NodeTransitions objects\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a7e1126_81c2ba32","line":58,"range":{"start_line":58,"start_character":45,"end_line":58,"end_character":50},"updated":"2015-12-21 02:01:52.000000000","message":"ports?","commit_id":"73dc84cb32701ba1fa45d81af84e37ebe8d72901"},{"author":{"_account_id":7882,"name":"Yuiko Takada Mori","email":"yuiko-mori@nec.com","username":"YuikoTakada"},"change_message_id":"9928acb70a09cb22c958e6ebfa67653c476baa1c","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class NodeTransitionsCollection(collection.Collection):"},{"line_number":58,"context_line":"    \"\"\"API representation of a collection of ports.\"\"\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    node_transitions \u003d [NodeTransitions]"},{"line_number":61,"context_line":"    \"\"\"A list containing NodeTransitions objects\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a7e1126_0d7c83ea","line":58,"range":{"start_line":58,"start_character":45,"end_line":58,"end_character":50},"in_reply_to":"3a7e1126_81c2ba32","updated":"2015-12-22 08:20:46.000000000","message":"Done","commit_id":"73dc84cb32701ba1fa45d81af84e37ebe8d72901"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"30d6e9ad55e31fd9f4932b8357440997f85cbce2","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            raise exception.NotAcceptable()"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        sort_dir \u003d api_utils.validate_sort_dir(sort_dir)"},{"line_number":101,"context_line":"        node_transitions \u003d fsm.get_transitions()"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if from_state:"},{"line_number":104,"context_line":"            node_transitions \u003d self._get_node_transitions_by_from_state("}],"source_content_type":"text/x-python","patch_set":4,"id":"3a7e1126_215d0679","line":101,"range":{"start_line":101,"start_character":46,"end_line":101,"end_character":48},"updated":"2015-12-21 02:01:52.000000000","message":"this will return all nodes\u0027s transitions from fsm? I am not quite familire with automation lib but what about save this transitions in DB for each action and fetch it from DB?","commit_id":"73dc84cb32701ba1fa45d81af84e37ebe8d72901"},{"author":{"_account_id":7882,"name":"Yuiko Takada Mori","email":"yuiko-mori@nec.com","username":"YuikoTakada"},"change_message_id":"9928acb70a09cb22c958e6ebfa67653c476baa1c","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            raise exception.NotAcceptable()"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        sort_dir \u003d api_utils.validate_sort_dir(sort_dir)"},{"line_number":101,"context_line":"        node_transitions \u003d fsm.get_transitions()"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if from_state:"},{"line_number":104,"context_line":"            node_transitions \u003d self._get_node_transitions_by_from_state("}],"source_content_type":"text/x-python","patch_set":4,"id":"3a7e1126_cde67baf","line":101,"range":{"start_line":101,"start_character":46,"end_line":101,"end_character":48},"in_reply_to":"3a7e1126_215d0679","updated":"2015-12-22 08:20:46.000000000","message":"node transitions is common information for all nodes and never be changed (different to node information or port information), so that, I think we don\u0027t need to store into DB.","commit_id":"73dc84cb32701ba1fa45d81af84e37ebe8d72901"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"3cddf5bdf84871cafc067b5bc79099ac4a9bb0f3","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            raise exception.NotAcceptable()"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        sort_dir \u003d api_utils.validate_sort_dir(sort_dir)"},{"line_number":101,"context_line":"        node_transitions \u003d fsm.get_transitions()"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if from_state:"},{"line_number":104,"context_line":"            node_transitions \u003d self._get_node_transitions_by_from_state("}],"source_content_type":"text/x-python","patch_set":6,"id":"1a7b0d38_205ecb76","line":101,"range":{"start_line":101,"start_character":46,"end_line":101,"end_character":48},"updated":"2015-12-24 09:02:26.000000000","message":"my concern is fsm only save the transitions in memory, what if the   service is broken or the machine is restart, you will lose all of them. any ideas?","commit_id":"831d5315149009693c7b788c20aa105842a6e091"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"26e3dbab5099abcae95edd6cb8d75bf045461853","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    @expose.expose(NodeTransitionsCollection, wtypes.text,"},{"line_number":86,"context_line":"                   wtypes.text, wtypes.text, wtypes.text, wtypes.text)"},{"line_number":87,"context_line":"    def get_all(self, from_state\u003dNone, event\u003dNone, target_state\u003dNone,"},{"line_number":88,"context_line":"                sort_key\u003d\u0027from_state\u0027, sort_dir\u003d\u0027asc\u0027):"},{"line_number":89,"context_line":"        \"\"\"Retrieve a list of node transitions."},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a68dd71_4709cf94","line":87,"updated":"2016-01-20 20:22:54.000000000","message":"none of these parameters were approved in the spec","commit_id":"f785f19d27d30b6e38cf2005d38937d9224ec07a"},{"author":{"_account_id":14810,"name":"Kan","email":"sofaopenstack@gmail.com","username":"Kan"},"change_message_id":"b2854548cf0bd3ad9c2d9f3112bc6edce48efcb3","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        sort_dir \u003d api_utils.validate_sort_dir(sort_dir)"},{"line_number":101,"context_line":"        node_transitions \u003d ir_states.get_transitions()"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if from_state:"},{"line_number":104,"context_line":"            node_transitions \u003d self._get_node_transitions_by_from_state("},{"line_number":105,"context_line":"                node_transitions, from_state)"},{"line_number":106,"context_line":"        elif event:"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba63e191_cf7d95e8","line":103,"range":{"start_line":103,"start_character":11,"end_line":103,"end_character":21},"updated":"2016-01-20 05:56:50.000000000","message":"Could not \u0027from_state\u0027, \u0027target_state\u0027 and \u0027event\u0027 be used as the arguments together?","commit_id":"f785f19d27d30b6e38cf2005d38937d9224ec07a"},{"author":{"_account_id":7882,"name":"Yuiko Takada Mori","email":"yuiko-mori@nec.com","username":"YuikoTakada"},"change_message_id":"06e53510db24489173abe1195a46c97813c5b1c5","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        sort_dir \u003d api_utils.validate_sort_dir(sort_dir)"},{"line_number":101,"context_line":"        node_transitions \u003d ir_states.get_transitions()"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if from_state:"},{"line_number":104,"context_line":"            node_transitions \u003d self._get_node_transitions_by_from_state("},{"line_number":105,"context_line":"                node_transitions, from_state)"},{"line_number":106,"context_line":"        elif event:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a5ae5dd_399097ec","line":103,"range":{"start_line":103,"start_character":11,"end_line":103,"end_character":21},"in_reply_to":"ba63e191_cf7d95e8","updated":"2016-02-03 02:24:50.000000000","message":"Done","commit_id":"f785f19d27d30b6e38cf2005d38937d9224ec07a"}],"ironic/api/controllers/v1/utils.py":[{"author":{"_account_id":14810,"name":"Kan","email":"sofaopenstack@gmail.com","username":"Kan"},"change_message_id":"b2854548cf0bd3ad9c2d9f3112bc6edce48efcb3","unresolved":false,"context_lines":[{"line_number":243,"context_line":"            versions.MINOR_14_LINKS_NODESTATES_DRIVERPROPERTIES)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"def allow_transitions():"},{"line_number":247,"context_line":"    \"\"\"Check if transitions is displayable."},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    Version 1.15 of the API GET /v1/nodes/transitions is available."}],"source_content_type":"text/x-python","patch_set":7,"id":"ba63e191_4fad2530","line":246,"updated":"2016-01-20 05:56:50.000000000","message":"Also need test cases for that, please refer to:\n\nhttps://github.com/openstack/ironic/blob/master/ironic/tests/unit/api/v1/test_utils.py#L71-L80","commit_id":"f785f19d27d30b6e38cf2005d38937d9224ec07a"},{"author":{"_account_id":7882,"name":"Yuiko Takada Mori","email":"yuiko-mori@nec.com","username":"YuikoTakada"},"change_message_id":"06e53510db24489173abe1195a46c97813c5b1c5","unresolved":false,"context_lines":[{"line_number":243,"context_line":"            versions.MINOR_14_LINKS_NODESTATES_DRIVERPROPERTIES)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"def allow_transitions():"},{"line_number":247,"context_line":"    \"\"\"Check if transitions is displayable."},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    Version 1.15 of the API GET /v1/nodes/transitions is available."}],"source_content_type":"text/x-python","patch_set":7,"id":"5a5ae5dd_943ab2e6","line":246,"in_reply_to":"ba63e191_4fad2530","updated":"2016-02-03 02:24:50.000000000","message":"Done","commit_id":"f785f19d27d30b6e38cf2005d38937d9224ec07a"}],"ironic/common/fsm.py":[{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"30d6e9ad55e31fd9f4932b8357440997f85cbce2","unresolved":false,"context_lines":[{"line_number":26,"context_line":"\"\"\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"from ironic.api.controllers.v1 import node as api_node"},{"line_number":30,"context_line":"from ironic.common import exception as excp"},{"line_number":31,"context_line":"from ironic.common.i18n import _"},{"line_number":32,"context_line":"from ironic.common import states as ir_states"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a7e1126_21ebc679","line":29,"updated":"2015-12-21 02:01:52.000000000","message":"nit:this could be a potential cross reference import in the future....","commit_id":"73dc84cb32701ba1fa45d81af84e37ebe8d72901"},{"author":{"_account_id":7882,"name":"Yuiko Takada Mori","email":"yuiko-mori@nec.com","username":"YuikoTakada"},"change_message_id":"9928acb70a09cb22c958e6ebfa67653c476baa1c","unresolved":false,"context_lines":[{"line_number":26,"context_line":"\"\"\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"from ironic.api.controllers.v1 import node as api_node"},{"line_number":30,"context_line":"from ironic.common import exception as excp"},{"line_number":31,"context_line":"from ironic.common.i18n import _"},{"line_number":32,"context_line":"from ironic.common import states as ir_states"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a7e1126_3032f2a7","line":29,"in_reply_to":"3a7e1126_21ebc679","updated":"2015-12-22 08:20:46.000000000","message":"Thank you for your advice. I\u0027m not sure the best solution but I\u0027ve tried. Could you please check it?","commit_id":"73dc84cb32701ba1fa45d81af84e37ebe8d72901"}],"ironic/tests/unit/api/test_root.py":[{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"26e3dbab5099abcae95edd6cb8d75bf045461853","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        # Check if all known resources are present and there are no extra ones."},{"line_number":47,"context_line":"        not_resources \u003d (\u0027id\u0027, \u0027links\u0027, \u0027media_types\u0027)"},{"line_number":48,"context_line":"        actual_resources \u003d tuple(set(data.keys()) - set(not_resources))"},{"line_number":49,"context_line":"        expected_resources \u003d (\u0027chassis\u0027, \u0027drivers\u0027, \u0027node_transitions\u0027,"},{"line_number":50,"context_line":"                              \u0027nodes\u0027, \u0027ports\u0027)"},{"line_number":51,"context_line":"        self.assertEqual(sorted(expected_resources), sorted(actual_resources))"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a68dd71_e7fd636f","line":49,"updated":"2016-01-20 20:22:54.000000000","message":"the new node_transitions resource is only expected if version \u003e\u003d 1.15\n\nPlease validate that in a test case.","commit_id":"f785f19d27d30b6e38cf2005d38937d9224ec07a"},{"author":{"_account_id":7882,"name":"Yuiko Takada Mori","email":"yuiko-mori@nec.com","username":"YuikoTakada"},"change_message_id":"06e53510db24489173abe1195a46c97813c5b1c5","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        # Check if all known resources are present and there are no extra ones."},{"line_number":47,"context_line":"        not_resources \u003d (\u0027id\u0027, \u0027links\u0027, \u0027media_types\u0027)"},{"line_number":48,"context_line":"        actual_resources \u003d tuple(set(data.keys()) - set(not_resources))"},{"line_number":49,"context_line":"        expected_resources \u003d (\u0027chassis\u0027, \u0027drivers\u0027, \u0027node_transitions\u0027,"},{"line_number":50,"context_line":"                              \u0027nodes\u0027, \u0027ports\u0027)"},{"line_number":51,"context_line":"        self.assertEqual(sorted(expected_resources), sorted(actual_resources))"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5a5ae5dd_54543a53","line":49,"in_reply_to":"9a68dd71_e7fd636f","updated":"2016-02-03 02:24:50.000000000","message":"Done","commit_id":"f785f19d27d30b6e38cf2005d38937d9224ec07a"}]}
