)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"a39b78a734c014fdec263a2978768d3d0269b55d","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Jay Faulkner \u003cjay@jvf.cc\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-10-18 16:53:57 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add spec for specific faults support"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I0f617f16616658ec8d8aa3cf5ef35fa275b9b4f6"},{"line_number":10,"context_line":"Related-bug: 1596107"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"ba5da102_21213bfc","line":7,"updated":"2016-10-28 10:25:21.000000000","message":"Please add a summary of what the spec is about. 1-2 paragraphs?","commit_id":"661cea00c14d9464a161ad2800c6a87396d1d4a8"}],"specs/approved/node-fault-support.rst":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"d094c477f77aed1ac61b290363a9bcc254ddefbb","unresolved":false,"context_lines":[{"line_number":49,"context_line":"Once this spec is merged, any situation where ironic would have set maintenance"},{"line_number":50,"context_line":"on a node should be replaced by an applicable node fault, even if we must add"},{"line_number":51,"context_line":"a catchall fault to cover non-specific errors."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"All faults will be attached to a driver interface. However, there will be a"},{"line_number":54,"context_line":"small number of generic faults registered via the BaseInterface. Each fault"},{"line_number":55,"context_line":"will consist of two parts: a name, and a method to check if the fault still"}],"source_content_type":"text/x-rst","patch_set":8,"id":"5a74a57a_2c5611ce","line":52,"updated":"2016-11-28 12:25:48.000000000","message":"Currently we prevent some actions like deploy on a node in maintenance state. Should we do the same for fault nodes?","commit_id":"984a5a9448dc3bf2bb0b5a11c768772dbf9ba0bd"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"bbd6c817ee9a19c71d2f620658e78adabd2e2fa6","unresolved":false,"context_lines":[{"line_number":49,"context_line":"Once this spec is merged, any situation where ironic would have set maintenance"},{"line_number":50,"context_line":"on a node should be replaced by an applicable node fault, even if we must add"},{"line_number":51,"context_line":"a catchall fault to cover non-specific errors."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"All faults will be attached to a driver interface. However, there will be a"},{"line_number":54,"context_line":"small number of generic faults registered via the BaseInterface. Each fault"},{"line_number":55,"context_line":"will consist of two parts: a name, and a method to check if the fault still"}],"source_content_type":"text/x-rst","patch_set":8,"id":"5a74a57a_077be228","line":52,"in_reply_to":"5a74a57a_2c5611ce","updated":"2016-12-08 16:10:40.000000000","message":"Yes; that\u0027s completely a built in assumption, I\u0027ll make sure next patchset we explicitly mention it.","commit_id":"984a5a9448dc3bf2bb0b5a11c768772dbf9ba0bd"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"d094c477f77aed1ac61b290363a9bcc254ddefbb","unresolved":false,"context_lines":[{"line_number":53,"context_line":"All faults will be attached to a driver interface. However, there will be a"},{"line_number":54,"context_line":"small number of generic faults registered via the BaseInterface. Each fault"},{"line_number":55,"context_line":"will consist of two parts: a name, and a method to check if the fault still"},{"line_number":56,"context_line":"exists on a node. Creating a fault will be done via decorator. For example::"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"  @faults.add_fault(\u0027PowerFault\u0027)"},{"line_number":59,"context_line":"  def power_fault_verifier(task):"}],"source_content_type":"text/x-rst","patch_set":8,"id":"5a74a57a_0ca235fd","line":56,"range":{"start_line":56,"start_character":18,"end_line":56,"end_character":34},"updated":"2016-11-28 12:25:48.000000000","message":"Please also provide an example how to set fault state on a node via internal API bu using fault\u0027s name.","commit_id":"984a5a9448dc3bf2bb0b5a11c768772dbf9ba0bd"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"bbd6c817ee9a19c71d2f620658e78adabd2e2fa6","unresolved":false,"context_lines":[{"line_number":53,"context_line":"All faults will be attached to a driver interface. However, there will be a"},{"line_number":54,"context_line":"small number of generic faults registered via the BaseInterface. Each fault"},{"line_number":55,"context_line":"will consist of two parts: a name, and a method to check if the fault still"},{"line_number":56,"context_line":"exists on a node. Creating a fault will be done via decorator. For example::"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"  @faults.add_fault(\u0027PowerFault\u0027)"},{"line_number":59,"context_line":"  def power_fault_verifier(task):"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a71b18c_857210e2","line":56,"range":{"start_line":56,"start_character":18,"end_line":56,"end_character":34},"in_reply_to":"5a74a57a_0ca235fd","updated":"2016-12-08 16:10:40.000000000","message":"I\u0027ll add this as a todo. I\u0027m not certain what that interface should look like yet.","commit_id":"984a5a9448dc3bf2bb0b5a11c768772dbf9ba0bd"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"d094c477f77aed1ac61b290363a9bcc254ddefbb","unresolved":false,"context_lines":[{"line_number":86,"context_line":"+----------------------------+-------------------------------------------+"},{"line_number":87,"context_line":"| uuid                       | str                                       |"},{"line_number":88,"context_line":"+----------------------------+-------------------------------------------+"},{"line_number":89,"context_line":"| status                     | str (values: ACTIVE, RESOLVING, RESOLVED) |"},{"line_number":90,"context_line":"+----------------------------+-------------------------------------------+"},{"line_number":91,"context_line":"| node_id                    | int (foreign key: node.id)                |"},{"line_number":92,"context_line":"+----------------------------+-------------------------------------------+"}],"source_content_type":"text/x-rst","patch_set":8,"id":"5a74a57a_acc22132","line":89,"range":{"start_line":89,"start_character":52,"end_line":89,"end_character":61},"updated":"2016-11-28 12:25:48.000000000","message":"What is RESOLVING state? Operator sets this state that faults resolving in progress?","commit_id":"984a5a9448dc3bf2bb0b5a11c768772dbf9ba0bd"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"bbd6c817ee9a19c71d2f620658e78adabd2e2fa6","unresolved":false,"context_lines":[{"line_number":86,"context_line":"+----------------------------+-------------------------------------------+"},{"line_number":87,"context_line":"| uuid                       | str                                       |"},{"line_number":88,"context_line":"+----------------------------+-------------------------------------------+"},{"line_number":89,"context_line":"| status                     | str (values: ACTIVE, RESOLVING, RESOLVED) |"},{"line_number":90,"context_line":"+----------------------------+-------------------------------------------+"},{"line_number":91,"context_line":"| node_id                    | int (foreign key: node.id)                |"},{"line_number":92,"context_line":"+----------------------------+-------------------------------------------+"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a71b18c_2544dc72","line":89,"range":{"start_line":89,"start_character":52,"end_line":89,"end_character":61},"in_reply_to":"5a74a57a_acc22132","updated":"2016-12-08 16:10:40.000000000","message":"An operator can\u0027t set this state directly, but it\u0027s triggered when a fault in being actively resolved.","commit_id":"984a5a9448dc3bf2bb0b5a11c768772dbf9ba0bd"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"08dd0fe1cabfc9a9e26e51bc47e3ad93a6df307c","unresolved":false,"context_lines":[{"line_number":1,"context_line":".."},{"line_number":2,"context_line":" This work is licensed under a Creative Commons Attribution 3.0 Unported"},{"line_number":3,"context_line":" License."},{"line_number":4,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"9a30ddce_d492cb4a","line":1,"updated":"2017-03-08 16:35:55.000000000","message":"Should add that maintenance will disable auto-resolution for a node","commit_id":"40d0504598424492bf49abaf842844d28664220f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"08dd0fe1cabfc9a9e26e51bc47e3ad93a6df307c","unresolved":false,"context_lines":[{"line_number":1,"context_line":".."},{"line_number":2,"context_line":" This work is licensed under a Creative Commons Attribution 3.0 Unported"},{"line_number":3,"context_line":" License."},{"line_number":4,"context_line":""},{"line_number":5,"context_line":" http://creativecommons.org/licenses/by/3.0/legalcode"}],"source_content_type":"text/x-rst","patch_set":9,"id":"9a30ddce_34b16790","line":2,"updated":"2017-03-08 16:35:55.000000000","message":"Question was brought up in our discussion: what about duplicate faults?\n\n- Fault 1 on a node by operation A\n- operation A runs again, puts fault 2 on the node of the same fault type\n\nas a result of our discussion, we determined that we should not be performing operation A on the faulty node until it gets resolved.\n\nWe also concluded that you should be able to have multiple active faults on a node. We\u0027re still discussing whether we should allow multiple faults from the same interface on the same node at the same time.","commit_id":"40d0504598424492bf49abaf842844d28664220f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0c098a5602ebd94039bdef1366f868ce422c3157","unresolved":false,"context_lines":[{"line_number":56,"context_line":"exists on a node. Creating a fault will be done via decorator. For example::"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"  @faults.add_fault(\u0027PowerFault\u0027)"},{"line_number":59,"context_line":"  def power_fault_verifier(task):"},{"line_number":60,"context_line":"      try:"},{"line_number":61,"context_line":"          task.driver.power.validate(task)"},{"line_number":62,"context_line":"          return True"}],"source_content_type":"text/x-rst","patch_set":9,"id":"da36d5c6_8c4b3159","line":59,"updated":"2017-02-20 02:52:18.000000000","message":"do I get it right, that this fault handler will be attached to PowerInterface? then its definition lacks \"self\"..","commit_id":"40d0504598424492bf49abaf842844d28664220f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0c098a5602ebd94039bdef1366f868ce422c3157","unresolved":false,"context_lines":[{"line_number":67,"context_line":"          return False"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"TODO(jay): Add an example of what setting a fault on a node looks like."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"Any node with an active fault should be treated the same as a node in"},{"line_number":73,"context_line":"maintenance is today; no deploys permitted, and no actions taken by ironic"}],"source_content_type":"text/x-rst","patch_set":9,"id":"da36d5c6_ac48f55c","line":70,"updated":"2017-02-20 02:52:18.000000000","message":"please do :)","commit_id":"40d0504598424492bf49abaf842844d28664220f"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"f7ce8ab030aa9833d7d09b29825e98c66a91ee50","unresolved":false,"context_lines":[{"line_number":120,"context_line":"node (link to /v1/nodes/{node_ident}/faults)."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"GET /v1/drivers/{driver name or hardware type} will be updated to include a"},{"line_number":123,"context_line":"\"supported_faults\" field, which is a list of \"fault_type\" strings indicating"},{"line_number":124,"context_line":"which faults may be set on a node with the specified driver."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"The following API methods will be added with the addition of node fault"}],"source_content_type":"text/x-rst","patch_set":9,"id":"da36d5c6_2c8885e7","line":123,"updated":"2017-02-20 08:04:15.000000000","message":"What is meant by \u0027fault_type\u0027 here? Is it a broad categorization of faults or each fault being defined with decorator  is a fault type?\n@faults.add_fault(\u0027PowerFault\u0027)\ndef power_fault_verifier(task):\n\nHow do you relate the fault_type with the name (str)?","commit_id":"40d0504598424492bf49abaf842844d28664220f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0c098a5602ebd94039bdef1366f868ce422c3157","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"  * Parameters:"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    * node: Identifier for a node (name or UUID)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    * fault_type: Full fault type to filter by (string)."},{"line_number":146,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"da36d5c6_cc7369b3","line":143,"updated":"2017-02-20 02:52:18.000000000","message":"this is not quite restful, and should instead be /v1/nodes/\u003cUUID\u003e/faults\n\n/v1/faults should return faults for all nodes, which may or may not make sense (it\u0027s up to you to decide)","commit_id":"40d0504598424492bf49abaf842844d28664220f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"08dd0fe1cabfc9a9e26e51bc47e3ad93a6df307c","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    * node: Identifier for a node (name or UUID)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    * fault_type: Full fault type to filter by (string)."},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    * status: Filter by status. Must be one of \"active\", \"resolved\", or"},{"line_number":148,"context_line":"      \"resolving\" (string)"}],"source_content_type":"text/x-rst","patch_set":9,"id":"9a30ddce_0f136e0e","line":145,"range":{"start_line":145,"start_character":6,"end_line":145,"end_character":16},"updated":"2017-03-08 16:35:55.000000000","message":"s/fault_type/name, or we might think that this is the fault code, or interface name (this is the thing you put in the decorator","commit_id":"40d0504598424492bf49abaf842844d28664220f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"08dd0fe1cabfc9a9e26e51bc47e3ad93a6df307c","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    * node: Identifier for a node (name or UUID)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    * fault_type: Full fault type to filter by (string)."},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    * status: Filter by status. Must be one of \"active\", \"resolved\", or"},{"line_number":148,"context_line":"      \"resolving\" (string)"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"9a30ddce_4ff566c9","line":146,"updated":"2017-03-08 16:35:55.000000000","message":"need to add concept of fault code here, talk about auto-generating docs for it","commit_id":"40d0504598424492bf49abaf842844d28664220f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"08dd0fe1cabfc9a9e26e51bc47e3ad93a6df307c","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    * status: Filter by status. Must be one of \"active\", \"resolved\", or"},{"line_number":148,"context_line":"      \"resolving\" (string)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    * limit (int) - maximum number of resources to return in a single result."},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    * marker (uuid) - pagination marker for large data sets"}],"source_content_type":"text/x-rst","patch_set":9,"id":"9a30ddce_ef829aff","line":149,"updated":"2017-03-08 16:35:55.000000000","message":"have a concept of which interface in here?","commit_id":"40d0504598424492bf49abaf842844d28664220f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0c098a5602ebd94039bdef1366f868ce422c3157","unresolved":false,"context_lines":[{"line_number":181,"context_line":""},{"line_number":182,"context_line":"  * Response: JSON schema definition of a Fault"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"* /v1/faults/{fault_uuid}/resolve"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"  * Call the method to resolve a fault asynchronously."},{"line_number":187,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"da36d5c6_ec782d92","line":184,"updated":"2017-02-20 02:52:18.000000000","message":"in an attempt to make our API more restful, let\u0027s maybe replace it with\n\n PUT /v1/faults/\u003cfault_uuid\u003e\n\nwith resolved\u003dTrue in the body (and btw maybe with resolve_message\u003d\"some explanation\")","commit_id":"40d0504598424492bf49abaf842844d28664220f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0c098a5602ebd94039bdef1366f868ce422c3157","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    * Body: None"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"* /v1/nodes/{node_ident}/faults"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"  * Retrieve a list of all faults associated with the given node."},{"line_number":209,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"da36d5c6_0c6e61c9","line":206,"updated":"2017-02-20 02:52:18.000000000","message":"oh, here is is :) then the first endpoint should not accept node UUID","commit_id":"40d0504598424492bf49abaf842844d28664220f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0c098a5602ebd94039bdef1366f868ce422c3157","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"To maintain compatibility with previous API microversions, the \"maintenance\""},{"line_number":242,"context_line":"field will be returned as True with \"maintenance_reason\" set to \"The node has"},{"line_number":243,"context_line":"active fault(s): {list of fault_types}\""},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"Client (CLI) impact"},{"line_number":246,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":9,"id":"da36d5c6_2c7325b3","line":243,"updated":"2017-02-20 02:52:18.000000000","message":"this is only in previous microversions, right? with new ones, maintenance will be false?","commit_id":"40d0504598424492bf49abaf842844d28664220f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0c098a5602ebd94039bdef1366f868ce422c3157","unresolved":false,"context_lines":[{"line_number":255,"context_line":"* `ironic fault-list`"},{"line_number":256,"context_line":"* `ironic fault-show \u003cfault_uuid\u003e`"},{"line_number":257,"context_line":"* `ironic fault-resolve \u003cfault_uuid\u003e`"},{"line_number":258,"context_line":"* `ironic node-show-faults \u003cfault_uuid\u003e`"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"Modify the following CLI command to expose the added `supported_faults` field:"},{"line_number":261,"context_line":"* `ironic driver-show \u003cdriver_name\u003e`"}],"source_content_type":"text/x-rst","patch_set":9,"id":"da36d5c6_4c6859bb","line":258,"updated":"2017-02-20 02:52:18.000000000","message":"should be node-faults-list","commit_id":"40d0504598424492bf49abaf842844d28664220f"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"f7ce8ab030aa9833d7d09b29825e98c66a91ee50","unresolved":false,"context_lines":[{"line_number":255,"context_line":"* `ironic fault-list`"},{"line_number":256,"context_line":"* `ironic fault-show \u003cfault_uuid\u003e`"},{"line_number":257,"context_line":"* `ironic fault-resolve \u003cfault_uuid\u003e`"},{"line_number":258,"context_line":"* `ironic node-show-faults \u003cfault_uuid\u003e`"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"Modify the following CLI command to expose the added `supported_faults` field:"},{"line_number":261,"context_line":"* `ironic driver-show \u003cdriver_name\u003e`"}],"source_content_type":"text/x-rst","patch_set":9,"id":"da36d5c6_2cede58b","line":258,"in_reply_to":"da36d5c6_4c6859bb","updated":"2017-02-20 08:04:15.000000000","message":"++","commit_id":"40d0504598424492bf49abaf842844d28664220f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0c098a5602ebd94039bdef1366f868ce422c3157","unresolved":false,"context_lines":[{"line_number":265,"context_line":"Add the following OSC commands, mapping to new API endpoints:"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"* `openstack baremetal fault list`"},{"line_number":268,"context_line":"* `openstack baremetal fault list --node \u003cnode_uuid\u003e`"},{"line_number":269,"context_line":"* `openstack baremetal fault show \u003cfault_uuid\u003e`"},{"line_number":270,"context_line":"* `openstack baremetal fault resolve \u003cfault_uuid\u003e`"},{"line_number":271,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"da36d5c6_6c651de0","line":268,"updated":"2017-02-20 02:52:18.000000000","message":"maybe \n\n openstack baremetal node fault list \u003cUUID\u003e\n\n? dunno what is better","commit_id":"40d0504598424492bf49abaf842844d28664220f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0c098a5602ebd94039bdef1366f868ce422c3157","unresolved":false,"context_lines":[{"line_number":267,"context_line":"* `openstack baremetal fault list`"},{"line_number":268,"context_line":"* `openstack baremetal fault list --node \u003cnode_uuid\u003e`"},{"line_number":269,"context_line":"* `openstack baremetal fault show \u003cfault_uuid\u003e`"},{"line_number":270,"context_line":"* `openstack baremetal fault resolve \u003cfault_uuid\u003e`"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"Modify the following OSC command to expose the added `supported_faults` field:"},{"line_number":273,"context_line":"* `openstack baremetal driver show \u003cdriver_name\u003e`"}],"source_content_type":"text/x-rst","patch_set":9,"id":"da36d5c6_8c6251d7","line":270,"updated":"2017-02-20 02:52:18.000000000","message":"I think a bit more OSC-ish would be\n\n openstack baremetal fault set \u003cfault UUID\u003e --resolved|--not-resolved\n\nalso I\u0027d have\n\n --resolve-message \"I FIXED EVERYTHING!!\"","commit_id":"40d0504598424492bf49abaf842844d28664220f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0c098a5602ebd94039bdef1366f868ce422c3157","unresolved":false,"context_lines":[{"line_number":333,"context_line":"Two configuration options will be added:"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"* `[conductor]/fault_resolution_periodic_frequency` (int): How often the fault"},{"line_number":336,"context_line":"  resolution periodic task should run, in seconds. Defaults to 86400 (daily)."},{"line_number":337,"context_line":"  If 0, fault resolution periodic task is disabled."},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"* `[conductor]/fault_ttl` (int): How long, in days, ironic should keep faults"}],"source_content_type":"text/x-rst","patch_set":9,"id":"da36d5c6_ac5f150d","line":336,"updated":"2017-02-20 02:52:18.000000000","message":"does it mean that in case of a network glitch, a node will go back to available only in a day? Sounds too much, I\u0027d set maximum one hour, maybe less.","commit_id":"40d0504598424492bf49abaf842844d28664220f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0c098a5602ebd94039bdef1366f868ce422c3157","unresolved":false,"context_lines":[{"line_number":336,"context_line":"  resolution periodic task should run, in seconds. Defaults to 86400 (daily)."},{"line_number":337,"context_line":"  If 0, fault resolution periodic task is disabled."},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"* `[conductor]/fault_ttl` (int): How long, in days, ironic should keep faults"},{"line_number":340,"context_line":"  stored once resolved. If 0, faults are never expired. Defaults to 0 (never"},{"line_number":341,"context_line":"  prune)."},{"line_number":342,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"da36d5c6_cc9a89c5","line":339,"updated":"2017-02-20 02:52:18.000000000","message":"s/in days/hours/ maybe?","commit_id":"40d0504598424492bf49abaf842844d28664220f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0c098a5602ebd94039bdef1366f868ce422c3157","unresolved":false,"context_lines":[{"line_number":338,"context_line":""},{"line_number":339,"context_line":"* `[conductor]/fault_ttl` (int): How long, in days, ironic should keep faults"},{"line_number":340,"context_line":"  stored once resolved. If 0, faults are never expired. Defaults to 0 (never"},{"line_number":341,"context_line":"  prune)."},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"Developer impact"},{"line_number":344,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":9,"id":"da36d5c6_ec9f4db2","line":341,"updated":"2017-02-20 02:52:18.000000000","message":"A risky default IMO. I\u0027d prefer we set it to something high (30 days?), but finite.","commit_id":"40d0504598424492bf49abaf842844d28664220f"},{"author":{"_account_id":19686,"name":"Ramamani Yeleswarapu","email":"ramamani.yeleswarapu@intel.com","username":"Rama_Y"},"change_message_id":"b7eaaa33ca9c07d72d8df0572561d151506f531f","unresolved":false,"context_lines":[{"line_number":37,"context_line":"Proposed change"},{"line_number":38,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"In order to address faults on nodes automatically, we need to codify potential"},{"line_number":41,"context_line":"faults, how to detect them, and how to resolve them. Additionally, we need to"},{"line_number":42,"context_line":"add a new top-level API for faults, as well as the proper DB design for storing"},{"line_number":43,"context_line":"faults. This API could be used by operators to discover all faults, list active"},{"line_number":44,"context_line":"node faults, faults that already been resolved, and resolve active faults."}],"source_content_type":"text/x-rst","patch_set":10,"id":"1a1ced50_b9ea3072","line":41,"range":{"start_line":40,"start_character":51,"end_line":41,"end_character":6},"updated":"2017-03-22 21:06:43.000000000","message":"I think a fault list (fault codes and descriptions) should be included in the spec.","commit_id":"e6553ac2a01027ae56e87281793d20b531fdb92e"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"1b49fa94f62f93a02bf0a90012e16f6ab4ba4cdf","unresolved":false,"context_lines":[{"line_number":37,"context_line":"Proposed change"},{"line_number":38,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"In order to address faults on nodes automatically, we need to codify potential"},{"line_number":41,"context_line":"faults, how to detect them, and how to resolve them. Additionally, we need to"},{"line_number":42,"context_line":"add a new top-level API for faults, as well as the proper DB design for storing"},{"line_number":43,"context_line":"faults. This API could be used by operators to discover all faults, list active"},{"line_number":44,"context_line":"node faults, faults that already been resolved, and resolve active faults."}],"source_content_type":"text/x-rst","patch_set":10,"id":"1f1a1f67_073c54c6","line":41,"range":{"start_line":40,"start_character":51,"end_line":41,"end_character":6},"in_reply_to":"1a1ced50_b9ea3072","updated":"2017-07-14 07:07:51.000000000","message":"As defined in the db schema, I think the spec is preferring a string form as name and description.\nCurrently we have two cases automatically entering maintenance mode, namely power sync failure and clean failure.\n\nWe can define as following:\n\n* PowerFault: Power synchronization failure due to invalid IPMI credential, unresponsive BMC, or unreachable network.\n* CleanFault: Clean operation failed. We can record what step it fails, and when recovering, we can continue from last position, but since this spec is already huge now, we can defer this to another spec.","commit_id":"e6553ac2a01027ae56e87281793d20b531fdb92e"},{"author":{"_account_id":19686,"name":"Ramamani Yeleswarapu","email":"ramamani.yeleswarapu@intel.com","username":"Rama_Y"},"change_message_id":"b7eaaa33ca9c07d72d8df0572561d151506f531f","unresolved":false,"context_lines":[{"line_number":40,"context_line":"In order to address faults on nodes automatically, we need to codify potential"},{"line_number":41,"context_line":"faults, how to detect them, and how to resolve them. Additionally, we need to"},{"line_number":42,"context_line":"add a new top-level API for faults, as well as the proper DB design for storing"},{"line_number":43,"context_line":"faults. This API could be used by operators to discover all faults, list active"},{"line_number":44,"context_line":"node faults, faults that already been resolved, and resolve active faults."},{"line_number":45,"context_line":"Finally, we will add two periodic tasks to conductors: one to check nodes with"},{"line_number":46,"context_line":"active faults to see if their issue is resolved, and one to prune old,"},{"line_number":47,"context_line":"resolved faults out of the faults table."}],"source_content_type":"text/x-rst","patch_set":10,"id":"1a1ced50_2c67e0b7","line":44,"range":{"start_line":43,"start_character":68,"end_line":44,"end_character":73},"updated":"2017-03-22 21:06:43.000000000","message":"Nova has faults to track API errors and server errors and fault info is recorded; fault codes are actually HTTP response codes: https://developer.openstack.org/api-guide/compute/faults.html\n\nMy question is whether this spec is different from what nova is saving as \u0027fault\u0027 data. For example, fault code/id: how is it defined?","commit_id":"e6553ac2a01027ae56e87281793d20b531fdb92e"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"1b49fa94f62f93a02bf0a90012e16f6ab4ba4cdf","unresolved":false,"context_lines":[{"line_number":40,"context_line":"In order to address faults on nodes automatically, we need to codify potential"},{"line_number":41,"context_line":"faults, how to detect them, and how to resolve them. Additionally, we need to"},{"line_number":42,"context_line":"add a new top-level API for faults, as well as the proper DB design for storing"},{"line_number":43,"context_line":"faults. This API could be used by operators to discover all faults, list active"},{"line_number":44,"context_line":"node faults, faults that already been resolved, and resolve active faults."},{"line_number":45,"context_line":"Finally, we will add two periodic tasks to conductors: one to check nodes with"},{"line_number":46,"context_line":"active faults to see if their issue is resolved, and one to prune old,"},{"line_number":47,"context_line":"resolved faults out of the faults table."}],"source_content_type":"text/x-rst","patch_set":10,"id":"1f1a1f67_c7777c3a","line":44,"range":{"start_line":43,"start_character":68,"end_line":44,"end_character":73},"in_reply_to":"1a1ced50_2c67e0b7","updated":"2017-07-14 07:07:51.000000000","message":"IMO they are similar, but nova\u0027s is more api level, while in this spec, it\u0027s more related to node operations and states.","commit_id":"e6553ac2a01027ae56e87281793d20b531fdb92e"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"a4f76a4dad6da8712fe6fa632b1a427cb37e2a1f","unresolved":false,"context_lines":[{"line_number":52,"context_line":"should be treated similarly as a node in maintenance today: no actions taken"},{"line_number":53,"context_line":"except for attempts to resolve a fault."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"All faults will be attached to a driver interface. However, there will be a"},{"line_number":56,"context_line":"small number of generic faults registered via the BaseInterface. Each fault"},{"line_number":57,"context_line":"will consist of two parts: a name, and a method to check if the fault still"},{"line_number":58,"context_line":"exists on a node. Creating a fault will be done via decorator. For example::"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9a30ddce_cd1aaf7c","line":55,"range":{"start_line":55,"start_character":0,"end_line":55,"end_character":50},"updated":"2017-03-13 12:54:42.000000000","message":"Sorry I don\u0027t understand now this will be implemented. For example deploy interface do some action steps for deploying, how we attach fault to whole deploy interface?","commit_id":"e6553ac2a01027ae56e87281793d20b531fdb92e"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"1b49fa94f62f93a02bf0a90012e16f6ab4ba4cdf","unresolved":false,"context_lines":[{"line_number":52,"context_line":"should be treated similarly as a node in maintenance today: no actions taken"},{"line_number":53,"context_line":"except for attempts to resolve a fault."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"All faults will be attached to a driver interface. However, there will be a"},{"line_number":56,"context_line":"small number of generic faults registered via the BaseInterface. Each fault"},{"line_number":57,"context_line":"will consist of two parts: a name, and a method to check if the fault still"},{"line_number":58,"context_line":"exists on a node. Creating a fault will be done via decorator. For example::"}],"source_content_type":"text/x-rst","patch_set":10,"id":"1f1a1f67_e264a6e7","line":55,"range":{"start_line":55,"start_character":0,"end_line":55,"end_character":50},"in_reply_to":"9a30ddce_cd1aaf7c","updated":"2017-07-14 07:07:51.000000000","message":"I don\u0027t understand either, it may possible for faults that can be handled within a single driver interface, e.g., power, but for clean failure, deploy driver can\u0027t resolve the fault alone, the clean process is initiated by conductor, and other interfaces are involved.","commit_id":"e6553ac2a01027ae56e87281793d20b531fdb92e"},{"author":{"_account_id":19686,"name":"Ramamani Yeleswarapu","email":"ramamani.yeleswarapu@intel.com","username":"Rama_Y"},"change_message_id":"edbfa8dda6ee87962165bc9e73bc21c7e599c525","unresolved":false,"context_lines":[{"line_number":15,"context_line":"power status loop cannot contact the BMC) and an operator setting maintenance"},{"line_number":16,"context_line":"on a node (an explicit API action)."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"An explicit goal of this specification is to get replace any situation where"},{"line_number":19,"context_line":"ironic currently sets maintenance, and instead have ironic set a fault,"},{"line_number":20,"context_line":"leaving maintenance and maintenance_reason as operator-controlled fields."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Problem description"},{"line_number":23,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":15,"id":"7f287b81_cfd2af00","line":20,"range":{"start_line":18,"start_character":42,"end_line":20,"end_character":72},"updated":"2017-08-28 18:03:53.000000000","message":"I think this is slightly confusing. It can be reworded like this:\n\n\"... to replace any situation where ironic currently sets maintenance, with ironic setting a fault, leaving maintenance and maintenance_reason as operator-controlled fields\"","commit_id":"151554f10261d21b0945e9d394f4ec507433d604"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"7ba69d467d35ae226fd57872f92f1c7c98b5438e","unresolved":false,"context_lines":[{"line_number":15,"context_line":"power status loop cannot contact the BMC) and an operator setting maintenance"},{"line_number":16,"context_line":"on a node (an explicit API action)."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"An explicit goal of this specification is to get replace any situation where"},{"line_number":19,"context_line":"ironic currently sets maintenance, and instead have ironic set a fault,"},{"line_number":20,"context_line":"leaving maintenance and maintenance_reason as operator-controlled fields."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Problem description"},{"line_number":23,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":15,"id":"7f287b81_edd7734a","line":20,"range":{"start_line":18,"start_character":42,"end_line":20,"end_character":72},"in_reply_to":"7f287b81_cfd2af00","updated":"2017-08-30 07:42:40.000000000","message":"Done","commit_id":"151554f10261d21b0945e9d394f4ec507433d604"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"1867853b3e5d870b5a0d757add943e6f8ba0f1b9","unresolved":false,"context_lines":[{"line_number":15,"context_line":"power status loop cannot contact the BMC) and an operator setting maintenance"},{"line_number":16,"context_line":"on a node (an explicit API action)."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"An explicit goal of this specification is to get replace any situation where"},{"line_number":19,"context_line":"ironic currently sets maintenance, and instead have ironic set a fault,"},{"line_number":20,"context_line":"leaving maintenance and maintenance_reason as operator-controlled fields."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Problem description"},{"line_number":23,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":15,"id":"7f287b81_70993ec2","line":20,"range":{"start_line":18,"start_character":42,"end_line":20,"end_character":72},"in_reply_to":"7f287b81_cfd2af00","updated":"2017-08-29 05:30:22.000000000","message":"Thanks for pointing out, will do.\nthe hard part is how to keep compatibility with maintenance mode, if we assume maintenance is true when there are faults on node.\ni don\u0027t think compatibility can be achieved in this way.","commit_id":"151554f10261d21b0945e9d394f4ec507433d604"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"15f48d6c814d995af448463f775fe12f3865311b","unresolved":false,"context_lines":[{"line_number":57,"context_line":"will consist of two parts: a name, and a method to check if the fault still"},{"line_number":58,"context_line":"exists on a node. Creating a fault will be done via decorator. For example::"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"  @faults.register_fault(\u0027PowerFault\u0027)"},{"line_number":61,"context_line":"  def power_fault_verifier(self, task):"},{"line_number":62,"context_line":"      try:"},{"line_number":63,"context_line":"          task.driver.power.get_power_state(task)"},{"line_number":64,"context_line":"          return True"},{"line_number":65,"context_line":"      except Exception as e:"},{"line_number":66,"context_line":"          LOG.error(_(\u0027Failed to get power state for %(node)s, still faulted\u0027),"},{"line_number":67,"context_line":"                    {\u0027node\u0027: task.node.uuid})"},{"line_number":68,"context_line":"          return False"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Two faults will be added in this spec:"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"7f515b1d_8da83720","line":68,"range":{"start_line":60,"start_character":2,"end_line":68,"end_character":22},"updated":"2017-10-09 07:11:25.000000000","message":"Will this get called as part of fault \u0027resolve\u0027 action before setting the status of the fault as \u0027RESOLVED\u0027?","commit_id":"901180738a1730dd4347262a352a58b3f37bb325"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"25cf145bfcea7781b41efb56c79a74aa6303648c","unresolved":false,"context_lines":[{"line_number":57,"context_line":"will consist of two parts: a name, and a method to check if the fault still"},{"line_number":58,"context_line":"exists on a node. Creating a fault will be done via decorator. For example::"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"  @faults.register_fault(\u0027PowerFault\u0027)"},{"line_number":61,"context_line":"  def power_fault_verifier(self, task):"},{"line_number":62,"context_line":"      try:"},{"line_number":63,"context_line":"          task.driver.power.get_power_state(task)"},{"line_number":64,"context_line":"          return True"},{"line_number":65,"context_line":"      except Exception as e:"},{"line_number":66,"context_line":"          LOG.error(_(\u0027Failed to get power state for %(node)s, still faulted\u0027),"},{"line_number":67,"context_line":"                    {\u0027node\u0027: task.node.uuid})"},{"line_number":68,"context_line":"          return False"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Two faults will be added in this spec:"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"7f515b1d_79325df4","line":68,"range":{"start_line":60,"start_character":2,"end_line":68,"end_character":22},"in_reply_to":"7f515b1d_8da83720","updated":"2017-10-09 11:52:31.000000000","message":"I think fault detection and fault recovery are more like two distinct mechanisms, so from the original context, I think the answer is no.\nA fault transition from Active -\u003e Resolving -\u003e Resolved is handled by fault recovery.","commit_id":"901180738a1730dd4347262a352a58b3f37bb325"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"15f48d6c814d995af448463f775fe12f3865311b","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"An example of setting PowerFault on a node::"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"  with task_manager.acquire(context, node_id, shared\u003dTrue,"},{"line_number":78,"context_line":"                            purpose\u003d\u0027setting fault state\u0027) as task:"},{"line_number":79,"context_line":"    faults.add_fault(task, \u0027PowerFault\u0027,"},{"line_number":80,"context_line":"                     message\u003d\u0027Fault during power state sync\u0027)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"Any node with an active fault should be treated the same as a node in"},{"line_number":83,"context_line":"maintenance is today; no deploys permitted, and no actions taken by ironic"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7f515b1d_ad7413d0","line":80,"range":{"start_line":77,"start_character":2,"end_line":80,"end_character":61},"updated":"2017-10-09 07:11:25.000000000","message":"Where will be this called?","commit_id":"901180738a1730dd4347262a352a58b3f37bb325"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"25cf145bfcea7781b41efb56c79a74aa6303648c","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"An example of setting PowerFault on a node::"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"  with task_manager.acquire(context, node_id, shared\u003dTrue,"},{"line_number":78,"context_line":"                            purpose\u003d\u0027setting fault state\u0027) as task:"},{"line_number":79,"context_line":"    faults.add_fault(task, \u0027PowerFault\u0027,"},{"line_number":80,"context_line":"                     message\u003d\u0027Fault during power state sync\u0027)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"Any node with an active fault should be treated the same as a node in"},{"line_number":83,"context_line":"maintenance is today; no deploys permitted, and no actions taken by ironic"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7f515b1d_f9c88da8","line":80,"range":{"start_line":77,"start_character":2,"end_line":80,"end_character":61},"in_reply_to":"7f515b1d_ad7413d0","updated":"2017-10-09 11:52:31.000000000","message":"It gets called before ironic set node to maintenance, for example, in the method ``handle_sync_power_state_max_retries_exceeded`` of ironic conductor.\nSo that ironic will set a fault on node instead of set maintenance to true.","commit_id":"901180738a1730dd4347262a352a58b3f37bb325"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"25cf145bfcea7781b41efb56c79a74aa6303648c","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"If multiple faults happen on a node, faults of the same type will be"},{"line_number":87,"context_line":"updated with new fault related information, this is not allowed between"},{"line_number":88,"context_line":"different fault types. When dealing with multiple active faults, users are"},{"line_number":89,"context_line":"recommended to resolve in a temporal order, since faults are usually"},{"line_number":90,"context_line":"interconnected in a time order."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"Fault validation and auto-resolution will be bypassed when a node is manually"},{"line_number":93,"context_line":"set to maintenance mode."}],"source_content_type":"text/x-rst","patch_set":16,"id":"7f515b1d_04d3f9d6","line":90,"range":{"start_line":88,"start_character":23,"end_line":90,"end_character":31},"updated":"2017-10-09 11:52:31.000000000","message":"On second thought, this is not reliable. Suppose we have clean fault caused by power fault, we can\u0027t resolve the clean fault if power fault is active, maybe we have to define a fault priority.","commit_id":"901180738a1730dd4347262a352a58b3f37bb325"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"15f48d6c814d995af448463f775fe12f3865311b","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"* message: optional message when updating fault status."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"* extra: string representation of dictionary, provides detailed information"},{"line_number":133,"context_line":"  for diagnose or automatic resolving. The value depends on fault type and can"},{"line_number":134,"context_line":"  be extended when needed."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"State Machine Impact"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7f515b1d_38006301","line":134,"range":{"start_line":132,"start_character":9,"end_line":134,"end_character":26},"updated":"2017-10-09 07:11:25.000000000","message":"What is the \u0027automatic resolving\u0027 information? May be adding an example of this field may help.","commit_id":"901180738a1730dd4347262a352a58b3f37bb325"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"25cf145bfcea7781b41efb56c79a74aa6303648c","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"* message: optional message when updating fault status."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"* extra: string representation of dictionary, provides detailed information"},{"line_number":133,"context_line":"  for diagnose or automatic resolving. The value depends on fault type and can"},{"line_number":134,"context_line":"  be extended when needed."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"State Machine Impact"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7f515b1d_59bfa1a9","line":134,"range":{"start_line":132,"start_character":9,"end_line":134,"end_character":26},"in_reply_to":"7f515b1d_38006301","updated":"2017-10-09 11:52:31.000000000","message":"It\u0027s dedicated to record detailed information helpful for fault recovery.\nI tried but unable to identify specific fault type for ipmitool, I can only get a general error despite of ipmi network issue, ipmi credentials, etc.\nI leave it as a placeholder here for future implementation, and avoid db change later. We may want to address the clean fault recovery, then this field can be used to record the reason of clean failure, like which clean step is failing.","commit_id":"901180738a1730dd4347262a352a58b3f37bb325"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"15f48d6c814d995af448463f775fe12f3865311b","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":"  * Body: None"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"  * Response: JSON schema definition of a FaultCollection"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"* GET /v1/faults/{fault_uuid}"},{"line_number":191,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"7f515b1d_cd286fe3","line":188,"range":{"start_line":188,"start_character":2,"end_line":188,"end_character":57},"updated":"2017-10-09 07:11:25.000000000","message":"Can you add an example of response here.","commit_id":"901180738a1730dd4347262a352a58b3f37bb325"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"15f48d6c814d995af448463f775fe12f3865311b","unresolved":false,"context_lines":[{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    * Body: None"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"  * Response: JSON schema definition of a Fault"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"* POST /v1/faults/{fault_uuid}"},{"line_number":211,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"7f515b1d_0d9c470c","line":208,"range":{"start_line":208,"start_character":3,"end_line":208,"end_character":47},"updated":"2017-10-09 07:11:25.000000000","message":"Add an example here.","commit_id":"901180738a1730dd4347262a352a58b3f37bb325"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"15f48d6c814d995af448463f775fe12f3865311b","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":"* POST /v1/faults/{fault_uuid}"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"  * Perform an action on a fault"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"  * Method type POST."},{"line_number":215,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"7f515b1d_58b2ff4a","line":212,"range":{"start_line":212,"start_character":3,"end_line":212,"end_character":32},"updated":"2017-10-09 07:11:25.000000000","message":"Should node be in specific state say \u0027manageable\u0027 to perform an action on the fault?","commit_id":"901180738a1730dd4347262a352a58b3f37bb325"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"25cf145bfcea7781b41efb56c79a74aa6303648c","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":"* POST /v1/faults/{fault_uuid}"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"  * Perform an action on a fault"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"  * Method type POST."},{"line_number":215,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"7f515b1d_59de81da","line":212,"range":{"start_line":212,"start_character":3,"end_line":212,"end_character":32},"in_reply_to":"7f515b1d_58b2ff4a","updated":"2017-10-09 11:52:31.000000000","message":"I think a specific state is not required, and would be an issue for managing provision state.\nWhen ironic sets node to maintenance, the provision state is also not changed, we can keep that way.","commit_id":"901180738a1730dd4347262a352a58b3f37bb325"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"15f48d6c814d995af448463f775fe12f3865311b","unresolved":false,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"* DELETE /v1/faults/{fault_uuid}"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"  * Delete a fault from node"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"  * Method type DELETE"},{"line_number":243,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"7f515b1d_983e37b6","line":240,"range":{"start_line":240,"start_character":3,"end_line":240,"end_character":28},"updated":"2017-10-09 07:11:25.000000000","message":"Should fault be in \u0027RESOLVED\u0027 status to perform this action?Or fault in any status (ACTIVE, RESOLVING, RESOLVED)can be deleted?","commit_id":"901180738a1730dd4347262a352a58b3f37bb325"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"25cf145bfcea7781b41efb56c79a74aa6303648c","unresolved":false,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"* DELETE /v1/faults/{fault_uuid}"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"  * Delete a fault from node"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"  * Method type DELETE"},{"line_number":243,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"7f515b1d_84eda9b8","line":240,"range":{"start_line":240,"start_character":3,"end_line":240,"end_character":28},"in_reply_to":"7f515b1d_983e37b6","updated":"2017-10-09 11:52:31.000000000","message":"Fault can be removed in state Active and Resolved. Delete a fault in state of Resolving is not allowed, will update.","commit_id":"901180738a1730dd4347262a352a58b3f37bb325"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"15f48d6c814d995af448463f775fe12f3865311b","unresolved":false,"context_lines":[{"line_number":290,"context_line":""},{"line_number":291,"context_line":"  * Body: None"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"  * Response: JSON schema definition of a FaultCollection"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"To maintain compatibility with previous API microversions, the \"maintenance\""},{"line_number":296,"context_line":"field will be returned as True with \"maintenance_reason\" set to \"The node has"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7f515b1d_58443f47","line":293,"range":{"start_line":293,"start_character":2,"end_line":293,"end_character":57},"updated":"2017-10-09 07:11:25.000000000","message":"Can you add an example of response here.","commit_id":"901180738a1730dd4347262a352a58b3f37bb325"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"15f48d6c814d995af448463f775fe12f3865311b","unresolved":false,"context_lines":[{"line_number":400,"context_line":"Assignee(s)"},{"line_number":401,"context_line":"-----------"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"Primary assignee:"},{"line_number":404,"context_line":"  JayF"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"Other contributors:"},{"line_number":407,"context_line":"  mariojv"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"Work Items"},{"line_number":410,"context_line":"----------"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7f515b1d_58679fb8","line":407,"range":{"start_line":403,"start_character":0,"end_line":407,"end_character":9},"updated":"2017-10-09 07:11:25.000000000","message":"This section needs to be updates with new owners.","commit_id":"901180738a1730dd4347262a352a58b3f37bb325"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e436b0110d6d33062a4b27fc12d8a0301fe0b87d","unresolved":false,"context_lines":[{"line_number":52,"context_line":"treated similarly as a node in maintenance today: no actions taken except for"},{"line_number":53,"context_line":"attempts to resolve a fault."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"All faults will be attached to a hardware interface. However, there will be a"},{"line_number":56,"context_line":"small number of generic faults registered via the BaseInterface. Each fault"},{"line_number":57,"context_line":"will consist of two parts: a name, and a method to check if the fault still"},{"line_number":58,"context_line":"exists on a node. Creating a fault will be done via decorator. For example::"}],"source_content_type":"text/x-rst","patch_set":17,"id":"df7087c5_a6f9f3c8","line":55,"range":{"start_line":55,"start_character":33,"end_line":55,"end_character":51},"updated":"2018-03-13 03:50:33.000000000","message":"Do you mean \u0027interface of a hardware type\u0027 here?","commit_id":"22a6d70f4d1e3e383690113d207bb41e42054d22"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"4ba5ea4a31b89a71b001fbb8370fa286a830c3df","unresolved":false,"context_lines":[{"line_number":52,"context_line":"treated similarly as a node in maintenance today: no actions taken except for"},{"line_number":53,"context_line":"attempts to resolve a fault."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"All faults will be attached to a hardware interface. However, there will be a"},{"line_number":56,"context_line":"small number of generic faults registered via the BaseInterface. Each fault"},{"line_number":57,"context_line":"will consist of two parts: a name, and a method to check if the fault still"},{"line_number":58,"context_line":"exists on a node. Creating a fault will be done via decorator. For example::"}],"source_content_type":"text/x-rst","patch_set":17,"id":"df7087c5_411f7db6","line":55,"range":{"start_line":55,"start_character":33,"end_line":55,"end_character":51},"in_reply_to":"df7087c5_a6f9f3c8","updated":"2018-03-13 09:36:50.000000000","message":"Ah, yes, interface of hardware interface. The spec is proposed for a long time, some terms are nor standardized.\nwill update on next patch.","commit_id":"22a6d70f4d1e3e383690113d207bb41e42054d22"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e436b0110d6d33062a4b27fc12d8a0301fe0b87d","unresolved":false,"context_lines":[{"line_number":121,"context_line":"+----------------------------+-------------------------------------------+"},{"line_number":122,"context_line":"| message                    | str_or_none                               |"},{"line_number":123,"context_line":"+----------------------------+-------------------------------------------+"},{"line_number":124,"context_line":"| extra                      | str_or_none                               |"},{"line_number":125,"context_line":"+----------------------------+-------------------------------------------+"},{"line_number":126,"context_line":"| created_at                 | datetime_or_none                          |"},{"line_number":127,"context_line":"+----------------------------+-------------------------------------------+"}],"source_content_type":"text/x-rst","patch_set":17,"id":"df7087c5_0939d03f","line":124,"range":{"start_line":124,"start_character":2,"end_line":124,"end_character":45},"updated":"2018-03-13 03:50:33.000000000","message":"Not sure if anyone would be interested in \u0027count\u0027 to know how many times a given fault was reported or \u0027updated_at\u0027 should be sufficient ?","commit_id":"22a6d70f4d1e3e383690113d207bb41e42054d22"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"4ba5ea4a31b89a71b001fbb8370fa286a830c3df","unresolved":false,"context_lines":[{"line_number":121,"context_line":"+----------------------------+-------------------------------------------+"},{"line_number":122,"context_line":"| message                    | str_or_none                               |"},{"line_number":123,"context_line":"+----------------------------+-------------------------------------------+"},{"line_number":124,"context_line":"| extra                      | str_or_none                               |"},{"line_number":125,"context_line":"+----------------------------+-------------------------------------------+"},{"line_number":126,"context_line":"| created_at                 | datetime_or_none                          |"},{"line_number":127,"context_line":"+----------------------------+-------------------------------------------+"}],"source_content_type":"text/x-rst","patch_set":17,"id":"df7087c5_a13d392c","line":124,"range":{"start_line":124,"start_character":2,"end_line":124,"end_character":45},"in_reply_to":"df7087c5_0939d03f","updated":"2018-03-13 09:36:50.000000000","message":"The field is used for storing various information about the fault, so it\u0027s not dedicated for fault count statistics.\na fault is stored as a db record, so the count can be calculated from db query, if required.","commit_id":"22a6d70f4d1e3e383690113d207bb41e42054d22"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e436b0110d6d33062a4b27fc12d8a0301fe0b87d","unresolved":false,"context_lines":[{"line_number":274,"context_line":"        \"message\": \"During sync_power_state, max retries exceeded for node 51454e66-b052-449c-ab93-a3dde11b4310\","},{"line_number":275,"context_line":"        \"extra\": {\"error\": \"Error: Unable to establish IPMI v2 / RMCP+ session\"},"},{"line_number":276,"context_line":"        \"updated_at\": \"2017-10-16T08:05:52+00:00\","},{"line_number":277,"context_line":"        \"created_at\": \"2017-10-16T08:00:30+00:00\""},{"line_number":278,"context_line":"      }"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"* POST /v1/faults/{fault_uuid}"}],"source_content_type":"text/x-rst","patch_set":17,"id":"df7087c5_5c36a8e8","line":277,"range":{"start_line":277,"start_character":8,"end_line":277,"end_character":49},"updated":"2018-03-13 03:50:33.000000000","message":"It should also have \u0027node_id\u0027 field as mentioned in \u0027Data Model impact\u0027 section.","commit_id":"22a6d70f4d1e3e383690113d207bb41e42054d22"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"4ba5ea4a31b89a71b001fbb8370fa286a830c3df","unresolved":false,"context_lines":[{"line_number":274,"context_line":"        \"message\": \"During sync_power_state, max retries exceeded for node 51454e66-b052-449c-ab93-a3dde11b4310\","},{"line_number":275,"context_line":"        \"extra\": {\"error\": \"Error: Unable to establish IPMI v2 / RMCP+ session\"},"},{"line_number":276,"context_line":"        \"updated_at\": \"2017-10-16T08:05:52+00:00\","},{"line_number":277,"context_line":"        \"created_at\": \"2017-10-16T08:00:30+00:00\""},{"line_number":278,"context_line":"      }"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"* POST /v1/faults/{fault_uuid}"}],"source_content_type":"text/x-rst","patch_set":17,"id":"df7087c5_7cdee86d","line":277,"range":{"start_line":277,"start_character":8,"end_line":277,"end_character":49},"in_reply_to":"df7087c5_5c36a8e8","updated":"2018-03-13 09:36:50.000000000","message":"node_id is a primary key in db, I believe we shouldn\u0027t expose that to user, just like id in the node table.","commit_id":"22a6d70f4d1e3e383690113d207bb41e42054d22"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e436b0110d6d33062a4b27fc12d8a0301fe0b87d","unresolved":false,"context_lines":[{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    * message: optional, a user provided message describing this action"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    * Body: None"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"* DELETE /v1/faults/{fault_uuid}"},{"line_number":309,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"df7087c5_9d38a3ee","line":306,"range":{"start_line":306,"start_character":4,"end_line":306,"end_character":16},"updated":"2018-03-13 03:50:33.000000000","message":"Isn\u0027t \u0027action\u0027 string part of the body?","commit_id":"22a6d70f4d1e3e383690113d207bb41e42054d22"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"4ba5ea4a31b89a71b001fbb8370fa286a830c3df","unresolved":false,"context_lines":[{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    * message: optional, a user provided message describing this action"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    * Body: None"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"* DELETE /v1/faults/{fault_uuid}"},{"line_number":309,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"df7087c5_fc4e786d","line":306,"range":{"start_line":306,"start_character":4,"end_line":306,"end_character":16},"in_reply_to":"df7087c5_9d38a3ee","updated":"2018-03-13 09:36:50.000000000","message":"will update on next patch","commit_id":"22a6d70f4d1e3e383690113d207bb41e42054d22"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e436b0110d6d33062a4b27fc12d8a0301fe0b87d","unresolved":false,"context_lines":[{"line_number":458,"context_line":"  resolution periodic task should run, in seconds. Defaults to 86400 (daily)."},{"line_number":459,"context_line":"  If 0, fault resolution periodic task is disabled."},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"* `[conductor]/fault_ttl` (int): How long, in days, ironic should keep faults"},{"line_number":462,"context_line":"  stored once resolved. If 0, faults are never expired. Defaults to 90."},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"Developer impact"},{"line_number":465,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":17,"id":"df7087c5_b87255ac","line":462,"range":{"start_line":461,"start_character":0,"end_line":462,"end_character":71},"updated":"2018-03-13 03:50:33.000000000","message":"How these would be cleared? Would this need another perodic task to perform this cleanup?","commit_id":"22a6d70f4d1e3e383690113d207bb41e42054d22"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"4ba5ea4a31b89a71b001fbb8370fa286a830c3df","unresolved":false,"context_lines":[{"line_number":458,"context_line":"  resolution periodic task should run, in seconds. Defaults to 86400 (daily)."},{"line_number":459,"context_line":"  If 0, fault resolution periodic task is disabled."},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"* `[conductor]/fault_ttl` (int): How long, in days, ironic should keep faults"},{"line_number":462,"context_line":"  stored once resolved. If 0, faults are never expired. Defaults to 90."},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"Developer impact"},{"line_number":465,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":17,"id":"df7087c5_c1386def","line":462,"range":{"start_line":461,"start_character":0,"end_line":462,"end_character":71},"in_reply_to":"df7087c5_b87255ac","updated":"2018-03-13 09:36:50.000000000","message":"It\u0027s not mentioned before, I guess we need one, or reuse the task mentioned at L448.\nActually I think we\u0027d better separate this into another smaller feature, focusing on fault record maintenance, if there is requirement in practice.","commit_id":"22a6d70f4d1e3e383690113d207bb41e42054d22"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b938e116051f425c20a7a3fd9453031d486ebc5c","unresolved":false,"context_lines":[{"line_number":477,"context_line":"  kaifeng"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"Other contributors:"},{"line_number":480,"context_line":"  JayF, mariojv"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"Work Items"},{"line_number":483,"context_line":"----------"}],"source_content_type":"text/x-rst","patch_set":17,"id":"df7087c5_d960a6a8","line":480,"range":{"start_line":480,"start_character":2,"end_line":480,"end_character":15},"updated":"2018-03-09 17:17:51.000000000","message":"These people should be removed, they no longer work on ironic. On the bright side, if you agree to take a simpler path, you can add me.","commit_id":"22a6d70f4d1e3e383690113d207bb41e42054d22"}],"specs/approved/specific-fault-support.rst":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d794750a6747e4c6fbdc08d21c71ebb73f669e82","unresolved":false,"context_lines":[{"line_number":24,"context_line":"* Transient failures (such as network failures) can cause many nodes in an"},{"line_number":25,"context_line":"  environment to go into maintenance mode, acting as a denial of service."},{"line_number":26,"context_line":"  With the current boolean maintenance system, enough information does not"},{"line_number":27,"context_line":"  exist for ironic to reliably self-heal in these scenarios. (Although such"},{"line_number":28,"context_line":"  self-healing is outside the scope of this spec)."},{"line_number":29,"context_line":"* In order for ironic to heal after transient failures, such as network issues"},{"line_number":30,"context_line":"  preventing access to a BMC, fault conditions found by ironic need to be"},{"line_number":31,"context_line":"  identified separately from operator-set maintenance modes."}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_ea601da7","line":28,"range":{"start_line":27,"start_character":61,"end_line":28,"end_character":49},"updated":"2016-06-27 06:11:30.000000000","message":"nit: I\u0027d prefer it to be in scope","commit_id":"4d01b3bac2fd94147137d456a23ff73adf93790c"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"95e53bceefb9a72ec6ebd8811a9f7e061065aa3f","unresolved":false,"context_lines":[{"line_number":24,"context_line":"* Transient failures (such as network failures) can cause many nodes in an"},{"line_number":25,"context_line":"  environment to go into maintenance mode, acting as a denial of service."},{"line_number":26,"context_line":"  With the current boolean maintenance system, enough information does not"},{"line_number":27,"context_line":"  exist for ironic to reliably self-heal in these scenarios. (Although such"},{"line_number":28,"context_line":"  self-healing is outside the scope of this spec)."},{"line_number":29,"context_line":"* In order for ironic to heal after transient failures, such as network issues"},{"line_number":30,"context_line":"  preventing access to a BMC, fault conditions found by ironic need to be"},{"line_number":31,"context_line":"  identified separately from operator-set maintenance modes."}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_a2757f33","line":28,"range":{"start_line":27,"start_character":61,"end_line":28,"end_character":49},"in_reply_to":"3aaa91ec_ea601da7","updated":"2016-06-27 15:18:26.000000000","message":"Is that a volunteer to help? :P\n\nPretty much I\u0027m trying to take a small bite so it\u0027s more achievable. My hope would be once we have programatically detectable faults, the periodic tasks to clean them up would be so obvious it would be specless.","commit_id":"4d01b3bac2fd94147137d456a23ff73adf93790c"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"07937c1742cb2e6a995cb44d643497cf801c76ef","unresolved":false,"context_lines":[{"line_number":37,"context_line":"This spec proposes adding a field on the node, \"faults\" which would contain a"},{"line_number":38,"context_line":"list of Ironic-identified faults on the node. Multiple faults could be"},{"line_number":39,"context_line":"simultaneously identified on a node, such as if a node both timed out while"},{"line_number":40,"context_line":"booting a ramdisk for cleaning and BMC communication failed. These would both"},{"line_number":41,"context_line":"have to be separately resolved for the node to be treated normally again."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"#TODO / Open question: How should the data model look like for this? A list of"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_6e8724b5","line":40,"updated":"2016-06-27 03:44:10.000000000","message":"Today, Ironic puts the node into maitenance and does not perform any further act on that node. Since a \u0027list\u0027 of faults being proposed, do you mean Ironic would try to peform next steps even when some critical action on hardware (ex. communication) has failed. If the fault is of type \u0027communication failure\u0027 all subsequent operations on node would fail and fault list may have long list of failures wherein actual failure is just one.","commit_id":"4d01b3bac2fd94147137d456a23ff73adf93790c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d794750a6747e4c6fbdc08d21c71ebb73f669e82","unresolved":false,"context_lines":[{"line_number":40,"context_line":"booting a ramdisk for cleaning and BMC communication failed. These would both"},{"line_number":41,"context_line":"have to be separately resolved for the node to be treated normally again."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"#TODO / Open question: How should the data model look like for this? A list of"},{"line_number":44,"context_line":"#                      opaque error codes? Error strings?"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"By identifying the faults explicitly, we allow ironic to detect and resolve"},{"line_number":47,"context_line":"those faults, in order to later self-heal."}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_eaebfd10","line":44,"range":{"start_line":43,"start_character":0,"end_line":44,"end_character":57},"updated":"2016-06-27 06:11:30.000000000","message":"Rather a table I guess. And to put it further, a table with history, so e.g. old faults are available and searchable. But it might be out of scope here :)","commit_id":"4d01b3bac2fd94147137d456a23ff73adf93790c"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"95e53bceefb9a72ec6ebd8811a9f7e061065aa3f","unresolved":false,"context_lines":[{"line_number":40,"context_line":"booting a ramdisk for cleaning and BMC communication failed. These would both"},{"line_number":41,"context_line":"have to be separately resolved for the node to be treated normally again."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"#TODO / Open question: How should the data model look like for this? A list of"},{"line_number":44,"context_line":"#                      opaque error codes? Error strings?"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"By identifying the faults explicitly, we allow ironic to detect and resolve"},{"line_number":47,"context_line":"those faults, in order to later self-heal."}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_42cdbb5c","line":44,"range":{"start_line":43,"start_character":0,"end_line":44,"end_character":57},"in_reply_to":"3aaa91ec_eaebfd10","updated":"2016-06-27 15:18:26.000000000","message":"Yeah, we\u0027re thinking the same thing - I\u0027m just being a tad more incremental with it, but I want to make sure whatever we come up with is suitable to both of those.\n\nAlthough storing the faults might be reasonable to pull into scope with this.","commit_id":"4d01b3bac2fd94147137d456a23ff73adf93790c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d794750a6747e4c6fbdc08d21c71ebb73f669e82","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"By identifying the faults explicitly, we allow ironic to detect and resolve"},{"line_number":47,"context_line":"those faults, in order to later self-heal."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"Alternatives"},{"line_number":50,"context_line":"------------"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_8ab87912","line":48,"updated":"2016-06-27 06:11:30.000000000","message":"The biggest problem with the current maintenance-based approach is that it\u0027s very hard for a user to notice. How will faults be signaled to a user? A goal is to easily spot nodes at fault by looking at ironic node-list.","commit_id":"4d01b3bac2fd94147137d456a23ff73adf93790c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d794750a6747e4c6fbdc08d21c71ebb73f669e82","unresolved":false,"context_lines":[{"line_number":52,"context_line":"* Proposals have already been made and rejected to use the combination of"},{"line_number":53,"context_line":"  maintenance being set and a given maintenance_reason or last_error to do"},{"line_number":54,"context_line":"  self-healing due to inconsistency."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"Data model impact"},{"line_number":57,"context_line":"-----------------"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_4a497130","line":55,"updated":"2016-06-27 06:11:30.000000000","message":"there was a proposal on the summit to have something like automatic_maintenance boolean readonly field.","commit_id":"4d01b3bac2fd94147137d456a23ff73adf93790c"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"07937c1742cb2e6a995cb44d643497cf801c76ef","unresolved":false,"context_lines":[{"line_number":65,"context_line":"State Machine Impact"},{"line_number":66,"context_line":"--------------------"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"None."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"REST API impact"},{"line_number":71,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_ee6834f7","line":68,"updated":"2016-06-27 03:44:10.000000000","message":"List of faults are just reasons or formatted strings filled with relevant node data related to faults?","commit_id":"4d01b3bac2fd94147137d456a23ff73adf93790c"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"8f9f365e42150ef98f122259b1c6d415fde385a5","unresolved":false,"context_lines":[{"line_number":32,"context_line":"Proposed change"},{"line_number":33,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"In order to address faults on nodes automatically, we need a codified list of"},{"line_number":36,"context_line":"potential faults. As part of defining faults ironic is aware of. Each new"},{"line_number":37,"context_line":"fault code will need to include not only the criteria for issuing the fault as"},{"line_number":38,"context_line":"well as a method for verifying that the fault is resolved. This method can then"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa6399be_b53e30d8","line":35,"updated":"2016-10-19 20:13:55.000000000","message":"I think what you\u0027re trying to do here needs around 6 separate pieces:\n\n1. A representation of a fault itself, and what ironic can do with a fault (an interface)\n2. Specific types of faults (similar to the concept of \"fault code\" proposed here) that plug into (maybe subclass, but let\u0027s not get too specific) this interface\n3. Within each fault type:\na. A generic way of indicating whether a node is currently \"faulty\" in this way. For example, if one type of IPMI call fails, and another succeeds, it\u0027s a different fault than the case where all IPMI calls fail, but we might be able to do similar actions to fix the node. Or, it could be a different power driver, but something about the power is still anomalous.\nb. Mappings between the node representation and what \"actual fault\" (more specific than the fault type) is on the node. This could, for example, be implemented as a list of methods that return a key like \"ipmi_poweron_failure\", \"ipmi_poweroff_failure\", or \"ipmi_failure\" in general. Maybe we would need something different that could be triggered by ironic without inspecting attributes of the node, though.\nc. Mappings between the \"actual fault\" and actions that we think could resolve the \"actual fault\"\n4. DB representation of a fault, which we can discuss below\n5. Have a way to figure out which faults are on a given node or class of nodes. We can discuss this in the API section.\n6. A configurable periodic task, like the one you\u0027re talking about, that look through some subset (or all) of the faults periodically, attempting to fix them. Maybe to avoid duplication, we implement some mechanism to keep fault/node pairs distinct with a count of how many times that fault has been seen on the node and how many times that fault has been fixed. Also, it\u0027d be good to know whether that fault is currently on the node.\n\nTrying to be generic enough here that we\u0027re not stuck to a particular implementation model, but what do you think?","commit_id":"661cea00c14d9464a161ad2800c6a87396d1d4a8"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"8f9f365e42150ef98f122259b1c6d415fde385a5","unresolved":false,"context_lines":[{"line_number":39,"context_line":"be plugged into a periodic task which would run and see if the fault has"},{"line_number":40,"context_line":"been resolved and if so, mark it as resolved."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"This spec proposes adding a new DB table, \"faults\" which would contain a"},{"line_number":43,"context_line":"list of Ironic-identified faults. This new table would contain an fault UUID,"},{"line_number":44,"context_line":"node UUID, a specific fault code (which could, in code, be translated into"},{"line_number":45,"context_line":"operator-friendly strings for API responses), a field for a longer form"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa6399be_72774e9f","line":42,"range":{"start_line":42,"start_character":43,"end_line":42,"end_character":49},"updated":"2016-10-19 20:13:55.000000000","message":"maybe \"node_faults\", since this is specific to nodes? doesn\u0027t really matter","commit_id":"661cea00c14d9464a161ad2800c6a87396d1d4a8"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"8f9f365e42150ef98f122259b1c6d415fde385a5","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"This spec proposes adding a new DB table, \"faults\" which would contain a"},{"line_number":43,"context_line":"list of Ironic-identified faults. This new table would contain an fault UUID,"},{"line_number":44,"context_line":"node UUID, a specific fault code (which could, in code, be translated into"},{"line_number":45,"context_line":"operator-friendly strings for API responses), a field for a longer form"},{"line_number":46,"context_line":"error message similar to what currently goes in node.last_error, and a boolean"},{"line_number":47,"context_line":"indicating if the fault is active."}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa6399be_b515504a","line":44,"range":{"start_line":44,"start_character":28,"end_line":44,"end_character":32},"updated":"2016-10-19 20:13:55.000000000","message":"fault type? It might be better to actually just store the code in the DB and API layer translates like you\u0027re thinking about, since then changes require a microversion bump.","commit_id":"661cea00c14d9464a161ad2800c6a87396d1d4a8"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"8f9f365e42150ef98f122259b1c6d415fde385a5","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"This spec proposes adding a new DB table, \"faults\" which would contain a"},{"line_number":43,"context_line":"list of Ironic-identified faults. This new table would contain an fault UUID,"},{"line_number":44,"context_line":"node UUID, a specific fault code (which could, in code, be translated into"},{"line_number":45,"context_line":"operator-friendly strings for API responses), a field for a longer form"},{"line_number":46,"context_line":"error message similar to what currently goes in node.last_error, and a boolean"},{"line_number":47,"context_line":"indicating if the fault is active."}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa6399be_a00c2c3c","line":44,"range":{"start_line":44,"start_character":0,"end_line":44,"end_character":9},"updated":"2016-10-19 20:13:55.000000000","message":"or just node.id, like Ports have","commit_id":"661cea00c14d9464a161ad2800c6a87396d1d4a8"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"8f9f365e42150ef98f122259b1c6d415fde385a5","unresolved":false,"context_lines":[{"line_number":44,"context_line":"node UUID, a specific fault code (which could, in code, be translated into"},{"line_number":45,"context_line":"operator-friendly strings for API responses), a field for a longer form"},{"line_number":46,"context_line":"error message similar to what currently goes in node.last_error, and a boolean"},{"line_number":47,"context_line":"indicating if the fault is active."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"# Note: I think this is wrong? Maybe we should just add a calculated field"},{"line_number":50,"context_line":"# to the node to provide in an API response?"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa6399be_6002140b","line":47,"updated":"2016-10-19 20:13:55.000000000","message":"I like including all these things, but for the resolution piece, I think the counts described in point 6 on L35 might be necessary.","commit_id":"661cea00c14d9464a161ad2800c6a87396d1d4a8"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"8f9f365e42150ef98f122259b1c6d415fde385a5","unresolved":false,"context_lines":[{"line_number":57,"context_line":"node. Operators could manually initiate a resolution of a fault by calling"},{"line_number":58,"context_line":"an API endpoint to force ironic to verify if the fault is resolved. This would"},{"line_number":59,"context_line":"trigger roughly the same action that would occur in the earlier detailed"},{"line_number":60,"context_line":"periodic task."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"Multiple faults could be simultaneously identified on a node, such as if a"},{"line_number":63,"context_line":"node both timed out while booting a ramdisk for cleaning and BMC"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa6399be_e01b841a","line":60,"updated":"2016-10-19 20:13:55.000000000","message":"I haven\u0027t thought too specifically about this yet, but maybe something like:\n\n/v1/faults -- returns all faults\n/v1/faults/resolve -- tries to resolve all active faults\n/v1/faults/\u003cfault uuid\u003e -- return this fault\n/v1/faults/\u003cfault uuid\u003e/resolve -- try to resolve this fault, if it\u0027s active\n/v1/nodes/\u003cnode uuid\u003e/faults -- return faults on this node\n/v1/nodes/\u003cnode uuid\u003e/faults/resolve -- try to resolve all faults on this node\n\nwith appropriate HTTP methods and field filtering to allow more complex behavior, possibly in the future.","commit_id":"661cea00c14d9464a161ad2800c6a87396d1d4a8"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"8f9f365e42150ef98f122259b1c6d415fde385a5","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"* POWER"},{"line_number":70,"context_line":"  * Cause: Inability for ironic to access a nodes configured PowerInterface"},{"line_number":71,"context_line":"  * Automated resolution periodic task would attempt to obtain a power status"},{"line_number":72,"context_line":"    from the node. If it was able to, the node fault would be removed."},{"line_number":73,"context_line":"* MANAGEMENT"},{"line_number":74,"context_line":"  * Cause: Inability for ironic to access a nodes configured ManagementInterface"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa6399be_a0850c08","line":71,"updated":"2016-10-19 20:13:55.000000000","message":"I think this and L75 can be put in the same periodic task, instead of having 1 periodic task for each fault class. This could start degrading performance if we make it too heavyweight in the beginning.","commit_id":"661cea00c14d9464a161ad2800c6a87396d1d4a8"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"8f9f365e42150ef98f122259b1c6d415fde385a5","unresolved":false,"context_lines":[{"line_number":86,"context_line":"-----------------"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"This will add a field to the node object in the ironic db to contain a list"},{"line_number":89,"context_line":"of faults."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"#TODO: Figure out the best way to store this data and define db fields."},{"line_number":92,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa6399be_c0a3e09c","line":89,"updated":"2016-10-19 20:13:55.000000000","message":"Maybe just do all the logic to retrieve node faults by querying the new faults table by node.id, instead of adding anything to the node object.","commit_id":"661cea00c14d9464a161ad2800c6a87396d1d4a8"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"8f9f365e42150ef98f122259b1c6d415fde385a5","unresolved":false,"context_lines":[{"line_number":118,"context_line":"RPC API impact"},{"line_number":119,"context_line":"--------------"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"Changes which affect the RPC API should be listed here. For example:"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"* What are the changes, if any, to existing API calls?"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa6399be_80b008df","line":121,"updated":"2016-10-19 20:13:55.000000000","message":"probably some new calls from faults API to a faults rpcapi","commit_id":"661cea00c14d9464a161ad2800c6a87396d1d4a8"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"8f9f365e42150ef98f122259b1c6d415fde385a5","unresolved":false,"context_lines":[{"line_number":242,"context_line":""},{"line_number":243,"context_line":"Examples of things to consider here include:"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"* A periodic task might look like a small addition, but all periodic tasks run"},{"line_number":246,"context_line":"  in a single thread so a periodic task that takes a long time to run will have"},{"line_number":247,"context_line":"  an effect on the timing of other periodic tasks."},{"line_number":248,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa6399be_3bb691dc","line":245,"updated":"2016-10-19 20:13:55.000000000","message":"This will require some thought. A periodic task like the one we\u0027re discussing running in the same thread as all the others could severely degrade performance.\n\nImagine something like this:\n1. 1000 nodes experience a power outage\n2. a periodic task picks this up, initiates resolution, tries to get a power status on the 1000\n\nWhile those anomalies are being fixed, you\u0027re blocking every other periodic task.\n\nSome sort of smart rate limiting or yielding to other tasks in heavy failure scenarios like that might be needed.","commit_id":"661cea00c14d9464a161ad2800c6a87396d1d4a8"}]}
