)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"88c7980503c4ae99d67e5519a55793233a073590","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Jim Rollenhagen \u003cjim@jimrollenhagen.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-10-10 11:38:35 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add node reservations spec"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Ironic currently leaves all scheduling activities as an exercise to the"},{"line_number":10,"context_line":"client. Let\u0027s help the clients by building a scheduling system into"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"3a29b11f_8c113bb2","line":7,"updated":"2015-10-26 05:11:43.000000000","message":"claims?","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add node reservations spec"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Ironic currently leaves all scheduling activities as an exercise to the"},{"line_number":10,"context_line":"client. Let\u0027s help the clients by building a scheduling system into"},{"line_number":11,"context_line":"Ironic. Also build a filter API to help clients do their own scheduling,"},{"line_number":12,"context_line":"if wish to do so."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"fa80f949_970c66ee","line":10,"updated":"2015-11-06 03:24:53.000000000","message":"s/scheduling/placement/","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Ironic currently leaves all scheduling activities as an exercise to the"},{"line_number":10,"context_line":"client. Let\u0027s help the clients by building a scheduling system into"},{"line_number":11,"context_line":"Ironic. Also build a filter API to help clients do their own scheduling,"},{"line_number":12,"context_line":"if wish to do so."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I930912f98107d86f3beefe6343e46f419a229e46"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"fa80f949_370d7ae8","line":11,"updated":"2015-11-06 03:24:53.000000000","message":"s/scheduling/placement/","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7aec57701639c42532cc4ae508c76aefe05d7721","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Devananda van der Veen \u003cdevananda.vdv@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-11-12 08:09:27 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add node reservations spec"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Ironic currently leaves all scheduling activities as an exercise to the"},{"line_number":10,"context_line":"client. Let\u0027s help the clients by adding search and claim mechanisms into"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"da85f559_f40a2d1f","line":7,"updated":"2015-11-12 13:36:39.000000000","message":"this is called claims now","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"}],"specs/approved/node-reservations.rst":[{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":11,"context_line":"https://blueprints.launchpad.net/ironic/+spec/node-reservations"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Ironic currently leaves all scheduling activities as an exercise to the"},{"line_number":14,"context_line":"client. Let\u0027s help the clients by building a scheduling system into Ironic."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Problem description"}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_57127e0a","line":14,"updated":"2015-11-06 03:24:53.000000000","message":"ditto","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":20,"context_line":"Currently clients must implement their own scheduling mechanisms. Nova has"},{"line_number":21,"context_line":"a scheduler subsystem; no other clients do (that we know of) today. This"},{"line_number":22,"context_line":"doesn\u0027t help standalone users, and Ironic\u0027s model isn\u0027t a good fit for Nova."},{"line_number":23,"context_line":"If Ironic had a scheduler, Nova could stop dealing with individual nodes and"},{"line_number":24,"context_line":"deal with Ironic as a whole. Deployments without Nova can leverage Ironic"},{"line_number":25,"context_line":"for scheduling, rather than building their own scheduler."},{"line_number":26,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_f7fb72bf","line":23,"updated":"2015-11-06 03:24:53.000000000","message":"ditto\n\nthis line in particular reads much more clearly as:\n\nif Ironic had a placement engine, Nova could stop dealing with individual nodes\nand deal with Ironic as a whole. Deployments without Nova could leverage Ironic\nfor placement, rather than building their own engine on top of Ironic.","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"88c7980503c4ae99d67e5519a55793233a073590","unresolved":false,"context_lines":[{"line_number":23,"context_line":"If Ironic had a scheduler, Nova could stop dealing with individual nodes and"},{"line_number":24,"context_line":"deal with Ironic as a whole. Deployments without Nova can leverage Ironic"},{"line_number":25,"context_line":"for scheduling, rather than building their own scheduler."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Proposed change"},{"line_number":29,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_ac1677a5","line":26,"updated":"2015-10-26 05:11:43.000000000","message":"I would list races in nova as one more reason, really..","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"88c7980503c4ae99d67e5519a55793233a073590","unresolved":false,"context_lines":[{"line_number":31,"context_line":"Let\u0027s add a concept of \"claims\" to Ironic. A client may request a"},{"line_number":32,"context_line":"claim by passing an instance UUID, and the properties and/or"},{"line_number":33,"context_line":"capabilities that the node must have. These don\u0027t need to be exact matches;"},{"line_number":34,"context_line":"simple operators may be used for less exact matching."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"TODO(jroll): explore TTLs for claims. Defaults, configs, part of the claims"},{"line_number":37,"context_line":"request?"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_4c0b237e","line":34,"updated":"2015-10-26 05:11:43.000000000","message":"This spec doesn\u0027t quite explains (or maybe I misread) why we need a proper claim object, instead of a smart API for setting node.instance_uuid :)","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":33,"context_line":"capabilities that the node must have. These don\u0027t need to be exact matches;"},{"line_number":34,"context_line":"simple operators may be used for less exact matching."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"TODO(jroll): explore TTLs for claims. Defaults, configs, part of the claims"},{"line_number":37,"context_line":"request?"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"A successful request for a claim should \"reserve\" the node by placing"}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_17f956c7","line":36,"updated":"2015-11-06 03:24:53.000000000","message":"I don\u0027t see a benefit to TTLs here.\n\nIf I claim a Node and then deploy an instance on it, the claim continues to exist, right?\n\nSo, what if I delete that instance and then want to deploy another on the same node? Shouldn\u0027t my claim still be valid?\n\nNot that we\u0027re doing billing in ironic today, but this would seem to openthe door to providers pinning hardware to a tenant, and billing based on that pin (\"claim\") rather than by the active instance in Nova. Which is something some providers will be happy about.","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"88c7980503c4ae99d67e5519a55793233a073590","unresolved":false,"context_lines":[{"line_number":33,"context_line":"capabilities that the node must have. These don\u0027t need to be exact matches;"},{"line_number":34,"context_line":"simple operators may be used for less exact matching."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"TODO(jroll): explore TTLs for claims. Defaults, configs, part of the claims"},{"line_number":37,"context_line":"request?"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"A successful request for a claim should \"reserve\" the node by placing"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_6c105fa9","line":36,"updated":"2015-10-26 05:11:43.000000000","message":"I\u0027m not sure what nova claims are, but I seriously doubt these are related... but I may be terribly wrong here :)","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"0c654af41885c8a7776927c865a289891a9258d1","unresolved":false,"context_lines":[{"line_number":33,"context_line":"capabilities that the node must have. These don\u0027t need to be exact matches;"},{"line_number":34,"context_line":"simple operators may be used for less exact matching."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"TODO(jroll): explore TTLs for claims. Defaults, configs, part of the claims"},{"line_number":37,"context_line":"request?"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"A successful request for a claim should \"reserve\" the node by placing"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_b2dc3713","line":36,"updated":"2015-10-20 19:43:53.000000000","message":"So claims for nova seems to be on the way out, because they create resource quota inconsistencies if the code around them isn\u0027t 100% bullet proof. Any idea if the claim concept in nova being removed will impact the ironic equivalent described here? Perhaps a good idea to talk with nova folks about what is going away and why, before a similar path is followed here...","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"88c7980503c4ae99d67e5519a55793233a073590","unresolved":false,"context_lines":[{"line_number":34,"context_line":"simple operators may be used for less exact matching."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"TODO(jroll): explore TTLs for claims. Defaults, configs, part of the claims"},{"line_number":37,"context_line":"request?"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"A successful request for a claim should \"reserve\" the node by placing"},{"line_number":40,"context_line":"the instance ID on the node, and return a claim object that includes"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_0c268b16","line":37,"updated":"2015-10-26 05:11:43.000000000","message":"judging by previous experience, TTL is something we MUST have. This will probably require a flag to be stored on the first deploy with this claim, that a claim is in use.. On the other hand, we don\u0027t have a TTL for just setting instance_uuid :) maybe leave it for later","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"b9be6fd899366ef088a4a81ec167d697ef44260f","unresolved":false,"context_lines":[{"line_number":34,"context_line":"simple operators may be used for less exact matching."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"TODO(jroll): explore TTLs for claims. Defaults, configs, part of the claims"},{"line_number":37,"context_line":"request?"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"A successful request for a claim should \"reserve\" the node by placing"},{"line_number":40,"context_line":"the instance ID on the node, and return a claim object that includes"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a26ad4f_00dee7dc","line":37,"in_reply_to":"3a29b11f_0c268b16","updated":"2015-11-01 18:24:57.000000000","message":"I\u0027d put this in the \u0027get the basics working first\u0027 then add TTLs after the basic stuff is working (if this spec goes through and gets approved); less complexity initially I think is better.","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"A successful request for a claim should \"reserve\" the node by placing"},{"line_number":40,"context_line":"the instance ID on the node, and return a claim object that includes"},{"line_number":41,"context_line":"a link to the node that was reserved. That node may then be deployed to by a"},{"line_number":42,"context_line":"client. After tearing down the instance, a claim may be deleted, which will"},{"line_number":43,"context_line":"remove the instance ID from the node. Claims may also be listed and"},{"line_number":44,"context_line":"fetched by ID. To be clear, the claim creation and deletion happens"},{"line_number":45,"context_line":"outside of the deploy and tear down process."}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_b7016ab1","line":42,"updated":"2015-11-06 03:24:53.000000000","message":"I believe this is in the sense of RFC proposals (eg, MAY, MUST, etc)\n\nSo I read this to mean that:\n- if a claim exists, instance deletion MUST NOT clear node.instance_uuid\n- if a claim exists, and the associated node has an active instance, the claim CAN NOT be deleted until after the instance is deleted\n- if a claim exists and there is no active instance associated with it, then the claim itself MAY be deleted.","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"88c7980503c4ae99d67e5519a55793233a073590","unresolved":false,"context_lines":[{"line_number":39,"context_line":"A successful request for a claim should \"reserve\" the node by placing"},{"line_number":40,"context_line":"the instance ID on the node, and return a claim object that includes"},{"line_number":41,"context_line":"a link to the node that was reserved. That node may then be deployed to by a"},{"line_number":42,"context_line":"client. After tearing down the instance, a claim may be deleted, which will"},{"line_number":43,"context_line":"remove the instance ID from the node. Claims may also be listed and"},{"line_number":44,"context_line":"fetched by ID. To be clear, the claim creation and deletion happens"},{"line_number":45,"context_line":"outside of the deploy and tear down process."}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_2c234707","line":42,"updated":"2015-10-26 05:11:43.000000000","message":"define \"may\" please. will ironic delete it? nova?","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1393c73d39404539266c4e841d36134f2ca5361f","unresolved":false,"context_lines":[{"line_number":39,"context_line":"A successful request for a claim should \"reserve\" the node by placing"},{"line_number":40,"context_line":"the instance ID on the node, and return a claim object that includes"},{"line_number":41,"context_line":"a link to the node that was reserved. That node may then be deployed to by a"},{"line_number":42,"context_line":"client. After tearing down the instance, a claim may be deleted, which will"},{"line_number":43,"context_line":"remove the instance ID from the node. Claims may also be listed and"},{"line_number":44,"context_line":"fetched by ID. To be clear, the claim creation and deletion happens"},{"line_number":45,"context_line":"outside of the deploy and tear down process."}],"source_content_type":"text/x-rst","patch_set":6,"id":"da85f559_8d08e792","line":42,"in_reply_to":"fa80f949_b7016ab1","updated":"2015-11-10 15:37:33.000000000","message":"I understand it, I\u0027m interested what we actually plan to do :)","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"A request for a claim should be met with a node in the AVAILABLE"},{"line_number":48,"context_line":"state that meets the requirements in the request. If no node can meet"},{"line_number":49,"context_line":"the request, a 404 should be returned."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Nodes may continue to be deployed without a claim, for clients that"},{"line_number":52,"context_line":"wish to continue doing their own scheduling (and for backwards compatibility"}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_d7fe6ead","line":49,"updated":"2015-11-06 03:24:53.000000000","message":"404 NOT FOUND is not the right response, because claim creation is not done with a GET request.\n\nI don\u0027t have the RFC in front of me, but I think it\u0027s a 402","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"88c7980503c4ae99d67e5519a55793233a073590","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"A request for a claim should be met with a node in the AVAILABLE"},{"line_number":48,"context_line":"state that meets the requirements in the request. If no node can meet"},{"line_number":49,"context_line":"the request, a 404 should be returned."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Nodes may continue to be deployed without a claim, for clients that"},{"line_number":52,"context_line":"wish to continue doing their own scheduling (and for backwards compatibility"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_cc1f33b6","line":49,"updated":"2015-10-26 05:11:43.000000000","message":"Will we prevent users from moving nodes with claims to e.g. MANAEABLE? (except for maintenance mode, obviously)","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1393c73d39404539266c4e841d36134f2ca5361f","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"A request for a claim should be met with a node in the AVAILABLE"},{"line_number":48,"context_line":"state that meets the requirements in the request. If no node can meet"},{"line_number":49,"context_line":"the request, a 404 should be returned."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Nodes may continue to be deployed without a claim, for clients that"},{"line_number":52,"context_line":"wish to continue doing their own scheduling (and for backwards compatibility"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da85f559_ad212bfd","line":49,"in_reply_to":"fa80f949_d7fe6ead","updated":"2015-11-10 15:37:33.000000000","message":"Not sure 404 is only for GET. 402 Payment Required is a great code for use, but I\u0027m afraid it\u0027s not perfect as well :) not sure what you meant here, but list of HTTP codes is too short IMO to find an exact match for any case.","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":56,"context_line":"properties that can be scheduled against (node properties, node capabilities,"},{"line_number":57,"context_line":"etc.) should be in a separate table rather than a JSON blob. This will allow"},{"line_number":58,"context_line":"for indexing this data and querying against it, rather than looping through"},{"line_number":59,"context_line":"all nodes."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"Since we\u0027ll already have code internally to do filtering of nodes based on"},{"line_number":62,"context_line":"properties and capabilities, we should also put an API in front of that for"}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_772ea244","line":59,"updated":"2015-11-06 03:24:53.000000000","message":"+1000","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"88c7980503c4ae99d67e5519a55793233a073590","unresolved":false,"context_lines":[{"line_number":56,"context_line":"properties that can be scheduled against (node properties, node capabilities,"},{"line_number":57,"context_line":"etc.) should be in a separate table rather than a JSON blob. This will allow"},{"line_number":58,"context_line":"for indexing this data and querying against it, rather than looping through"},{"line_number":59,"context_line":"all nodes."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"Since we\u0027ll already have code internally to do filtering of nodes based on"},{"line_number":62,"context_line":"properties and capabilities, we should also put an API in front of that for"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_ec1c6fc3","line":59,"updated":"2015-10-26 05:11:43.000000000","message":"\\o/","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"be40c98327cbba6833f762ebc9c002f695993710","unresolved":false,"context_lines":[{"line_number":74,"context_line":"Data model impact"},{"line_number":75,"context_line":"-----------------"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"A new ``claims`` table will be added, with accompanying migrations."},{"line_number":78,"context_line":"This table will have the following fields:"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"* `created_at` - DATETIME - the timestamp of creation"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_6d2e568d","line":77,"updated":"2015-10-22 23:27:36.000000000","message":"the only thing to migrate is to add the (empty) table, right?","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"88c7980503c4ae99d67e5519a55793233a073590","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"* `node_id` - INT - foreign key to the node being reserved"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"  * TODO(jroll): should this be node_uuid (and not a foreign key)?"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"* `id` - INT - auto-increment ID"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_8c785bfa","line":86,"updated":"2015-10-26 05:11:43.000000000","message":"no :)","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"* `id` - INT - auto-increment ID"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* `uuid` - STRING - unique UUID4 for the claim"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"A new ``properties`` table will be added, with accompanying migrations."},{"line_number":93,"context_line":"This table will have the following fields:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_973306ab","line":90,"updated":"2015-11-06 03:24:53.000000000","message":"what about claims for \u003e1 node at a time? If there\u0027s a UNIQUE index on uuid,\nthen this structure will prevent multinode claims. And if there\u0027s not a UX on this,\nthen we\u0027re duplicating the uuid in every row for that claim. Which we could do, though\nit\u0027s not \"normalized\", and we could end up with different metadata on different rows for the same claim.\n\nAs such, I\u0027d suggest using two table for this:\n\n``claims``: created_at, updated_at, id, uuid, [user_id, request_details, and maybe some other metadata]\n\n``claim_node_ref``: claim_id, node_id, ref_id INT AUTO_INCREMENT, INDEX (claim_id, node_id), UNIQUE INDEX (node_id), FOREIGN KEY (claim_id) REF claims.id ON DELETE CASCADE, FOREIGN KEY (node_id) REF nodes.id ON DELETE RESTRICT\n\nThis structure does a few things:\n- deletion of a claim automatically deletes the claim_node_ref entries for it,\n- deletion of a node isn\u0027t possible while there\u0027s an active claim on it,\n- a single claim can be associated with an arbitrary number of nodes","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1393c73d39404539266c4e841d36134f2ca5361f","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"* `id` - INT - auto-increment ID"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* `uuid` - STRING - unique UUID4 for the claim"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"A new ``properties`` table will be added, with accompanying migrations."},{"line_number":93,"context_line":"This table will have the following fields:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da85f559_0d515762","line":90,"in_reply_to":"fa80f949_973306ab","updated":"2015-11-10 15:37:33.000000000","message":"Why would we need it? If we do it properly, we need to have multi-node locking. If we don\u0027t lock all nodes together, then why not create N claims?","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"be40c98327cbba6833f762ebc9c002f695993710","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* `uuid` - STRING - unique UUID4 for the claim"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"A new ``properties`` table will be added, with accompanying migrations."},{"line_number":93,"context_line":"This table will have the following fields:"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* `created_at` - DATETIME - the timestamp of creation"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_4d4a7a56","line":92,"updated":"2015-10-22 23:27:36.000000000","message":"maybe \u0027node-properties\u0027 in case we ever have eg a \u0027driver-properties\u0027","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* `uuid` - STRING - unique UUID4 for the claim"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"A new ``properties`` table will be added, with accompanying migrations."},{"line_number":93,"context_line":"This table will have the following fields:"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* `created_at` - DATETIME - the timestamp of creation"}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_37249a5e","line":92,"updated":"2015-11-06 03:24:53.000000000","message":"rloo++","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"88c7980503c4ae99d67e5519a55793233a073590","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* `uuid` - STRING - unique UUID4 for the claim"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"A new ``properties`` table will be added, with accompanying migrations."},{"line_number":93,"context_line":"This table will have the following fields:"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* `created_at` - DATETIME - the timestamp of creation"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_ac7d17e9","line":92,"updated":"2015-10-26 05:11:43.000000000","message":"rloo++, I would avoid reserving such a generic name","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":90,"context_line":"* `uuid` - STRING - unique UUID4 for the claim"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"A new ``properties`` table will be added, with accompanying migrations."},{"line_number":93,"context_line":"This table will have the following fields:"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* `created_at` - DATETIME - the timestamp of creation"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_57291e36","line":93,"updated":"2015-11-06 03:24:53.000000000","message":"rloo, yes, though that\u0027s going to be messy, because we have nested dicts in node.properties today.\n\n(what about nested nested dicts? how many levels do we need to handle?)","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"be40c98327cbba6833f762ebc9c002f695993710","unresolved":false,"context_lines":[{"line_number":90,"context_line":"* `uuid` - STRING - unique UUID4 for the claim"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"A new ``properties`` table will be added, with accompanying migrations."},{"line_number":93,"context_line":"This table will have the following fields:"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* `created_at` - DATETIME - the timestamp of creation"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_cd552afa","line":93,"updated":"2015-10-22 23:27:36.000000000","message":"we\u0027d migrate the stuff in node.properties to this and delete node.properties, right?","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"be40c98327cbba6833f762ebc9c002f695993710","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"* `updated_at` - DATETIME - the timestamp of the last update"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"* `node_id` - INT - foreign key to the node being reserved"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"* `id` - INT - auto-increment ID"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_4d611ad2","line":99,"updated":"2015-10-22 23:27:36.000000000","message":"not reserving anything; looks like copy/paste issue :)","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"be40c98327cbba6833f762ebc9c002f695993710","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"* `updated_at` - DATETIME - the timestamp of the last update"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"* `node_id` - INT - foreign key to the node being reserved"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"* `id` - INT - auto-increment ID"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_0d9ec2b8","line":114,"updated":"2015-10-22 23:27:36.000000000","message":"ditto","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"be40c98327cbba6833f762ebc9c002f695993710","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"* `key` - STRING - the key for the property."},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"* `value` - STRING - the value for the property."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"The ``node.properties`` and ``node.capabilities`` fields should be lazily"},{"line_number":123,"context_line":"migrated to the corresponding tables on node.save, to avoid a migration"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_cda3eafe","line":120,"updated":"2015-10-22 23:27:36.000000000","message":"the above two are s/property/capability/","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"* `value` - STRING - the value for the property."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"The ``node.properties`` and ``node.capabilities`` fields should be lazily"},{"line_number":123,"context_line":"migrated to the corresponding tables on node.save, to avoid a migration"},{"line_number":124,"context_line":"that can not be performed while services are online. These fields should"},{"line_number":125,"context_line":"be deleted in a later release."}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_f7229251","line":122,"updated":"2015-11-06 03:24:53.000000000","message":"\"capabilities\" is actually a nested field within node.properties today.\nExtracting that to a top level resource is great -- but we should be clear\nin the spec about the current status.","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"88c7980503c4ae99d67e5519a55793233a073590","unresolved":false,"context_lines":[{"line_number":125,"context_line":"be deleted in a later release."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"TODO(jroll): since properties is a JSON blob with arbitrary depth, how do we"},{"line_number":128,"context_line":"handle key/value pairs not at the top level?"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"State Machine Impact"},{"line_number":131,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_4c8243ca","line":128,"updated":"2015-10-26 05:11:43.000000000","message":"Ruby, e.g. root device hints are stored in a dict... I suggest we make such fields top level.","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":125,"context_line":"be deleted in a later release."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"TODO(jroll): since properties is a JSON blob with arbitrary depth, how do we"},{"line_number":128,"context_line":"handle key/value pairs not at the top level?"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"State Machine Impact"},{"line_number":131,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_17207647","line":128,"updated":"2015-11-06 03:24:53.000000000","message":"Yea, any downstream user can nest data as many levels deep as they want.... for example, take a look at the \"pxeless ilo deploy\" spec. It\u0027s proposing to store driver_info[\u0027ip_address_info\u0027] \u003d [ {dict of things}, {dict of things}, ...]\n\nSo that\u0027s a nested list of dicts. Possible today.\n\nI suggest we simply migrate the key/value pairs as they are, and index on a prefix of the value. So in the case of:\n\n  properties[\u0027cpu_arch\u0027] \u003d \u0027x86_64\u0027\n\nwe get the following row in the new table:\n\n  properties: (\u0027cpu_arch\u0027, \u0027x86_64\u0027)\n\nAnd in the case of a weird nested dict, we might get the following row:\n\n  properties: (\u0027my_nested_dict\u0027, \u0027{\"foo\": \"bar\", \"baz\": \"kazoo\"}\u0027)\n\nThis value becomes essentially unindexable, but we get a lot of benefit right away for non-nested fields. And anyone who wants to leverage the new API for searching can migrate their nested field to top-level keys.","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"be40c98327cbba6833f762ebc9c002f695993710","unresolved":false,"context_lines":[{"line_number":125,"context_line":"be deleted in a later release."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"TODO(jroll): since properties is a JSON blob with arbitrary depth, how do we"},{"line_number":128,"context_line":"handle key/value pairs not at the top level?"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"State Machine Impact"},{"line_number":131,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_4d8fda74","line":128,"updated":"2015-10-22 23:27:36.000000000","message":"what else do we have besides properties[\u0027capabilities\u0027] that is complex? Do we need to take something else apart?","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"51d4d60d9fda7c7f04b197849636bcfedd140a9e","unresolved":false,"context_lines":[{"line_number":125,"context_line":"be deleted in a later release."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"TODO(jroll): since properties is a JSON blob with arbitrary depth, how do we"},{"line_number":128,"context_line":"handle key/value pairs not at the top level?"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"State Machine Impact"},{"line_number":131,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a26ad4f_ae7438fd","line":128,"in_reply_to":"3a29b11f_4c8243ca","updated":"2015-11-01 06:39:08.000000000","message":"And any arbitrary field that someone stores data in :(","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1393c73d39404539266c4e841d36134f2ca5361f","unresolved":false,"context_lines":[{"line_number":125,"context_line":"be deleted in a later release."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"TODO(jroll): since properties is a JSON blob with arbitrary depth, how do we"},{"line_number":128,"context_line":"handle key/value pairs not at the top level?"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"State Machine Impact"},{"line_number":131,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da85f559_88ed3527","line":128,"in_reply_to":"fa80f949_17207647","updated":"2015-11-10 15:37:33.000000000","message":"Not sure I get it. So we create a table with 2 columns: key and value. Key is, well, a key. Value is essentially a JSON value encoded as a string.\n\nNext, when we have a node search request, we figure out if value is of a simple type or of a complex one. For complex types (dict, list) we return error 400. For simple types we JSON-encode them and then proceed with usual indexed search.\n\nIs it correct?","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"be40c98327cbba6833f762ebc9c002f695993710","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"POST /v1/claims"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"* Reserve a node that matches the requested properties."},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"* Returns 201 Created on success"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_2d3dbe8e","line":145,"updated":"2015-10-22 23:27:36.000000000","message":"would someone want to specify the number of nodes that they want?","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"POST /v1/claims"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"* Reserve a node that matches the requested properties."},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"* Returns 201 Created on success"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_b7188a1f","line":145,"updated":"2015-11-06 03:24:53.000000000","message":"yes - I think claim needs to accept a count, and be atomic (claim all or none)","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1393c73d39404539266c4e841d36134f2ca5361f","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"POST /v1/claims"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"* Reserve a node that matches the requested properties."},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"* Returns 201 Created on success"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"da85f559_48ce6db5","line":145,"in_reply_to":"fa80f949_b7188a1f","updated":"2015-11-10 15:37:33.000000000","message":"This again reminds me of multi-node locks... maybe we could do without them though","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"* Returns 201 Created on success"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"* Returns 404 Not Found if no node was found to match the requested"},{"line_number":150,"context_line":"  properties."},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"* Request body::"}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_d7150ee5","line":149,"updated":"2015-11-06 03:24:53.000000000","message":"I need to check, but I think the RFC sais 404 should only be used for GET requests","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":151,"context_line":""},{"line_number":152,"context_line":"* Request body::"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    {"},{"line_number":155,"context_line":"        \"memory_mb\": \u003cint_or_none\u003e,"},{"line_number":156,"context_line":"        \"root_gb\": \u003cint_or_none\u003e,"},{"line_number":157,"context_line":"        \"ephemeral_gb\": \u003cint_or_none\u003e,"}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_77d5421a","line":154,"updated":"2015-11-06 03:24:53.000000000","message":"hm, yea, instance_uuid should be optional. Nova is going to pass it, but other clients may not.","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"88c7980503c4ae99d67e5519a55793233a073590","unresolved":false,"context_lines":[{"line_number":151,"context_line":""},{"line_number":152,"context_line":"* Request body::"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    {"},{"line_number":155,"context_line":"        \"memory_mb\": \u003cint_or_none\u003e,"},{"line_number":156,"context_line":"        \"root_gb\": \u003cint_or_none\u003e,"},{"line_number":157,"context_line":"        \"ephemeral_gb\": \u003cint_or_none\u003e,"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_6c87ffd7","line":154,"updated":"2015-10-26 05:11:43.000000000","message":"instance_uuid","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        \"memory_mb\": \u003cint_or_none\u003e,"},{"line_number":156,"context_line":"        \"root_gb\": \u003cint_or_none\u003e,"},{"line_number":157,"context_line":"        \"ephemeral_gb\": \u003cint_or_none\u003e,"},{"line_number":158,"context_line":"        \"image\": \u003cuuid_or_none\u003e"},{"line_number":159,"context_line":"        TODO(jroll): add capabilities, etc."},{"line_number":160,"context_line":"        TODO(jroll): what kind of validation should we do here? Have a strict"},{"line_number":161,"context_line":"                     list of keys that may be passed? Ignore keys we don\u0027t"}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_97da264b","line":158,"updated":"2015-11-06 03:24:53.000000000","message":"why is image included here? \n\nI can see, if it\u0027s a Glance image, that ironic might query Glance to get some capability/requirements from the image metadata. But what does this mean if it\u0027s a simple HTTP URL?","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"6e6ecefe609b19ca0b9886d6fd0aa63a80301761","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        \"memory_mb\": \u003cint_or_none\u003e,"},{"line_number":156,"context_line":"        \"root_gb\": \u003cint_or_none\u003e,"},{"line_number":157,"context_line":"        \"ephemeral_gb\": \u003cint_or_none\u003e,"},{"line_number":158,"context_line":"        \"image\": \u003cuuid_or_none\u003e"},{"line_number":159,"context_line":"        TODO(jroll): add capabilities, etc."},{"line_number":160,"context_line":"        TODO(jroll): what kind of validation should we do here? Have a strict"},{"line_number":161,"context_line":"                     list of keys that may be passed? Ignore keys we don\u0027t"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da85f559_14347adc","line":158,"in_reply_to":"fa80f949_97da264b","updated":"2015-11-06 21:13:17.000000000","message":"Maybe this should be image_metadata, or something? Need to poke around more.","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"be40c98327cbba6833f762ebc9c002f695993710","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        \"root_gb\": \u003cint_or_none\u003e,"},{"line_number":157,"context_line":"        \"ephemeral_gb\": \u003cint_or_none\u003e,"},{"line_number":158,"context_line":"        \"image\": \u003cuuid_or_none\u003e"},{"line_number":159,"context_line":"        TODO(jroll): add capabilities, etc."},{"line_number":160,"context_line":"        TODO(jroll): what kind of validation should we do here? Have a strict"},{"line_number":161,"context_line":"                     list of keys that may be passed? Ignore keys we don\u0027t"},{"line_number":162,"context_line":"                     know about?"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_cd244a61","line":159,"updated":"2015-10-22 23:27:36.000000000","message":"how do you distinguish between properties and capabilities? and can one have the same key in both properties and capabilities table?\n\nI don\u0027t think we should ignore keys we don\u0027t know about; if it is in the request body, it needs to be filtered.  So if that key is non-existent, that means no node satisfies the request.","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        \"root_gb\": \u003cint_or_none\u003e,"},{"line_number":157,"context_line":"        \"ephemeral_gb\": \u003cint_or_none\u003e,"},{"line_number":158,"context_line":"        \"image\": \u003cuuid_or_none\u003e"},{"line_number":159,"context_line":"        TODO(jroll): add capabilities, etc."},{"line_number":160,"context_line":"        TODO(jroll): what kind of validation should we do here? Have a strict"},{"line_number":161,"context_line":"                     list of keys that may be passed? Ignore keys we don\u0027t"},{"line_number":162,"context_line":"                     know about?"}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_37db3a51","line":159,"updated":"2015-11-06 03:24:53.000000000","message":"make everything top level in this API. how much RAM a machine has is just as important as whether it has a GPU or not.\n\nyes, that deviates from Nova slightly, but this *is* a different space. We can translate in the virt driver.","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"6e6ecefe609b19ca0b9886d6fd0aa63a80301761","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        \"root_gb\": \u003cint_or_none\u003e,"},{"line_number":157,"context_line":"        \"ephemeral_gb\": \u003cint_or_none\u003e,"},{"line_number":158,"context_line":"        \"image\": \u003cuuid_or_none\u003e"},{"line_number":159,"context_line":"        TODO(jroll): add capabilities, etc."},{"line_number":160,"context_line":"        TODO(jroll): what kind of validation should we do here? Have a strict"},{"line_number":161,"context_line":"                     list of keys that may be passed? Ignore keys we don\u0027t"},{"line_number":162,"context_line":"                     know about?"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da85f559_d44cb278","line":159,"in_reply_to":"fa80f949_37db3a51","updated":"2015-11-06 21:13:17.000000000","message":"Actually, I was thinking of making properties a top level key, capabilities a top level key, etc. (since those are different tables)","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1393c73d39404539266c4e841d36134f2ca5361f","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        \"root_gb\": \u003cint_or_none\u003e,"},{"line_number":157,"context_line":"        \"ephemeral_gb\": \u003cint_or_none\u003e,"},{"line_number":158,"context_line":"        \"image\": \u003cuuid_or_none\u003e"},{"line_number":159,"context_line":"        TODO(jroll): add capabilities, etc."},{"line_number":160,"context_line":"        TODO(jroll): what kind of validation should we do here? Have a strict"},{"line_number":161,"context_line":"                     list of keys that may be passed? Ignore keys we don\u0027t"},{"line_number":162,"context_line":"                     know about?"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da85f559_88a535b6","line":159,"in_reply_to":"fa80f949_37db3a51","updated":"2015-11-10 15:37:33.000000000","message":"I think I agree that capabilities and properties might not be very different from user\u0027s point of view..","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        \"ephemeral_gb\": \u003cint_or_none\u003e,"},{"line_number":158,"context_line":"        \"image\": \u003cuuid_or_none\u003e"},{"line_number":159,"context_line":"        TODO(jroll): add capabilities, etc."},{"line_number":160,"context_line":"        TODO(jroll): what kind of validation should we do here? Have a strict"},{"line_number":161,"context_line":"                     list of keys that may be passed? Ignore keys we don\u0027t"},{"line_number":162,"context_line":"                     know about?"},{"line_number":163,"context_line":"    }"}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_57e03efa","line":160,"updated":"2015-11-06 03:24:53.000000000","message":"both properties and capabilities support artibrary keys. There is also a subset of keys that we require today (because Nova requires them). But if a user doesn\u0027t care how large the root disk is, I dont think they should need to pass root_gb or ephemeral_gb or swap.\n\nConversely, if they pass a key, we had better honor it, even if we don\u0027t know about it.\n\nThe answer to \"Find me a machine that is a zebra\" is not \"Here\u0027s a machine, but I dont know what a zebra is\". The answer is just \"I dont know what a zebra is\".","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        TODO(jroll): add capabilities, etc."},{"line_number":160,"context_line":"        TODO(jroll): what kind of validation should we do here? Have a strict"},{"line_number":161,"context_line":"                     list of keys that may be passed? Ignore keys we don\u0027t"},{"line_number":162,"context_line":"                     know about?"},{"line_number":163,"context_line":"    }"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"* No request parameters are required; only parameters passed will be used for"}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_f7e932e7","line":162,"updated":"2015-11-06 03:24:53.000000000","message":"@Meghal, I think AZ-related hints need to be supported.\n\nHere\u0027s an idea floating around in my brain... Could you store a key that represents this and then pass hints down? I don\u0027t see why not. For example,\n\n  node.properties[\u0027location\u0027] \u003d \u0027BLD-A-NW-ROW-2-12\u0027\n\nand then you could request nodes that match \u0027BLD-A-NW-ROW-2-%\u0027 or just \u0027BLD-A-NW-%\u0027 or so on.\n\nHowever, you asked also about creating new pluggable filters, and I think that\u0027s a VERY different discussion. No where in this proposal has there been talk of creating a pluggable filter API, and I do not want to create a service akin to Nova\u0027s that pulls back all the Node data into Python and loops over a bunch of arbitrary customizable python scripts.","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":7455,"name":"Meghal Gosalia","username":"meghal"},"change_message_id":"a1e118922e334ff1160b26a58891261d3c86a4da","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        TODO(jroll): add capabilities, etc."},{"line_number":160,"context_line":"        TODO(jroll): what kind of validation should we do here? Have a strict"},{"line_number":161,"context_line":"                     list of keys that may be passed? Ignore keys we don\u0027t"},{"line_number":162,"context_line":"                     know about?"},{"line_number":163,"context_line":"    }"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"* No request parameters are required; only parameters passed will be used for"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_4abc07dc","line":162,"updated":"2015-10-20 22:55:44.000000000","message":"What are your thoughts on adding availability-zone or scheduling hints to this list ?\n\nI understand that availability-zone do not directly gel with Ironic concept as it is related to a nova-compute host and not the nodes that nova-compute host represent.\nBut, in any case we do leverage availability zone concept at Yahoo to allow users to pass availability zone during nova boot and select an ironic node whose capabilities match the AZ params. Same applies to scheduling hints. \n\nSo, the question that comes up is that will the new ironic endpoint allow creation of new pluggable filters which will allow the modification of the scheduling behavior ?","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":7455,"name":"Meghal Gosalia","username":"meghal"},"change_message_id":"c49373c1bffe34d962c06a4c8955e6823e7e4fd4","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        TODO(jroll): add capabilities, etc."},{"line_number":160,"context_line":"        TODO(jroll): what kind of validation should we do here? Have a strict"},{"line_number":161,"context_line":"                     list of keys that may be passed? Ignore keys we don\u0027t"},{"line_number":162,"context_line":"                     know about?"},{"line_number":163,"context_line":"    }"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"* No request parameters are required; only parameters passed will be used for"}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_08f59455","line":162,"in_reply_to":"fa80f949_f7e932e7","updated":"2015-11-06 18:21:46.000000000","message":"Question - how is the filter api going to identify nodes ?\n\nIs entire operation going to be limited to raw db queries, getting a list of nodes and picking one at random ?\n\nOr will it be doing db query based on some criteria, identifying list of nodes, comparing remaining key value pairs in request spec to key value pairs in properties, truncating the list further and then picking one at random ?\n\nThat will help us understand what needs to be accepted from request-spec.","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"88c7980503c4ae99d67e5519a55793233a073590","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        \"uuid\": \u003cuuid\u003e,"},{"line_number":172,"context_line":"        \"node_uuid\": \u003cuuid\u003e,"},{"line_number":173,"context_line":"        \"created_at\": \u003cdatetime\u003e,"},{"line_number":174,"context_line":"        \"updated_at\": \u003cdatetime\u003e"},{"line_number":175,"context_line":"    }"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"GET /v1/claims"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_0c6d2b32","line":174,"updated":"2015-10-26 05:11:43.000000000","message":"if we introduce TTL\u0027s, a TTL should be here","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"be40c98327cbba6833f762ebc9c002f695993710","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"* Should be no error cases."},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"* No additional parameters."},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"* Empty request body."},{"line_number":188,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_4dc7da63","line":185,"updated":"2015-10-22 23:27:36.000000000","message":"since this is returning a list, I looked at the parameters we have for other list-like requests and we have (drum roll):\n - marker\n - limit\n - sort key (eg sort on claim uuid, node-uuid, create/update date?)\n - sort dir","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a58e4e6bec49871e9175ce2c2da3a1e9743bad2c","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        \"updated_at\": \u003cdatetime\u003e"},{"line_number":219,"context_line":"    }"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"DELETE /v1/claims/\u003cuuid\u003e"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"* Deletes the claim object for \u003cuuid\u003e."},{"line_number":224,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa80f949_17e71612","line":221,"updated":"2015-11-06 03:24:53.000000000","message":"what if the node has an active instance, and thus the claim can\u0027t be deleted yet?","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"be40c98327cbba6833f762ebc9c002f695993710","unresolved":false,"context_lines":[{"line_number":233,"context_line":"* Empty response body."},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"The API version should be bumped for this feature."},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"Client (CLI) impact"},{"line_number":238,"context_line":"-------------------"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_2d8e1e2e","line":236,"updated":"2015-10-22 23:27:36.000000000","message":"How can i get a list of nodes that have been claimed, or a list of nodes that have not been claimed?\n\nOr a list of nodes that have been claimed but not deployed to?","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"be40c98327cbba6833f762ebc9c002f695993710","unresolved":false,"context_lines":[{"line_number":259,"context_line":"--------------"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"RPC methods will need to be created to allow claim create to happen in"},{"line_number":262,"context_line":"the conductor. TODO(jroll) is this required or can we just do it in the API"},{"line_number":263,"context_line":"layer?"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"Driver API impact"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a29b11f_2d95be31","line":262,"updated":"2015-10-22 23:27:36.000000000","message":"Doesn\u0027t it have to be done at conductor layer cuz it is accessing the DB?","commit_id":"0de07d7196d42256d4e1ac14f8828043b103b306"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"480fcd38d8322245c7b68414468dc126c7e7a93f","unresolved":false,"context_lines":[{"line_number":44,"context_line":"and/or capabilities that the node(s) must have. The request may include a claim"},{"line_number":45,"context_line":"ID; if one is not supplied, Ironic shall generate one; if the claim ID is"},{"line_number":46,"context_line":"already registered with Ironic, and the new request is successful, claimed"},{"line_number":47,"context_line":"resources will be added to the existing claim."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"The claim API will accept a query string contianing one or more properties to"},{"line_number":50,"context_line":"match against the set of available nodes. The set of allowed operators will be:"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_34ff3eac","line":47,"updated":"2015-11-12 19:48:06.000000000","message":"Oh, oops. I will remove this.\n\nIt was an idea I was sketching out in earlier local drafts, but then removed (or thought I did).","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7aec57701639c42532cc4ae508c76aefe05d7721","unresolved":false,"context_lines":[{"line_number":44,"context_line":"and/or capabilities that the node(s) must have. The request may include a claim"},{"line_number":45,"context_line":"ID; if one is not supplied, Ironic shall generate one; if the claim ID is"},{"line_number":46,"context_line":"already registered with Ironic, and the new request is successful, claimed"},{"line_number":47,"context_line":"resources will be added to the existing claim."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"The claim API will accept a query string contianing one or more properties to"},{"line_number":50,"context_line":"match against the set of available nodes. The set of allowed operators will be:"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_9416414a","line":47,"updated":"2015-11-12 13:36:39.000000000","message":"What\u0027s the use case for this? Definitely not something that nova would use, right? I\u0027m afraid of the confusion it might bring.","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e2f3a460d1f806a3d13e7d7bfb6aed9ed63d36ee","unresolved":false,"context_lines":[{"line_number":44,"context_line":"and/or capabilities that the node(s) must have. The request may include a claim"},{"line_number":45,"context_line":"ID; if one is not supplied, Ironic shall generate one; if the claim ID is"},{"line_number":46,"context_line":"already registered with Ironic, and the new request is successful, claimed"},{"line_number":47,"context_line":"resources will be added to the existing claim."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"The claim API will accept a query string contianing one or more properties to"},{"line_number":50,"context_line":"match against the set of available nodes. The set of allowed operators will be:"}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba8a016a_a5aa1484","line":47,"in_reply_to":"da85f559_34ff3eac","updated":"2015-11-16 12:15:07.000000000","message":"++ to remove it","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e2f3a460d1f806a3d13e7d7bfb6aed9ed63d36ee","unresolved":false,"context_lines":[{"line_number":46,"context_line":"already registered with Ironic, and the new request is successful, claimed"},{"line_number":47,"context_line":"resources will be added to the existing claim."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"The claim API will accept a query string contianing one or more properties to"},{"line_number":50,"context_line":"match against the set of available nodes. The set of allowed operators will be:"},{"line_number":51,"context_line":"\u0027\u003d\u0027, \u0027\u003c\u0027, \u0027\u003e\u0027, \u0027\u003c\u003d\u0027, \u0027\u003e\u003d\u0027, \u0027!\u003d\u0027, \u0027in\u0027, \u0027begins_with\u0027, \u0027ends_with\u0027."},{"line_number":52,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba8a016a_259f0461","line":49,"updated":"2015-11-16 12:15:07.000000000","message":"containing","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7aec57701639c42532cc4ae508c76aefe05d7721","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"The claim API will accept a query string contianing one or more properties to"},{"line_number":50,"context_line":"match against the set of available nodes. The set of allowed operators will be:"},{"line_number":51,"context_line":"\u0027\u003d\u0027, \u0027\u003c\u0027, \u0027\u003e\u0027, \u0027\u003c\u003d\u0027, \u0027\u003e\u003d\u0027, \u0027!\u003d\u0027, \u0027in\u0027, \u0027begins_with\u0027, \u0027ends_with\u0027."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"A successful request for a claim MUST reserve the node(s) and prevent any other"},{"line_number":54,"context_line":"claim from becoming associated with them. The claim request shall return a"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_b4110554","line":51,"updated":"2015-11-12 13:36:39.000000000","message":"I think we need to have \"between\" as well","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"480fcd38d8322245c7b68414468dc126c7e7a93f","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"The claim API will accept a query string contianing one or more properties to"},{"line_number":50,"context_line":"match against the set of available nodes. The set of allowed operators will be:"},{"line_number":51,"context_line":"\u0027\u003d\u0027, \u0027\u003c\u0027, \u0027\u003e\u0027, \u0027\u003c\u003d\u0027, \u0027\u003e\u003d\u0027, \u0027!\u003d\u0027, \u0027in\u0027, \u0027begins_with\u0027, \u0027ends_with\u0027."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"A successful request for a claim MUST reserve the node(s) and prevent any other"},{"line_number":54,"context_line":"claim from becoming associated with them. The claim request shall return a"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_d42a722f","line":51,"updated":"2015-11-12 19:48:06.000000000","message":"begins_with / ends_with are string matching. I think you mean the \"in\" operator.\n\n\"between\" is a ternary operator if used in the sense of \"X between A and B\". Rather than introducing ternary operators, we could allow duplicate key names, eg, this could be expressed as \"X \u003e A, X \u003c B\"\n\nSince all the inputs are done as lists, I think we can handle that.","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e2f3a460d1f806a3d13e7d7bfb6aed9ed63d36ee","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"The claim API will accept a query string contianing one or more properties to"},{"line_number":50,"context_line":"match against the set of available nodes. The set of allowed operators will be:"},{"line_number":51,"context_line":"\u0027\u003d\u0027, \u0027\u003c\u0027, \u0027\u003e\u0027, \u0027\u003c\u003d\u0027, \u0027\u003e\u003d\u0027, \u0027!\u003d\u0027, \u0027in\u0027, \u0027begins_with\u0027, \u0027ends_with\u0027."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"A successful request for a claim MUST reserve the node(s) and prevent any other"},{"line_number":54,"context_line":"claim from becoming associated with them. The claim request shall return a"}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba8a016a_655e6c47","line":51,"in_reply_to":"da85f559_d42a722f","updated":"2015-11-16 12:15:07.000000000","message":"++\n\nShould we care about OR operators as well?","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"2fa7a3fbb09d802f5eaf3373850e8b38e9669d05","unresolved":false,"context_lines":[{"line_number":58,"context_line":"deployed to and deleted from them repeatedly without affecting the claim."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Furthermore, a claim is not required to provision a node; all nodes may"},{"line_number":61,"context_line":"continue to be deployed without a claim. This is to support clients that wish"},{"line_number":62,"context_line":"to continue doing their own scheduling and for backwards compatibility with"},{"line_number":63,"context_line":"existing clients."},{"line_number":64,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba8a016a_0eef4788","line":61,"updated":"2015-11-17 13:25:35.000000000","message":"Will a mixed environment be supported? That is some nodes might have been part of a claim and some are not. \nIf so, Would it ensure to provide a non-claim based node when provisioning request without claim is made?","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"0f1ae0d7b54c88ff0523cafc20151c6f05ecc5c0","unresolved":false,"context_lines":[{"line_number":58,"context_line":"deployed to and deleted from them repeatedly without affecting the claim."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Furthermore, a claim is not required to provision a node; all nodes may"},{"line_number":61,"context_line":"continue to be deployed without a claim. This is to support clients that wish"},{"line_number":62,"context_line":"to continue doing their own scheduling and for backwards compatibility with"},{"line_number":63,"context_line":"existing clients."},{"line_number":64,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba8a016a_79301002","line":61,"in_reply_to":"ba8a016a_0eef4788","updated":"2015-11-17 14:12:10.000000000","message":"That\u0027s a great question, we\u0027ll need to consider how to ensure that a claimed node cannot be deployed to by another client that does not have a claim. Maybe just submit the claim ID with the deploy request.","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7aec57701639c42532cc4ae508c76aefe05d7721","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"Therefore, only nodes in the AVAILABLE state and which have a NULL"},{"line_number":66,"context_line":"instance_uuid and no associated claim shall be considered when evaluating a"},{"line_number":67,"context_line":"claim request. . Claimed nodes which are placed into maintenance mode will"},{"line_number":68,"context_line":"remain claimed until the claim is deleted. A deployment failure does not affect"},{"line_number":69,"context_line":"the claimed status of a node. Claimed nodes may not be returned to the"},{"line_number":70,"context_line":"MANAGEABLE state until the claim is deleted."}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_541c5969","line":67,"updated":"2015-11-12 13:36:39.000000000","message":"1. nit: double dot\n\n2. I guess node that are already in maintenance are not considered for claim is well","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"480fcd38d8322245c7b68414468dc126c7e7a93f","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"Therefore, only nodes in the AVAILABLE state and which have a NULL"},{"line_number":66,"context_line":"instance_uuid and no associated claim shall be considered when evaluating a"},{"line_number":67,"context_line":"claim request. . Claimed nodes which are placed into maintenance mode will"},{"line_number":68,"context_line":"remain claimed until the claim is deleted. A deployment failure does not affect"},{"line_number":69,"context_line":"the claimed status of a node. Claimed nodes may not be returned to the"},{"line_number":70,"context_line":"MANAGEABLE state until the claim is deleted."}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_f42f763c","line":67,"updated":"2015-11-12 19:48:06.000000000","message":"fixed\n\n2. correct. see details below.","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7aec57701639c42532cc4ae508c76aefe05d7721","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"Implement an entire new scheduling service, akin to the one Nova already has."},{"line_number":98,"context_line":"This would provide more customizability / pluggability than the proposal here,"},{"line_number":99,"context_line":"however it is significantly more complex than the proposal here as well."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"Data model impact"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_74171d45","line":99,"updated":"2015-11-12 13:36:39.000000000","message":"As a person who wrote a 3rd party inspection API and a simple 3rd party scheduler (https://github.com/dtantsur/metalsmith) I don\u0027t quite agree. While it\u0027s definitely easier, it also means that we\u0027ll support it forever as part of ironic API.\n\nI don\u0027t have a strong opinion on this matter though.","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e2f3a460d1f806a3d13e7d7bfb6aed9ed63d36ee","unresolved":false,"context_lines":[{"line_number":98,"context_line":"This would provide more customizability / pluggability than the proposal here,"},{"line_number":99,"context_line":"however it is significantly more complex than the proposal here as well."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"Data model impact"},{"line_number":103,"context_line":"-----------------"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba8a016a_372097f7","line":101,"updated":"2015-11-16 12:15:07.000000000","message":"Just throwing an idea here...\n\nWe always have a 1:1 relation between a claim and a node right? Plus, the claim concept sounds a lot like a improved version of the \u0027instance_uuid\u0027 (becuase that how nova right now \"claim\"/\"lock\" a node for the deployment) and that makes me think whether we should just promote the \u0027instance_uuid\u0027 field to be what determine if a node is claimed or not instead of creating a complete new ID for the claims itself.\n\nSay a user hits the claim API with a certain query. Ironic will then filter out the nodes based on those parameters, if a node is found that matches those Ironic will then sets the instance_uuid on it and creates the claim object, which contain looks like:\n\n* id\n\n* uuid\n\n* request_details \n\n* instance_uuid\n\nNow, instance_uuid should be an internal attribute, meaning data a user can not remove it via PATCH. The instance_uuid gets null\u0027d once the claim is deleted.","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"85dddb8152b4d0edd380e61b73200cd4c40e085e","unresolved":false,"context_lines":[{"line_number":98,"context_line":"This would provide more customizability / pluggability than the proposal here,"},{"line_number":99,"context_line":"however it is significantly more complex than the proposal here as well."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"Data model impact"},{"line_number":103,"context_line":"-----------------"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba8a016a_7c4b57b1","line":101,"in_reply_to":"ba8a016a_372097f7","updated":"2015-11-16 16:05:07.000000000","message":"Right, it isn\u0027t a terrible idea, however we\u0027ll always need to support the older version of the API, meaning we\u0027ll have to deal with a user always being able to remove it via a PATCH request.","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"480fcd38d8322245c7b68414468dc126c7e7a93f","unresolved":false,"context_lines":[{"line_number":107,"context_line":""},{"line_number":108,"context_line":"* `created_at` - DATETIME - the timestamp of creation"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"* `updated_at` - DATETIME - the timestamp of the last update"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"* `id` - INT - auto-increment ID"},{"line_number":113,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_9424ea60","line":110,"updated":"2015-11-12 19:48:06.000000000","message":"Nothing really. But our data models effectively necessitate this field, unless we special case the db object. (every table has it)","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7aec57701639c42532cc4ae508c76aefe05d7721","unresolved":false,"context_lines":[{"line_number":107,"context_line":""},{"line_number":108,"context_line":"* `created_at` - DATETIME - the timestamp of creation"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"* `updated_at` - DATETIME - the timestamp of the last update"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"* `id` - INT - auto-increment ID"},{"line_number":113,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_1429f189","line":110,"updated":"2015-11-12 13:36:39.000000000","message":"what can we actually update here?","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7aec57701639c42532cc4ae508c76aefe05d7721","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"* `uuid` - STRING - unique UUID4 for the claim"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"* `request_details` - STRING - contains a serialized copy of the request"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"A new ``claim_node_ref`` table will be added. This table will be a cross-join"},{"line_number":119,"context_line":"table between `claims` and `nodes`, and will have the following fields:"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_342c3598","line":116,"updated":"2015-11-12 13:36:39.000000000","message":"JSON, right?","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"480fcd38d8322245c7b68414468dc126c7e7a93f","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"* `uuid` - STRING - unique UUID4 for the claim"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"* `request_details` - STRING - contains a serialized copy of the request"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"A new ``claim_node_ref`` table will be added. This table will be a cross-join"},{"line_number":119,"context_line":"table between `claims` and `nodes`, and will have the following fields:"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_b429ee39","line":116,"updated":"2015-11-12 19:48:06.000000000","message":"yah","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e2f3a460d1f806a3d13e7d7bfb6aed9ed63d36ee","unresolved":false,"context_lines":[{"line_number":116,"context_line":"* `request_details` - STRING - contains a serialized copy of the request"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"A new ``claim_node_ref`` table will be added. This table will be a cross-join"},{"line_number":119,"context_line":"table between `claims` and `nodes`, and will have the following fields:"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"* `created_at` - DATETIME - the timestamp when this node was added to the claim"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba8a016a_9774e3cf","line":119,"updated":"2015-11-16 12:15:07.000000000","message":"Do we need this table?\n\nMaybe we just should have an \"claim_id\" in the node table itself? I think it is simpler or am I missing something here?","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"85dddb8152b4d0edd380e61b73200cd4c40e085e","unresolved":false,"context_lines":[{"line_number":116,"context_line":"* `request_details` - STRING - contains a serialized copy of the request"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"A new ``claim_node_ref`` table will be added. This table will be a cross-join"},{"line_number":119,"context_line":"table between `claims` and `nodes`, and will have the following fields:"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"* `created_at` - DATETIME - the timestamp when this node was added to the claim"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba8a016a_3c9aaf15","line":119,"in_reply_to":"ba8a016a_9774e3cf","updated":"2015-11-16 16:05:07.000000000","message":"Seems like it\u0027s probably here for allowing one claim to multiple nodes.","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"480fcd38d8322245c7b68414468dc126c7e7a93f","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"* `created_at` - DATETIME - the timestamp when this node was added to the claim"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"* `updated_at` - DATETIME - the timestamp of the last update"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"* `id` - INT - auto-increment ID, used for internal reference only"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_541f6209","line":123,"updated":"2015-11-12 19:48:06.000000000","message":"agreed, but see above.","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7aec57701639c42532cc4ae508c76aefe05d7721","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"* `created_at` - DATETIME - the timestamp when this node was added to the claim"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"* `updated_at` - DATETIME - the timestamp of the last update"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"* `id` - INT - auto-increment ID, used for internal reference only"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_d41e095e","line":123,"updated":"2015-11-12 13:36:39.000000000","message":"ditto, what can be updated here? I think such records can be only created and deleted..","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"338fca7423476eac2ffebfa6ad6016563e7a0526","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"* `created_at` - DATETIME - the timestamp when this node was added to the claim"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"* `updated_at` - DATETIME - the timestamp of the last update"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"* `id` - INT - auto-increment ID, used for internal reference only"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba8a016a_9aca83a0","line":123,"in_reply_to":"ba8a016a_719b5273","updated":"2015-11-17 14:36:22.000000000","message":"Yes","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"2fa7a3fbb09d802f5eaf3373850e8b38e9669d05","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"* `created_at` - DATETIME - the timestamp when this node was added to the claim"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"* `updated_at` - DATETIME - the timestamp of the last update"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"* `id` - INT - auto-increment ID, used for internal reference only"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba8a016a_719b5273","line":123,"in_reply_to":"da85f559_541f6209","updated":"2015-11-17 13:25:35.000000000","message":"@Deva, Sorry, I did not quiet get your answer. \n\nIs `updated_at` field will have timestamp of last updation of claim object?","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7aec57701639c42532cc4ae508c76aefe05d7721","unresolved":false,"context_lines":[{"line_number":151,"context_line":"# NOTE (deva) a lazy migration here will mean that search functionality will"},{"line_number":152,"context_line":"# not immediately work after this feature is released. Searching and claims"},{"line_number":153,"context_line":"# will only \"see\" nodes whose data has been migrated and will therefore return"},{"line_number":154,"context_line":"# partial (and thus incorrect) results until all nodes have been updated."},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"The current ``node.properties[\u0027capabilities\u0027]`` field, which is a nested JSON"},{"line_number":157,"context_line":"field, will be \"de-nested\" and migrated to the new `node_properties` table as"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_f421cd9e","line":154,"updated":"2015-11-12 13:36:39.000000000","message":"let\u0027s provide a tool for explicit migration for those who can affort downtime","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"480fcd38d8322245c7b68414468dc126c7e7a93f","unresolved":false,"context_lines":[{"line_number":151,"context_line":"# NOTE (deva) a lazy migration here will mean that search functionality will"},{"line_number":152,"context_line":"# not immediately work after this feature is released. Searching and claims"},{"line_number":153,"context_line":"# will only \"see\" nodes whose data has been migrated and will therefore return"},{"line_number":154,"context_line":"# partial (and thus incorrect) results until all nodes have been updated."},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"The current ``node.properties[\u0027capabilities\u0027]`` field, which is a nested JSON"},{"line_number":157,"context_line":"field, will be \"de-nested\" and migrated to the new `node_properties` table as"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_741ce613","line":154,"updated":"2015-11-12 19:48:06.000000000","message":"sounds good to me","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"85dddb8152b4d0edd380e61b73200cd4c40e085e","unresolved":false,"context_lines":[{"line_number":151,"context_line":"# NOTE (deva) a lazy migration here will mean that search functionality will"},{"line_number":152,"context_line":"# not immediately work after this feature is released. Searching and claims"},{"line_number":153,"context_line":"# will only \"see\" nodes whose data has been migrated and will therefore return"},{"line_number":154,"context_line":"# partial (and thus incorrect) results until all nodes have been updated."},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"The current ``node.properties[\u0027capabilities\u0027]`` field, which is a nested JSON"},{"line_number":157,"context_line":"field, will be \"de-nested\" and migrated to the new `node_properties` table as"}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba8a016a_5caa131b","line":154,"in_reply_to":"da85f559_741ce613","updated":"2015-11-16 16:05:07.000000000","message":"+1, though I\u0027m not convinced a tool for explicit migration will require downtime.","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e2f3a460d1f806a3d13e7d7bfb6aed9ed63d36ee","unresolved":false,"context_lines":[{"line_number":159,"context_line":"indistinguishable from properties.  The reason for the current distinction is"},{"line_number":160,"context_line":"merely to facilitate Nova\u0027s \"filter scheduler\" to match against capabilities;"},{"line_number":161,"context_line":"this proposal obviates the need for that, and allows flavor extra_specs to be"},{"line_number":162,"context_line":"pushed down to Ironic for more efficient node selection."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"All other fields stored within ``node.properties`` will be migrated directly to"},{"line_number":165,"context_line":"the new `node_properties` table. Any additional nested fields will not be"}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba8a016a_ba40ee08","line":162,"updated":"2015-11-16 12:15:07.000000000","message":"So the capabilities will leave in the same level as cpus, local_gb, arch and memory_mb ?\n\nI wonder if a distinction should be made here, how that\u0027s going to look like? Because in the Nova model CPUS, local_gb, arch and memory_mb are not passed to the capabilities filter but they have their own filter to do it.\n\nBasically, I\u0027m wondering if we should have capabilities as a separated table.","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e2f3a460d1f806a3d13e7d7bfb6aed9ed63d36ee","unresolved":false,"context_lines":[{"line_number":211,"context_line":"will create and return a claim object associated with the selected nodes. For"},{"line_number":212,"context_line":"example::"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"  POST /v1/claims?count\u003d5"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"  {"},{"line_number":217,"context_line":"    \"memory_mb\": [\"\u003d\", \"32768\"],"}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba8a016a_7a7cc620","line":214,"updated":"2015-11-16 12:15:07.000000000","message":"I kinda understand the optimization here to have a bulk request but it makes me wonder if that does really fit the RESTful way of our API.\n\nRight now we don\u0027t support bulk operations on the API level because there are concerns about how failures got reported back in response to such a request.\n\nSo, say a user requested 5 nodes but only 4 is available. How does it works internally? Ironic will create a claim one by one and if the last one is not available Ironic will then rollback (delete) the previous claims?\n\nI personally would think that such complexity could leave on a layer above the API.","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"480fcd38d8322245c7b68414468dc126c7e7a93f","unresolved":false,"context_lines":[{"line_number":216,"context_line":"  {"},{"line_number":217,"context_line":"    \"memory_mb\": [\"\u003d\", \"32768\"],"},{"line_number":218,"context_line":"    \"root_gb\": [\"\u003e\u003d\", \"100\"],"},{"line_number":219,"context_line":"    \"storage_type\": [\"!\u003d\", \"ssd\"]"},{"line_number":220,"context_line":"  }"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"If a claim UUID is supplied in the POST request, it must be unique and must not"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_1419da22","line":219,"updated":"2015-11-12 19:48:06.000000000","message":"I think it\u0027s worth having a discussion aobut this and looking at what other projects have done, what standards exist out there.\n\nI\u0027ve done some cursory looking, but to be honest, I\u0027m not happy with anything I\u0027ve found yet and want to keep looking. I think the URI syntax (for GET) is good, but I\u0027m not thrilled with what I\u0027ve proposed here for the POST body.","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7aec57701639c42532cc4ae508c76aefe05d7721","unresolved":false,"context_lines":[{"line_number":216,"context_line":"  {"},{"line_number":217,"context_line":"    \"memory_mb\": [\"\u003d\", \"32768\"],"},{"line_number":218,"context_line":"    \"root_gb\": [\"\u003e\u003d\", \"100\"],"},{"line_number":219,"context_line":"    \"storage_type\": [\"!\u003d\", \"ssd\"]"},{"line_number":220,"context_line":"  }"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"If a claim UUID is supplied in the POST request, it must be unique and must not"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_943de1c5","line":219,"updated":"2015-11-12 13:36:39.000000000","message":"I wonder if it\u0027s reasonable to use the same syntax that ironic-inspector borrowed from ceilometer: https://github.com/openstack/ironic-inspector#conditions (example: https://github.com/openstack/ironic-inspector/blob/master/devstack/exercise.sh#L16-L17)","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e2f3a460d1f806a3d13e7d7bfb6aed9ed63d36ee","unresolved":false,"context_lines":[{"line_number":216,"context_line":"  {"},{"line_number":217,"context_line":"    \"memory_mb\": [\"\u003d\", \"32768\"],"},{"line_number":218,"context_line":"    \"root_gb\": [\"\u003e\u003d\", \"100\"],"},{"line_number":219,"context_line":"    \"storage_type\": [\"!\u003d\", \"ssd\"]"},{"line_number":220,"context_line":"  }"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"If a claim UUID is supplied in the POST request, it must be unique and must not"}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba8a016a_da1052ab","line":219,"in_reply_to":"da85f559_1419da22","updated":"2015-11-16 12:15:07.000000000","message":"I kinda tend to like the ceilometer-ish way better just because it resembles what we have in the json-PATCH format (a \"op\", \"path\" and \"value\" field).","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7aec57701639c42532cc4ae508c76aefe05d7721","unresolved":false,"context_lines":[{"line_number":233,"context_line":"  This may also indicate that no node has the requested property."},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"* Returns 409 Conflict if a UUID is supplied and conflicts with an existing"},{"line_number":236,"context_line":"  claim."},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"* Response body::"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_b43825d4","line":236,"updated":"2015-11-12 13:36:39.000000000","message":"I\u0027m +1 to this, but above you suggested to add nodes to a claim..","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"480fcd38d8322245c7b68414468dc126c7e7a93f","unresolved":false,"context_lines":[{"line_number":233,"context_line":"  This may also indicate that no node has the requested property."},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"* Returns 409 Conflict if a UUID is supplied and conflicts with an existing"},{"line_number":236,"context_line":"  claim."},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"* Response body::"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_34165ef2","line":236,"updated":"2015-11-12 19:48:06.000000000","message":"yep. pls disregard prevoius statement :)","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7aec57701639c42532cc4ae508c76aefe05d7721","unresolved":false,"context_lines":[{"line_number":322,"context_line":"and the CLI should both support this. The CLI should add the new commands,"},{"line_number":323,"context_line":"which each correspond to the new REST API methods:"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"* ironic claim-create [--count N] [\"\u003cproperty\u003e\u003coperator\u003e\u003cvalue\u003e,...\"]"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"* ironic claim-list"},{"line_number":328,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_5433f9f5","line":325,"updated":"2015-11-12 13:36:39.000000000","message":"Am I getting it right:\n\n ironic claim-create \"memory_mb\u003e\u003d1024\" \"local_gb\u003c42\"\n\nor\n\n ironic claim-create \"memory_mb\u003e\u003d1024,local_gb\u003c42\"\n\n? how does it play with text operators (\"in\", \"between\", etc)? using space? what to do with operators accepting several values (I\u0027d like to see \"between\")?","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"480fcd38d8322245c7b68414468dc126c7e7a93f","unresolved":false,"context_lines":[{"line_number":322,"context_line":"and the CLI should both support this. The CLI should add the new commands,"},{"line_number":323,"context_line":"which each correspond to the new REST API methods:"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"* ironic claim-create [--count N] [\"\u003cproperty\u003e\u003coperator\u003e\u003cvalue\u003e,...\"]"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"* ironic claim-list"},{"line_number":328,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_d4d11231","line":325,"updated":"2015-11-12 19:48:06.000000000","message":"Hmm. It might be easier to generate inputs for this from automation tools if these are space-separated parameters, rather than one giant string. I don\u0027t have a strong opinion on this yet.","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7aec57701639c42532cc4ae508c76aefe05d7721","unresolved":false,"context_lines":[{"line_number":332,"context_line":""},{"line_number":333,"context_line":"The client will also be modified to allow more advanced searching for nodes:"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"* ironic node-list -q \"\u003cproperty\u003e\u003coperator\u003e\u003cvalue\u003e,...\""},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"RPC API impact"},{"line_number":338,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da85f559_742e3d8d","line":335,"updated":"2015-11-12 13:36:39.000000000","message":"so it\u0027s one string, not several?","commit_id":"c87b3309f4590f238dddf0115395e2dfba29a3e6"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"2c046b6b1a50ce555883d6f082c83184cf76c69f","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Currently clients must implement their own scheduling mechanisms. Nova has a"},{"line_number":25,"context_line":"scheduler subsystem, but Ironic does not fit well within it. Other clients may"},{"line_number":26,"context_line":"integrate external schedulers, but if any do this today, it will necessarily be"},{"line_number":27,"context_line":"inefficient because they, like Nova, must fetch all resources from Ironic to"},{"line_number":28,"context_line":"perform filtering on the client side."}],"source_content_type":"text/x-rst","patch_set":8,"id":"1a7b0d38_b9d0f2ca","line":25,"updated":"2015-12-22 20:21:21.000000000","message":"Operators of data centers who have other scheduling and physical infrastructure management systems (aka \"CMDB\") in play already, and would like to integrate Ironic with those as a provisioning tool.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"57c7def7056609eb32c0f341121821f77eb2a0c2","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Currently clients must implement their own scheduling mechanisms. Nova has a"},{"line_number":25,"context_line":"scheduler subsystem, but Ironic does not fit well within it. Other clients may"},{"line_number":26,"context_line":"integrate external schedulers, but if any do this today, it will necessarily be"},{"line_number":27,"context_line":"inefficient because they, like Nova, must fetch all resources from Ironic to"},{"line_number":28,"context_line":"perform filtering on the client side."}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a740942_d0ec602b","line":25,"updated":"2015-12-10 20:01:42.000000000","message":"What other clients?","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"97c36dd4b0b503d2abc4c176cc807b63e5eeec9d","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Currently clients must implement their own scheduling mechanisms. Nova has a"},{"line_number":25,"context_line":"scheduler subsystem, but Ironic does not fit well within it. Other clients may"},{"line_number":26,"context_line":"integrate external schedulers, but if any do this today, it will necessarily be"},{"line_number":27,"context_line":"inefficient because they, like Nova, must fetch all resources from Ironic to"},{"line_number":28,"context_line":"perform filtering on the client side."}],"source_content_type":"text/x-rst","patch_set":8,"id":"1a7b0d38_e0255e5c","line":25,"in_reply_to":"1a7b0d38_b9d0f2ca","updated":"2015-12-22 21:08:39.000000000","message":"Catering to them seems sorta like a secondary goal though, said operators are already by there very nature not using openstack as it seems it was meant to be used so it feels sorta wrong to design solutions for them...","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"2c046b6b1a50ce555883d6f082c83184cf76c69f","unresolved":false,"context_lines":[{"line_number":25,"context_line":"scheduler subsystem, but Ironic does not fit well within it. Other clients may"},{"line_number":26,"context_line":"integrate external schedulers, but if any do this today, it will necessarily be"},{"line_number":27,"context_line":"inefficient because they, like Nova, must fetch all resources from Ironic to"},{"line_number":28,"context_line":"perform filtering on the client side."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"If Ironic had a query interface and/or placement engine, Nova could stop"},{"line_number":31,"context_line":"dealing with individual nodes and deal with Ironic as a whole, while"}],"source_content_type":"text/x-rst","patch_set":8,"id":"1a7b0d38_d9d5beb9","line":28,"updated":"2015-12-22 20:21:21.000000000","message":"Bifrost is another \"user\" of Ironic within OpenStack -- it\u0027s a set of Ansible playbooks that can drive Ironic\u0027s API through the necessary steps for deployment, much like what the nova.virt.ironic driver does during deploy(). It would benefit from some simple filtering mechanisms that could be done server-side.\n\nThere are several operators who are using Ironic in a stand-alone capacity (ie, without Nova or Neutron) and would benefit from this.\n\nI don\u0027t think this is the right place to have a broader discussion of Nova\u0027s mission statement, but clearly, bare metal and containers are separate projects in OpenStack.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"57c7def7056609eb32c0f341121821f77eb2a0c2","unresolved":false,"context_lines":[{"line_number":25,"context_line":"scheduler subsystem, but Ironic does not fit well within it. Other clients may"},{"line_number":26,"context_line":"integrate external schedulers, but if any do this today, it will necessarily be"},{"line_number":27,"context_line":"inefficient because they, like Nova, must fetch all resources from Ironic to"},{"line_number":28,"context_line":"perform filtering on the client side."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"If Ironic had a query interface and/or placement engine, Nova could stop"},{"line_number":31,"context_line":"dealing with individual nodes and deal with Ironic as a whole, while"}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a740942_70580cfb","line":28,"updated":"2015-12-10 20:01:42.000000000","message":"Isn\u0027t this made better by just having nova and ironic better share the location of where resources are in a more shareable manner, for example don\u0027t have the location be a \u0027compute_nodes\u0027 table but a database/table (or something else...) that both ironic and nova can *both* use to read/write from directly... Then there is none of this inefficiency in the first place...","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"97c36dd4b0b503d2abc4c176cc807b63e5eeec9d","unresolved":false,"context_lines":[{"line_number":25,"context_line":"scheduler subsystem, but Ironic does not fit well within it. Other clients may"},{"line_number":26,"context_line":"integrate external schedulers, but if any do this today, it will necessarily be"},{"line_number":27,"context_line":"inefficient because they, like Nova, must fetch all resources from Ironic to"},{"line_number":28,"context_line":"perform filtering on the client side."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"If Ironic had a query interface and/or placement engine, Nova could stop"},{"line_number":31,"context_line":"dealing with individual nodes and deal with Ironic as a whole, while"}],"source_content_type":"text/x-rst","patch_set":8,"id":"1a7b0d38_a0e75611","line":28,"in_reply_to":"1a7b0d38_d9d5beb9","updated":"2015-12-22 21:08:39.000000000","message":"Fair enough, that seems to be happening at https://review.openstack.org/#/c/256440/ anyways (for containers at least); although my same catering concerns applies here as above.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"bb1f59f70d30e07754a543f9783a12f0ec443e5d","unresolved":false,"context_lines":[{"line_number":25,"context_line":"scheduler subsystem, but Ironic does not fit well within it. Other clients may"},{"line_number":26,"context_line":"integrate external schedulers, but if any do this today, it will necessarily be"},{"line_number":27,"context_line":"inefficient because they, like Nova, must fetch all resources from Ironic to"},{"line_number":28,"context_line":"perform filtering on the client side."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"If Ironic had a query interface and/or placement engine, Nova could stop"},{"line_number":31,"context_line":"dealing with individual nodes and deal with Ironic as a whole, while"}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a740942_742319a8","line":28,"in_reply_to":"7a740942_70580cfb","updated":"2015-12-10 22:44:04.000000000","message":"Do note, the above location need not be a database table, its just a useful way to right now represent the fields + data, but it need not be this, I\u0027m just using that \u0027name\u0027 because its well understood....","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"3143aa00615103ca0920595728169b4a24fdfdf4","unresolved":false,"context_lines":[{"line_number":25,"context_line":"scheduler subsystem, but Ironic does not fit well within it. Other clients may"},{"line_number":26,"context_line":"integrate external schedulers, but if any do this today, it will necessarily be"},{"line_number":27,"context_line":"inefficient because they, like Nova, must fetch all resources from Ironic to"},{"line_number":28,"context_line":"perform filtering on the client side."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"If Ironic had a query interface and/or placement engine, Nova could stop"},{"line_number":31,"context_line":"dealing with individual nodes and deal with Ironic as a whole, while"}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a740942_a2110d06","line":28,"in_reply_to":"7a740942_742319a8","updated":"2015-12-11 19:32:40.000000000","message":"I don\u0027t think this was about Nova/Ironic being inefficient, but a hypothetical user of Ironic other than Nova.  I say hypothetical only because I am not aware of any.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"0f56de4006e640e2eb3b97bf90309e8fafccabd2","unresolved":false,"context_lines":[{"line_number":25,"context_line":"scheduler subsystem, but Ironic does not fit well within it. Other clients may"},{"line_number":26,"context_line":"integrate external schedulers, but if any do this today, it will necessarily be"},{"line_number":27,"context_line":"inefficient because they, like Nova, must fetch all resources from Ironic to"},{"line_number":28,"context_line":"perform filtering on the client side."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"If Ironic had a query interface and/or placement engine, Nova could stop"},{"line_number":31,"context_line":"dealing with individual nodes and deal with Ironic as a whole, while"}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a740942_826643eb","line":28,"in_reply_to":"7a740942_a2110d06","updated":"2015-12-12 01:49:34.000000000","message":"Hypothetical user of ironic other than nova? Is that user in openstack and understand what its mission is (especially the compute program).\n\n nova:\n      mission: \u003e\n        To implement services and associated libraries to provide massively\n        scalable, on demand, self service access to compute resources, including\n        bare metal, virtual machines, and containers.\n\nSaid hypothetical user there is basically cutting out the \u003cincluding bare metal\u003e part there from that mission statement. I guess hypothetically they could, but said hypothetical person doesn\u0027t seem to aligned with the compute programs current mission so I\u0027m not sure the community should align on hypothetical users \u0027desires\u0027 either.\n\nBut maybe I\u0027m all confusing this, and that mission statement shouldn\u0027t include bare metal anyway (as it seems like in projects.yaml ironic is its own thing anyway); who knows, I\u0027m probably just confused, ha.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"2c046b6b1a50ce555883d6f082c83184cf76c69f","unresolved":false,"context_lines":[{"line_number":30,"context_line":"If Ironic had a query interface and/or placement engine, Nova could stop"},{"line_number":31,"context_line":"dealing with individual nodes and deal with Ironic as a whole, while"},{"line_number":32,"context_line":"deployments without Nova could leverage Ironic for placement, rather than"},{"line_number":33,"context_line":"building their own engine on top."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":8,"id":"1a7b0d38_79db6aee","line":33,"updated":"2015-12-22 20:21:21.000000000","message":"@James, Nova scheduler was built with virtualization as a first principle; it makes assumptions about resource usage, allocation, divisibility, fault-management that emerge from that principle and which do not apply to either containers or bare metal. So I disagree with the assertion that \"this is what the nova scheduler does\" -- it is what you want it to do, but not what it actually does.\n\nThe nova scheduler selects a nova-compute process, and requests that nova-compute process to allocate a portion of its resources to a virtual machine, based on request parameters and cached view of the resources reported by the set of running nova-compute processes.\n\nIFF the nova-scheduler were to select an Ironic Node (instead of a nova-compute process), based on request parameters and a cached view of the resources reported by the ironic cluster, and then pass that request to Ironic, THEN it would be suitable to the task we need it to perform.\n\nBut that is not what it does. We\u0027ve discussed this at length between the two projects for over a year now and all agreed on this conclusion. I think Andrew has also explained this well.\n\nThe proposal here is a moderate improvement over what we have today, and it moves us closer to having an API in Ironic that would allow the nova-scheduler to *directly* interface with ironic -- if such a plug point were created in Nova at some future time.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"57c7def7056609eb32c0f341121821f77eb2a0c2","unresolved":false,"context_lines":[{"line_number":30,"context_line":"If Ironic had a query interface and/or placement engine, Nova could stop"},{"line_number":31,"context_line":"dealing with individual nodes and deal with Ironic as a whole, while"},{"line_number":32,"context_line":"deployments without Nova could leverage Ironic for placement, rather than"},{"line_number":33,"context_line":"building their own engine on top."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a740942_30fa84be","line":33,"updated":"2015-12-10 20:01:42.000000000","message":"What deployments is this? Advocating these cases does continue to fracture nova (and the compute program in general), people are aware of this right...? I really hope people are aware what that fracturing signals to others (because IMHO its not a good signal)...","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":9452,"name":"James Penick","email":"penick@verizonmedia.com","username":"epim"},"change_message_id":"a10ec6db8daf3c55e8e7f7a558799d412bea5d98","unresolved":false,"context_lines":[{"line_number":31,"context_line":"dealing with individual nodes and deal with Ironic as a whole, while"},{"line_number":32,"context_line":"deployments without Nova could leverage Ironic for placement, rather than"},{"line_number":33,"context_line":"building their own engine on top."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Proposed change"},{"line_number":37,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":8,"id":"ba8a016a_1d5b2230","line":34,"updated":"2015-11-20 19:37:59.000000000","message":"My objection to this, is this is what the nova scheduler /does/. It\u0027s supposed to \nselect a compute resource based on constraints. To make the one system blind to the other seems to open the door to a host of problems.\n\nIt does make sense to me for Nova-scheduler to select a node, then tell Ironic to lock that node with a claim.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"cb116f17dde736720d0b463e3deae72aa3164e67","unresolved":false,"context_lines":[{"line_number":31,"context_line":"dealing with individual nodes and deal with Ironic as a whole, while"},{"line_number":32,"context_line":"deployments without Nova could leverage Ironic for placement, rather than"},{"line_number":33,"context_line":"building their own engine on top."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Proposed change"},{"line_number":37,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a740942_42e13b29","line":34,"in_reply_to":"7a740942_4204e948","updated":"2015-12-12 01:58:18.000000000","message":"But \u0027Nova schedule to the compute node\u0027 seems quite useless honestly, could as easily use the scheduling result/outcome and spin up a thread to do the rest (where that thread interacts with ironic to do whatever it does). That\u0027s also what feels weird here, virt drivers that do nothing other than proxy to other systems don\u0027t even need nova-compute to do anything (and then u can just scale out the scheduling process and its thread pool size and be done with it) so why are they being bottlenecked by nova-compute in the first place... Why workaround issues to fit into the nova-compute model when u could just spin off a thread for these types of drivers in the first place (for vms sure send a request to nova-compute to do something useful, for other systems, meh, don\u0027t bother).","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"ac42296eaafd53a21706f2222ae59d0bb66eae5b","unresolved":false,"context_lines":[{"line_number":31,"context_line":"dealing with individual nodes and deal with Ironic as a whole, while"},{"line_number":32,"context_line":"deployments without Nova could leverage Ironic for placement, rather than"},{"line_number":33,"context_line":"building their own engine on top."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Proposed change"},{"line_number":37,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a740942_da54f6fe","line":34,"in_reply_to":"7a740942_42e13b29","updated":"2015-12-14 17:03:08.000000000","message":"That\u0027s a fair point, and there has been discussion around this in the past.  There\u0027s been general acknowledgement that plugging in clustered systems at the virt driver layer is not ideal and there may be a better way.  However, that is the plug point we have today and this is an effort to improve the interactions there.\n\nI would support an effort define a better layer for plugging in these systems.  Let\u0027s say we wanted to just skip nova-compute today when passing a message to Ironic we would need Ironic to implement the poorly defined interface that nova-compute currently provides.  As well as the periodic tasks and resource tracking.  Why duplicate all of that in Ironic?  If we could define a proper interface and possibly move things out of the nova-compute domain we would be in a much better spot to consider skipping nova-compute for clusters like Ironic.\n\nI don\u0027t think we should not work on this in the short term in hopes that a better solution shows up later.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"e0f1f3fe666f7ff002d84927e7d4791cd04a9e7f","unresolved":false,"context_lines":[{"line_number":31,"context_line":"dealing with individual nodes and deal with Ironic as a whole, while"},{"line_number":32,"context_line":"deployments without Nova could leverage Ironic for placement, rather than"},{"line_number":33,"context_line":"building their own engine on top."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Proposed change"},{"line_number":37,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":8,"id":"5a710552_6d22d5bb","line":34,"in_reply_to":"7a740942_da54f6fe","updated":"2015-12-14 17:35:14.000000000","message":"Fair enough, def needs some work to do better layering here overall (cause its IMHO really weird), thanks for responding...","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"3143aa00615103ca0920595728169b4a24fdfdf4","unresolved":false,"context_lines":[{"line_number":31,"context_line":"dealing with individual nodes and deal with Ironic as a whole, while"},{"line_number":32,"context_line":"deployments without Nova could leverage Ironic for placement, rather than"},{"line_number":33,"context_line":"building their own engine on top."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Proposed change"},{"line_number":37,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a740942_4204e948","line":34,"in_reply_to":"7a740942_f0907c97","updated":"2015-12-11 19:32:40.000000000","message":"Nova is not looking to get out of the scheduling business.  There are a few things at play here.\n\nIronic without Nova means that whomever is consuming Ironic must do their own scheduling.  I think it\u0027s fair to say that Ironic could stand on its own.  You can take any other project that Nova virt drivers control out on its own and use it, I\u0027m not sure why we would expect something different from Ironic.\n\nNova has an interesting time scheduling with clustered technologies like Ironic and VMware.  This proposal is looking at a way to improve that by just having Nova schedule to the compute node and then letting the cluster manager, Ironic in this case, take it from there.  This would allow Nova to interact with the Ironic virt driver in a more similar manner to how it interacts with other virt drivers.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"57c7def7056609eb32c0f341121821f77eb2a0c2","unresolved":false,"context_lines":[{"line_number":31,"context_line":"dealing with individual nodes and deal with Ironic as a whole, while"},{"line_number":32,"context_line":"deployments without Nova could leverage Ironic for placement, rather than"},{"line_number":33,"context_line":"building their own engine on top."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Proposed change"},{"line_number":37,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a740942_f0907c97","line":34,"in_reply_to":"ba8a016a_1d5b2230","updated":"2015-12-10 20:01:42.000000000","message":"+1 \n\nThis is a bigger general cross-project issue (what does nova do and what does ironic do, and what parts/apis of nova work and/or don\u0027t when this is done); if nova really is the compute project, then it seems reasonable to expect it to be picking which resources to allocate when a compute resource is requested. But if nova wants to get out of this decision process (or only be partially involved) then it would be real nice to know that ahead of time so that the confusion around this can be resolved (and/or publicly known and accepted).","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"57c7def7056609eb32c0f341121821f77eb2a0c2","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"The claim API will accept a query string containing one or more properties to"},{"line_number":47,"context_line":"match against the set of available nodes. The set of allowed operators will be:"},{"line_number":48,"context_line":"\u0027\u003d\u0027, \u0027\u003c\u0027, \u0027\u003e\u0027, \u0027\u003c\u003d\u0027, \u0027\u003e\u003d\u0027, \u0027!\u003d\u0027, \u0027in\u0027, \u0027begins_with\u0027, \u0027ends_with\u0027."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"A successful request for a claim MUST reserve the node(s) and prevent any other"},{"line_number":51,"context_line":"claim from becoming associated with them. The claim request shall return a"}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a740942_70b48cf1","line":48,"updated":"2015-12-10 20:01:42.000000000","message":"Woah :-/","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"7598eae9318ec7b992cc41d304dece8a29d0e4d1","unresolved":false,"context_lines":[{"line_number":54,"context_line":"on any node(s) separately from the claim. Claimed nodes may have instances"},{"line_number":55,"context_line":"deployed to and deleted from them repeatedly without affecting the claim."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"Furthermore, a claim is not required to provision a node; all nodes may"},{"line_number":58,"context_line":"continue to be deployed without a claim. This is to support clients that wish"},{"line_number":59,"context_line":"to continue doing their own scheduling and for backwards compatibility with"},{"line_number":60,"context_line":"existing clients."},{"line_number":61,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"dada55a8_7cfbc57b","line":58,"range":{"start_line":57,"start_character":58,"end_line":58,"end_character":40},"updated":"2016-07-26 03:35:45.000000000","message":"This description conflict with line 79, IMO.\nI think this should be:\n\"all unclaimed nodes may continue to be deployed without a claim.\"","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":9608,"name":"Pranesh Pandurangan","email":"praneshpg@gmail.com","username":"pran1990"},"change_message_id":"b1e5c531e1e37081cb8594020af2420416cef5a4","unresolved":false,"context_lines":[{"line_number":64,"context_line":"claim request. Claimed nodes which are placed into maintenance mode will"},{"line_number":65,"context_line":"remain claimed until the claim is deleted. A deployment failure does not affect"},{"line_number":66,"context_line":"the claimed status of a node. Claimed nodes may not be returned to the"},{"line_number":67,"context_line":"MANAGEABLE state until the claim is deleted."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"TODO(jroll) how does this work if one node out of 10 in a claim dies? just use"},{"line_number":70,"context_line":"maintenance? Allow removing the claim for one node in a group?"}],"source_content_type":"text/x-rst","patch_set":8,"id":"fa69d971_1692d29f","line":67,"updated":"2016-01-08 19:51:27.000000000","message":"Seems slightly ambiguous with the other statement that state machine is not impacted","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"3f14c8b2d4455c997a77d606f0f5165d5e9f772b","unresolved":false,"context_lines":[{"line_number":67,"context_line":"MANAGEABLE state until the claim is deleted."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"TODO(jroll) how does this work if one node out of 10 in a claim dies? just use"},{"line_number":70,"context_line":"maintenance? Allow removing the claim for one node in a group?"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"Claims may be listed and fetched by ID, and a reference to the claim shall be"},{"line_number":73,"context_line":"returned on a request for node details if that node is associated to a claim."}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a740942_d092204b","line":70,"updated":"2015-12-10 20:07:20.000000000","message":"Good question, how does this work.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"b28d1b09035ca9ef34838d86835a9a875619c9d6","unresolved":false,"context_lines":[{"line_number":84,"context_line":"properties that can be scheduled against (node properties, node capabilities,"},{"line_number":85,"context_line":"etc.) shall be moved from their current storage in JSON fields into separate"},{"line_number":86,"context_line":"database tables. This will allow for more efficient indexing of this data and"},{"line_number":87,"context_line":"querying against it. This is covered in a separate spec.[1]"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a740942_5f2cea49","line":87,"updated":"2015-12-11 07:37:44.000000000","message":"To find a matching node will be an independent Restful API or only be part of work in claims API? It might be useful for inventory management with given some conditions.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"2c046b6b1a50ce555883d6f082c83184cf76c69f","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"Only build the claim mechanism, without a filter API. This would force all"},{"line_number":98,"context_line":"clients to continue to perform filtering as inefficiently as they do today (eg,"},{"line_number":99,"context_line":"by fetching all nodes from Ironic and filtering on the client side)."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"Implement an entire new scheduling service, akin to the one Nova already has."},{"line_number":102,"context_line":"This would provide more customizability / pluggability than the proposal here,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"1a7b0d38_99d896f1","line":99,"updated":"2015-12-22 20:21:21.000000000","message":"++ to a search API that doesn\u0027t necessarily require a claim\n\n++ to the idea of nova-schedler integration, but everything about that is *helped* by the work proposed here\n\n-- what interface is used to pass the claim to nova-compute? this \u0027claim_id\u0027 has nothing to do with other virt drivers in Nova. how is the nova-compute host selected (is it just random?)?","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":7455,"name":"Meghal Gosalia","username":"meghal"},"change_message_id":"3dc9c2ce8df8be31643d92fac7b2bac6e5b37316","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"Only build the claim mechanism, without a filter API. This would force all"},{"line_number":98,"context_line":"clients to continue to perform filtering as inefficiently as they do today (eg,"},{"line_number":99,"context_line":"by fetching all nodes from Ironic and filtering on the client side)."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"Implement an entire new scheduling service, akin to the one Nova already has."},{"line_number":102,"context_line":"This would provide more customizability / pluggability than the proposal here,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"ba8a016a_3a6173d3","line":99,"updated":"2015-11-20 03:37:24.000000000","message":"Thinking out loud here.\n\nHow about building the filter and claim api separately ?\nThis way,\n\n 1. Clients can call filter api. Get qualifying nodes. \n 2. Run its own qualification.\n 3. Select a node and call claim api. \n\nAlso, we could introduce a claim flag in filter api.\nIf claim flag is turned on, it will return a claim id in the response. \nThat way, it will revert to the behavior described in this spec.\n\n\nTaking this idea forward, \n 1. how about nova-scheduler (maybe IronicScheduler deriving from base nova scheduler), calling filter api and operate on the node list just like any other nova scheduler filter does.\n 2. nova-scheduler will select a node and call claim api on Ironic. \n 3. If claim fails, retry.\n 4. nova-scheduler could then pass the claim-id to nova-compute. \n 5. There could be a config option under ironic section in nova for direct_filter_claim, which if turned on will bypass all nova filters.\n\nMajor disadvantage in Ironic is resource tracker playing a catch up game to find out qualifying Ironic nodes. \nCombination of filter and claim api will allow us to use nova-scheduler and not have resource tracker catch up to Ironic transitions. \n\nThoughts ?","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":9452,"name":"James Penick","email":"penick@verizonmedia.com","username":"epim"},"change_message_id":"a10ec6db8daf3c55e8e7f7a558799d412bea5d98","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"Only build the claim mechanism, without a filter API. This would force all"},{"line_number":98,"context_line":"clients to continue to perform filtering as inefficiently as they do today (eg,"},{"line_number":99,"context_line":"by fetching all nodes from Ironic and filtering on the client side)."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"Implement an entire new scheduling service, akin to the one Nova already has."},{"line_number":102,"context_line":"This would provide more customizability / pluggability than the proposal here,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"ba8a016a_7d926ef8","line":99,"in_reply_to":"ba8a016a_3a6173d3","updated":"2015-11-20 19:37:59.000000000","message":"+1 on everything but IronicScheduler derived from nova-scheduler. \n\nNova is all things compute, nova-scheduler should schedule for all compute-y things. Having an Ironic filter in the nova scheduler is a graceful way to put these two things together.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"3f14c8b2d4455c997a77d606f0f5165d5e9f772b","unresolved":false,"context_lines":[{"line_number":102,"context_line":"This would provide more customizability / pluggability than the proposal here,"},{"line_number":103,"context_line":"however it is significantly more complex than the proposal here as well."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"Data model impact"},{"line_number":107,"context_line":"-----------------"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a740942_9001f86c","line":105,"updated":"2015-12-10 20:07:20.000000000","message":"Alernative #4 stop having disjoint data sources for \u0027compute_nodes\u0027 and ironic \u0027nodes\u0027 and figure out how to use a location (and schema) for both ironic and nova, that both can read/write from, rename this new source \u0027compute_resource(s)\u0027  (it need not be a database table) or something and have a shared  \u0027superset\u0027 schema that exists that both can use to read/write from as they need.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"2c046b6b1a50ce555883d6f082c83184cf76c69f","unresolved":false,"context_lines":[{"line_number":102,"context_line":"This would provide more customizability / pluggability than the proposal here,"},{"line_number":103,"context_line":"however it is significantly more complex than the proposal here as well."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"Data model impact"},{"line_number":107,"context_line":"-----------------"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"1a7b0d38_39e5e2a7","line":105,"updated":"2015-12-22 20:21:21.000000000","message":"In this future world, if nova-scheduler will only be concerned with scheduling the work to a nova-compute, then we are in exactly the same problem we have today.\n\n*Something* needs to select which node Ironic is going to place the instance on, and that is completely unrelated to the nova-compute process.\n\nSo if the nova-scheduler doesn\u0027t care about what\u0027s behind the clustered hypervisor, then, well, Ironic had better have its own scheduler :)","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"97c36dd4b0b503d2abc4c176cc807b63e5eeec9d","unresolved":false,"context_lines":[{"line_number":102,"context_line":"This would provide more customizability / pluggability than the proposal here,"},{"line_number":103,"context_line":"however it is significantly more complex than the proposal here as well."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"Data model impact"},{"line_number":107,"context_line":"-----------------"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"1a7b0d38_00b50acc","line":105,"in_reply_to":"1a7b0d38_39e5e2a7","updated":"2015-12-22 21:08:39.000000000","message":"Right, it\u0027s all a question of what resources are known by who, and if a scheduler doesn\u0027t know about some resources inside of a clustered entity well then it can\u0027t make really any good scheduling decision for that clustered entity. \n\nSadly (or maybe not sadly); the siloing of resources into different openstack projects set in motion this direction many years ago (the side-effect of splitting off projects for ease of development..., comes at a cost after all).","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"18c7d675a4b057f5522e7442b96825e82d3c8262","unresolved":false,"context_lines":[{"line_number":102,"context_line":"This would provide more customizability / pluggability than the proposal here,"},{"line_number":103,"context_line":"however it is significantly more complex than the proposal here as well."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"Data model impact"},{"line_number":107,"context_line":"-----------------"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"5a710552_e156c005","line":105,"in_reply_to":"5a710552_301ae66f","updated":"2015-12-14 23:24:59.000000000","message":"It\u0027s interesting that #3 may not do much/anything in the ironic case (random.choice(compute_nodes)?) in fact most cluster \u0027hiding\u0027 drivers should probably not care which compute node the request originates from (because internally those clustering drivers need to do synchronization themselves anyway; due to the very nature of being a cluster); future work to clean this up I suppose...","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"ac42296eaafd53a21706f2222ae59d0bb66eae5b","unresolved":false,"context_lines":[{"line_number":102,"context_line":"This would provide more customizability / pluggability than the proposal here,"},{"line_number":103,"context_line":"however it is significantly more complex than the proposal here as well."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"Data model impact"},{"line_number":107,"context_line":"-----------------"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a740942_362c7c98","line":105,"in_reply_to":"7a740942_227afa88","updated":"2015-12-14 17:03:08.000000000","message":"The potential path based on what I was saying is something like:\n    1. Receive API request for boot, do some validation.\n    2. Check quotas.  Breaking this out is a separate discussion that\u0027s not pertinent here.\n    3. Call into nova-scheduler to determine a compute node for the instance.  The plan is to isolate the nova-scheduler service from the nova db, not necessarily to split it out.\n    4. Send build request to selected compute node.  If there is a cluster behind the compute node, Nova should not need to treat that differently than if there isn\u0027t.\n    5. \u003cwait until done building\u003e\n    6. Report compute instance ready for usage.\n\nwhich really isn\u0027t much different from today.\n\nStep #4 is not about sending to a compute or Ironic, it sends to a compute and then doesn\u0027t worry about which specific node Ironic uses.  This is detailed a bit in https://review.openstack.org/#/c/194453/11","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"e0f1f3fe666f7ff002d84927e7d4791cd04a9e7f","unresolved":false,"context_lines":[{"line_number":102,"context_line":"This would provide more customizability / pluggability than the proposal here,"},{"line_number":103,"context_line":"however it is significantly more complex than the proposal here as well."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"Data model impact"},{"line_number":107,"context_line":"-----------------"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"5a710552_301ae66f","line":105,"in_reply_to":"7a740942_362c7c98","updated":"2015-12-14 17:35:14.000000000","message":"Thanks for helping clear up the thoughts here.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"3143aa00615103ca0920595728169b4a24fdfdf4","unresolved":false,"context_lines":[{"line_number":102,"context_line":"This would provide more customizability / pluggability than the proposal here,"},{"line_number":103,"context_line":"however it is significantly more complex than the proposal here as well."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"Data model impact"},{"line_number":107,"context_line":"-----------------"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a740942_bd3852a1","line":105,"in_reply_to":"7a740942_9001f86c","updated":"2015-12-11 19:32:40.000000000","message":"Ultimately things are moving in this general direction.  But even the compute nodes are moving away from writing directly to the db that the scheduler uses.  The idea is that providers of capabilities or consumable resources will report that information over RPC/HTTP to the scheduler which can handle the persistence its own way.  Eventually other projects like Ironic/Cinder/Neutron could feed data in that the scheduler can use.\n\nBut the problem here isn\u0027t that data isn\u0027t shared.  The real issue is that Nova is not designed to work on subdivisions of a compute node.  We could look for a model that unifies clustered and non-clustered hypervisors by making things like xen and libvirt/kvm look more like a cluster, or we could have the clusters look more like a compute and let them manage what happens within that cluster.  The latter is the direction we\u0027re headed.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"6e1cef9eb0acc66d5b062e0ef9e8a0f7f3c28b28","unresolved":false,"context_lines":[{"line_number":102,"context_line":"This would provide more customizability / pluggability than the proposal here,"},{"line_number":103,"context_line":"however it is significantly more complex than the proposal here as well."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"Data model impact"},{"line_number":107,"context_line":"-----------------"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a740942_227afa88","line":105,"in_reply_to":"7a740942_bd3852a1","updated":"2015-12-11 20:16:33.000000000","message":"So what does that turn nova into? Let\u0027s jump forward about two years from now. What in your mind does nova do at this point?\n\nLet\u0027s \u0027imagine\u0027 for the compute \u0027boot\u0027 call. Is it something like:\n\n    1. Receive API request for boot, and do some validation of it.\n    2. Call into *some* quota service to reserve some quota for future work.\n    3. Call into *some* scheduler service to find locations where this quota can be consumed.\n    4. Request endpoints of matched locations (vm, baremetal, containers...) to start building...\n    5.    \u003c wait until done building \u003e\n    6. Report compute instance(s) ready for usage.\n\nIs that the gist of the (potential) path here?\n\nDuring #4 this could be ironic (or it could be nova-compute itself, just some compute  building \u0027endpoint\u0027 with some agreed upon API would be all that is needed).","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":9608,"name":"Pranesh Pandurangan","email":"praneshpg@gmail.com","username":"pran1990"},"change_message_id":"7bedcb70d0616325be9d0e38ed622000029603cb","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"* `created_at` - DATETIME - the timestamp of creation"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"* `updated_at` - DATETIME - the timestamp of the last update"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"* `id` - INT - auto-increment ID"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a7e1126_7e2fc4a1","line":114,"range":{"start_line":114,"start_character":3,"end_line":114,"end_character":13},"updated":"2015-12-17 06:53:26.000000000","message":"Does it makes sense to have an `expires_at` field as well? If the client dies after calling this api, but before deploying, we could have permanently locked up node[s]. The conductor could have a periodic task removing expired claims.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":9608,"name":"Pranesh Pandurangan","email":"praneshpg@gmail.com","username":"pran1990"},"change_message_id":"7bb789e9fc2af50d2a2f27917681f332ef0c2658","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"* `uuid` - STRING - unique UUID4 for the claim"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"* `request_details` - STRING - contains a serialized copy of the request body"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"A new ``claim_node_ref`` table will be added. This table will be a cross-join"},{"line_number":123,"context_line":"table between `claims` and `nodes`, and will have the following fields:"}],"source_content_type":"text/x-rst","patch_set":8,"id":"da6ed579_c66b93f0","line":120,"range":{"start_line":120,"start_character":3,"end_line":120,"end_character":18},"updated":"2016-01-16 02:19:00.000000000","message":"Can you call out what would happen if there were sensitive details in request_details? Will the api scrub it out before putting it in the db, or not care?","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":9608,"name":"Pranesh Pandurangan","email":"praneshpg@gmail.com","username":"pran1990"},"change_message_id":"b1e5c531e1e37081cb8594020af2420416cef5a4","unresolved":false,"context_lines":[{"line_number":132,"context_line":""},{"line_number":133,"context_line":"* `node_id` - INT - foreign key to the `nodes` table"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"TODO(jroll) add unique constraint on (claim_id, node_id)? See also RPC impact"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"State Machine Impact"},{"line_number":138,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":8,"id":"fa69d971_6b600736","line":135,"updated":"2016-01-08 19:51:27.000000000","message":"not only that, don\u0027t you need to have a unique constraint on just node_id also? you don\u0027t want to have both (claim1, node1) and (claim2, node1) in the db.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":9608,"name":"Pranesh Pandurangan","email":"praneshpg@gmail.com","username":"pran1990"},"change_message_id":"b2545f2ca8eaceee027e6a324287fefb9939fecf","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"No changes, but it is important to note that nodes may only be claimed when in"},{"line_number":141,"context_line":"the AVAILABLE state, when the node has no `instance_uuid`, and when there is no"},{"line_number":142,"context_line":"claim already associated with the node."},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"REST API impact"},{"line_number":145,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a7e1126_314126aa","line":142,"range":{"start_line":142,"start_character":25,"end_line":142,"end_character":29},"updated":"2015-12-17 23:18:29.000000000","message":"What about other actions, for example manually calling cleaning on a node? Is that possible when a node has been marked \u0027claimed\u0027?","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"944234312d426579fe1f600a595fcd18c4b506ee","unresolved":false,"context_lines":[{"line_number":148,"context_line":"which will take as input a URL encoded query string. For example::"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"  GET /v1/nodes?q\u003d\"memory_mb\u003d32768,root_gb\u003e\u003d1000,storage_type!\u003dssd\""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"This may be combined with existing query parameters to form more complex"},{"line_number":153,"context_line":"searches.  The following example demonstrates a search query equivalent to a"},{"line_number":154,"context_line":"claim query with the same \"q\" parameters::"}],"source_content_type":"text/x-rst","patch_set":8,"id":"da6ed579_0c0cc039","line":151,"updated":"2016-01-14 16:59:24.000000000","message":"What if I wanted to query for such nodes that are NOT claimed? If this GET request won\u0027t provide that info (although it would be ideal if it could), we should provide some other API (from the node\u0027s perspective, not the CLAIMS API you have below) to get the info.\n\nOr what if I wanted to get a list of all nodes that are claimed (or not claimed)? Or claimed and not deployed yet. eg, find out if a claim was put on a node a week ago and still no deployment/actions on the node since then.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":9608,"name":"Pranesh Pandurangan","email":"praneshpg@gmail.com","username":"pran1990"},"change_message_id":"b1e5c531e1e37081cb8594020af2420416cef5a4","unresolved":false,"context_lines":[{"line_number":163,"context_line":""},{"line_number":164,"context_line":"  {"},{"line_number":165,"context_line":"    \"target\": \"active\","},{"line_number":166,"context_line":"    \"claim\": \u003cclaim_uuid\u003e"},{"line_number":167,"context_line":"  }"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"* Returns 202 Accepted if:"}],"source_content_type":"text/x-rst","patch_set":8,"id":"fa69d971_560fea87","line":166,"updated":"2016-01-08 19:51:27.000000000","message":"Can you call out (not sure which section is appropriate for this) that if target !\u003d active, claim is ignored?","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":9608,"name":"Pranesh Pandurangan","email":"praneshpg@gmail.com","username":"pran1990"},"change_message_id":"0a65e4eb60d08e8bd5cce756853e874c9956539d","unresolved":false,"context_lines":[{"line_number":163,"context_line":""},{"line_number":164,"context_line":"  {"},{"line_number":165,"context_line":"    \"target\": \"active\","},{"line_number":166,"context_line":"    \"claim\": \u003cclaim_uuid\u003e"},{"line_number":167,"context_line":"  }"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"* Returns 202 Accepted if:"}],"source_content_type":"text/x-rst","patch_set":8,"id":"da6ed579_e65d777a","line":166,"in_reply_to":"da6ed579_f8800bc1","updated":"2016-01-16 02:08:21.000000000","message":"@ruby: I think manual operations (eg cleaning by an admin) should not be blocked by a claim, acc to this spec. So for those actions claim_id should ignored.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"944234312d426579fe1f600a595fcd18c4b506ee","unresolved":false,"context_lines":[{"line_number":163,"context_line":""},{"line_number":164,"context_line":"  {"},{"line_number":165,"context_line":"    \"target\": \"active\","},{"line_number":166,"context_line":"    \"claim\": \u003cclaim_uuid\u003e"},{"line_number":167,"context_line":"  }"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"* Returns 202 Accepted if:"}],"source_content_type":"text/x-rst","patch_set":8,"id":"da6ed579_f8800bc1","line":166,"in_reply_to":"fa69d971_560fea87","updated":"2016-01-14 16:59:24.000000000","message":"I\u0027m not sure it should be ignored. It should probably return an error. Unless it makes sense to specify the claim when putting the node in some other state, eg rebuilding, or deleting. Actually, if a node is claimed, wouldn\u0027t we want to insist that the claim UUID is provide for all actions on the node?","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"7598eae9318ec7b992cc41d304dece8a29d0e4d1","unresolved":false,"context_lines":[{"line_number":193,"context_line":"  {"},{"line_number":194,"context_line":"    \"count\": 5"},{"line_number":195,"context_line":"    \"properties\": {"},{"line_number":196,"context_line":"      \"memory_mb\": [\"\u003d\", \"32768\"],"},{"line_number":197,"context_line":"      \"root_gb\": [\"\u003e\u003d\", \"100\"],"},{"line_number":198,"context_line":"      \"storage_type\": [\"!\u003d\", \"ssd\"]"},{"line_number":199,"context_line":"    }"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dada55a8_22a764be","line":196,"range":{"start_line":196,"start_character":25,"end_line":196,"end_character":32},"updated":"2016-07-26 03:35:45.000000000","message":"Do we need to do some type convert if we use string here?\nHow to distinguish a  bool and a string?","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"da806c0fb124b8a9cfec877b2b0f7e007ee92712","unresolved":false,"context_lines":[{"line_number":197,"context_line":"      \"root_gb\": [\"\u003e\u003d\", \"100\"],"},{"line_number":198,"context_line":"      \"storage_type\": [\"!\u003d\", \"ssd\"]"},{"line_number":199,"context_line":"    }"},{"line_number":200,"context_line":"  }"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"If a claim UUID is supplied in the POST request, it must be unique and must not"},{"line_number":203,"context_line":"yet exist. For example::"}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a740942_34935ffc","line":200,"updated":"2015-12-10 17:53:32.000000000","message":"Have you thought about creating claims on specific nodes? Eg, what if you had done some filtering before because you wanted to get a list and do some other stuff to whittle it down (maybe based on something that isn\u0027t filterable yet), and you know which nodes you want to claim.\n\nI dunno. POST /v1/claims {\"nodes\":[uuid1, uuid2, uuid3]} ?","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"33ab1b42c7638c0d2f17e00fd0b2e7826cd0306f","unresolved":false,"context_lines":[{"line_number":197,"context_line":"      \"root_gb\": [\"\u003e\u003d\", \"100\"],"},{"line_number":198,"context_line":"      \"storage_type\": [\"!\u003d\", \"ssd\"]"},{"line_number":199,"context_line":"    }"},{"line_number":200,"context_line":"  }"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"If a claim UUID is supplied in the POST request, it must be unique and must not"},{"line_number":203,"context_line":"yet exist. For example::"}],"source_content_type":"text/x-rst","patch_set":8,"id":"fa69d971_d8cda45e","line":200,"in_reply_to":"7a740942_34935ffc","updated":"2016-01-07 19:53:39.000000000","message":"+1, going to add this here","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"73a34d6cef633ee1396db3b8cc26d3105789b089","unresolved":false,"context_lines":[{"line_number":207,"context_line":"* This method implicitly matches only nodes that are not associated to an"},{"line_number":208,"context_line":"  instance and not in maintenance mode and are in the AVAILABLE state."},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"* Returns 201 Created on success, with the Claim object as the response body."},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"* Returns 404 Not Found if no node was found to match the requested properties."},{"line_number":213,"context_line":"  This may also indicate that no node has the requested property. This also"}],"source_content_type":"text/x-rst","patch_set":8,"id":"9a8ffd7b_c6635fdc","line":210,"updated":"2015-12-01 15:38:04.000000000","message":"You should consider having this return a 202 and a link to a claim object so that the HTTP response does not need to wait on the results of a scheduler.  Over time the scale of a deployment or complexity of a request could lead to long scheduling times which could cause problems if there are client or proxy timeouts in place.\n\nOr by going down this route it should be well documented that the scheduler will need to reasonably performant and the way Ironic is scaled out may need to take into account this constraint on scheduling.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"2c046b6b1a50ce555883d6f082c83184cf76c69f","unresolved":false,"context_lines":[{"line_number":207,"context_line":"* This method implicitly matches only nodes that are not associated to an"},{"line_number":208,"context_line":"  instance and not in maintenance mode and are in the AVAILABLE state."},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"* Returns 201 Created on success, with the Claim object as the response body."},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"* Returns 404 Not Found if no node was found to match the requested properties."},{"line_number":213,"context_line":"  This may also indicate that no node has the requested property. This also"}],"source_content_type":"text/x-rst","patch_set":8,"id":"1a7b0d38_59e22ea1","line":210,"updated":"2015-12-22 20:21:21.000000000","message":"after some thought, I am inclined to agree.\n\nAsync claims API is much better.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"a663cc25bccc60367abead2047ea32517878e8de","unresolved":false,"context_lines":[{"line_number":207,"context_line":"* This method implicitly matches only nodes that are not associated to an"},{"line_number":208,"context_line":"  instance and not in maintenance mode and are in the AVAILABLE state."},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"* Returns 201 Created on success, with the Claim object as the response body."},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"* Returns 404 Not Found if no node was found to match the requested properties."},{"line_number":213,"context_line":"  This may also indicate that no node has the requested property. This also"}],"source_content_type":"text/x-rst","patch_set":8,"id":"9a8ffd7b_28ad1f84","line":210,"in_reply_to":"9a8ffd7b_c6635fdc","updated":"2015-12-02 12:29:02.000000000","message":"+1, that\u0027s a good idea.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":9608,"name":"Pranesh Pandurangan","email":"praneshpg@gmail.com","username":"pran1990"},"change_message_id":"b1e5c531e1e37081cb8594020af2420416cef5a4","unresolved":false,"context_lines":[{"line_number":295,"context_line":""},{"line_number":296,"context_line":"* Empty response body."},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"The API version should be bumped for this feature."},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"Client (CLI) impact"},{"line_number":301,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":8,"id":"fa69d971_76746e9b","line":298,"updated":"2016-01-08 19:51:27.000000000","message":"Can you call out who is responsible for calling delete?\na) set_provision_state\nb) client\nc) something else","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"b28d1b09035ca9ef34838d86835a9a875619c9d6","unresolved":false,"context_lines":[{"line_number":319,"context_line":""},{"line_number":320,"context_line":"The client will be modified to accept a claim ID for provision requests:"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"* ironic node-set-provision-state [--claim \u003cclaim_uuid\u003e] \u003cnode\u003e active"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"RPC API impact"},{"line_number":325,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a740942_1ff3c20b","line":322,"updated":"2015-12-11 07:37:44.000000000","message":"Can the client provision nodes with a clain uuid only, or client has to get the uuid and then provision one by one?","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"73a34d6cef633ee1396db3b8cc26d3105789b089","unresolved":false,"context_lines":[{"line_number":329,"context_line":"Claims will be created and modified directly in the API tier."},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"TODO(jroll) consider moving to conductor to allow for locking to prevent races,"},{"line_number":332,"context_line":"or does adding a unique constraint for (claim, node) solve this?"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"Driver API impact"},{"line_number":335,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":8,"id":"9a8ffd7b_648b8b1f","line":332,"updated":"2015-12-01 15:38:04.000000000","message":"I would recommend looking at this path.  The API should be able to respond to requests quickly and more data and process intensive work such as scheduling would do better to be offloaded elsewhere.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"73a34d6cef633ee1396db3b8cc26d3105789b089","unresolved":false,"context_lines":[{"line_number":362,"context_line":"------------------"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"Until the work to move node properties to a separate table is done[1], this API"},{"line_number":365,"context_line":"will be very slow as it must loop over each node. This API should be marked"},{"line_number":366,"context_line":"experimental (or just not land) until that work is complete."},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"Other deployer impact"}],"source_content_type":"text/x-rst","patch_set":8,"id":"9a8ffd7b_04e71fe5","line":365,"updated":"2015-12-01 15:38:04.000000000","message":"This is exactly why I suggested above not having the API response wait on this decision, and doing it outside of the API tier.","commit_id":"4dd1e65760db4e165683f1808900b76c4bb657db"}],"specs/liberty/node-reservations.rst":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7b4595e6e6da3214df534e26855341d9d04cd165","unresolved":false,"context_lines":[{"line_number":32,"context_line":"reservation by passing an instance UUID, and the resources that should be"},{"line_number":33,"context_line":"present on the node (CPUs, amount of RAM, etc). This could be further"},{"line_number":34,"context_line":"extended (outside the scope of this spec) to allow requesting certain"},{"line_number":35,"context_line":"capabilities or other attributes of a node."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"A successful request for a reservation should \"reserve\" the node by placing"},{"line_number":38,"context_line":"the instance ID on the node, and return a reservation object that includes"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a50d1a3_ce1e930b","line":35,"updated":"2015-07-23 11:29:49.000000000","message":"1. For standalone case, what should we supploy as instance UUID?\n\n2. Not sure about \"reservation\" word, we already use it for locking\n\n3. I don\u0027t think it\u0027s useful without capabilities, I\u0027d like them to be added, at least in the simples form of one capability..","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"9bab078e3b2e2edd349fc181d6557f1cb9507acc","unresolved":false,"context_lines":[{"line_number":32,"context_line":"reservation by passing an instance UUID, and the resources that should be"},{"line_number":33,"context_line":"present on the node (CPUs, amount of RAM, etc). This could be further"},{"line_number":34,"context_line":"extended (outside the scope of this spec) to allow requesting certain"},{"line_number":35,"context_line":"capabilities or other attributes of a node."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"A successful request for a reservation should \"reserve\" the node by placing"},{"line_number":38,"context_line":"the instance ID on the node, and return a reservation object that includes"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a50d1a3_3fbaa30b","line":35,"in_reply_to":"3a50d1a3_21c37339","updated":"2015-07-23 20:02:40.000000000","message":"Let me rephrase - do we think it\u0027s useful for the reservations API? I certainly think it\u0027s useful for an API to filter by node.properties things.","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4ed7044ff8d50a1691e0cde6c9e77eeb73dea2de","unresolved":false,"context_lines":[{"line_number":32,"context_line":"reservation by passing an instance UUID, and the resources that should be"},{"line_number":33,"context_line":"present on the node (CPUs, amount of RAM, etc). This could be further"},{"line_number":34,"context_line":"extended (outside the scope of this spec) to allow requesting certain"},{"line_number":35,"context_line":"capabilities or other attributes of a node."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"A successful request for a reservation should \"reserve\" the node by placing"},{"line_number":38,"context_line":"the instance ID on the node, and return a reservation object that includes"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a50d1a3_21c37339","line":35,"in_reply_to":"3a50d1a3_8fccf389","updated":"2015-07-23 17:00:25.000000000","message":"\u003e Lucas, do we think fuzzy matching like that is useful?\n\nWe\u0027re using a similar thing on an inspector level, and we\u0027ll likely to continue doing it on inspector level. Just my 0.5","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"58bfb14ae089cadd3d86fba51f1296655813accc","unresolved":false,"context_lines":[{"line_number":32,"context_line":"reservation by passing an instance UUID, and the resources that should be"},{"line_number":33,"context_line":"present on the node (CPUs, amount of RAM, etc). This could be further"},{"line_number":34,"context_line":"extended (outside the scope of this spec) to allow requesting certain"},{"line_number":35,"context_line":"capabilities or other attributes of a node."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"A successful request for a reservation should \"reserve\" the node by placing"},{"line_number":38,"context_line":"the instance ID on the node, and return a reservation object that includes"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a50d1a3_8fccf389","line":35,"in_reply_to":"3a50d1a3_be248a0c","updated":"2015-07-23 16:42:38.000000000","message":"1. I tend to think node.instance_uuid should actually be node.instance_id, and anything could be supplied. However, I think generating one for now might be ok.\n\n2. Yeah. I don\u0027t know what a better word would be, though.\n\n3. Okay, let me think about what that would look like.\n\nLucas, do we think fuzzy matching like that is useful? I don\u0027t think it\u0027s a bad idea, but is it worth complicating the code to do it if nobody ends up using it?\n\nI agree we *must* split out node.properties into a separate table to make this work. I\u0027ll add it.","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7e7c49795f6bdbc7c17244615fe6c39559afd1a0","unresolved":false,"context_lines":[{"line_number":32,"context_line":"reservation by passing an instance UUID, and the resources that should be"},{"line_number":33,"context_line":"present on the node (CPUs, amount of RAM, etc). This could be further"},{"line_number":34,"context_line":"extended (outside the scope of this spec) to allow requesting certain"},{"line_number":35,"context_line":"capabilities or other attributes of a node."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"A successful request for a reservation should \"reserve\" the node by placing"},{"line_number":38,"context_line":"the instance ID on the node, and return a reservation object that includes"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a50d1a3_be248a0c","line":35,"in_reply_to":"3a50d1a3_ce1e930b","updated":"2015-07-23 14:54:22.000000000","message":"1. Would be good to just generate a random UUID for it if not passed.\n\n...\n\nOne thing I wonder is if we could use operators for those resources and not always matching the exact amount of it i.e memory_mb \u003e\u003d X. Will that be possible?\n\nAlso, as part of this spec are we creating a table for the json fields in our current model? I believe that would make the filtering much faster. How we plan to filter things if they currently leave in a data blob? Fetch all nodes and interact between them until we find one that is suitable?","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7b4595e6e6da3214df534e26855341d9d04cd165","unresolved":false,"context_lines":[{"line_number":38,"context_line":"the instance ID on the node, and return a reservation object that includes"},{"line_number":39,"context_line":"a link to the node that was reserved. That node may then be deployed to."},{"line_number":40,"context_line":"After tearing down the instance, a reservation may be deleted, which will"},{"line_number":41,"context_line":"remove the instance ID from the node. Reservations may also be listed and"},{"line_number":42,"context_line":"fetched by ID."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"A request for a reservation should be met with a node in the AVAILABLE"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a50d1a3_6e197f21","line":41,"updated":"2015-07-23 11:29:49.000000000","message":"1. does removing happen automatically on tear down?\n\n2. what if a caller forgets/fails to deploy? will reservation timeout or something?\n\n3. why not combine reservation process with set-provision-state active?","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7e7c49795f6bdbc7c17244615fe6c39559afd1a0","unresolved":false,"context_lines":[{"line_number":38,"context_line":"the instance ID on the node, and return a reservation object that includes"},{"line_number":39,"context_line":"a link to the node that was reserved. That node may then be deployed to."},{"line_number":40,"context_line":"After tearing down the instance, a reservation may be deleted, which will"},{"line_number":41,"context_line":"remove the instance ID from the node. Reservations may also be listed and"},{"line_number":42,"context_line":"fetched by ID."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"A request for a reservation should be met with a node in the AVAILABLE"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a50d1a3_de42b667","line":41,"in_reply_to":"3a50d1a3_6e197f21","updated":"2015-07-23 14:54:22.000000000","message":"I would expect that deleting a reservation would actually trigger the node\u0027s tear down? Is that the case?","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"58bfb14ae089cadd3d86fba51f1296655813accc","unresolved":false,"context_lines":[{"line_number":38,"context_line":"the instance ID on the node, and return a reservation object that includes"},{"line_number":39,"context_line":"a link to the node that was reserved. That node may then be deployed to."},{"line_number":40,"context_line":"After tearing down the instance, a reservation may be deleted, which will"},{"line_number":41,"context_line":"remove the instance ID from the node. Reservations may also be listed and"},{"line_number":42,"context_line":"fetched by ID."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"A request for a reservation should be met with a node in the AVAILABLE"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a50d1a3_892393bc","line":41,"in_reply_to":"3a50d1a3_de42b667","updated":"2015-07-23 16:42:38.000000000","message":"So my initial thoughts are that deploy/teardown is separate from reservation create/delete. There might be value in multiple deletes within a single reservation, or reserving a thing minutes/hours(?) before deploy. I\u0027m not entirely sure.\n\nTimeout is probably a good idea; let me think about that more.","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7b4595e6e6da3214df534e26855341d9d04cd165","unresolved":false,"context_lines":[{"line_number":51,"context_line":"Alternatives"},{"line_number":52,"context_line":"------------"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"Continue to make clients do their own scheduling."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"Data model impact"},{"line_number":57,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a50d1a3_8e140be9","line":54,"updated":"2015-07-23 11:29:49.000000000","message":"reusing existing API is an alternative as well","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7e7c49795f6bdbc7c17244615fe6c39559afd1a0","unresolved":false,"context_lines":[{"line_number":52,"context_line":"------------"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"Continue to make clients do their own scheduling."},{"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":2,"id":"3a50d1a3_fa845b5e","line":55,"updated":"2015-07-23 14:54:22.000000000","message":"One alternative would be to allow complex filtering in our API. e.g:\n\n  GET v1/nodes?query\u003d[{\u0027op\u0027: \u0027\u003e\u003d\u0027, \u0027path\u0027: \u0027properties/memory_mb\u0027, \u0027value\u0027: 2048}, ...]\n\n\nThis would be good because other systems could more easily integrate with Ironic, not only for the scheduling propose but other things like a dashboard. Operators may find it useful to just be able to query for nodes to see things like \"give me all nodes that are x86_64 achiteture\".\n\nOne con would be that scheduling would need to be implemented outside Ironic and yes we would end up with clients implementing their own. Tho, thecheduling will be quite simple, a simple python script could do that, e.g:\n\n \n try: \n     node \u003d client.node.list(query\u003d[{...}, ...])[0]\n  except IndexError:\n     raise ...\n\n  # instance uuid ...\n  node.update(\n  node.set_provision_state(states.ACTIVE, configdrive\u003d...)\n\nI also wonder that due the simplicity of the scheduling we could implement it in the Ironic client.","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"58bfb14ae089cadd3d86fba51f1296655813accc","unresolved":false,"context_lines":[{"line_number":52,"context_line":"------------"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"Continue to make clients do their own scheduling."},{"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":2,"id":"3a50d1a3_09f46358","line":55,"in_reply_to":"3a50d1a3_9ac8b756","updated":"2015-07-23 16:42:38.000000000","message":"Not only retries, but also randomness and such so you wear your hosts evenly, etc. I think there\u0027s enough logic that it\u0027s worth doing on the server side (not to mention python-ironicclient isn\u0027t the only client).\n\nHowever, I don\u0027t mind allowing this filtering in our API in the future now that this spec will break properties out to something indexable.\n\nAt any rate, I will list these as alternatives here, thanks :)","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"5b4f639d73cbdb40502efc48644f79c0a83df1dc","unresolved":false,"context_lines":[{"line_number":52,"context_line":"------------"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"Continue to make clients do their own scheduling."},{"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":2,"id":"3a50d1a3_9ac8b756","line":55,"in_reply_to":"3a50d1a3_fa845b5e","updated":"2015-07-23 14:59:43.000000000","message":"1. Your suggestion gets pretty close to https://blueprints.launchpad.net/ironic-inspector/+spec/advanced-matching (just FYI)\n\n2. This also needs retries in case of conflicts, so it\u0027s not *that* simple","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7e7c49795f6bdbc7c17244615fe6c39559afd1a0","unresolved":false,"context_lines":[{"line_number":156,"context_line":""},{"line_number":157,"context_line":"  * Deletes the reservation object for \u003cuuid\u003e."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"  * Returns 204 on success."},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"  * Returns 404 if \u003cuuid\u003e does not exist."},{"line_number":162,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a50d1a3_f9a6ac0d","line":159,"updated":"2015-07-23 14:54:22.000000000","message":"If the deleation of a reservation implies on tearing down the node we probably should return 202 here because that will be an async operation.","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"58bfb14ae089cadd3d86fba51f1296655813accc","unresolved":false,"context_lines":[{"line_number":156,"context_line":""},{"line_number":157,"context_line":"  * Deletes the reservation object for \u003cuuid\u003e."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"  * Returns 204 on success."},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"  * Returns 404 if \u003cuuid\u003e does not exist."},{"line_number":162,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a50d1a3_affc4f72","line":159,"in_reply_to":"3a50d1a3_f9a6ac0d","updated":"2015-07-23 16:42:38.000000000","message":"Right, it does not.","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7b4595e6e6da3214df534e26855341d9d04cd165","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"  * Empty response body."},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"* API version should be bumped for this feature."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"Client (CLI) impact"},{"line_number":172,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a50d1a3_2ed61728","line":169,"updated":"2015-07-23 11:29:49.000000000","message":"We need API to get reservation for a node","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"58bfb14ae089cadd3d86fba51f1296655813accc","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"  * Empty response body."},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"* API version should be bumped for this feature."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"Client (CLI) impact"},{"line_number":172,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a50d1a3_6f42c7af","line":169,"in_reply_to":"3a50d1a3_2ed61728","updated":"2015-07-23 16:42:38.000000000","message":"Do we? I\u0027m not opposed to it, just curious.","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"9bab078e3b2e2edd349fc181d6557f1cb9507acc","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"  * Empty response body."},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"* API version should be bumped for this feature."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"Client (CLI) impact"},{"line_number":172,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a50d1a3_bf44731b","line":169,"in_reply_to":"3a50d1a3_61d17b22","updated":"2015-07-23 20:02:40.000000000","message":"Yeah, seems reasonable. I thought about it earlier, too. Just asking :)","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4ed7044ff8d50a1691e0cde6c9e77eeb73dea2de","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"  * Empty response body."},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"* API version should be bumped for this feature."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"Client (CLI) impact"},{"line_number":172,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a50d1a3_61d17b22","line":169,"in_reply_to":"3a50d1a3_6f42c7af","updated":"2015-07-23 17:00:25.000000000","message":"At least for the sake of consistency, like getting ports for a node. WDYT?","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7b4595e6e6da3214df534e26855341d9d04cd165","unresolved":false,"context_lines":[{"line_number":190,"context_line":""},{"line_number":191,"context_line":"RPC methods will need to be created to allow reservation create to happen in"},{"line_number":192,"context_line":"the conductor. TODO(jroll) is this required or can we just do it in the API"},{"line_number":193,"context_line":"layer?"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"Driver API impact"},{"line_number":196,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a50d1a3_4ed92356","line":193,"updated":"2015-07-23 11:29:49.000000000","message":"I think currently we work with database on API level.","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"58bfb14ae089cadd3d86fba51f1296655813accc","unresolved":false,"context_lines":[{"line_number":190,"context_line":""},{"line_number":191,"context_line":"RPC methods will need to be created to allow reservation create to happen in"},{"line_number":192,"context_line":"the conductor. TODO(jroll) is this required or can we just do it in the API"},{"line_number":193,"context_line":"layer?"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"Driver API impact"},{"line_number":196,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a50d1a3_cfd2fbd0","line":193,"in_reply_to":"3a50d1a3_19d35861","updated":"2015-07-23 16:42:38.000000000","message":"Hm, you\u0027re probably right.","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7e7c49795f6bdbc7c17244615fe6c39559afd1a0","unresolved":false,"context_lines":[{"line_number":190,"context_line":""},{"line_number":191,"context_line":"RPC methods will need to be created to allow reservation create to happen in"},{"line_number":192,"context_line":"the conductor. TODO(jroll) is this required or can we just do it in the API"},{"line_number":193,"context_line":"layer?"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"Driver API impact"},{"line_number":196,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a50d1a3_19d35861","line":193,"in_reply_to":"3a50d1a3_4ed92356","updated":"2015-07-23 14:54:22.000000000","message":"You probably needs to get an exclusive lock before reserving the node, which only happens on the conductor side.","commit_id":"8416b8f2b25fee41325a30ac3335c0d3c50bfb60"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"9893d8deb37406f92ce5f24760a51605ac059069","unresolved":false,"context_lines":[{"line_number":34,"context_line":"extended (outside the scope of this spec) to allow requesting certain"},{"line_number":35,"context_line":"capabilities or other attributes of a node."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"TODO(jroll) should we allow for fuzzy matching? \"\u003e 50mb\", etc?"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"A successful request for a reservation should \"reserve\" the node by placing"},{"line_number":40,"context_line":"the instance ID on the node, and return a reservation object that includes"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_24afdd95","line":37,"updated":"2015-07-24 10:33:28.000000000","message":"+1, I think it\u0027s not that difficult to do it.","commit_id":"d663542f34542aa0d6c4ded4719248bd8ab2c774"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a876896cf13d6ffd236be3ba849416b85118236e","unresolved":false,"context_lines":[{"line_number":34,"context_line":"extended (outside the scope of this spec) to allow requesting certain"},{"line_number":35,"context_line":"capabilities or other attributes of a node."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"TODO(jroll) should we allow for fuzzy matching? \"\u003e 50mb\", etc?"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"A successful request for a reservation should \"reserve\" the node by placing"},{"line_number":40,"context_line":"the instance ID on the node, and return a reservation object that includes"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_1ff78af6","line":37,"in_reply_to":"3a50d1a3_24afdd95","updated":"2015-07-24 10:43:00.000000000","message":"+0, but limit to simple operations \u003d\u003e, \u003c\u003d, \u003d\u003d","commit_id":"d663542f34542aa0d6c4ded4719248bd8ab2c774"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a876896cf13d6ffd236be3ba849416b85118236e","unresolved":false,"context_lines":[{"line_number":65,"context_line":"Alternatives"},{"line_number":66,"context_line":"------------"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"Only biuld the filtering API and don\u0027t have any concept of reservations."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Data model impact"},{"line_number":71,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_1f454a16","line":68,"updated":"2015-07-24 10:43:00.000000000","message":"nit: s/biuld/build/","commit_id":"d663542f34542aa0d6c4ded4719248bd8ab2c774"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"9893d8deb37406f92ce5f24760a51605ac059069","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"* `uuid` - STRING - unique UUID4 for the reservation"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"A new ``properties`` table will be added, with accompanying migrations."},{"line_number":87,"context_line":"This table will have the following fields:"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"* `created_at` - DATETIME - the timestamp of creation"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_9f307aea","line":86,"updated":"2015-07-24 10:33:28.000000000","message":"Will we cease to have node.properties ? What about certain other things like root_device which is again a JSON dictionary?","commit_id":"d663542f34542aa0d6c4ded4719248bd8ab2c774"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a876896cf13d6ffd236be3ba849416b85118236e","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"* `key` - STRING - the key for the property."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"* `value` - STRING - the value for the property."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"A new ``capabilities`` table will be added, with accompanying migrations."},{"line_number":102,"context_line":"This table will have the following fields:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_5f867266","line":99,"updated":"2015-07-24 10:43:00.000000000","message":"note that not all properties are strings, so this should be JSON-encoded value","commit_id":"d663542f34542aa0d6c4ded4719248bd8ab2c774"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a876896cf13d6ffd236be3ba849416b85118236e","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"* `key` - STRING - the key for the property."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"* `value` - STRING - the value for the property."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"The ``node.properties`` and ``node.capabilities`` fields should be lazily"},{"line_number":117,"context_line":"migrated to the corresponding tables on node.save, to avoid a migration"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_5f0992dc","line":114,"updated":"2015-07-24 10:43:00.000000000","message":"both tables should have index on (key, value), right?","commit_id":"d663542f34542aa0d6c4ded4719248bd8ab2c774"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"9893d8deb37406f92ce5f24760a51605ac059069","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"* `value` - STRING - the value for the property."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"The ``node.properties`` and ``node.capabilities`` fields should be lazily"},{"line_number":117,"context_line":"migrated to the corresponding tables on node.save, to avoid a migration"},{"line_number":118,"context_line":"that can not be performed while services are online. These fields should"},{"line_number":119,"context_line":"be deleted in a later release."}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_448ea928","line":116,"updated":"2015-07-24 10:33:28.000000000","message":"I hope we will continue to provide node.instance_uuid as a readonly field in the Node object.  This should rather be figured out by joining nodes and reservations table.","commit_id":"d663542f34542aa0d6c4ded4719248bd8ab2c774"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a876896cf13d6ffd236be3ba849416b85118236e","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"* `value` - STRING - the value for the property."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"The ``node.properties`` and ``node.capabilities`` fields should be lazily"},{"line_number":117,"context_line":"migrated to the corresponding tables on node.save, to avoid a migration"},{"line_number":118,"context_line":"that can not be performed while services are online. These fields should"},{"line_number":119,"context_line":"be deleted in a later release."}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_3f9a86c6","line":116,"updated":"2015-07-24 10:43:00.000000000","message":"note that we don\u0027t have node.capabilities, it\u0027s node.properties[capabilities]","commit_id":"d663542f34542aa0d6c4ded4719248bd8ab2c774"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a876896cf13d6ffd236be3ba849416b85118236e","unresolved":false,"context_lines":[{"line_number":116,"context_line":"The ``node.properties`` and ``node.capabilities`` fields should be lazily"},{"line_number":117,"context_line":"migrated to the corresponding tables on node.save, to avoid a migration"},{"line_number":118,"context_line":"that can not be performed while services are online. These fields should"},{"line_number":119,"context_line":"be deleted in a later release."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"State Machine Impact"},{"line_number":122,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_5fed1224","line":119,"updated":"2015-07-24 10:43:00.000000000","message":"we can\u0027t drop any fields due to API versioning, we have to support it forever \u003d^_^\u003d","commit_id":"d663542f34542aa0d6c4ded4719248bd8ab2c774"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"9893d8deb37406f92ce5f24760a51605ac059069","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"Nodes may only be reserved when in the AVAILABLE state."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"REST API impact"},{"line_number":127,"context_line":"---------------"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"TODO(jroll) add new filters for node api, get reservation by node"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_e4c6d548","line":126,"updated":"2015-07-24 10:33:28.000000000","message":"What\u0027s the impact of instance_uuid field returned when we do GET /v1/nodes/NNNN.  I think we should still return it (makes it easy for clients to avoid doing two REST calls), but shouldn\u0027t allow PATCHing it anymore.","commit_id":"d663542f34542aa0d6c4ded4719248bd8ab2c774"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"9893d8deb37406f92ce5f24760a51605ac059069","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"  * Returns 201 Created on success"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"  * Returns 404 Not Found if no node was found to match the requested"},{"line_number":138,"context_line":"    properties."},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"  * Request body::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_04566106","line":137,"updated":"2015-07-24 10:33:28.000000000","message":"I think it should return 409 Conflict if duplicate instance_uuid is found (some weird client who doesn\u0027t generate unique reservation uuids)","commit_id":"d663542f34542aa0d6c4ded4719248bd8ab2c774"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a876896cf13d6ffd236be3ba849416b85118236e","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"  * Returns 201 Created on success"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"  * Returns 404 Not Found if no node was found to match the requested"},{"line_number":138,"context_line":"    properties."},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"  * Request body::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_dff5a2cb","line":137,"in_reply_to":"3a50d1a3_04566106","updated":"2015-07-24 10:43:00.000000000","message":"+1","commit_id":"d663542f34542aa0d6c4ded4719248bd8ab2c774"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"9893d8deb37406f92ce5f24760a51605ac059069","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        \"image\": \u003cuuid_or_none\u003e"},{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"  * Only instance_uuid is required; if a parameter in this list is not"},{"line_number":151,"context_line":"    provided, it may be matched to anything."},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"  * Response body::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_649f25b5","line":150,"updated":"2015-07-24 10:33:28.000000000","message":"Looking at previous patch set, I think we agreed to generate a instance_uuid if it wasn\u0027t provided.  Then, any empty POST on /v1/reservations should return back the reservation.","commit_id":"d663542f34542aa0d6c4ded4719248bd8ab2c774"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"9893d8deb37406f92ce5f24760a51605ac059069","unresolved":false,"context_lines":[{"line_number":153,"context_line":"  * Response body::"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    {"},{"line_number":156,"context_line":"        \"uuid\": \u003cuuid\u003e,"},{"line_number":157,"context_line":"        \"node_uuid\": \u003cuuid\u003e,"},{"line_number":158,"context_line":"        \"created_at\": \u003cdatetime\u003e,"},{"line_number":159,"context_line":"        \"updated_at\": \u003cdatetime\u003e"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_a4b52d32","line":156,"updated":"2015-07-24 10:33:28.000000000","message":"I think this should have instance_uuid returned to make sure we can return it when Ironic is generating one.","commit_id":"d663542f34542aa0d6c4ded4719248bd8ab2c774"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a876896cf13d6ffd236be3ba849416b85118236e","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":"  * Returns 204 on success."},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"  * Returns 404 if \u003cuuid\u003e does not exist."},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"  * No additional parameters."},{"line_number":215,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_5f30b29e","line":212,"updated":"2015-07-24 10:43:00.000000000","message":"Returns 400 if associated node is not AVAILABLE/MANAGEABLE *OR* in maintenance (whatever state is).","commit_id":"d663542f34542aa0d6c4ded4719248bd8ab2c774"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a876896cf13d6ffd236be3ba849416b85118236e","unresolved":false,"context_lines":[{"line_number":234,"context_line":""},{"line_number":235,"context_line":"* ironic reservation-show \u003cuuid\u003e"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"* ironic reservation-delete \u003cuuid\u003e"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"RPC API impact"},{"line_number":240,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_bfe69614","line":237,"updated":"2015-07-24 10:43:00.000000000","message":"future improvement\n\n ironic node-reservation-delete \u003cNODE UUID\u003e","commit_id":"d663542f34542aa0d6c4ded4719248bd8ab2c774"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"9893d8deb37406f92ce5f24760a51605ac059069","unresolved":false,"context_lines":[{"line_number":239,"context_line":"RPC API impact"},{"line_number":240,"context_line":"--------------"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"RPC methods will need to be created to allow reservation create to happen in"},{"line_number":243,"context_line":"the conductor. TODO(jroll) is this required or can we just do it in the API"},{"line_number":244,"context_line":"layer?"},{"line_number":245,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_c4e63916","line":242,"updated":"2015-07-24 10:33:28.000000000","message":"We need some locking  on the ironic-api to do this (which we don\u0027t do today).  This seems perfectly doable in the API as majority of the actual work is in the DB.","commit_id":"d663542f34542aa0d6c4ded4719248bd8ab2c774"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a876896cf13d6ffd236be3ba849416b85118236e","unresolved":false,"context_lines":[{"line_number":239,"context_line":"RPC API impact"},{"line_number":240,"context_line":"--------------"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"RPC methods will need to be created to allow reservation create to happen in"},{"line_number":243,"context_line":"the conductor. TODO(jroll) is this required or can we just do it in the API"},{"line_number":244,"context_line":"layer?"},{"line_number":245,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_9feddaf1","line":242,"in_reply_to":"3a50d1a3_c4e63916","updated":"2015-07-24 10:43:00.000000000","message":"It\u0027s discussable whether we should have locking in API. Currently, locks are bound to a conductor.","commit_id":"d663542f34542aa0d6c4ded4719248bd8ab2c774"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0a8ae86479c88189660509b6cba968d651d8bb6c","unresolved":false,"context_lines":[{"line_number":31,"context_line":"Let\u0027s add a concept of \"reservations\" to Ironic. A client may request a"},{"line_number":32,"context_line":"reservation by passing an instance UUID, and the properties and/or"},{"line_number":33,"context_line":"capabilities that the node must have. These don\u0027t need to be exact matches;"},{"line_number":34,"context_line":"simple operators may be used tor less exact matching."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"A successful request for a reservation should \"reserve\" the node by placing"},{"line_number":37,"context_line":"the instance ID on the node, and return a reservation object that includes"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a50d1a3_87e57add","line":34,"updated":"2015-07-30 23:06:40.000000000","message":"s/tor/for","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"c3679e45f21c1e29935e8866aba80d67bc3f59de","unresolved":false,"context_lines":[{"line_number":31,"context_line":"Let\u0027s add a concept of \"reservations\" to Ironic. A client may request a"},{"line_number":32,"context_line":"reservation by passing an instance UUID, and the properties and/or"},{"line_number":33,"context_line":"capabilities that the node must have. These don\u0027t need to be exact matches;"},{"line_number":34,"context_line":"simple operators may be used tor less exact matching."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"A successful request for a reservation should \"reserve\" the node by placing"},{"line_number":37,"context_line":"the instance ID on the node, and return a reservation object that includes"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_0a6456b6","line":34,"in_reply_to":"3a50d1a3_87e57add","updated":"2015-10-10 15:27:49.000000000","message":"Done","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0a8ae86479c88189660509b6cba968d651d8bb6c","unresolved":false,"context_lines":[{"line_number":33,"context_line":"capabilities that the node must have. These don\u0027t need to be exact matches;"},{"line_number":34,"context_line":"simple operators may be used tor less exact matching."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"A successful request for a reservation should \"reserve\" the node by placing"},{"line_number":37,"context_line":"the instance ID on the node, and return a reservation object that includes"},{"line_number":38,"context_line":"a link to the node that was reserved. That node may then be deployed to."},{"line_number":39,"context_line":"After tearing down the instance, a reservation may be deleted, which will"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a50d1a3_e798fe1d","line":36,"updated":"2015-07-30 23:06:40.000000000","message":"Does a reservation have to be permanent if the node doesn\u0027t get deployed to in a reasonable amount of time? I wonder if it would be useful to expire a reservation after a certain period of time, or at least allow operators to have that as a configurable option.","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"c3679e45f21c1e29935e8866aba80d67bc3f59de","unresolved":false,"context_lines":[{"line_number":33,"context_line":"capabilities that the node must have. These don\u0027t need to be exact matches;"},{"line_number":34,"context_line":"simple operators may be used tor less exact matching."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"A successful request for a reservation should \"reserve\" the node by placing"},{"line_number":37,"context_line":"the instance ID on the node, and return a reservation object that includes"},{"line_number":38,"context_line":"a link to the node that was reserved. That node may then be deployed to."},{"line_number":39,"context_line":"After tearing down the instance, a reservation may be deleted, which will"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_ea079ac7","line":36,"in_reply_to":"3a50d1a3_e798fe1d","updated":"2015-10-10 15:27:49.000000000","message":"Yeah, I\u0027d like to think about some sort of optional TTL. However, I\u0027d also like to maybe explore using this for actions other than deploy.","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":6804,"name":"bruce-benjamin","email":"bruce.benjamin@jhuapl.edu","username":"bruce-benjamin"},"change_message_id":"e5249dc4719dfda6504e8b376c48893c8db46071","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"A successful request for a reservation should \"reserve\" the node by placing"},{"line_number":37,"context_line":"the instance ID on the node, and return a reservation object that includes"},{"line_number":38,"context_line":"a link to the node that was reserved. That node may then be deployed to."},{"line_number":39,"context_line":"After tearing down the instance, a reservation may be deleted, which will"},{"line_number":40,"context_line":"remove the instance ID from the node. Reservations may also be listed and"},{"line_number":41,"context_line":"fetched by ID. To be clear, the reservation creation and deletion happens"}],"source_content_type":"text/x-rst","patch_set":4,"id":"da20952f_0fb5ecec","line":38,"updated":"2015-08-27 21:53:31.000000000","message":"This sentence is incomplete.  Suggestion:  s/deployed to/deployed by the client/","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"c3679e45f21c1e29935e8866aba80d67bc3f59de","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"A successful request for a reservation should \"reserve\" the node by placing"},{"line_number":37,"context_line":"the instance ID on the node, and return a reservation object that includes"},{"line_number":38,"context_line":"a link to the node that was reserved. That node may then be deployed to."},{"line_number":39,"context_line":"After tearing down the instance, a reservation may be deleted, which will"},{"line_number":40,"context_line":"remove the instance ID from the node. Reservations may also be listed and"},{"line_number":41,"context_line":"fetched by ID. To be clear, the reservation creation and deletion happens"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_ca109e02","line":38,"in_reply_to":"da20952f_0fb5ecec","updated":"2015-10-10 15:27:49.000000000","message":"Done","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0a8ae86479c88189660509b6cba968d651d8bb6c","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"A request for a reservation should be met with a node in the AVAILABLE"},{"line_number":45,"context_line":"state that meets the requirements in the request. If no node can meet"},{"line_number":46,"context_line":"the request, a 404 should be returned."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Nodes may continue to be deployed without a reservation, for clients that"},{"line_number":49,"context_line":"wish to continue doing their own scheduling."}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a50d1a3_87581a8c","line":46,"updated":"2015-07-30 23:06:40.000000000","message":"What would happen in the event that a node with a reservation becomes unavailable before it\u0027s deployed to? \n\nMaybe at deploy time, if reservations are used, we could try to send back another reservation with a link to a new node with the originally requested properties, if another one exists. Or, the deploy just fails. Not sure what the best behavior is in that case.","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"c3679e45f21c1e29935e8866aba80d67bc3f59de","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"A request for a reservation should be met with a node in the AVAILABLE"},{"line_number":45,"context_line":"state that meets the requirements in the request. If no node can meet"},{"line_number":46,"context_line":"the request, a 404 should be returned."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Nodes may continue to be deployed without a reservation, for clients that"},{"line_number":49,"context_line":"wish to continue doing their own scheduling."}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_8af706d2","line":46,"in_reply_to":"3a50d1a3_87581a8c","updated":"2015-10-10 15:27:49.000000000","message":"I think we\u0027ll keep the current behavior here; reject deploy requests for nodes in an invalid state.","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"cd612e4af050ec0120817ac7f5986f9ae07ba3aa","unresolved":false,"context_lines":[{"line_number":62,"context_line":"Alternatives"},{"line_number":63,"context_line":"------------"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"Only biuld the filtering API and don\u0027t have any concept of reservations."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"Data model impact"},{"line_number":68,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a50d1a3_5c721213","line":65,"updated":"2015-07-30 09:00:51.000000000","message":"nit: s/biuld/build","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"c3679e45f21c1e29935e8866aba80d67bc3f59de","unresolved":false,"context_lines":[{"line_number":62,"context_line":"Alternatives"},{"line_number":63,"context_line":"------------"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"Only biuld the filtering API and don\u0027t have any concept of reservations."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"Data model impact"},{"line_number":68,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_2a0272b4","line":65,"in_reply_to":"3a50d1a3_5c721213","updated":"2015-10-10 15:27:49.000000000","message":"Done","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"546e6d4e7985ca139a8e4b47e1e6c5dbc6dfae15","unresolved":false,"context_lines":[{"line_number":67,"context_line":"Data model impact"},{"line_number":68,"context_line":"-----------------"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"A new ``reservations`` table will be added, with accompanying migrations."},{"line_number":71,"context_line":"This table will have the following fields:"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"* `created_at` - DATETIME - the timestamp of creation"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_aa6c42d0","line":70,"updated":"2015-10-10 14:42:02.000000000","message":"Let\u0027s change this to \u0027claims\u0027 instead.","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"c3679e45f21c1e29935e8866aba80d67bc3f59de","unresolved":false,"context_lines":[{"line_number":67,"context_line":"Data model impact"},{"line_number":68,"context_line":"-----------------"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"A new ``reservations`` table will be added, with accompanying migrations."},{"line_number":71,"context_line":"This table will have the following fields:"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"* `created_at` - DATETIME - the timestamp of creation"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_4afd6eaf","line":70,"in_reply_to":"7a2fa921_aa6c42d0","updated":"2015-10-10 15:27:49.000000000","message":"Done","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"cd612e4af050ec0120817ac7f5986f9ae07ba3aa","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"* `uuid` - STRING - unique UUID4 for the reservation"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"A new ``properties`` table will be added, with accompanying migrations."},{"line_number":84,"context_line":"This table will have the following fields:"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"* `created_at` - DATETIME - the timestamp of creation"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a50d1a3_b13fb8b4","line":83,"updated":"2015-07-30 09:00:51.000000000","message":"this table will be updated with node-create/node-update as well as we do today for node.properties?","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"c3679e45f21c1e29935e8866aba80d67bc3f59de","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"* `uuid` - STRING - unique UUID4 for the reservation"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"A new ``properties`` table will be added, with accompanying migrations."},{"line_number":84,"context_line":"This table will have the following fields:"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"* `created_at` - DATETIME - the timestamp of creation"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_ea2eba41","line":83,"in_reply_to":"3a50d1a3_b13fb8b4","updated":"2015-10-10 15:27:49.000000000","message":"Yes, this will be explained in the API impact section.","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"cd612e4af050ec0120817ac7f5986f9ae07ba3aa","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"* `value` - STRING - the value for the property."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"A new ``capabilities`` table will be added, with accompanying migrations."},{"line_number":99,"context_line":"This table will have the following fields:"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"* `created_at` - DATETIME - the timestamp of creation"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a50d1a3_d13cc4c1","line":98,"updated":"2015-07-30 09:00:51.000000000","message":"ditto","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"c3679e45f21c1e29935e8866aba80d67bc3f59de","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"* `value` - STRING - the value for the property."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"A new ``capabilities`` table will be added, with accompanying migrations."},{"line_number":99,"context_line":"This table will have the following fields:"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"* `created_at` - DATETIME - the timestamp of creation"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_0a3216a7","line":98,"in_reply_to":"3a50d1a3_d13cc4c1","updated":"2015-10-10 15:27:49.000000000","message":"Done","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"cd612e4af050ec0120817ac7f5986f9ae07ba3aa","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"The ``node.properties`` and ``node.capabilities`` fields should be lazily"},{"line_number":114,"context_line":"migrated to the corresponding tables on node.save, to avoid a migration"},{"line_number":115,"context_line":"that can not be performed while services are online. These fields should"},{"line_number":116,"context_line":"be deleted in a later release."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"State Machine Impact"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a50d1a3_b1ad78ec","line":115,"updated":"2015-07-30 09:00:51.000000000","message":"These fields may be deleted later on from node table but at the same time the existing CLI andAPI should be able to update the new table with current format also.","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"c3679e45f21c1e29935e8866aba80d67bc3f59de","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"The ``node.properties`` and ``node.capabilities`` fields should be lazily"},{"line_number":114,"context_line":"migrated to the corresponding tables on node.save, to avoid a migration"},{"line_number":115,"context_line":"that can not be performed while services are online. These fields should"},{"line_number":116,"context_line":"be deleted in a later release."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"State Machine Impact"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_6a238a56","line":115,"in_reply_to":"3a50d1a3_b1ad78ec","updated":"2015-10-10 15:27:49.000000000","message":"Again, this will be explained in the API impact section.","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"cd612e4af050ec0120817ac7f5986f9ae07ba3aa","unresolved":false,"context_lines":[{"line_number":123,"context_line":"REST API impact"},{"line_number":124,"context_line":"---------------"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"TODO(jroll) add new filters for node api, get reservation by node"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"POST /v1/reservations"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a50d1a3_3103a8c0","line":126,"updated":"2015-07-30 09:00:51.000000000","message":"I assume the filters means the operators functionality needs to be implemented. \nThe end point to call the filters are missing like \"get me a list of nodes matching these criterias\".\n\nHow could we make use of these filters in standalone ironic?","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"c3679e45f21c1e29935e8866aba80d67bc3f59de","unresolved":false,"context_lines":[{"line_number":123,"context_line":"REST API impact"},{"line_number":124,"context_line":"---------------"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"TODO(jroll) add new filters for node api, get reservation by node"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"POST /v1/reservations"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_4a148ee7","line":126,"in_reply_to":"3a50d1a3_3103a8c0","updated":"2015-10-10 15:27:49.000000000","message":"Right, as part of this we\u0027ll build a filter API; this will be similar to the \"create a claim\" API, but return a list of matching nodes, rather than picking one.","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"cd612e4af050ec0120817ac7f5986f9ae07ba3aa","unresolved":false,"context_lines":[{"line_number":137,"context_line":"* Request body::"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    {"},{"line_number":140,"context_line":"        \"instance_uuid\": \u003cuuid\u003e,"},{"line_number":141,"context_line":"        \"memory_mb\": \u003cint_or_none\u003e,"},{"line_number":142,"context_line":"        \"root_gb\": \u003cint_or_none\u003e,"},{"line_number":143,"context_line":"        \"ephemeral_gb\": \u003cint_or_none\u003e,"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a50d1a3_b187b8b5","line":140,"updated":"2015-07-30 09:00:51.000000000","message":"Who will provide the instance uuid? As of now Nova only assigns the instance_uuid.","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"c3679e45f21c1e29935e8866aba80d67bc3f59de","unresolved":false,"context_lines":[{"line_number":137,"context_line":"* Request body::"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    {"},{"line_number":140,"context_line":"        \"instance_uuid\": \u003cuuid\u003e,"},{"line_number":141,"context_line":"        \"memory_mb\": \u003cint_or_none\u003e,"},{"line_number":142,"context_line":"        \"root_gb\": \u003cint_or_none\u003e,"},{"line_number":143,"context_line":"        \"ephemeral_gb\": \u003cint_or_none\u003e,"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_cade5e3d","line":140,"in_reply_to":"3a50d1a3_b187b8b5","updated":"2015-10-10 15:27:49.000000000","message":"The client making the claim will provide it, whether that\u0027s Nova or some other client. I think I want to remove this, though...","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0a8ae86479c88189660509b6cba968d651d8bb6c","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    {"},{"line_number":140,"context_line":"        \"instance_uuid\": \u003cuuid\u003e,"},{"line_number":141,"context_line":"        \"memory_mb\": \u003cint_or_none\u003e,"},{"line_number":142,"context_line":"        \"root_gb\": \u003cint_or_none\u003e,"},{"line_number":143,"context_line":"        \"ephemeral_gb\": \u003cint_or_none\u003e,"},{"line_number":144,"context_line":"        \"image\": \u003cuuid_or_none\u003e"},{"line_number":145,"context_line":"    }"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a50d1a3_87b49a82","line":142,"updated":"2015-07-30 23:06:40.000000000","message":"It would be neat if we could accept ranges for integer values. \n\nIf these mapped directly to Nova flavors that wouldn\u0027t be very useful, but imagine if we had someone using Ironic standalone where they have an application that needs nodes with \u003e100GB disk space and don\u0027t care about any other features.","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"c3679e45f21c1e29935e8866aba80d67bc3f59de","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    {"},{"line_number":140,"context_line":"        \"instance_uuid\": \u003cuuid\u003e,"},{"line_number":141,"context_line":"        \"memory_mb\": \u003cint_or_none\u003e,"},{"line_number":142,"context_line":"        \"root_gb\": \u003cint_or_none\u003e,"},{"line_number":143,"context_line":"        \"ephemeral_gb\": \u003cint_or_none\u003e,"},{"line_number":144,"context_line":"        \"image\": \u003cuuid_or_none\u003e"},{"line_number":145,"context_line":"    }"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_2af032c8","line":142,"in_reply_to":"3a50d1a3_87b49a82","updated":"2015-10-10 15:27:49.000000000","message":"+1. I\u0027m wondering if we should put that in scope here or  save it for an additional feature later on.","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"cd612e4af050ec0120817ac7f5986f9ae07ba3aa","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        \"memory_mb\": \u003cint_or_none\u003e,"},{"line_number":142,"context_line":"        \"root_gb\": \u003cint_or_none\u003e,"},{"line_number":143,"context_line":"        \"ephemeral_gb\": \u003cint_or_none\u003e,"},{"line_number":144,"context_line":"        \"image\": \u003cuuid_or_none\u003e"},{"line_number":145,"context_line":"    }"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"* Only instance_uuid is required; if a parameter in this list is not"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a50d1a3_719db065","line":144,"updated":"2015-07-30 09:00:51.000000000","message":"is this an example of the request body or only these parameters are allowed in the request?\n\nThis confuses me how do i match and get a node with certain capabilities which is not defined above in the request body.\n\nIf any parameters could be defined in request body, then are these parameters keys validated against some db? In other words do we validate any parameters keys or we assume that any key given by the user is correct?","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"c3679e45f21c1e29935e8866aba80d67bc3f59de","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        \"memory_mb\": \u003cint_or_none\u003e,"},{"line_number":142,"context_line":"        \"root_gb\": \u003cint_or_none\u003e,"},{"line_number":143,"context_line":"        \"ephemeral_gb\": \u003cint_or_none\u003e,"},{"line_number":144,"context_line":"        \"image\": \u003cuuid_or_none\u003e"},{"line_number":145,"context_line":"    }"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"* Only instance_uuid is required; if a parameter in this list is not"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_4ac24e54","line":144,"in_reply_to":"3a50d1a3_719db065","updated":"2015-10-10 15:27:49.000000000","message":"This is an example, added a TODO for the next revision.","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"cd612e4af050ec0120817ac7f5986f9ae07ba3aa","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        \"image\": \u003cuuid_or_none\u003e"},{"line_number":145,"context_line":"    }"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"* Only instance_uuid is required; if a parameter in this list is not"},{"line_number":148,"context_line":"  provided, it may be matched to anything."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"* Response body::"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a50d1a3_514d1498","line":147,"updated":"2015-07-30 09:00:51.000000000","message":"ditto, how do we get/create the instance_uuid? from nova?","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"c3679e45f21c1e29935e8866aba80d67bc3f59de","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        \"image\": \u003cuuid_or_none\u003e"},{"line_number":145,"context_line":"    }"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"* Only instance_uuid is required; if a parameter in this list is not"},{"line_number":148,"context_line":"  provided, it may be matched to anything."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"* Response body::"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_6ad14a22","line":147,"in_reply_to":"3a50d1a3_514d1498","updated":"2015-10-10 15:27:49.000000000","message":"Removed.","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"cd612e4af050ec0120817ac7f5986f9ae07ba3aa","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        {"},{"line_number":175,"context_line":"            \"uuid\": \u003cuuid\u003e,"},{"line_number":176,"context_line":"            \"node_uuid\": \u003cuuid\u003e,"},{"line_number":177,"context_line":"            \"created_at\": \u003cdatetime\u003e,"},{"line_number":178,"context_line":"            \"updated_at\": \u003cdatetime\u003e"},{"line_number":179,"context_line":"        }, ..."},{"line_number":180,"context_line":"    ]"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a50d1a3_b1001837","line":177,"updated":"2015-07-30 09:00:51.000000000","message":"what do created_at/updated_at signify?Is this the create time of the node?\n\nI am not sure how do these help a ironic user here. I am not able to think of a reason for returning the created_at/updated_at values.","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"c3679e45f21c1e29935e8866aba80d67bc3f59de","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        {"},{"line_number":175,"context_line":"            \"uuid\": \u003cuuid\u003e,"},{"line_number":176,"context_line":"            \"node_uuid\": \u003cuuid\u003e,"},{"line_number":177,"context_line":"            \"created_at\": \u003cdatetime\u003e,"},{"line_number":178,"context_line":"            \"updated_at\": \u003cdatetime\u003e"},{"line_number":179,"context_line":"        }, ..."},{"line_number":180,"context_line":"    ]"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_aaa9a291","line":177,"in_reply_to":"3a50d1a3_b1001837","updated":"2015-10-10 15:27:49.000000000","message":"It\u0027s the created_at/updated_at values for the claim, not the node. It\u0027s standard for us to return these for all objects.","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":13997,"name":"SHIGEMATSU Mitsuhiro","email":"shigematsu.mitsuhiro@lab.ntt.co.jp","username":"pshige"},"change_message_id":"1297fef39730e4a6ee1daafdb06d548aff2ebefd","unresolved":false,"context_lines":[{"line_number":220,"context_line":"-------------------"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"The client should also be updated to support this feature. The python"},{"line_number":223,"context_line":"library and the CLI should both support this. THe CLI should add the new"},{"line_number":224,"context_line":"commands, which each correspond to the new REST API methods:"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"* ironic reservation-create --instance-uuid \u003cinstance_uuid\u003e --memory-mb"}],"source_content_type":"text/x-rst","patch_set":4,"id":"1a4dcd0f_04170555","line":223,"updated":"2015-08-16 06:31:02.000000000","message":"s/THe/The/","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"c3679e45f21c1e29935e8866aba80d67bc3f59de","unresolved":false,"context_lines":[{"line_number":220,"context_line":"-------------------"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"The client should also be updated to support this feature. The python"},{"line_number":223,"context_line":"library and the CLI should both support this. THe CLI should add the new"},{"line_number":224,"context_line":"commands, which each correspond to the new REST API methods:"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"* ironic reservation-create --instance-uuid \u003cinstance_uuid\u003e --memory-mb"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_ea8a3a1a","line":223,"in_reply_to":"1a4dcd0f_04170555","updated":"2015-10-10 15:27:49.000000000","message":"Done","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":6804,"name":"bruce-benjamin","email":"bruce.benjamin@jhuapl.edu","username":"bruce-benjamin"},"change_message_id":"e5249dc4719dfda6504e8b376c48893c8db46071","unresolved":false,"context_lines":[{"line_number":328,"context_line":""},{"line_number":329,"context_line":"References"},{"line_number":330,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"[0] https://review.openstack.org/#/c/194453/"}],"source_content_type":"text/x-rst","patch_set":4,"id":"da20952f_52edcced","line":331,"updated":"2015-08-27 21:53:31.000000000","message":"Could you explain how the underlying feature that\u0027s reported in this bug report fits in with what you are proposing?  https://bugs.launchpad.net/ironic/+bug/1422753","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"546e6d4e7985ca139a8e4b47e1e6c5dbc6dfae15","unresolved":false,"context_lines":[{"line_number":328,"context_line":""},{"line_number":329,"context_line":"References"},{"line_number":330,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"[0] https://review.openstack.org/#/c/194453/"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_ea9d5abc","line":331,"in_reply_to":"da20952f_52edcced","updated":"2015-10-10 14:42:02.000000000","message":"That bug is about a \u0027reservation\u0027 field on the nodes table that behaves as a lock, not about this feature at all. I\u0027m going to change the \u0027reservation\u0027 word to \u0027claim\u0027 for this feature to avoid confusion.","commit_id":"a8c7f524cd1d552b908c67facf7f41b141dd3d3d"}]}
