)]}'
{"nova/tests/unit/virt/ironic/test_driver.py":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"13c33cdab05b379a06293ce39efaa25e378d8a3d","unresolved":false,"context_lines":[{"line_number":969,"context_line":"        node_uuid \u003d \u0027aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\u0027"},{"line_number":970,"context_line":"        network_info \u003d \u0027foo\u0027"},{"line_number":971,"context_line":""},{"line_number":972,"context_line":"        node \u003d ironic_utils.get_test_node(driver\u003d\u0027fake\u0027, uuid\u003dnode_uuid,"},{"line_number":973,"context_line":"                                        provision_state\u003dironic_states.CLEANING)"},{"line_number":974,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.ctx, node\u003dnode_uuid)"},{"line_number":975,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_a9a4224b","line":972,"updated":"2015-03-09 21:58:15.000000000","message":"nit: indentation","commit_id":"dca42cd7862ef93643f39fd527bd1adec7cd72da"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"25994dddc22d7511f64f45475032a046048adece","unresolved":false,"context_lines":[{"line_number":969,"context_line":"        node_uuid \u003d \u0027aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\u0027"},{"line_number":970,"context_line":"        network_info \u003d \u0027foo\u0027"},{"line_number":971,"context_line":""},{"line_number":972,"context_line":"        node \u003d ironic_utils.get_test_node(driver\u003d\u0027fake\u0027, uuid\u003dnode_uuid,"},{"line_number":973,"context_line":"                                        provision_state\u003dironic_states.CLEANING)"},{"line_number":974,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.ctx, node\u003dnode_uuid)"},{"line_number":975,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_9cc7fe11","line":972,"in_reply_to":"9a80dd14_a9a4224b","updated":"2015-03-12 16:42:02.000000000","message":"Done","commit_id":"dca42cd7862ef93643f39fd527bd1adec7cd72da"}],"nova/virt/ironic/driver.py":[{"author":{"_account_id":7543,"name":"Yongli He","email":"yongli.he@intel.com","username":"yongli.he"},"change_message_id":"164a13c9641cf8a2da42098d0615cdfa4b8ecad2","unresolved":false,"context_lines":[{"line_number":739,"context_line":"        def _wait_for_provision_state():"},{"line_number":740,"context_line":"            node \u003d _validate_instance_and_node(ironicclient, instance)"},{"line_number":741,"context_line":"            if node.provision_state in (ironic_states.NOSTATE,"},{"line_number":742,"context_line":"                                        ironic_states.CLEANING,"},{"line_number":743,"context_line":"                                        ironic_states.AVAILABLE):"},{"line_number":744,"context_line":"                LOG.debug(\"Ironic node %(node)s is now unprovisioned, will \""},{"line_number":745,"context_line":"                          \"begin cleaning if enabled.\","}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_0a98b776","line":742,"updated":"2015-03-10 01:53:43.000000000","message":"indent here seems could get better.","commit_id":"dca42cd7862ef93643f39fd527bd1adec7cd72da"},{"author":{"_account_id":7543,"name":"Yongli He","email":"yongli.he@intel.com","username":"yongli.he"},"change_message_id":"19a6e98c62df2c7abdadb96807a26e0ee90d4164","unresolved":false,"context_lines":[{"line_number":739,"context_line":"        def _wait_for_provision_state():"},{"line_number":740,"context_line":"            node \u003d _validate_instance_and_node(ironicclient, instance)"},{"line_number":741,"context_line":"            if node.provision_state in (ironic_states.NOSTATE,"},{"line_number":742,"context_line":"                                        ironic_states.CLEANING,"},{"line_number":743,"context_line":"                                        ironic_states.AVAILABLE):"},{"line_number":744,"context_line":"                LOG.debug(\"Ironic node %(node)s is now unprovisioned, will \""},{"line_number":745,"context_line":"                          \"begin cleaning if enabled.\","}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_4cb53430","line":742,"in_reply_to":"9a80dd14_0a98b776","updated":"2015-03-11 01:14:31.000000000","message":"sorry,my browser problem...-:)","commit_id":"dca42cd7862ef93643f39fd527bd1adec7cd72da"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"037af662ada137aa06ec0112865c35aed007a806","unresolved":false,"context_lines":[{"line_number":742,"context_line":"                                        ironic_states.CLEANING,"},{"line_number":743,"context_line":"                                        ironic_states.AVAILABLE):"},{"line_number":744,"context_line":"                LOG.debug(\"Ironic node %(node)s is now unprovisioned, will \""},{"line_number":745,"context_line":"                          \"begin cleaning if enabled.\","},{"line_number":746,"context_line":"                          dict(node\u003dnode.uuid), instance\u003dinstance)"},{"line_number":747,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":748,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_4ed48ceb","line":745,"updated":"2015-03-09 21:30:28.000000000","message":"I\u0027d actually prefer if it only logs the \u0027begin cleaning if enabled\u0027 part when the provision_state is \u0027cleaning\u0027. Because the other two states mean that the node is available for provisioning; we don\u0027t know if cleaning had already occurred or (most likely didn\u0027t occur and/or was disabled).","commit_id":"dca42cd7862ef93643f39fd527bd1adec7cd72da"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"71c3b99ba3bf8730158ef67d927e6bacb201c999","unresolved":false,"context_lines":[{"line_number":742,"context_line":"                                        ironic_states.CLEANING,"},{"line_number":743,"context_line":"                                        ironic_states.AVAILABLE):"},{"line_number":744,"context_line":"                LOG.debug(\"Ironic node %(node)s is now unprovisioned, will \""},{"line_number":745,"context_line":"                          \"begin cleaning if enabled.\","},{"line_number":746,"context_line":"                          dict(node\u003dnode.uuid), instance\u003dinstance)"},{"line_number":747,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":748,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_c93a3698","line":745,"in_reply_to":"9a80dd14_4ed48ceb","updated":"2015-03-09 21:44:15.000000000","message":"I agree, but I couldn\u0027t think of a way to do it that wasn\u0027t a race condition. We want the instance to disappear from the user\u0027s list as soon as Ironic can say the node is, in fact, finished deleting and moving to the next state. Since it\u0027s polling every X seconds, it could find a deleted node in either CLEANING (could be actually cleaning or could be there for the briefest of moments if it\u0027s disabled) or AVAILABLE (really fast cleaning or cleaning was disabled).","commit_id":"dca42cd7862ef93643f39fd527bd1adec7cd72da"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"b4a7a9a77910c0dfdb4b91c4a8f1c4474b33a9b7","unresolved":false,"context_lines":[{"line_number":742,"context_line":"                                        ironic_states.CLEANING,"},{"line_number":743,"context_line":"                                        ironic_states.AVAILABLE):"},{"line_number":744,"context_line":"                LOG.debug(\"Ironic node %(node)s is now unprovisioned, will \""},{"line_number":745,"context_line":"                          \"begin cleaning if enabled.\","},{"line_number":746,"context_line":"                          dict(node\u003dnode.uuid), instance\u003dinstance)"},{"line_number":747,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":748,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_95253a0c","line":745,"in_reply_to":"9a80dd14_8f15999d","updated":"2015-03-11 23:45:59.000000000","message":"I think this is the same problem. You unprovision 5 nodes, 3 say current state CLEANING, 2 say current state AVAILABLE. That\u0027s odd, racey behavior if I\u0027m an operator.","commit_id":"dca42cd7862ef93643f39fd527bd1adec7cd72da"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0de20fb8154ac472827ddc6273476d97b11ea07e","unresolved":false,"context_lines":[{"line_number":742,"context_line":"                                        ironic_states.CLEANING,"},{"line_number":743,"context_line":"                                        ironic_states.AVAILABLE):"},{"line_number":744,"context_line":"                LOG.debug(\"Ironic node %(node)s is now unprovisioned, will \""},{"line_number":745,"context_line":"                          \"begin cleaning if enabled.\","},{"line_number":746,"context_line":"                          dict(node\u003dnode.uuid), instance\u003dinstance)"},{"line_number":747,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":748,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_8f15999d","line":745,"in_reply_to":"9a80dd14_c93a3698","updated":"2015-03-10 01:29:26.000000000","message":"How about something like \u0027Ironic node %(node)s has been unprovisioned; it is now in provision state \"(state)s\".\u0027\n\nNot sure about the tenses, \u0027has been\u0027, \u0027is now\u0027. whatever.","commit_id":"dca42cd7862ef93643f39fd527bd1adec7cd72da"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"8293ae5db49bdf61d8bbea57942b2ebba37f4287","unresolved":false,"context_lines":[{"line_number":746,"context_line":"                # get into CLEANFAIL state, it must be fixed in Ironic, but we"},{"line_number":747,"context_line":"                # can consider the instance unprovisioned."},{"line_number":748,"context_line":"                LOG.debug(\"Ironic node %(node)s is now unprovisioned, will \""},{"line_number":749,"context_line":"                          \"begin cleaning if enabled.\","},{"line_number":750,"context_line":"                          dict(node\u003dnode.uuid), instance\u003dinstance)"},{"line_number":751,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":752,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_a6758899","line":749,"updated":"2015-03-12 20:19:02.000000000","message":"This is a debug. What are we trying to capture here? I don\u0027t think it is very useful to put \u0027will begin cleaning if enabled.\u0027 If the state is NOSTATE, CLEANFAIL, or AVAILABLE, we know that \u0027will begin cleaning if enabled\u0027 is not true so why bother logging it?Seems like it would be more confusing to log that, than not to log it. Logging the provision-state is fine, cuz that\u0027s what it is at the point you\u0027re logging this.","commit_id":"6f674a73fa31969561c287d5afa63a5b374d85c3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"589204be5952199c30dfd9233b76f2b072030132","unresolved":false,"context_lines":[{"line_number":746,"context_line":"                # gets into CLEANFAIL state, it must be fixed in Ironic, but we"},{"line_number":747,"context_line":"                # can consider the instance unprovisioned."},{"line_number":748,"context_line":"                LOG.debug(\"Ironic node %(node)s is in state %(state)s, \""},{"line_number":749,"context_line":"                          \"instance is now unprovisioned.\" %"},{"line_number":750,"context_line":"                          {\u0027node\u0027: node.uuid, \u0027state\u0027: node.provision_state},"},{"line_number":751,"context_line":"                          instance\u003dinstance)"},{"line_number":752,"context_line":"                raise loopingcall.LoopingCallDone()"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_05ae4181","line":749,"updated":"2015-03-13 00:45:02.000000000","message":"at the end of this line. s/%/,/","commit_id":"389b7768fd509b24f0e9b11df5cf7ed499477b89"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"3c0eff22d5ebfb6023536dc14eddb184d18e78ff","unresolved":false,"context_lines":[{"line_number":736,"context_line":"                              \u0027node\u0027: node_uuid})"},{"line_number":737,"context_line":"                self.destroy(context, instance, network_info)"},{"line_number":738,"context_line":""},{"line_number":739,"context_line":"    def _unprovision(self, ironicclient, instance, node):"},{"line_number":740,"context_line":"        \"\"\"This method is called from destroy() to unprovision"},{"line_number":741,"context_line":"        already provisioned node after required checks."},{"line_number":742,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_4e7e636b","line":739,"updated":"2015-03-13 22:45:22.000000000","message":"Should there be a unittest for this function?  I didn\u0027t see one.  It seems like to test the changes for _wait_for_provision_state, it is calling destroy, which then calls _unprovision, which then calls _wait_for_provision.  Just wondering if getting closer to the actual function would be better.  Since _wait_for_provision_state is a closure function, it is probably difficult to test directly.","commit_id":"4f62bdbdd92b9d26c017d98b67aa6ac1f94654a7"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"78dfba60f0e86191f0c1665a0d38556caae13b9b","unresolved":false,"context_lines":[{"line_number":736,"context_line":"                              \u0027node\u0027: node_uuid})"},{"line_number":737,"context_line":"                self.destroy(context, instance, network_info)"},{"line_number":738,"context_line":""},{"line_number":739,"context_line":"    def _unprovision(self, ironicclient, instance, node):"},{"line_number":740,"context_line":"        \"\"\"This method is called from destroy() to unprovision"},{"line_number":741,"context_line":"        already provisioned node after required checks."},{"line_number":742,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_87ce465a","line":739,"in_reply_to":"9a80dd14_1b9710ed","updated":"2015-03-16 17:03:01.000000000","message":"Makes sense to me.  Thanks.","commit_id":"4f62bdbdd92b9d26c017d98b67aa6ac1f94654a7"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"54029e0ac3f128ede12b47fb5b0541210ebde043","unresolved":false,"context_lines":[{"line_number":736,"context_line":"                              \u0027node\u0027: node_uuid})"},{"line_number":737,"context_line":"                self.destroy(context, instance, network_info)"},{"line_number":738,"context_line":""},{"line_number":739,"context_line":"    def _unprovision(self, ironicclient, instance, node):"},{"line_number":740,"context_line":"        \"\"\"This method is called from destroy() to unprovision"},{"line_number":741,"context_line":"        already provisioned node after required checks."},{"line_number":742,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_1b9710ed","line":739,"in_reply_to":"9a80dd14_4e7e636b","updated":"2015-03-16 17:00:42.000000000","message":"I\u0027m not terribly against a more inclusive test. Since _unprovision is only called by destroy, it seems like this is still one logical block of code, just split up to be easier to reason about, so unittesting just destroy is reasonable. If _unprovision was being called in more than one spot, I\u0027d agree, it should be mocked out and tested separately.","commit_id":"4f62bdbdd92b9d26c017d98b67aa6ac1f94654a7"}],"nova/virt/ironic/ironic_states.py":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"cc57cd3f97361905c21acf9a7f490f3a3cad892d","unresolved":false,"context_lines":[{"line_number":93,"context_line":"\"\"\" Node is being automatically cleaned to prepare it for provisioning. \"\"\""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"CLEANFAIL \u003d \u0027clean failed\u0027"},{"line_number":96,"context_line":"\"\"\" Node failed cleaning. This requires operator intervention to resolve. \"\"\""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"ERROR \u003d \u0027error\u0027"},{"line_number":99,"context_line":"\"\"\" An error occurred during node processing."}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_3b639d42","line":96,"updated":"2015-03-12 00:51:19.000000000","message":"Why do we need to add this \"CLEANFAIL\" in this patch?\nThis status is not used at any places.","commit_id":"dca42cd7862ef93643f39fd527bd1adec7cd72da"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"25994dddc22d7511f64f45475032a046048adece","unresolved":false,"context_lines":[{"line_number":93,"context_line":"\"\"\" Node is being automatically cleaned to prepare it for provisioning. \"\"\""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"CLEANFAIL \u003d \u0027clean failed\u0027"},{"line_number":96,"context_line":"\"\"\" Node failed cleaning. This requires operator intervention to resolve. \"\"\""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"ERROR \u003d \u0027error\u0027"},{"line_number":99,"context_line":"\"\"\" An error occurred during node processing."}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_bf02f406","line":96,"in_reply_to":"9a80dd14_3b639d42","updated":"2015-03-12 16:42:02.000000000","message":"Ahh that was an oversight. I added it to the state checks. Thanks!","commit_id":"dca42cd7862ef93643f39fd527bd1adec7cd72da"}]}
