)]}'
{"specs/newton/approved/generic-resource-pools.rst":[{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"037aecf20d3467c30f366238323680cbf342a5fa","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    Instead of cloud deployer manually updating the resource pool\u0027s inventory,"},{"line_number":164,"context_line":"    it\u0027s more likely that a script would call the `neutron subnet-XXX` commands"},{"line_number":165,"context_line":"    to determine capacity and reserved amounts."},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"5) The cloud user creates a port in Neutron, asking for an IP out of a"},{"line_number":168,"context_line":"   particular subnet::"}],"source_content_type":"text/x-rst","patch_set":1,"id":"7a1b2928_5ab9eee8","line":165,"updated":"2016-04-11 16:17:10.000000000","message":"Question: would it be feasible to have Neutron make these calls? The corresponding spec for subnets has Neutron updating inventories whenever it assigns/releases an IP address, so perhaps it would be better to have a command like:\n\n    neutron resource-update --resource-id\u003d$RP_UUID subnet-id\u003d$SUBNET_UUID","commit_id":"b353b0a3a2500cc55c9f3087216d2f2e65893147"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"46923bea834ca02ddb6dff84628c32d8a2c04dc1","unresolved":false,"context_lines":[{"line_number":688,"context_line":""},{"line_number":689,"context_line":"* Create database models and migrations for new `resource_provider_aggregates`"},{"line_number":690,"context_line":"  table."},{"line_number":691,"context_line":"* Create `nova.objects` models for `ResourcePool`"},{"line_number":692,"context_line":"* Create REST API controllers for resource pool querying and handling"},{"line_number":693,"context_line":"* Modify resource tracker to pull information on aggregates the compute node is"},{"line_number":694,"context_line":"  associated with and determine if disk capacity and usage tracking should be"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba0121b8_93ebafdb","line":691,"updated":"2016-04-01 11:08:27.000000000","message":"In the POC I ended up needing a ResourcePoolList too.","commit_id":"b353b0a3a2500cc55c9f3087216d2f2e65893147"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"48ad98262953fb783fa2b7f114d16bf952c23a95","unresolved":false,"context_lines":[{"line_number":695,"context_line":"  skipped if a resource pool is tracking that information separately"},{"line_number":696,"context_line":"* Modify the scheduler to look at resource pool information for aggregates"},{"line_number":697,"context_line":"  associated with compute nodes to determine if request can be fulfilled by the"},{"line_number":698,"context_line":"  resource pool"},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"For this particular step, the changes to the existing filter scheduler should"},{"line_number":701,"context_line":"be minimal. Right now, the host manager queries the list of all aggregates in"}],"source_content_type":"text/x-rst","patch_set":1,"id":"9a061dce_19583efa","line":698,"updated":"2016-04-04 11:21:06.000000000","message":"Of these items, the first 3 are fairy tractable and well explained either in this spec or others that are related. The last 2, however, are listed kind of as if they are trivial but to the uninitiated they are not.\n\nI _think_ the first of the two is saying:\n\n\"look for the aggregates this node is in and see if those aggregates have pools. If so, skip local tracking of resource classes in those pools\"\n\nEither way the location of the \"skipping\" is not clear (to me).\n\nThe second of the last two similarly seems to be leaving out a piece of information that describes how the request for information is keyed.","commit_id":"b353b0a3a2500cc55c9f3087216d2f2e65893147"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":44,"context_line":"Neutron port is associated with a specific subnet pool segment, and ensure that"},{"line_number":45,"context_line":"my instance is booted on a compute node that matches that segment."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"As an advanced Cinder user, if I specify a Cinder volume-id on the nova boot"},{"line_number":48,"context_line":"command, I want Nova to be able to know which compute nodes are attached to a"},{"line_number":49,"context_line":"Cinder storage pool that contains the requested volume."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Proposed change"},{"line_number":52,"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":2,"id":"1a122d0e_1978e72a","line":49,"range":{"start_line":47,"start_character":0,"end_line":49,"end_character":55},"updated":"2016-04-24 20:26:38.000000000","message":"We can kind of hack around this with AZs today right? Create a volume in a specific AZ in Cinder and boot an instance using that volume in the exact same AZ in Nova (because if they aren\u0027t in the same AZ I think Cinder fails by default). Or boot from volume with source\u003dimage, dest\u003dvolume and AZ\u003dfoo and if Cinder doesn\u0027t have a \u0027foo\u0027 AZ it fails (unless you\u0027ve configured Cinder to not fail which is a hack workaround IMO).\n\nI just remember dealing with this AZ BFV bug and it wasn\u0027t fun.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ee417af7cc1bf8b0c2268938950155826a0da1cd","unresolved":false,"context_lines":[{"line_number":44,"context_line":"Neutron port is associated with a specific subnet pool segment, and ensure that"},{"line_number":45,"context_line":"my instance is booted on a compute node that matches that segment."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"As an advanced Cinder user, if I specify a Cinder volume-id on the nova boot"},{"line_number":48,"context_line":"command, I want Nova to be able to know which compute nodes are attached to a"},{"line_number":49,"context_line":"Cinder storage pool that contains the requested volume."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Proposed change"},{"line_number":52,"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":2,"id":"1a122d0e_fa1b4ac8","line":49,"range":{"start_line":47,"start_character":0,"end_line":49,"end_character":55},"in_reply_to":"1a122d0e_1978e72a","updated":"2016-04-25 16:07:03.000000000","message":"Well, the way AZs are implemented (awkward mix of nova.conf/cinder.conf option values and metadata keys on aggregates) is total poo, agreed. This proposal actually doesn\u0027t have anything to do with AZs. The relationship between resource pools and the set of compute nodes that share resources in that resource pool is via the resource_pool_aggregates table, true, but other than that, there\u0027s no correlation to an AZ.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"4dec4369c44225c2b48e897d19cd66e5375536e8","unresolved":false,"context_lines":[{"line_number":44,"context_line":"Neutron port is associated with a specific subnet pool segment, and ensure that"},{"line_number":45,"context_line":"my instance is booted on a compute node that matches that segment."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"As an advanced Cinder user, if I specify a Cinder volume-id on the nova boot"},{"line_number":48,"context_line":"command, I want Nova to be able to know which compute nodes are attached to a"},{"line_number":49,"context_line":"Cinder storage pool that contains the requested volume."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Proposed change"},{"line_number":52,"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":2,"id":"1a122d0e_e3d167cd","line":49,"range":{"start_line":47,"start_character":0,"end_line":49,"end_character":55},"in_reply_to":"1a122d0e_fa1b4ac8","updated":"2016-04-29 19:18:51.000000000","message":"Done","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c74882a0565bee354ef272060fa7c0d689ee23cd","unresolved":false,"context_lines":[{"line_number":61,"context_line":"problem of shared storage accounting in Nova."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"A RESTful API is proposed (see below for details) that will allow"},{"line_number":64,"context_line":"administrative (or service) users to create resource pools, to update the"},{"line_number":65,"context_line":"capacity and usage information for those pools, and to indicate which compute"},{"line_number":66,"context_line":"nodes can use the pool\u0027s resources by associating the pool with one or more"},{"line_number":67,"context_line":"aggregates."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_b25aa5f0","line":64,"updated":"2016-05-04 14:05:29.000000000","message":"@sundar: I\u0027m documenting the FPGA use case in a follow-up spec called dynamic-resource-classes that should be pushed later today. I will add you as a reviewer.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"4dec4369c44225c2b48e897d19cd66e5375536e8","unresolved":false,"context_lines":[{"line_number":61,"context_line":"problem of shared storage accounting in Nova."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"A RESTful API is proposed (see below for details) that will allow"},{"line_number":64,"context_line":"administrative (or service) users to create resource pools, to update the"},{"line_number":65,"context_line":"capacity and usage information for those pools, and to indicate which compute"},{"line_number":66,"context_line":"nodes can use the pool\u0027s resources by associating the pool with one or more"},{"line_number":67,"context_line":"aggregates."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_43565b5c","line":64,"range":{"start_line":64,"start_character":0,"end_line":64,"end_character":33},"updated":"2016-04-29 19:18:51.000000000","message":"We spoke about using this mechanism for FPGAs (and other programmable accelerators), with each accelerator type being a resource class. Then the requirement for human involvement in creating/managing resource classes becomes a bit onerous. Ideally, when an accelerator is programmed into the device, it is auto-discovered and it is either automatically added to an existing resource pool (RP) or a new RP gets created for it. Otherwise, as accelerators come and go, the admin has to manually update the RPs, which is not viable in the cloud.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"632f18b192081196ffe793f5393bf19bb4b93174","unresolved":false,"context_lines":[{"line_number":61,"context_line":"problem of shared storage accounting in Nova."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"A RESTful API is proposed (see below for details) that will allow"},{"line_number":64,"context_line":"administrative (or service) users to create resource pools, to update the"},{"line_number":65,"context_line":"capacity and usage information for those pools, and to indicate which compute"},{"line_number":66,"context_line":"nodes can use the pool\u0027s resources by associating the pool with one or more"},{"line_number":67,"context_line":"aggregates."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_b7c805aa","line":64,"range":{"start_line":64,"start_character":0,"end_line":64,"end_character":33},"in_reply_to":"1a122d0e_43565b5c","updated":"2016-05-03 14:22:46.000000000","message":"This seems similar to the situation when an admin creates a VM on a host outside of Nova - there is no automatic mechanism to let Nova know about the change in available resources on that host until the next sync interval.\n\nHow is the program on the FPGA device exposed so that the host can report it to the scheduler?","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"1265b5189b5e6de55c461fdd5eff8c67f609814b","unresolved":false,"context_lines":[{"line_number":61,"context_line":"problem of shared storage accounting in Nova."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"A RESTful API is proposed (see below for details) that will allow"},{"line_number":64,"context_line":"administrative (or service) users to create resource pools, to update the"},{"line_number":65,"context_line":"capacity and usage information for those pools, and to indicate which compute"},{"line_number":66,"context_line":"nodes can use the pool\u0027s resources by associating the pool with one or more"},{"line_number":67,"context_line":"aggregates."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_ba6d57ce","line":64,"in_reply_to":"1a122d0e_b25aa5f0","updated":"2016-05-04 15:11:48.000000000","message":"Since it has API, it can be used by either human or service(as described in the highlighted text) or driver. Those programs can be responsible to manage the shared resources automatically through the interface exposed by the resource-provider.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":172,"context_line":"6) The cloud user boots an instance, specifying the ID of the port created"},{"line_number":173,"context_line":"   in step 5::"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    nova boot --nic port_id\u003d$PORT_UUID,subnet_id\u003d$SUBNET_UUID"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"7) During (or perhaps before) the scheduling process, Nova will want to answer"},{"line_number":178,"context_line":"   the question, \"if this port ID is a member of a resource pool containing"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_9907d780","line":175,"range":{"start_line":175,"start_character":39,"end_line":175,"end_character":48},"updated":"2016-04-24 20:26:38.000000000","message":"You must mean net-id. Or just omit this.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c74882a0565bee354ef272060fa7c0d689ee23cd","unresolved":false,"context_lines":[{"line_number":172,"context_line":"6) The cloud user boots an instance, specifying the ID of the port created"},{"line_number":173,"context_line":"   in step 5::"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    nova boot --nic port_id\u003d$PORT_UUID,subnet_id\u003d$SUBNET_UUID"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"7) During (or perhaps before) the scheduling process, Nova will want to answer"},{"line_number":178,"context_line":"   the question, \"if this port ID is a member of a resource pool containing"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_1272797c","line":175,"updated":"2016-05-04 14:05:29.000000000","message":"done.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":186,"context_line":"   aggregates."},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"What this gives the cloud user is basic network affinity during scheduling,"},{"line_number":189,"context_line":"with the cloud user only needing to specify a port ID and subnet ID."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"Scenario 2b: Live migration of instance booted in scenario 2a"},{"line_number":192,"context_line":"-------------------------------------------------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_d9014f6c","line":189,"range":{"start_line":189,"start_character":54,"end_line":189,"end_character":67},"updated":"2016-04-24 20:26:38.000000000","message":"drop this","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c74882a0565bee354ef272060fa7c0d689ee23cd","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"What this gives the cloud user is basic network affinity during scheduling,"},{"line_number":189,"context_line":"with the cloud user only needing to specify a port ID and subnet ID."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"Scenario 2b: Live migration of instance booted in scenario 2a"},{"line_number":192,"context_line":"-------------------------------------------------------------"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_f26c1d9f","line":190,"updated":"2016-05-04 14:05:29.000000000","message":"done.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":227,"context_line":"A new many-to-many mapping table will be created to enable an aggregate to be"},{"line_number":228,"context_line":"associated with one or more resource pools::"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    CREATE TABLE resource_provider_aggregates ("},{"line_number":231,"context_line":"        resource_provider_id INT NOT NULL,"},{"line_number":232,"context_line":"        aggregate_id INT NOT NULL,"},{"line_number":233,"context_line":"        PRIMARY KEY (aggregate_id, resource_provider_id),"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_b9c73311","line":230,"updated":"2016-04-24 20:26:38.000000000","message":"created_at/updated_at fields? Basically TimestampMixin without the SoftDeleteMixin.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ee417af7cc1bf8b0c2268938950155826a0da1cd","unresolved":false,"context_lines":[{"line_number":227,"context_line":"A new many-to-many mapping table will be created to enable an aggregate to be"},{"line_number":228,"context_line":"associated with one or more resource pools::"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    CREATE TABLE resource_provider_aggregates ("},{"line_number":231,"context_line":"        resource_provider_id INT NOT NULL,"},{"line_number":232,"context_line":"        aggregate_id INT NOT NULL,"},{"line_number":233,"context_line":"        PRIMARY KEY (aggregate_id, resource_provider_id),"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_9a5a1682","line":230,"in_reply_to":"1a122d0e_97a836dd","updated":"2016-04-25 16:07:03.000000000","message":"Actually, those questions *were* resolved. We chose not to add any of those fields to the table.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"efd1c74e33a2adb9409dd128b3e939d367a0969d","unresolved":false,"context_lines":[{"line_number":227,"context_line":"A new many-to-many mapping table will be created to enable an aggregate to be"},{"line_number":228,"context_line":"associated with one or more resource pools::"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    CREATE TABLE resource_provider_aggregates ("},{"line_number":231,"context_line":"        resource_provider_id INT NOT NULL,"},{"line_number":232,"context_line":"        aggregate_id INT NOT NULL,"},{"line_number":233,"context_line":"        PRIMARY KEY (aggregate_id, resource_provider_id),"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_97a836dd","line":230,"in_reply_to":"1a122d0e_b9c73311","updated":"2016-04-25 12:11:43.000000000","message":"These question came up in the earlier, mitaka, version of the spec and wasn\u0027t really resolve then. The WIP is not currently using timestamps for this mapping, or for resource providers themselves, but I guess that would be easy enough to change.\n\nFor aggregate mapping it might make sense as they are more ephemeral than the resource providers themselves.\n\nBut then again I used to live in a world where if it doesn\u0027t have timestamps then it is broken. Are we in that world? Should we be?","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":230,"context_line":"    CREATE TABLE resource_provider_aggregates ("},{"line_number":231,"context_line":"        resource_provider_id INT NOT NULL,"},{"line_number":232,"context_line":"        aggregate_id INT NOT NULL,"},{"line_number":233,"context_line":"        PRIMARY KEY (aggregate_id, resource_provider_id),"},{"line_number":234,"context_line":"    );"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"A new nova object model for resource pools will be introduced. This object"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_d9382f40","line":233,"range":{"start_line":233,"start_character":21,"end_line":233,"end_character":55},"updated":"2016-04-24 20:26:38.000000000","message":"foreign keys on these?","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ee417af7cc1bf8b0c2268938950155826a0da1cd","unresolved":false,"context_lines":[{"line_number":230,"context_line":"    CREATE TABLE resource_provider_aggregates ("},{"line_number":231,"context_line":"        resource_provider_id INT NOT NULL,"},{"line_number":232,"context_line":"        aggregate_id INT NOT NULL,"},{"line_number":233,"context_line":"        PRIMARY KEY (aggregate_id, resource_provider_id),"},{"line_number":234,"context_line":"    );"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"A new nova object model for resource pools will be introduced. This object"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_bad6f2c0","line":233,"in_reply_to":"1a122d0e_5785fe56","updated":"2016-04-25 16:07:03.000000000","message":"Foreign key constraints are fine... we can put them in if you want. I was asked to remove too fine a level of detail...","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"efd1c74e33a2adb9409dd128b3e939d367a0969d","unresolved":false,"context_lines":[{"line_number":230,"context_line":"    CREATE TABLE resource_provider_aggregates ("},{"line_number":231,"context_line":"        resource_provider_id INT NOT NULL,"},{"line_number":232,"context_line":"        aggregate_id INT NOT NULL,"},{"line_number":233,"context_line":"        PRIMARY KEY (aggregate_id, resource_provider_id),"},{"line_number":234,"context_line":"    );"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"A new nova object model for resource pools will be introduced. This object"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_5785fe56","line":233,"in_reply_to":"1a122d0e_d9382f40","updated":"2016-04-25 12:11:43.000000000","message":"I had the understanding that the modern plan was to eschew explicit foreign key constraints?","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":241,"context_line":"REST API impact"},{"line_number":242,"context_line":"---------------"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"*ALL* below API calls are meant only for cloud administrators."},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"*Note*: All of the below API calls should be implemented in"},{"line_number":247,"context_line":"`/nova/api/openstack/placement/`, **not** in `/nova/api/openstack/compute/`"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_394043a5","line":244,"range":{"start_line":244,"start_character":47,"end_line":244,"end_character":61},"updated":"2016-04-24 20:26:38.000000000","message":"or service users like neutron?","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ee417af7cc1bf8b0c2268938950155826a0da1cd","unresolved":false,"context_lines":[{"line_number":241,"context_line":"REST API impact"},{"line_number":242,"context_line":"---------------"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"*ALL* below API calls are meant only for cloud administrators."},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"*Note*: All of the below API calls should be implemented in"},{"line_number":247,"context_line":"`/nova/api/openstack/placement/`, **not** in `/nova/api/openstack/compute/`"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_7aebba78","line":244,"range":{"start_line":244,"start_character":47,"end_line":244,"end_character":61},"in_reply_to":"1a122d0e_394043a5","updated":"2016-04-25 16:07:03.000000000","message":"Yes, or service users... I can add to the spec if you need me to.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":243,"context_line":""},{"line_number":244,"context_line":"*ALL* below API calls are meant only for cloud administrators."},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"*Note*: All of the below API calls should be implemented in"},{"line_number":247,"context_line":"`/nova/api/openstack/placement/`, **not** in `/nova/api/openstack/compute/`"},{"line_number":248,"context_line":"since these calls will be part of the split-out scheduler REST API.  There"},{"line_number":249,"context_line":"should be a wholly separate placement API endpoint, started on a different port"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_d9d4afbe","line":246,"updated":"2016-04-24 20:26:38.000000000","message":"Want to mention something about microversions on this if it\u0027s a new set of REST APIs that aren\u0027t part of compute?  Assuming it would start as v1.0?","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c74882a0565bee354ef272060fa7c0d689ee23cd","unresolved":false,"context_lines":[{"line_number":243,"context_line":""},{"line_number":244,"context_line":"*ALL* below API calls are meant only for cloud administrators."},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"*Note*: All of the below API calls should be implemented in"},{"line_number":247,"context_line":"`/nova/api/openstack/placement/`, **not** in `/nova/api/openstack/compute/`"},{"line_number":248,"context_line":"since these calls will be part of the split-out scheduler REST API.  There"},{"line_number":249,"context_line":"should be a wholly separate placement API endpoint, started on a different port"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_526cf19b","line":246,"updated":"2016-05-04 14:05:29.000000000","message":"done.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ee417af7cc1bf8b0c2268938950155826a0da1cd","unresolved":false,"context_lines":[{"line_number":243,"context_line":""},{"line_number":244,"context_line":"*ALL* below API calls are meant only for cloud administrators."},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"*Note*: All of the below API calls should be implemented in"},{"line_number":247,"context_line":"`/nova/api/openstack/placement/`, **not** in `/nova/api/openstack/compute/`"},{"line_number":248,"context_line":"since these calls will be part of the split-out scheduler REST API.  There"},{"line_number":249,"context_line":"should be a wholly separate placement API endpoint, started on a different port"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_5a951ee2","line":246,"in_reply_to":"1a122d0e_b77c5273","updated":"2016-04-25 16:07:03.000000000","message":"Sure, I can add a note about microversioning he API from the start...","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"efd1c74e33a2adb9409dd128b3e939d367a0969d","unresolved":false,"context_lines":[{"line_number":243,"context_line":""},{"line_number":244,"context_line":"*ALL* below API calls are meant only for cloud administrators."},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"*Note*: All of the below API calls should be implemented in"},{"line_number":247,"context_line":"`/nova/api/openstack/placement/`, **not** in `/nova/api/openstack/compute/`"},{"line_number":248,"context_line":"since these calls will be part of the split-out scheduler REST API.  There"},{"line_number":249,"context_line":"should be a wholly separate placement API endpoint, started on a different port"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_b77c5273","line":246,"in_reply_to":"1a122d0e_d9d4afbe","updated":"2016-04-25 12:11:43.000000000","message":"/me adds \"add microversion support to his wip todo list","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":291,"context_line":"        \"aggregates\": {"},{"line_number":292,"context_line":"          \"type\": \"array\","},{"line_number":293,"context_line":"          \"items\": {"},{"line_number":294,"context_line":"            \"type\": \"string\""},{"line_number":295,"context_line":"          },"},{"line_number":296,"context_line":"          \"minItems\": 1"},{"line_number":297,"context_line":"        },"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_193bc739","line":294,"range":{"start_line":294,"start_character":21,"end_line":294,"end_character":27},"updated":"2016-04-24 20:26:38.000000000","message":"uuid?","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ee417af7cc1bf8b0c2268938950155826a0da1cd","unresolved":false,"context_lines":[{"line_number":291,"context_line":"        \"aggregates\": {"},{"line_number":292,"context_line":"          \"type\": \"array\","},{"line_number":293,"context_line":"          \"items\": {"},{"line_number":294,"context_line":"            \"type\": \"string\""},{"line_number":295,"context_line":"          },"},{"line_number":296,"context_line":"          \"minItems\": 1"},{"line_number":297,"context_line":"        },"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_3a98221b","line":294,"range":{"start_line":294,"start_character":21,"end_line":294,"end_character":27},"in_reply_to":"1a122d0e_193bc739","updated":"2016-04-25 16:07:03.000000000","message":"meh :) ok...","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c74882a0565bee354ef272060fa7c0d689ee23cd","unresolved":false,"context_lines":[{"line_number":298,"context_line":"        \"resources\": {"},{"line_number":299,"context_line":"          \"type\": \"object\","},{"line_number":300,"context_line":"          \"patternProperties\": {"},{"line_number":301,"context_line":"            \"^(/[^/]+)+$\": {"},{"line_number":302,"context_line":"              \"type\": \"object\","},{"line_number":303,"context_line":"              \"properties\": {"},{"line_number":304,"context_line":"                \"total\": {"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_3267b5b8","line":301,"updated":"2016-05-04 14:05:29.000000000","message":"Sorry, copy/paste typo from JSONSchema website examples :) Fixed.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"7748b5ef1a460e9a9a317b6b3b50d36fbe68c06f","unresolved":false,"context_lines":[{"line_number":298,"context_line":"        \"resources\": {"},{"line_number":299,"context_line":"          \"type\": \"object\","},{"line_number":300,"context_line":"          \"patternProperties\": {"},{"line_number":301,"context_line":"            \"^(/[^/]+)+$\": {"},{"line_number":302,"context_line":"              \"type\": \"object\","},{"line_number":303,"context_line":"              \"properties\": {"},{"line_number":304,"context_line":"                \"total\": {"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_cb25f45c","line":301,"updated":"2016-05-04 12:49:54.000000000","message":"the keys of resources are always in the format of /foo ? That doesn\u0027t seem right.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":338,"context_line":"    Location: /resource_pools/eaaf1c04-ced2-40e4-89a2-87edded06d64"},{"line_number":339,"context_line":"    {"},{"line_number":340,"context_line":"      \"resource_pool\": {"},{"line_number":341,"context_line":"        \"uuid\": \"eaaf1c04-ced2-40e4-89a2-87edded06d64\","},{"line_number":342,"context_line":"        \"name\": \"Global NFS share\","},{"line_number":343,"context_line":"        \"aggregates\": ["},{"line_number":344,"context_line":"            \"cd2ca052-6f9a-4b49-b466-f913e528d3cb\""}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_9915179d","line":341,"range":{"start_line":341,"start_character":17,"end_line":341,"end_character":53},"updated":"2016-04-24 20:26:38.000000000","message":"34372241-2c0c-4da3-a08e-19ffb6367ace","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c74882a0565bee354ef272060fa7c0d689ee23cd","unresolved":false,"context_lines":[{"line_number":338,"context_line":"    Location: /resource_pools/eaaf1c04-ced2-40e4-89a2-87edded06d64"},{"line_number":339,"context_line":"    {"},{"line_number":340,"context_line":"      \"resource_pool\": {"},{"line_number":341,"context_line":"        \"uuid\": \"eaaf1c04-ced2-40e4-89a2-87edded06d64\","},{"line_number":342,"context_line":"        \"name\": \"Global NFS share\","},{"line_number":343,"context_line":"        \"aggregates\": ["},{"line_number":344,"context_line":"            \"cd2ca052-6f9a-4b49-b466-f913e528d3cb\""}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_9204c9c6","line":341,"updated":"2016-05-04 14:05:29.000000000","message":"Fixed by changing the UUID from the above request...","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":358,"context_line":"      \"links\": ["},{"line_number":359,"context_line":"        {"},{"line_number":360,"context_line":"          \"rel\": \"aggregates\","},{"line_number":361,"context_line":"          \"url\": \"/resource_pools/eaaf1c04-ced2-40e4-89a2-87edded06d64/aggregates\""},{"line_number":362,"context_line":"        }"},{"line_number":363,"context_line":"      ]"},{"line_number":364,"context_line":"    }"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_d90f8f86","line":361,"range":{"start_line":361,"start_character":34,"end_line":361,"end_character":70},"updated":"2016-04-24 20:26:38.000000000","message":"34372241-2c0c-4da3-a08e-19ffb6367ace","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c74882a0565bee354ef272060fa7c0d689ee23cd","unresolved":false,"context_lines":[{"line_number":446,"context_line":"  information"},{"line_number":447,"context_line":"* `400 Bad Request` for any bad or invalid syntax."},{"line_number":448,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found"},{"line_number":449,"context_line":"* `409 Conflict` shall be returned if the `capacity` or the `reserved` amount"},{"line_number":450,"context_line":"  supplied for a particular resource class would put the resource pool into a"},{"line_number":451,"context_line":"  situation where there was more resources consumed (used) than the capacity"},{"line_number":452,"context_line":"  minus reserved amount multiplied by the allocation ratio."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_72076dc9","line":449,"updated":"2016-05-04 14:05:29.000000000","message":"@cdent: at the object layer when saving the batch of inventory records...","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":446,"context_line":"  information"},{"line_number":447,"context_line":"* `400 Bad Request` for any bad or invalid syntax."},{"line_number":448,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found"},{"line_number":449,"context_line":"* `409 Conflict` shall be returned if the `capacity` or the `reserved` amount"},{"line_number":450,"context_line":"  supplied for a particular resource class would put the resource pool into a"},{"line_number":451,"context_line":"  situation where there was more resources consumed (used) than the capacity"},{"line_number":452,"context_line":"  minus reserved amount multiplied by the allocation ratio."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_79211bfb","line":449,"updated":"2016-04-24 20:26:38.000000000","message":"cool was hoping you\u0027d check for this","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"1265b5189b5e6de55c461fdd5eff8c67f609814b","unresolved":false,"context_lines":[{"line_number":446,"context_line":"  information"},{"line_number":447,"context_line":"* `400 Bad Request` for any bad or invalid syntax."},{"line_number":448,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found"},{"line_number":449,"context_line":"* `409 Conflict` shall be returned if the `capacity` or the `reserved` amount"},{"line_number":450,"context_line":"  supplied for a particular resource class would put the resource pool into a"},{"line_number":451,"context_line":"  situation where there was more resources consumed (used) than the capacity"},{"line_number":452,"context_line":"  minus reserved amount multiplied by the allocation ratio."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_f4da48e8","line":449,"in_reply_to":"1a122d0e_72076dc9","updated":"2016-05-04 15:11:48.000000000","message":"What if the resource tracker tries to update the `inventory.total` field that will cause total-reserved \u003c 0 ?","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"d49199e191bd3142221e81ecfbe1dafe596ad22d","unresolved":false,"context_lines":[{"line_number":446,"context_line":"  information"},{"line_number":447,"context_line":"* `400 Bad Request` for any bad or invalid syntax."},{"line_number":448,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found"},{"line_number":449,"context_line":"* `409 Conflict` shall be returned if the `capacity` or the `reserved` amount"},{"line_number":450,"context_line":"  supplied for a particular resource class would put the resource pool into a"},{"line_number":451,"context_line":"  situation where there was more resources consumed (used) than the capacity"},{"line_number":452,"context_line":"  minus reserved amount multiplied by the allocation ratio."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_1adc4611","line":449,"in_reply_to":"1a122d0e_79211bfb","updated":"2016-04-25 15:37:56.000000000","message":"Is this a constraint we want to enforce at the object layer (when calling save() to update an existing inventory) or at the API layer (check any existing inventory) before calling save or create?\n\nI can see reasons for both: the former provides strict enforcement, the latter maintains the option for a different avenue of use of the object with flexible constraints.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"4beede540787de0295e73b30907250fca5c2addc","unresolved":false,"context_lines":[{"line_number":446,"context_line":"  information"},{"line_number":447,"context_line":"* `400 Bad Request` for any bad or invalid syntax."},{"line_number":448,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found"},{"line_number":449,"context_line":"* `409 Conflict` shall be returned if the `capacity` or the `reserved` amount"},{"line_number":450,"context_line":"  supplied for a particular resource class would put the resource pool into a"},{"line_number":451,"context_line":"  situation where there was more resources consumed (used) than the capacity"},{"line_number":452,"context_line":"  minus reserved amount multiplied by the allocation ratio."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_1aad6688","line":449,"in_reply_to":"1a122d0e_f4da48e8","updated":"2016-05-04 16:45:24.000000000","message":"The resource tracker doesn\u0027t get involved here, this only to set the values for a resource class provider by a resource pool. The situation you describe is accounted for by the description provided:\n\n    if (current_resource.used  \u003e\n        (inventory.total - inventory.reserved) *\n         inventory.allocation_ratio):\n\nIf reserved is more than total, as long as used is not a negative number we\u0027ll get the desired conflict.\n\nExcept that I guess somewhere in there we need to account for ensuring total, reserved and allocation_ratio are never negative numbers. This is currently not enforced in the Inventory object (the fields are currently Integers and Floats. I guess it should be NonNegativeInteger and NonNegativeFloat?\n\nGood catch.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c74882a0565bee354ef272060fa7c0d689ee23cd","unresolved":false,"context_lines":[{"line_number":576,"context_line":"* `404 Not Found` if the resource pool was found but the aggregate with ID"},{"line_number":577,"context_line":"  `{uuid}` was not found"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"`DELETE /resource_pools/{uuid}/aggregates/{id}`"},{"line_number":580,"context_line":"***********************************************"},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"Shall disassociate a resource pool with an aggregate."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_d20e41e4","line":579,"updated":"2016-05-04 14:05:29.000000000","message":"done.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":576,"context_line":"* `404 Not Found` if the resource pool was found but the aggregate with ID"},{"line_number":577,"context_line":"  `{uuid}` was not found"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"`DELETE /resource_pools/{uuid}/aggregates/{id}`"},{"line_number":580,"context_line":"***********************************************"},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"Shall disassociate a resource pool with an aggregate."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_99635741","line":579,"range":{"start_line":579,"start_character":43,"end_line":579,"end_character":45},"updated":"2016-04-24 20:26:38.000000000","message":"uuid?","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":583,"context_line":""},{"line_number":584,"context_line":"The returned HTTP response codes shall be:"},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"* `204 No Content` if the call was successful in associating the resource pool"},{"line_number":587,"context_line":"  with the aggregate"},{"line_number":588,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found"},{"line_number":589,"context_line":"* `404 Not Found` if the resource pool was found but the aggregate with ID"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_7978fbf2","line":586,"range":{"start_line":586,"start_character":49,"end_line":586,"end_character":60},"updated":"2016-04-24 20:26:38.000000000","message":"disassociating","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c74882a0565bee354ef272060fa7c0d689ee23cd","unresolved":false,"context_lines":[{"line_number":583,"context_line":""},{"line_number":584,"context_line":"The returned HTTP response codes shall be:"},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"* `204 No Content` if the call was successful in associating the resource pool"},{"line_number":587,"context_line":"  with the aggregate"},{"line_number":588,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found"},{"line_number":589,"context_line":"* `404 Not Found` if the resource pool was found but the aggregate with ID"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_b2110507","line":586,"updated":"2016-05-04 14:05:29.000000000","message":"done.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c74882a0565bee354ef272060fa7c0d689ee23cd","unresolved":false,"context_lines":[{"line_number":589,"context_line":"* `404 Not Found` if the resource pool was found but the aggregate with ID"},{"line_number":590,"context_line":"  `{uuid}` was not found"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"`GET /resource_pools/{uuid}/aggregates`"},{"line_number":593,"context_line":"***************************************"},{"line_number":594,"context_line":""},{"line_number":595,"context_line":"Shall return a list of aggregates that can utilize the resource pool."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_12f9d9c8","line":592,"updated":"2016-05-04 14:05:29.000000000","message":"Correct.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":589,"context_line":"* `404 Not Found` if the resource pool was found but the aggregate with ID"},{"line_number":590,"context_line":"  `{uuid}` was not found"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"`GET /resource_pools/{uuid}/aggregates`"},{"line_number":593,"context_line":"***************************************"},{"line_number":594,"context_line":""},{"line_number":595,"context_line":"Shall return a list of aggregates that can utilize the resource pool."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_d95dcf7a","line":592,"updated":"2016-04-24 20:26:38.000000000","message":"You could just get this from `GET /resource_pools/{uuid}` but I guess this is a convenience API?","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"262cef6521c9dcb29626ffdee952b8794e33c141","unresolved":false,"context_lines":[{"line_number":625,"context_line":""},{"line_number":626,"context_line":"We should create new notification messages for when resource pools are created,"},{"line_number":627,"context_line":"destroyed, updated, associated with an aggregate and disassociated with an"},{"line_number":628,"context_line":"aggregate."},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"Other end user impact"},{"line_number":631,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_491f036c","line":628,"updated":"2016-04-19 16:57:48.000000000","message":"Two questions on this:\n\n* How much information do we need in the payload of the notification? Are uuids of the resource pool sufficient or should we send the whole thing? What\u0027s the standard behavior here?\n\n* At what level are notifications spawned: in the API when we say \"do this thing\" or in the object itself?","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"58f86433ad9cd26a428c1ab0926a9ef950c783b9","unresolved":false,"context_lines":[{"line_number":625,"context_line":""},{"line_number":626,"context_line":"We should create new notification messages for when resource pools are created,"},{"line_number":627,"context_line":"destroyed, updated, associated with an aggregate and disassociated with an"},{"line_number":628,"context_line":"aggregate."},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"Other end user impact"},{"line_number":631,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_c8b636f8","line":628,"in_reply_to":"1a122d0e_491f036c","updated":"2016-04-20 14:41:14.000000000","message":"There is no generic guideline on the content of the payload my rule of thumb is the following:\n- Always send the uuid that identifies the entity on the REST API so the consumer can query info about the entity via REST\n- You might want to send those fields that actually triggered the current notification to avoid a blind REST API query from the consumer at every notification.\n- You shall not include the static part of the entity to save bandwidth and avoid repetition.\n\nI suggest to send the notification from the object level so that if later on the content of the pool can be changed not only via the REST API but by some other means then the notification will be still sent about the change.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0a1d057753763df5934ef5918194b4e0e2a0b602","unresolved":false,"context_lines":[{"line_number":625,"context_line":""},{"line_number":626,"context_line":"We should create new notification messages for when resource pools are created,"},{"line_number":627,"context_line":"destroyed, updated, associated with an aggregate and disassociated with an"},{"line_number":628,"context_line":"aggregate."},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"Other end user impact"},{"line_number":631,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_3e8e00d0","line":628,"in_reply_to":"1a122d0e_c8b636f8","updated":"2016-04-20 15:14:18.000000000","message":"Actually I started to formulate a generic guideline about the notification payload: https://review.openstack.org/#/c/308393/","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c74882a0565bee354ef272060fa7c0d689ee23cd","unresolved":false,"context_lines":[{"line_number":630,"context_line":"Other end user impact"},{"line_number":631,"context_line":"---------------------"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"New novaclient CLI commands should be created for the corresponding"},{"line_number":634,"context_line":"functionality:"},{"line_number":635,"context_line":""},{"line_number":636,"context_line":"* `nova resource-pool-list`"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_f2f37de5","line":633,"updated":"2016-05-04 14:05:29.000000000","message":"Changed to use OSC for all commands...","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":630,"context_line":"Other end user impact"},{"line_number":631,"context_line":"---------------------"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"New novaclient CLI commands should be created for the corresponding"},{"line_number":634,"context_line":"functionality:"},{"line_number":635,"context_line":""},{"line_number":636,"context_line":"* `nova resource-pool-list`"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_99ca3719","line":633,"updated":"2016-04-24 20:26:38.000000000","message":"Hrm, why not python-openstackclient for new CLIs? I could see adding new python API bindings to python-novaclient for OSC CLIs to use, (or Neutron for the routed networks spec to update pool capacity values?), but not sure about adding new CLIs to novaclient.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"efd1c74e33a2adb9409dd128b3e939d367a0969d","unresolved":false,"context_lines":[{"line_number":630,"context_line":"Other end user impact"},{"line_number":631,"context_line":"---------------------"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"New novaclient CLI commands should be created for the corresponding"},{"line_number":634,"context_line":"functionality:"},{"line_number":635,"context_line":""},{"line_number":636,"context_line":"* `nova resource-pool-list`"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_b7ca929f","line":633,"in_reply_to":"1a122d0e_99ca3719","updated":"2016-04-25 12:11:43.000000000","message":"In earlier version of this, if I recall correctly, the reason was because these are admin oriented, but *shrug*.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ee417af7cc1bf8b0c2268938950155826a0da1cd","unresolved":false,"context_lines":[{"line_number":630,"context_line":"Other end user impact"},{"line_number":631,"context_line":"---------------------"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"New novaclient CLI commands should be created for the corresponding"},{"line_number":634,"context_line":"functionality:"},{"line_number":635,"context_line":""},{"line_number":636,"context_line":"* `nova resource-pool-list`"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_da776ed2","line":633,"in_reply_to":"1a122d0e_99ca3719","updated":"2016-04-25 16:07:03.000000000","message":"Sure, that\u0027s fine with me.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"7748b5ef1a460e9a9a317b6b3b50d36fbe68c06f","unresolved":false,"context_lines":[{"line_number":647,"context_line":"   --max-unit\u003d1 \\"},{"line_number":648,"context_line":"   --step-size\u003d1 \\"},{"line_number":649,"context_line":"   --allocation-ratio\u003d1.0`"},{"line_number":650,"context_line":"* `nova resource-pool-associate-aggregate $UUID $AGG_ID`"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"Performance Impact"},{"line_number":653,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_ebc43042","line":650,"updated":"2016-05-04 12:49:54.000000000","message":"Whether or not this is in OSC, I think it\u0027s probably a good idea to *not* be in novaclient.\n\nWe\u0027re doing this for a split, and that means that the admin tooling is going to need to be split. There is also an attempt to start with a clean slate on the API side. That probably means now is the time to start clean slate on the CLI side as well, pick a name, and start a new CLI effort for this. Then once the split happens we don\u0027t have the segmentation of nova CLI to deal with late in the game, and a lot of old cruft coming over with it.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c74882a0565bee354ef272060fa7c0d689ee23cd","unresolved":false,"context_lines":[{"line_number":647,"context_line":"   --max-unit\u003d1 \\"},{"line_number":648,"context_line":"   --step-size\u003d1 \\"},{"line_number":649,"context_line":"   --allocation-ratio\u003d1.0`"},{"line_number":650,"context_line":"* `nova resource-pool-associate-aggregate $UUID $AGG_ID`"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"Performance Impact"},{"line_number":653,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_520351b8","line":650,"updated":"2016-05-04 14:05:29.000000000","message":"agreed, and fixed.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":662,"context_line":"created for any compute nodes that utilize that shared storage, associate the"},{"line_number":663,"context_line":"resource pool with those aggregates, and schedule (cronjob or the like) some"},{"line_number":664,"context_line":"script to periodically run `nova resource-pool-update-inventory $UUID"},{"line_number":665,"context_line":"--resource-class\u003dDISK_GB --total\u003dX --reserved\u003dY`."},{"line_number":666,"context_line":""},{"line_number":667,"context_line":"We should include a sample script along with the documentation for this."},{"line_number":668,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_59e1bf99","line":665,"updated":"2016-04-24 20:26:38.000000000","message":"Is this all big bang upgrade or will things continue to work (albeit broken) until this is all setup, meanwhile spewing warnings that we\u0027re hitting resources that aren\u0027t mapped out yet? In other words, if I have a deployment with some aggregates setup and using Ceph for shared storage, and I upgrade to this code, will things continue to work while I\u0027m setting this up or do I need to take my deployment down while doing this?","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ee417af7cc1bf8b0c2268938950155826a0da1cd","unresolved":false,"context_lines":[{"line_number":662,"context_line":"created for any compute nodes that utilize that shared storage, associate the"},{"line_number":663,"context_line":"resource pool with those aggregates, and schedule (cronjob or the like) some"},{"line_number":664,"context_line":"script to periodically run `nova resource-pool-update-inventory $UUID"},{"line_number":665,"context_line":"--resource-class\u003dDISK_GB --total\u003dX --reserved\u003dY`."},{"line_number":666,"context_line":""},{"line_number":667,"context_line":"We should include a sample script along with the documentation for this."},{"line_number":668,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_1d6d6098","line":665,"in_reply_to":"1a122d0e_59e1bf99","updated":"2016-04-25 16:07:03.000000000","message":"Excellent question, Matt, thanks for asking. The goal is to have a seamless experience, and much of that data migration is going to happen for existing instance usage information in the resource-providers-allocations blueprint. This blueprint introduces changes to the way that *inventory* is represented for shared resources on compute nodes. Since we don\u0027t have any existing way to indicate that compute node\u0027s are consuming from some shared storage system, I don\u0027t imagine any of this work here would impact upgrades negatively or introduce any sort of downtime.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":664,"context_line":"script to periodically run `nova resource-pool-update-inventory $UUID"},{"line_number":665,"context_line":"--resource-class\u003dDISK_GB --total\u003dX --reserved\u003dY`."},{"line_number":666,"context_line":""},{"line_number":667,"context_line":"We should include a sample script along with the documentation for this."},{"line_number":668,"context_line":""},{"line_number":669,"context_line":"Developer impact"},{"line_number":670,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_19d747c0","line":667,"updated":"2016-04-24 20:26:38.000000000","message":"Good idea on the sample scrpit, I was thinking the same thing for people upgrading to this.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":691,"context_line":"* Create `nova.objects` models for `ResourcePool`"},{"line_number":692,"context_line":"* Create REST API controllers for resource pool querying and handling"},{"line_number":693,"context_line":"* Modify resource tracker to pull information on aggregates the compute node is"},{"line_number":694,"context_line":"  associated with and determine if disk capacity and usage tracking should be"},{"line_number":695,"context_line":"  skipped if a resource pool is tracking that information separately"},{"line_number":696,"context_line":"* Modify the scheduler to look at resource pool information for aggregates"},{"line_number":697,"context_line":"  associated with compute nodes to determine if request can be fulfilled by the"},{"line_number":698,"context_line":"  resource pool"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_79fd9b39","line":695,"range":{"start_line":694,"start_character":18,"end_line":695,"end_character":68},"updated":"2016-04-24 20:26:38.000000000","message":"OK, I guess this is where we continue to work as-is until deployers are setting up the pools and mapping the aggregates out.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ee417af7cc1bf8b0c2268938950155826a0da1cd","unresolved":false,"context_lines":[{"line_number":691,"context_line":"* Create `nova.objects` models for `ResourcePool`"},{"line_number":692,"context_line":"* Create REST API controllers for resource pool querying and handling"},{"line_number":693,"context_line":"* Modify resource tracker to pull information on aggregates the compute node is"},{"line_number":694,"context_line":"  associated with and determine if disk capacity and usage tracking should be"},{"line_number":695,"context_line":"  skipped if a resource pool is tracking that information separately"},{"line_number":696,"context_line":"* Modify the scheduler to look at resource pool information for aggregates"},{"line_number":697,"context_line":"  associated with compute nodes to determine if request can be fulfilled by the"},{"line_number":698,"context_line":"  resource pool"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_ddf928ca","line":695,"range":{"start_line":694,"start_character":18,"end_line":695,"end_character":68},"in_reply_to":"1a122d0e_79fd9b39","updated":"2016-04-25 16:07:03.000000000","message":"Correct.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":711,"context_line":""},{"line_number":712,"context_line":"* Docs and example cronjob scripts for updating capacity and usage information"},{"line_number":713,"context_line":"  for a shared resource pool of disk"},{"line_number":714,"context_line":"* Functional integration tests in a multi-node devstack environment with shared"},{"line_number":715,"context_line":"  storage"},{"line_number":716,"context_line":""},{"line_number":717,"context_line":"Dependencies"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_59f89f49","line":714,"updated":"2016-04-24 20:26:38.000000000","message":"A bit confused on terminology here. Functional tests as in nova/tests/functional? Or Tempest tests in the multi-node job (assuming the latter). Although the multi-node job uses LVM today, but maybe we should take a look at moving that over to using Ceph (which might also help some of our volume-backed live migration testing woes).","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ee417af7cc1bf8b0c2268938950155826a0da1cd","unresolved":false,"context_lines":[{"line_number":711,"context_line":""},{"line_number":712,"context_line":"* Docs and example cronjob scripts for updating capacity and usage information"},{"line_number":713,"context_line":"  for a shared resource pool of disk"},{"line_number":714,"context_line":"* Functional integration tests in a multi-node devstack environment with shared"},{"line_number":715,"context_line":"  storage"},{"line_number":716,"context_line":""},{"line_number":717,"context_line":"Dependencies"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_fdfea4ac","line":714,"in_reply_to":"1a122d0e_59f89f49","updated":"2016-04-25 16:07:03.000000000","message":"Functional tests in Nova was what I was thinking here. We currently have no way of testing shared storage reporting and I\u0027d like a test to show the reporting after these patches is accurate when using a shared storage pool and multiple compute nodes.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":714,"context_line":"* Functional integration tests in a multi-node devstack environment with shared"},{"line_number":715,"context_line":"  storage"},{"line_number":716,"context_line":""},{"line_number":717,"context_line":"Dependencies"},{"line_number":718,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":719,"context_line":""},{"line_number":720,"context_line":"* `resource-classes` Blueprint must be completed before this one."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_f99feb00","line":717,"updated":"2016-04-24 20:26:38.000000000","message":"I think these are all done now, we could mark them complete or (DONE)?","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ee417af7cc1bf8b0c2268938950155826a0da1cd","unresolved":false,"context_lines":[{"line_number":714,"context_line":"* Functional integration tests in a multi-node devstack environment with shared"},{"line_number":715,"context_line":"  storage"},{"line_number":716,"context_line":""},{"line_number":717,"context_line":"Dependencies"},{"line_number":718,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":719,"context_line":""},{"line_number":720,"context_line":"* `resource-classes` Blueprint must be completed before this one."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_3d2f7c3f","line":717,"in_reply_to":"1a122d0e_f99feb00","updated":"2016-04-25 16:07:03.000000000","message":"ok.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":729,"context_line":"Testing"},{"line_number":730,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":731,"context_line":""},{"line_number":732,"context_line":"Full unit and functional integration tests must be added that demonstrate"},{"line_number":733,"context_line":"proper resource accounting of shared storage represented with a generic"},{"line_number":734,"context_line":"resource pool."},{"line_number":735,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_398a03c0","line":732,"range":{"start_line":732,"start_character":14,"end_line":732,"end_character":42},"updated":"2016-04-24 20:26:38.000000000","message":"Can you give an idea of the kind of Tempest test you\u0027re looking for? We could use the admin user to create the resource pool but I\u0027m not sure how it would know the total/reserved values, those might need to be pre-created in devstack before Tempest runs?\n\nIt could be interesting in the multi-node job to have one compute node in an aggregate in the resource pool and another that isn\u0027t, and schedule instances to both and make sure it all works out.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ee417af7cc1bf8b0c2268938950155826a0da1cd","unresolved":false,"context_lines":[{"line_number":729,"context_line":"Testing"},{"line_number":730,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":731,"context_line":""},{"line_number":732,"context_line":"Full unit and functional integration tests must be added that demonstrate"},{"line_number":733,"context_line":"proper resource accounting of shared storage represented with a generic"},{"line_number":734,"context_line":"resource pool."},{"line_number":735,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_3dbdbcd7","line":732,"range":{"start_line":732,"start_character":14,"end_line":732,"end_character":42},"in_reply_to":"1a122d0e_398a03c0","updated":"2016-04-25 16:07:03.000000000","message":"See above. I also like your suggestion of a multi-node job that has one or more compute nodes using shared storage and one or more not using shared storage and ensure that the accounting and reporting of resources is accurate.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d9bdbc10ed10a4ed98e4d65f8640b4f0c88072b","unresolved":false,"context_lines":[{"line_number":760,"context_line":"History"},{"line_number":761,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":762,"context_line":""},{"line_number":763,"context_line":"Optional section for Mitaka intended to be used each time the spec"},{"line_number":764,"context_line":"is updated to describe new design, API or any database schema"},{"line_number":765,"context_line":"updated. Useful to let reader understand what\u0027s happened along the"},{"line_number":766,"context_line":"time."},{"line_number":767,"context_line":""},{"line_number":768,"context_line":".. list-table:: Revisions"},{"line_number":769,"context_line":"   :header-rows: 1"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_198587ac","line":766,"range":{"start_line":763,"start_character":0,"end_line":766,"end_character":5},"updated":"2016-04-24 20:26:38.000000000","message":"Remove this template.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ee417af7cc1bf8b0c2268938950155826a0da1cd","unresolved":false,"context_lines":[{"line_number":760,"context_line":"History"},{"line_number":761,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":762,"context_line":""},{"line_number":763,"context_line":"Optional section for Mitaka intended to be used each time the spec"},{"line_number":764,"context_line":"is updated to describe new design, API or any database schema"},{"line_number":765,"context_line":"updated. Useful to let reader understand what\u0027s happened along the"},{"line_number":766,"context_line":"time."},{"line_number":767,"context_line":""},{"line_number":768,"context_line":".. list-table:: Revisions"},{"line_number":769,"context_line":"   :header-rows: 1"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1a122d0e_9db4d0f2","line":766,"range":{"start_line":763,"start_character":0,"end_line":766,"end_character":5},"in_reply_to":"1a122d0e_198587ac","updated":"2016-04-25 16:07:03.000000000","message":"will do.","commit_id":"34e038183174a7572fe8d7e5bcf82ae0bba8fd31"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"dd2347edfbe500f7e83618ddb1ec5b05b2bc815b","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":".. note::"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    Please note that the `--uuid` field in the `openstack resource-pool create`"},{"line_number":143,"context_line":"    call above is optional. The field allows passing in a UUID identifier"},{"line_number":144,"context_line":"    so that external systems can supply an already-known external global"},{"line_number":145,"context_line":"    identifier for the resource pool. If the `--uuid` option is not provided in"},{"line_number":146,"context_line":"    the call to `openstack resource-pool create`, a new UUID will automatically"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a122d0e_eeeb8cda","line":143,"range":{"start_line":142,"start_character":4,"end_line":143,"end_character":26},"updated":"2016-05-04 19:01:24.000000000","message":"Is this true for this use case? If you don\u0027t specify the subnet\u0027s UUID, how will it ever be connected to the subnet in Neutron? I can see how in some cases it would be optional, but not here.","commit_id":"6cef0e91cc103343b228ef9e41c549ff90589152"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"60fafe305b41f907b08e58a7093fa3845dbb5418","unresolved":false,"context_lines":[{"line_number":140,"context_line":".. note::"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    Please note that the `--uuid` field in the `openstack resource-pool create`"},{"line_number":143,"context_line":"    call above is optional. The field allows passing in a UUID identifier"},{"line_number":144,"context_line":"    so that external systems can supply an already-known external global"},{"line_number":145,"context_line":"    identifier for the resource pool. If the `--uuid` option is not provided in"},{"line_number":146,"context_line":"    the call to `openstack resource-pool create`, a new UUID will automatically"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_14377ae4","line":143,"updated":"2016-05-05 20:52:45.000000000","message":"Yes, you are correct. I have updated the note to make things more clear, including referencing the first scenario, which doesn\u0027t pass a --uuid parameter.","commit_id":"6cef0e91cc103343b228ef9e41c549ff90589152"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"60fafe305b41f907b08e58a7093fa3845dbb5418","unresolved":false,"context_lines":[{"line_number":172,"context_line":"6) The cloud user boots an instance, specifying the ID of the port created"},{"line_number":173,"context_line":"   in step 5::"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    openstack server create --nic port_id\u003d$PORT_UUID"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"7) During (or perhaps before) the scheduling process, Nova will want to answer"},{"line_number":178,"context_line":"   the question, \"if this port ID is a member of a resource pool containing"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_743406de","line":175,"updated":"2016-05-05 20:52:45.000000000","message":"@Yingxin: No, Nova does not automatically detect the relationship. It relies on calling Neutron during setup phase of networking, right before calling to the scheduler. Nova says to Neutron \"hey, I have this port UUID. Tell me if it is associated with a subnet, and if so, which one\".","commit_id":"6cef0e91cc103343b228ef9e41c549ff90589152"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"13a87998b67b4ee7326c34d2ba02cd1de0c00422","unresolved":false,"context_lines":[{"line_number":172,"context_line":"6) The cloud user boots an instance, specifying the ID of the port created"},{"line_number":173,"context_line":"   in step 5::"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    openstack server create --nic port_id\u003d$PORT_UUID"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"7) During (or perhaps before) the scheduling process, Nova will want to answer"},{"line_number":178,"context_line":"   the question, \"if this port ID is a member of a resource pool containing"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a122d0e_54397ca2","line":175,"range":{"start_line":175,"start_character":42,"end_line":175,"end_character":52},"updated":"2016-05-04 15:09:03.000000000","message":"The resource provider of the IPv4 resource pool is only associated with the $SUBNET_UUID in step 3). Does this command mean that nova can automatically detect the relationship from the $PORT_UUID to $SUBNET_UUID for scheduling?","commit_id":"6cef0e91cc103343b228ef9e41c549ff90589152"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a3418509b08e777378233a3cf5218c8fd8db04b8","unresolved":false,"context_lines":[{"line_number":301,"context_line":"        \"resources\": {"},{"line_number":302,"context_line":"          \"type\": \"object\","},{"line_number":303,"context_line":"          \"patternProperties\": {"},{"line_number":304,"context_line":"            \"^[A-Z\\_]+$\": {"},{"line_number":305,"context_line":"              \"type\": \"object\","},{"line_number":306,"context_line":"              \"properties\": {"},{"line_number":307,"context_line":"                \"total\": {"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a122d0e_a643826b","line":304,"updated":"2016-05-04 16:42:13.000000000","message":"nit: the \\ before the _ is not strictly needed","commit_id":"6cef0e91cc103343b228ef9e41c549ff90589152"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"dd2347edfbe500f7e83618ddb1ec5b05b2bc815b","unresolved":false,"context_lines":[{"line_number":323,"context_line":"                  \"type\": \"number\""},{"line_number":324,"context_line":"                },"},{"line_number":325,"context_line":"                \"required\": ["},{"line_number":326,"context_line":"                  \"total\""},{"line_number":327,"context_line":"                ]"},{"line_number":328,"context_line":"              },"},{"line_number":329,"context_line":"              \"additionalProperties\": False"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a122d0e_bfc37c89","line":326,"range":{"start_line":326,"start_character":18,"end_line":326,"end_character":24},"updated":"2016-05-04 19:01:24.000000000","message":"I don\u0027t understand what \"total\" is specifying here (and otehrs below). It might just be my minimal JSONschema knowledge, though.","commit_id":"6cef0e91cc103343b228ef9e41c549ff90589152"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"60fafe305b41f907b08e58a7093fa3845dbb5418","unresolved":false,"context_lines":[{"line_number":323,"context_line":"                  \"type\": \"number\""},{"line_number":324,"context_line":"                },"},{"line_number":325,"context_line":"                \"required\": ["},{"line_number":326,"context_line":"                  \"total\""},{"line_number":327,"context_line":"                ]"},{"line_number":328,"context_line":"              },"},{"line_number":329,"context_line":"              \"additionalProperties\": False"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_543102ec","line":326,"updated":"2016-05-05 20:52:45.000000000","message":"The above is saying that the only field in the resources dictionary that is required is the total field. All other fields are optional (they have sensible defaults)","commit_id":"6cef0e91cc103343b228ef9e41c549ff90589152"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"37714408ae37518dead82c6fd6d9bce487980c18","unresolved":false,"context_lines":[{"line_number":323,"context_line":"                  \"type\": \"number\""},{"line_number":324,"context_line":"                },"},{"line_number":325,"context_line":"                \"required\": ["},{"line_number":326,"context_line":"                  \"total\""},{"line_number":327,"context_line":"                ]"},{"line_number":328,"context_line":"              },"},{"line_number":329,"context_line":"              \"additionalProperties\": False"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_4f77773a","line":326,"in_reply_to":"dab17558_543102ec","updated":"2016-05-06 21:40:15.000000000","message":"Got it - thx","commit_id":"6cef0e91cc103343b228ef9e41c549ff90589152"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"dd2347edfbe500f7e83618ddb1ec5b05b2bc815b","unresolved":false,"context_lines":[{"line_number":595,"context_line":"`GET /resource_pools/{uuid}/aggregates`"},{"line_number":596,"context_line":"***************************************"},{"line_number":597,"context_line":""},{"line_number":598,"context_line":"Shall return a list of aggregates that can utilize the resource pool."},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"Here is an example returned response::"},{"line_number":601,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a122d0e_1fa390b2","line":598,"range":{"start_line":598,"start_character":43,"end_line":598,"end_character":50},"updated":"2016-05-04 19:01:24.000000000","message":"Grammar nit: use `use` instead.","commit_id":"6cef0e91cc103343b228ef9e41c549ff90589152"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"60fafe305b41f907b08e58a7093fa3845dbb5418","unresolved":false,"context_lines":[{"line_number":595,"context_line":"`GET /resource_pools/{uuid}/aggregates`"},{"line_number":596,"context_line":"***************************************"},{"line_number":597,"context_line":""},{"line_number":598,"context_line":"Shall return a list of aggregates that can utilize the resource pool."},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"Here is an example returned response::"},{"line_number":601,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_b44cae77","line":598,"updated":"2016-05-05 20:52:45.000000000","message":"done.","commit_id":"6cef0e91cc103343b228ef9e41c549ff90589152"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"60fafe305b41f907b08e58a7093fa3845dbb5418","unresolved":false,"context_lines":[{"line_number":627,"context_line":"--------------------"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"We should create new notification messages for when resource pools are created,"},{"line_number":630,"context_line":"destroyed, updated, associated with an aggregate and disassociated with an"},{"line_number":631,"context_line":"aggregate."},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"Other end user impact"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_9451aa11","line":630,"updated":"2016-05-05 20:52:45.000000000","message":"done.","commit_id":"6cef0e91cc103343b228ef9e41c549ff90589152"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"dd2347edfbe500f7e83618ddb1ec5b05b2bc815b","unresolved":false,"context_lines":[{"line_number":627,"context_line":"--------------------"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"We should create new notification messages for when resource pools are created,"},{"line_number":630,"context_line":"destroyed, updated, associated with an aggregate and disassociated with an"},{"line_number":631,"context_line":"aggregate."},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"Other end user impact"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a122d0e_7f98c46a","line":630,"range":{"start_line":630,"start_character":67,"end_line":630,"end_character":71},"updated":"2016-05-04 19:01:24.000000000","message":"nit: s/with/from","commit_id":"6cef0e91cc103343b228ef9e41c549ff90589152"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"60fafe305b41f907b08e58a7093fa3845dbb5418","unresolved":false,"context_lines":[{"line_number":697,"context_line":"* Modify resource tracker to pull information on aggregates the compute node is"},{"line_number":698,"context_line":"  associated with and determine if disk capacity and usage tracking should be"},{"line_number":699,"context_line":"  skipped if a resource pool is tracking that information separately"},{"line_number":700,"context_line":"* Modify the scheduler to look at resource pool information for aggregates"},{"line_number":701,"context_line":"  associated with compute nodes to determine if request can be fulfilled by the"},{"line_number":702,"context_line":"  resource pool"},{"line_number":703,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_f4563605","line":700,"updated":"2016-05-05 20:52:45.000000000","message":"@Yingxin: This spec does not change the location of the claim (it will continue to be done in the compute node\u0027s resource tracker). The resource tracker will be changed to understand that if the compute node is associated with an aggregate that has a resource pool of shared storage, and the instance has asked for some amount of DISK_GB resources, that claim process will write the allocation record against the resource pool, not the compute node, as the resource provider. I\u0027ve added some wording to make this clearer.","commit_id":"6cef0e91cc103343b228ef9e41c549ff90589152"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"13a87998b67b4ee7326c34d2ba02cd1de0c00422","unresolved":false,"context_lines":[{"line_number":697,"context_line":"* Modify resource tracker to pull information on aggregates the compute node is"},{"line_number":698,"context_line":"  associated with and determine if disk capacity and usage tracking should be"},{"line_number":699,"context_line":"  skipped if a resource pool is tracking that information separately"},{"line_number":700,"context_line":"* Modify the scheduler to look at resource pool information for aggregates"},{"line_number":701,"context_line":"  associated with compute nodes to determine if request can be fulfilled by the"},{"line_number":702,"context_line":"  resource pool"},{"line_number":703,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a122d0e_b77bb27a","line":700,"range":{"start_line":700,"start_character":13,"end_line":700,"end_character":74},"updated":"2016-05-04 15:09:03.000000000","message":"Where is the claim/consumption logic(i.e. add allocation records to the db) for the resource pools? Is it in scheduler service or in the claim logic of resource tracker?","commit_id":"6cef0e91cc103343b228ef9e41c549ff90589152"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"13a87998b67b4ee7326c34d2ba02cd1de0c00422","unresolved":false,"context_lines":[{"line_number":715,"context_line":""},{"line_number":716,"context_line":"* Docs and example cronjob scripts for updating capacity and usage information"},{"line_number":717,"context_line":"  for a shared resource pool of disk"},{"line_number":718,"context_line":"* Functional integration tests in a multi-node devstack environment with shared"},{"line_number":719,"context_line":"  storage"},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"Dependencies"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a122d0e_f7c9aa5b","line":718,"range":{"start_line":718,"start_character":36,"end_line":718,"end_character":67},"updated":"2016-05-04 15:09:03.000000000","message":"Is the *devstack* environment required? Current functional test framework doesn\u0027t use a devstack environment actually, but it can still launch multiple compute services in threads with fake virt driver.","commit_id":"6cef0e91cc103343b228ef9e41c549ff90589152"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"60fafe305b41f907b08e58a7093fa3845dbb5418","unresolved":false,"context_lines":[{"line_number":715,"context_line":""},{"line_number":716,"context_line":"* Docs and example cronjob scripts for updating capacity and usage information"},{"line_number":717,"context_line":"  for a shared resource pool of disk"},{"line_number":718,"context_line":"* Functional integration tests in a multi-node devstack environment with shared"},{"line_number":719,"context_line":"  storage"},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"Dependencies"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_d45b322d","line":718,"updated":"2016-05-05 20:52:45.000000000","message":"This will need to be a Tempest test since Nova\u0027s functional tests don\u0027t support shared storage.","commit_id":"6cef0e91cc103343b228ef9e41c549ff90589152"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1c2dd8c054772a1102112ccb42695302b6b70e09","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    $SUBNET_UUID\u003d`openstack subnet create $SEG_UUID --cidr\u003d192.168.10.1/24`"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"2) The cloud deployer creates an aggregate representing all the compute"},{"line_number":127,"context_line":"   nodes in row 3, racks 1 through 5::"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    $AGG_UUID\u003d`openstack aggregate create \"row 3, rack 1\"`"},{"line_number":130,"context_line":"    # for all compute nodes in the system that are in racks 1 in row 3..."}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_6177f43a","line":127,"range":{"start_line":127,"start_character":27,"end_line":127,"end_character":36},"updated":"2016-05-06 21:12:44.000000000","message":"This doesn\u0027t seem to fit in here, but meh.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d1438a677cfc39156e9c779aef4803c7c7fba0c3","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    $SUBNET_UUID\u003d`openstack subnet create $SEG_UUID --cidr\u003d192.168.10.1/24`"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"2) The cloud deployer creates an aggregate representing all the compute"},{"line_number":127,"context_line":"   nodes in row 3, racks 1 through 5::"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    $AGG_UUID\u003d`openstack aggregate create \"row 3, rack 1\"`"},{"line_number":130,"context_line":"    # for all compute nodes in the system that are in racks 1 in row 3..."}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_399053ec","line":127,"updated":"2016-05-09 15:06:30.000000000","message":"Why not? The use case is about explaining how deployers who use shared storage might lay out their Nova deployment in a common way using racks/rows as aggregates...","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"13b4c6eabefc8b97fdc2929a7d95219eb53bb2ec","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    $SUBNET_UUID\u003d`openstack subnet create $SEG_UUID --cidr\u003d192.168.10.1/24`"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"2) The cloud deployer creates an aggregate representing all the compute"},{"line_number":127,"context_line":"   nodes in row 3, racks 1 through 5::"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    $AGG_UUID\u003d`openstack aggregate create \"row 3, rack 1\"`"},{"line_number":130,"context_line":"    # for all compute nodes in the system that are in racks 1 in row 3..."}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_94eae60d","line":127,"in_reply_to":"dab17558_399053ec","updated":"2016-05-09 15:16:20.000000000","message":"Sorry, my point was you don\u0027t mention anything else in the example scenario about racks 2-5, just row 3, rack 1. But it\u0027s not a big deal.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1c2dd8c054772a1102112ccb42695302b6b70e09","unresolved":false,"context_lines":[{"line_number":171,"context_line":"5) The cloud user creates a port in Neutron, asking for an IP out of a"},{"line_number":172,"context_line":"   particular subnet::"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    PORT_UUID\u003d`openstack port create --network-id\u003d$SUBNET_UUID`"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"6) The cloud user boots an instance, specifying the ID of the port created"},{"line_number":177,"context_line":"   in step 5::"}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_a1b6fcd9","line":174,"range":{"start_line":174,"start_character":51,"end_line":174,"end_character":62},"updated":"2016-05-06 21:12:44.000000000","message":"NET_UUID?\n\nI think this would actually be:\n\nPORT_UUID\u003d`openstack port create --network-id\u003d$NET_UUID --fixed-ip subnet\u003d$SUBNET_UUID`","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d1438a677cfc39156e9c779aef4803c7c7fba0c3","unresolved":false,"context_lines":[{"line_number":171,"context_line":"5) The cloud user creates a port in Neutron, asking for an IP out of a"},{"line_number":172,"context_line":"   particular subnet::"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    PORT_UUID\u003d`openstack port create --network-id\u003d$SUBNET_UUID`"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"6) The cloud user boots an instance, specifying the ID of the port created"},{"line_number":177,"context_line":"   in step 5::"}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_99bdff6a","line":174,"updated":"2016-05-09 15:06:30.000000000","message":"OK, fixed.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d1438a677cfc39156e9c779aef4803c7c7fba0c3","unresolved":false,"context_lines":[{"line_number":176,"context_line":"6) The cloud user boots an instance, specifying the ID of the port created"},{"line_number":177,"context_line":"   in step 5::"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    openstack server create --nic port_id\u003d$PORT_UUID"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"7) During (or perhaps before) the scheduling process, Nova will want to answer"},{"line_number":182,"context_line":"   the question, \"if this port ID is a member of a resource pool containing"}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_79c01be1","line":179,"updated":"2016-05-09 15:06:30.000000000","message":"Added.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1c2dd8c054772a1102112ccb42695302b6b70e09","unresolved":false,"context_lines":[{"line_number":176,"context_line":"6) The cloud user boots an instance, specifying the ID of the port created"},{"line_number":177,"context_line":"   in step 5::"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    openstack server create --nic port_id\u003d$PORT_UUID"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"7) During (or perhaps before) the scheduling process, Nova will want to answer"},{"line_number":182,"context_line":"   the question, \"if this port ID is a member of a resource pool containing"}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_21404ca5","line":179,"updated":"2016-05-06 21:12:44.000000000","message":"Technically you\u0027d have an image and flavor here, but I know this is just an illustration.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d1438a677cfc39156e9c779aef4803c7c7fba0c3","unresolved":false,"context_lines":[{"line_number":228,"context_line":"Data model impact"},{"line_number":229,"context_line":"-----------------"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"A new many-to-many mapping table will be created to enable an aggregate to be"},{"line_number":232,"context_line":"associated with one or more resource pools::"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    CREATE TABLE resource_provider_aggregates ("}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_d9b78784","line":231,"updated":"2016-05-09 15:06:30.000000000","message":"Done.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1c2dd8c054772a1102112ccb42695302b6b70e09","unresolved":false,"context_lines":[{"line_number":228,"context_line":"Data model impact"},{"line_number":229,"context_line":"-----------------"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"A new many-to-many mapping table will be created to enable an aggregate to be"},{"line_number":232,"context_line":"associated with one or more resource pools::"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    CREATE TABLE resource_provider_aggregates ("}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_216e8c2f","line":231,"range":{"start_line":231,"start_character":27,"end_line":231,"end_character":48},"updated":"2016-05-06 21:12:44.000000000","message":"nit: would probably be good to be clear that it will be in the API DB schema.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0308ef803d01cab1fc52ab4152b4a2bb87a8e117","unresolved":false,"context_lines":[{"line_number":234,"context_line":"    CREATE TABLE resource_provider_aggregates ("},{"line_number":235,"context_line":"        resource_provider_id INT NOT NULL,"},{"line_number":236,"context_line":"        aggregate_id INT NOT NULL,"},{"line_number":237,"context_line":"        PRIMARY KEY (aggregate_id, resource_provider_id),"},{"line_number":238,"context_line":"    );"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"A new nova object model for resource pools will be introduced. This object"}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_af2b832f","line":237,"range":{"start_line":237,"start_character":8,"end_line":237,"end_character":56},"updated":"2016-05-06 21:37:02.000000000","message":"I asked in patch set 2 about foreign keys on these, and I think the answer was, sure we can add those. I only bring it up again because in case you rev this, it might be worth adding them, because someone else writing the code from the spec might figure they don\u0027t need fkeys. I know it\u0027s a bit of nit picking, but if we\u0027re going to be this specific already we might as well go all the way. :)","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d1438a677cfc39156e9c779aef4803c7c7fba0c3","unresolved":false,"context_lines":[{"line_number":234,"context_line":"    CREATE TABLE resource_provider_aggregates ("},{"line_number":235,"context_line":"        resource_provider_id INT NOT NULL,"},{"line_number":236,"context_line":"        aggregate_id INT NOT NULL,"},{"line_number":237,"context_line":"        PRIMARY KEY (aggregate_id, resource_provider_id),"},{"line_number":238,"context_line":"    );"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"A new nova object model for resource pools will be introduced. This object"}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_b9ba836c","line":237,"updated":"2016-05-09 15:06:30.000000000","message":"OK, done.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d1438a677cfc39156e9c779aef4803c7c7fba0c3","unresolved":false,"context_lines":[{"line_number":389,"context_line":"            \"step_size\": 1"},{"line_number":390,"context_line":"          }"},{"line_number":391,"context_line":"        },"},{"line_number":392,"context_line":"    }"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"The following JSONSchema document shall inform the request payload::"},{"line_number":395,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_19b2af94","line":392,"updated":"2016-05-09 15:06:30.000000000","message":"@cdent: I didn\u0027t think about removing an inventory record for a resource provider, unfortunately. That will need to be address, correct. We will probably want to add a new DELETE /resource_pools/{uuid}/inventories/{resource_class} call and associated `openstack resource-pool delete inventory CLI command.\n\nYou are correct that a PUT of a resource pool that doesn\u0027t contain all the original resource classes in the resources dictionary would remove the inventory record of the missing resource class.\n\nI think that is perfectly fine behaviour, especially if we add a method of specifically updating or deleting one inventory record.\n\nIf an inventory record is remove and allocations records exist for that resource class and provider ID, then I would expect a 409 Conflict should be raised with an appropriate error message.\n\nAs for your question regarding what should happen when an inventory is updated (total or reserved), yes, we should keep all existing allocation records. If the updated total or reserved would violate with the existing allocation records, a 409 Conflict should be returned and the total and reserved should not be updated.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"f366d3d1b7186db8a48ae3570ad48432007edba9","unresolved":false,"context_lines":[{"line_number":389,"context_line":"            \"step_size\": 1"},{"line_number":390,"context_line":"          }"},{"line_number":391,"context_line":"        },"},{"line_number":392,"context_line":"    }"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"The following JSONSchema document shall inform the request payload::"},{"line_number":395,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_3239a942","line":392,"updated":"2016-05-08 12:02:13.000000000","message":"I have some hopefully clarifying questions about the mechanics of what should happen under the cover when doing a PUT of a resource pool. We may have covered some of this in the past but I want to get it in one place.\n\n* Taken at face value the above means that the resource pool now has exactly one resource class (DISK_GB). If this example were a different class from the original POST then the inventory of resource class described in the original POST should be removed. Is this the desired behavior?\n\n* When an inventory of a resource is removed as a result of a resource-pool PUT, presumably that should mean all the associated allocations should be removed too. Is this correct? \n\n* Do we need to account for situation where we have active allocations for a class of resource that are about to be removed due to a PUT that removes that class of resource or is it up to the operator to be conscious of what they are doing?\nWe could raise a 409 here too (if used \u003e 0: raise \"really, are you sure?\") but it seems a bit nanny state.\n\n* If a resource-pool is updated with new constraints for the same class of resource (updated total, reserved, etc), the allocations associated with the resource class in its previous form should be preserved, correct? That is: they \"still count\" (keeping in mind the constraint described below about having a conflict if the existing used is over (total - reserved)).","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d1438a677cfc39156e9c779aef4803c7c7fba0c3","unresolved":false,"context_lines":[{"line_number":453,"context_line":"  information"},{"line_number":454,"context_line":"* `400 Bad Request` for any bad or invalid syntax."},{"line_number":455,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found"},{"line_number":456,"context_line":"* `409 Conflict` shall be returned if the `capacity` or the `reserved` amount"},{"line_number":457,"context_line":"  supplied for a particular resource class would put the resource pool into a"},{"line_number":458,"context_line":"  situation where there was more resources consumed (used) than the capacity"},{"line_number":459,"context_line":"  minus reserved amount multiplied by the allocation ratio."}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_f9ac0b37","line":456,"updated":"2016-05-09 15:06:30.000000000","message":"Done.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"f366d3d1b7186db8a48ae3570ad48432007edba9","unresolved":false,"context_lines":[{"line_number":453,"context_line":"  information"},{"line_number":454,"context_line":"* `400 Bad Request` for any bad or invalid syntax."},{"line_number":455,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found"},{"line_number":456,"context_line":"* `409 Conflict` shall be returned if the `capacity` or the `reserved` amount"},{"line_number":457,"context_line":"  supplied for a particular resource class would put the resource pool into a"},{"line_number":458,"context_line":"  situation where there was more resources consumed (used) than the capacity"},{"line_number":459,"context_line":"  minus reserved amount multiplied by the allocation ratio."}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_924055a7","line":456,"updated":"2016-05-08 12:02:13.000000000","message":"total","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d1438a677cfc39156e9c779aef4803c7c7fba0c3","unresolved":false,"context_lines":[{"line_number":626,"context_line":"Security impact"},{"line_number":627,"context_line":"---------------"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"None."},{"line_number":630,"context_line":""},{"line_number":631,"context_line":"Notifications impact"},{"line_number":632,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_59ac3734","line":629,"updated":"2016-05-09 15:06:30.000000000","message":"Good question. Not sure what the answer is here. I would like to consume anything that alaski is working on around policy as code.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1c2dd8c054772a1102112ccb42695302b6b70e09","unresolved":false,"context_lines":[{"line_number":626,"context_line":"Security impact"},{"line_number":627,"context_line":"---------------"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"None."},{"line_number":630,"context_line":""},{"line_number":631,"context_line":"Notifications impact"},{"line_number":632,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_e4ddb243","line":629,"updated":"2016-05-06 21:12:44.000000000","message":"What are we doing about policy with the new placement API? I guess that just lives in Nova\u0027s global default policy in code? Or would there be a separate policy.json file?","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"3350d4c96aed1fdfcf2837289130b29ac483e9cb","unresolved":false,"context_lines":[{"line_number":626,"context_line":"Security impact"},{"line_number":627,"context_line":"---------------"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"None."},{"line_number":630,"context_line":""},{"line_number":631,"context_line":"Notifications impact"},{"line_number":632,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_f4f41288","line":629,"in_reply_to":"dab17558_59ac3734","updated":"2016-05-09 15:20:09.000000000","message":"The defaults should definitely be embedded in the code from the start, which hopefully mostly eliminates the need for anyone to configure a policy file for this API endpoint. \n\nThere\u0027s still a question of how overrides could be provided if necessary. I would prefer to see this endpoint use its own policy file from the start.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d1438a677cfc39156e9c779aef4803c7c7fba0c3","unresolved":false,"context_lines":[{"line_number":656,"context_line":"   --max-unit\u003d1 \\"},{"line_number":657,"context_line":"   --step-size\u003d1 \\"},{"line_number":658,"context_line":"   --allocation-ratio\u003d1.0`"},{"line_number":659,"context_line":"* `openstack resource-pool add aggregate $UUID $AGG_ID`"},{"line_number":660,"context_line":""},{"line_number":661,"context_line":"Performance Impact"},{"line_number":662,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_39a7b350","line":659,"updated":"2016-05-09 15:06:30.000000000","message":"Added.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1c2dd8c054772a1102112ccb42695302b6b70e09","unresolved":false,"context_lines":[{"line_number":656,"context_line":"   --max-unit\u003d1 \\"},{"line_number":657,"context_line":"   --step-size\u003d1 \\"},{"line_number":658,"context_line":"   --allocation-ratio\u003d1.0`"},{"line_number":659,"context_line":"* `openstack resource-pool add aggregate $UUID $AGG_ID`"},{"line_number":660,"context_line":""},{"line_number":661,"context_line":"Performance Impact"},{"line_number":662,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_24cfba80","line":659,"updated":"2016-05-06 21:12:44.000000000","message":"And delete aggregate I guess to disassociate an aggregate from a pool.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1c2dd8c054772a1102112ccb42695302b6b70e09","unresolved":false,"context_lines":[{"line_number":666,"context_line":"Other deployer impact"},{"line_number":667,"context_line":"---------------------"},{"line_number":668,"context_line":""},{"line_number":669,"context_line":"Deployers who are using shared storage will need to create a resource pool for"},{"line_number":670,"context_line":"their shared disk storage, create any host aggregates that may need to be"},{"line_number":671,"context_line":"created for any compute nodes that utilize that shared storage, associate the"},{"line_number":672,"context_line":"resource pool with those aggregates, and schedule (cronjob or the like) some"}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_047a7624","line":669,"updated":"2016-05-06 21:12:44.000000000","message":"I might have already asked this once before, but if you don\u0027t create the resource pool for shared storage then things continue to \u0027work\u0027 as today, you just live with the bugs we have.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0308ef803d01cab1fc52ab4152b4a2bb87a8e117","unresolved":false,"context_lines":[{"line_number":666,"context_line":"Other deployer impact"},{"line_number":667,"context_line":"---------------------"},{"line_number":668,"context_line":""},{"line_number":669,"context_line":"Deployers who are using shared storage will need to create a resource pool for"},{"line_number":670,"context_line":"their shared disk storage, create any host aggregates that may need to be"},{"line_number":671,"context_line":"created for any compute nodes that utilize that shared storage, associate the"},{"line_number":672,"context_line":"resource pool with those aggregates, and schedule (cronjob or the like) some"}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_2f18331d","line":669,"in_reply_to":"dab17558_047a7624","updated":"2016-05-06 21:37:02.000000000","message":"I just looked back to patch set 2 and yeah I asked this before and you replied, and I was happy with it.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0308ef803d01cab1fc52ab4152b4a2bb87a8e117","unresolved":false,"context_lines":[{"line_number":699,"context_line":"  table."},{"line_number":700,"context_line":"* Create `nova.objects` models for `ResourcePool`"},{"line_number":701,"context_line":"* Create REST API controllers for resource pool querying and handling"},{"line_number":702,"context_line":"* Modify resource tracker to pull information on aggregates the compute node is"},{"line_number":703,"context_line":"  associated and the resource pools available for those aggregates. If the"},{"line_number":704,"context_line":"  instance is requesting some amount of DISK_GB resources and the compute node"},{"line_number":705,"context_line":"  is associated with a resource pool that contains available DISK_GB inventory,"},{"line_number":706,"context_line":"  then the resource tracker shall claim the resources (write an allocation"},{"line_number":707,"context_line":"  record) against the resource pool, not the compute node itself."},{"line_number":708,"context_line":"* Modify the scheduler to look at resource pool information for aggregates"},{"line_number":709,"context_line":"  associated with compute nodes to determine if request can be fulfilled by the"},{"line_number":710,"context_line":"  resource pool"}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_6fbfdbd0","line":707,"range":{"start_line":702,"start_character":2,"end_line":707,"end_character":65},"updated":"2016-05-06 21:37:02.000000000","message":"I think this must have changed a bit from patch set 2 where it talked about if the resources weren\u0027t in a pool it would do something else (the admin hadn\u0027t mapped things yet), which was related to my upgrade impact question. Maybe not necessary to clarify here unless it\u0027s simple to do that.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"429c51ea9d1ffb6d82ac04b10e47d374be82b5c4","unresolved":false,"context_lines":[{"line_number":705,"context_line":"  is associated with a resource pool that contains available DISK_GB inventory,"},{"line_number":706,"context_line":"  then the resource tracker shall claim the resources (write an allocation"},{"line_number":707,"context_line":"  record) against the resource pool, not the compute node itself."},{"line_number":708,"context_line":"* Modify the scheduler to look at resource pool information for aggregates"},{"line_number":709,"context_line":"  associated with compute nodes to determine if request can be fulfilled by the"},{"line_number":710,"context_line":"  resource pool"},{"line_number":711,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_1db6768a","line":708,"range":{"start_line":708,"start_character":2,"end_line":708,"end_character":74},"updated":"2016-05-06 02:15:00.000000000","message":"**not in the scope of this spec, but related to the resource-provider-series**\n\nI think its necessary to make scheduler handle all quantitative resources in a consistent way without the awareness of specific resource types. Its reasonable to have a generic `quantitative-filter` and `quantitative-weigher` to handle all the quantitative resources, replacing the current specific filters and weighers: `CoreFilter`, `DiskFilter`, `RamFilter`, `DiskWeigher`, `RAMWeigher`.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"dce93d07f5c956bb2844ddc67370608176abe808","unresolved":false,"context_lines":[{"line_number":705,"context_line":"  is associated with a resource pool that contains available DISK_GB inventory,"},{"line_number":706,"context_line":"  then the resource tracker shall claim the resources (write an allocation"},{"line_number":707,"context_line":"  record) against the resource pool, not the compute node itself."},{"line_number":708,"context_line":"* Modify the scheduler to look at resource pool information for aggregates"},{"line_number":709,"context_line":"  associated with compute nodes to determine if request can be fulfilled by the"},{"line_number":710,"context_line":"  resource pool"},{"line_number":711,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_bc6ab118","line":708,"updated":"2016-05-06 15:30:23.000000000","message":"@Yingxin: Yup, that is the plan. The resource-providers-allocations, compute-node-inventory-newton (implemented already) already address that goal. I still need to complete the blueprint/spec for converting the PCI device and NUMA topology resource types to be handled generically using simple integer calculations. That spec deals with what I\u0027ve been calling \"nested resource providers\". I\u0027ll shoot you a link to the spec when I push it up. It\u0027s unlikely the code will be completed in Newton, however. :(","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"f66c49191f0f24938f4e021ca645d1f78640e75c","unresolved":false,"context_lines":[{"line_number":705,"context_line":"  is associated with a resource pool that contains available DISK_GB inventory,"},{"line_number":706,"context_line":"  then the resource tracker shall claim the resources (write an allocation"},{"line_number":707,"context_line":"  record) against the resource pool, not the compute node itself."},{"line_number":708,"context_line":"* Modify the scheduler to look at resource pool information for aggregates"},{"line_number":709,"context_line":"  associated with compute nodes to determine if request can be fulfilled by the"},{"line_number":710,"context_line":"  resource pool"},{"line_number":711,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_ccb9a7cd","line":708,"in_reply_to":"dab17558_bc6ab118","updated":"2016-05-07 15:54:46.000000000","message":"Thanks its great, will keep in track of the progressing.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"dce93d07f5c956bb2844ddc67370608176abe808","unresolved":false,"context_lines":[{"line_number":723,"context_line":""},{"line_number":724,"context_line":"* Docs and example cronjob scripts for updating capacity and usage information"},{"line_number":725,"context_line":"  for a shared resource pool of disk"},{"line_number":726,"context_line":"* Functional integration tests in a multi-node devstack environment with shared"},{"line_number":727,"context_line":"  storage"},{"line_number":728,"context_line":""},{"line_number":729,"context_line":"Dependencies"}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_1c781df2","line":726,"updated":"2016-05-06 15:30:23.000000000","message":"@Yingxin: Sorry, I should have been more clear... I meant that Nova\u0027s functional tests do not support setting up a shared storage system like NFS or Ceph/RBD and testing that multiple compute nodes consume resources from the shared storage pool.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"429c51ea9d1ffb6d82ac04b10e47d374be82b5c4","unresolved":false,"context_lines":[{"line_number":723,"context_line":""},{"line_number":724,"context_line":"* Docs and example cronjob scripts for updating capacity and usage information"},{"line_number":725,"context_line":"  for a shared resource pool of disk"},{"line_number":726,"context_line":"* Functional integration tests in a multi-node devstack environment with shared"},{"line_number":727,"context_line":"  storage"},{"line_number":728,"context_line":""},{"line_number":729,"context_line":"Dependencies"}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_5068e5ba","line":726,"range":{"start_line":726,"start_character":36,"end_line":726,"end_character":67},"updated":"2016-05-06 02:15:00.000000000","message":"You said that \"Nova\u0027s functional tests don\u0027t support shared storage\". But it might not be the truth.\n\nAccording to a preview[1] creating *two* compute services in the scheduler functional test framework, there\u0027s currently no problem to test nova scheduler in the multi-node simulation. Like my performance profiling tool for nova scheduler, all the simulated compute services are real with fake virt driver.\n\n(Note that the above reasoning doesn\u0027t imply that Tempest test is not necessary for generic-resource-pools.)\n\n[1] https://review.openstack.org/#/c/281825/2/nova/tests/functional/test_scheduler.py@209","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"f66c49191f0f24938f4e021ca645d1f78640e75c","unresolved":false,"context_lines":[{"line_number":723,"context_line":""},{"line_number":724,"context_line":"* Docs and example cronjob scripts for updating capacity and usage information"},{"line_number":725,"context_line":"  for a shared resource pool of disk"},{"line_number":726,"context_line":"* Functional integration tests in a multi-node devstack environment with shared"},{"line_number":727,"context_line":"  storage"},{"line_number":728,"context_line":""},{"line_number":729,"context_line":"Dependencies"}],"source_content_type":"text/x-rst","patch_set":7,"id":"dab17558_acc5433d","line":726,"in_reply_to":"dab17558_1c781df2","updated":"2016-05-07 15:54:46.000000000","message":"OK, that\u0027s true.","commit_id":"429d37b087306274084c1e2ff7fc8e6607564a38"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e8cf684fbe44fdf6ad45cc693730371e7faf4892","unresolved":false,"context_lines":[{"line_number":171,"context_line":"5) The cloud user creates a port in Neutron, asking for an IP out of a"},{"line_number":172,"context_line":"   particular subnet::"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    PORT_UUID\u003d`openstack port create --network-id\u003d$SUBNET_UUID --fixed-ip \\"},{"line_number":175,"context_line":"        subnet\u003d$SUBNET_UUID`"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"6) The cloud user boots an instance, specifying the ID of the port created"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_11d8c31c","line":174,"updated":"2016-05-09 16:38:34.000000000","message":"Done.","commit_id":"f95f9446d0afdb7c7d82b19668995e31448f9c49"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"63be36a2f466f0b9dc9d9e0b6b2df162f80ca049","unresolved":false,"context_lines":[{"line_number":171,"context_line":"5) The cloud user creates a port in Neutron, asking for an IP out of a"},{"line_number":172,"context_line":"   particular subnet::"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    PORT_UUID\u003d`openstack port create --network-id\u003d$SUBNET_UUID --fixed-ip \\"},{"line_number":175,"context_line":"        subnet\u003d$SUBNET_UUID`"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"6) The cloud user boots an instance, specifying the ID of the port created"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_d483ce02","line":174,"range":{"start_line":174,"start_character":51,"end_line":174,"end_character":62},"updated":"2016-05-09 15:37:29.000000000","message":"NET_UUID","commit_id":"f95f9446d0afdb7c7d82b19668995e31448f9c49"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"3375a0dac4168cab5a3cde1aa6bc949dd36651e9","unresolved":false,"context_lines":[{"line_number":580,"context_line":"`POST /resource_pools/{uuid}/inventories`"},{"line_number":581,"context_line":"*****************************************"},{"line_number":582,"context_line":""},{"line_number":583,"context_line":"Shall add one or more inventory records for a resource pool specified by"},{"line_number":584,"context_line":"`{uuid}`."},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"Here is an example HTTP request payload::"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_fa9fd94d","line":583,"range":{"start_line":583,"start_character":6,"end_line":583,"end_character":39},"updated":"2016-05-09 15:59:23.000000000","message":"If *one or more* inventory records can be added. Should all the resources need to be presented in a list?\n\n\"resources\": [ \"DISK_GB\": { ... } ]\nsee line  589 and it applies to all the related presentations in this spec.","commit_id":"f95f9446d0afdb7c7d82b19668995e31448f9c49"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e8cf684fbe44fdf6ad45cc693730371e7faf4892","unresolved":false,"context_lines":[{"line_number":580,"context_line":"`POST /resource_pools/{uuid}/inventories`"},{"line_number":581,"context_line":"*****************************************"},{"line_number":582,"context_line":""},{"line_number":583,"context_line":"Shall add one or more inventory records for a resource pool specified by"},{"line_number":584,"context_line":"`{uuid}`."},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"Here is an example HTTP request payload::"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_7105cf78","line":583,"updated":"2016-05-09 16:38:34.000000000","message":"No, @cdent doesn\u0027t like lists of dicts so we changed this to a dict keyed by the resource class name, which I liked.","commit_id":"f95f9446d0afdb7c7d82b19668995e31448f9c49"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"90d8a0cf3cb5680539322608111e245207a970df","unresolved":false,"context_lines":[{"line_number":580,"context_line":"`POST /resource_pools/{uuid}/inventories`"},{"line_number":581,"context_line":"*****************************************"},{"line_number":582,"context_line":""},{"line_number":583,"context_line":"Shall add one or more inventory records for a resource pool specified by"},{"line_number":584,"context_line":"`{uuid}`."},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"Here is an example HTTP request payload::"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_f1a41fa7","line":583,"in_reply_to":"dab17558_fa9fd94d","updated":"2016-05-09 17:25:19.000000000","message":"Just so it\u0027s clear: Besides me not liking list of dicts: Elsewhere in the discussion it was decided that any one resource_pool can only have one inventory for each class. If that\u0027s the case then a dict is the right data structure.","commit_id":"f95f9446d0afdb7c7d82b19668995e31448f9c49"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"3375a0dac4168cab5a3cde1aa6bc949dd36651e9","unresolved":false,"context_lines":[{"line_number":586,"context_line":"Here is an example HTTP request payload::"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    {"},{"line_number":589,"context_line":"        \"resources\": {"},{"line_number":590,"context_line":"          \"DISK_GB\": {"},{"line_number":591,"context_line":"            \"total\": 2048,"},{"line_number":592,"context_line":"            \"reserved\": 100,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_5ac6e548","line":589,"range":{"start_line":589,"start_character":21,"end_line":589,"end_character":22},"updated":"2016-05-09 15:59:23.000000000","message":"\"[\" ?","commit_id":"f95f9446d0afdb7c7d82b19668995e31448f9c49"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e8cf684fbe44fdf6ad45cc693730371e7faf4892","unresolved":false,"context_lines":[{"line_number":586,"context_line":"Here is an example HTTP request payload::"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    {"},{"line_number":589,"context_line":"        \"resources\": {"},{"line_number":590,"context_line":"          \"DISK_GB\": {"},{"line_number":591,"context_line":"            \"total\": 2048,"},{"line_number":592,"context_line":"            \"reserved\": 100,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_51088b91","line":589,"updated":"2016-05-09 16:38:34.000000000","message":"no, it\u0027s meant to be a dict.","commit_id":"f95f9446d0afdb7c7d82b19668995e31448f9c49"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"3375a0dac4168cab5a3cde1aa6bc949dd36651e9","unresolved":false,"context_lines":[{"line_number":595,"context_line":"            \"max_unit\": 100,"},{"line_number":596,"context_line":"            \"step_size\": 1"},{"line_number":597,"context_line":"          }"},{"line_number":598,"context_line":"        },"},{"line_number":599,"context_line":"    }"},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"The following JSONSchema document shall inform the request payload::"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_dae815b7","line":598,"range":{"start_line":598,"start_character":8,"end_line":598,"end_character":9},"updated":"2016-05-09 15:59:23.000000000","message":"\"]\" ?","commit_id":"f95f9446d0afdb7c7d82b19668995e31448f9c49"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e8cf684fbe44fdf6ad45cc693730371e7faf4892","unresolved":false,"context_lines":[{"line_number":595,"context_line":"            \"max_unit\": 100,"},{"line_number":596,"context_line":"            \"step_size\": 1"},{"line_number":597,"context_line":"          }"},{"line_number":598,"context_line":"        },"},{"line_number":599,"context_line":"    }"},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"The following JSONSchema document shall inform the request payload::"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_b1ff3766","line":598,"updated":"2016-05-09 16:38:34.000000000","message":"ditto.","commit_id":"f95f9446d0afdb7c7d82b19668995e31448f9c49"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"63be36a2f466f0b9dc9d9e0b6b2df162f80ca049","unresolved":false,"context_lines":[{"line_number":696,"context_line":"* `409 Conflict` shall be returned if there is already an inventory record for"},{"line_number":697,"context_line":"  one of the resource classes listed in the request"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"`PUT /resource_pools/{uuid}/inventories/{resource_class`"},{"line_number":700,"context_line":"********************************************************"},{"line_number":701,"context_line":""},{"line_number":702,"context_line":"Shall add or update the inventory record for a resource pool specified by"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_b410caa9","line":699,"range":{"start_line":699,"start_character":41,"end_line":699,"end_character":55},"updated":"2016-05-09 15:37:29.000000000","message":"Missing closing }","commit_id":"f95f9446d0afdb7c7d82b19668995e31448f9c49"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e8cf684fbe44fdf6ad45cc693730371e7faf4892","unresolved":false,"context_lines":[{"line_number":696,"context_line":"* `409 Conflict` shall be returned if there is already an inventory record for"},{"line_number":697,"context_line":"  one of the resource classes listed in the request"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"`PUT /resource_pools/{uuid}/inventories/{resource_class`"},{"line_number":700,"context_line":"********************************************************"},{"line_number":701,"context_line":""},{"line_number":702,"context_line":"Shall add or update the inventory record for a resource pool specified by"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_9102f36d","line":699,"updated":"2016-05-09 16:38:34.000000000","message":"done.","commit_id":"f95f9446d0afdb7c7d82b19668995e31448f9c49"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"3375a0dac4168cab5a3cde1aa6bc949dd36651e9","unresolved":false,"context_lines":[{"line_number":696,"context_line":"* `409 Conflict` shall be returned if there is already an inventory record for"},{"line_number":697,"context_line":"  one of the resource classes listed in the request"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"`PUT /resource_pools/{uuid}/inventories/{resource_class`"},{"line_number":700,"context_line":"********************************************************"},{"line_number":701,"context_line":""},{"line_number":702,"context_line":"Shall add or update the inventory record for a resource pool specified by"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_ba02716d","line":699,"range":{"start_line":699,"start_character":55,"end_line":699,"end_character":56},"updated":"2016-05-09 15:59:23.000000000","message":"nit: }`","commit_id":"f95f9446d0afdb7c7d82b19668995e31448f9c49"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"63be36a2f466f0b9dc9d9e0b6b2df162f80ca049","unresolved":false,"context_lines":[{"line_number":713,"context_line":"        \"step_size\": 1"},{"line_number":714,"context_line":"    }"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"The following JSONSchema document shall inform the request payload::"},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"    {"},{"line_number":719,"context_line":"      \"type\": \"object\","}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_bf9d435b","line":716,"updated":"2016-05-09 15:37:29.000000000","message":"If the resource_class doesn\u0027t exist for the given resource pool and we\u0027re going to create it, we\u0027ll still have to validate that the resource_class specified on the PUT request falls within our regex validation above, e.g. no mixed case.","commit_id":"f95f9446d0afdb7c7d82b19668995e31448f9c49"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e8cf684fbe44fdf6ad45cc693730371e7faf4892","unresolved":false,"context_lines":[{"line_number":713,"context_line":"        \"step_size\": 1"},{"line_number":714,"context_line":"    }"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"The following JSONSchema document shall inform the request payload::"},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"    {"},{"line_number":719,"context_line":"      \"type\": \"object\","}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_f1f9bf81","line":716,"updated":"2016-05-09 16:38:34.000000000","message":"OK, added a note.","commit_id":"f95f9446d0afdb7c7d82b19668995e31448f9c49"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e8cf684fbe44fdf6ad45cc693730371e7faf4892","unresolved":false,"context_lines":[{"line_number":760,"context_line":"  inventory records"},{"line_number":761,"context_line":"* `400 Bad Request` for any bad or invalid syntax"},{"line_number":762,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found **OR** a"},{"line_number":763,"context_line":"  resource class called `{resource_class}` is not found"},{"line_number":764,"context_line":"* `409 Conflict` shall be returned if the new settings for `total` and"},{"line_number":765,"context_line":"  `reserved` would be violated by existing allocations records for the resource"},{"line_number":766,"context_line":"  class"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_d1f47b88","line":763,"updated":"2016-05-09 16:38:34.000000000","message":"No, it\u0027s not. You cannot create a new resource class using this method. You can only add/update inventory for known resource classes.","commit_id":"f95f9446d0afdb7c7d82b19668995e31448f9c49"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"63be36a2f466f0b9dc9d9e0b6b2df162f80ca049","unresolved":false,"context_lines":[{"line_number":759,"context_line":"* `204 No Content` if the call was successful in creating all resource pool"},{"line_number":760,"context_line":"  inventory records"},{"line_number":761,"context_line":"* `400 Bad Request` for any bad or invalid syntax"},{"line_number":762,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found **OR** a"},{"line_number":763,"context_line":"  resource class called `{resource_class}` is not found"},{"line_number":764,"context_line":"* `409 Conflict` shall be returned if the new settings for `total` and"},{"line_number":765,"context_line":"  `reserved` would be violated by existing allocations records for the resource"},{"line_number":766,"context_line":"  class"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_5fc6d748","line":763,"range":{"start_line":762,"start_character":65,"end_line":763,"end_character":55},"updated":"2016-05-09 15:37:29.000000000","message":"This is wrong if you plan on creating it via this PUT.","commit_id":"f95f9446d0afdb7c7d82b19668995e31448f9c49"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ef8f4725ad80705544280e9aa4f86bb41c1eb471","unresolved":false,"context_lines":[{"line_number":760,"context_line":"  inventory records"},{"line_number":761,"context_line":"* `400 Bad Request` for any bad or invalid syntax"},{"line_number":762,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found **OR** a"},{"line_number":763,"context_line":"  resource class called `{resource_class}` is not found"},{"line_number":764,"context_line":"* `409 Conflict` shall be returned if the new settings for `total` and"},{"line_number":765,"context_line":"  `reserved` would be violated by existing allocations records for the resource"},{"line_number":766,"context_line":"  class"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_87b8f1e6","line":763,"in_reply_to":"dab17558_d1f47b88","updated":"2016-05-09 17:25:39.000000000","message":"OK, yeah, I read the original description wrong, or was confusing this with one of the other methods.","commit_id":"f95f9446d0afdb7c7d82b19668995e31448f9c49"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e8cf684fbe44fdf6ad45cc693730371e7faf4892","unresolved":false,"context_lines":[{"line_number":947,"context_line":"* Functional integration tests in a multi-node devstack environment with shared"},{"line_number":948,"context_line":"  storage"},{"line_number":949,"context_line":""},{"line_number":950,"context_line":"Dependencies"},{"line_number":951,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":952,"context_line":""},{"line_number":953,"context_line":"* `resource-classes` Blueprint must be completed before this one."}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_31f4e784","line":950,"updated":"2016-05-09 16:38:34.000000000","message":"Added.","commit_id":"f95f9446d0afdb7c7d82b19668995e31448f9c49"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1c0e77dc08d2b21b3ced11db83760d4c7ddacf69","unresolved":false,"context_lines":[{"line_number":947,"context_line":"* Functional integration tests in a multi-node devstack environment with shared"},{"line_number":948,"context_line":"  storage"},{"line_number":949,"context_line":""},{"line_number":950,"context_line":"Dependencies"},{"line_number":951,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":952,"context_line":""},{"line_number":953,"context_line":"* `resource-classes` Blueprint must be completed before this one."}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_3ff9534e","line":950,"updated":"2016-05-09 15:39:44.000000000","message":"We also depend on blueprint policy-in-code for doing the placement API policy defaults in code part.","commit_id":"f95f9446d0afdb7c7d82b19668995e31448f9c49"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9b56684933f6b490989110ae5ecccbfb96e5facf","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        FOREIGN KEY fk_aggregates (aggregate_id)"},{"line_number":240,"context_line":"            REFERENCES aggregates (id),"},{"line_number":241,"context_line":"        FOREIGN KEY fk_resource_providers (resource_provider_id),"},{"line_number":242,"context_line":"            REFERENCES resource_providers (id)"},{"line_number":243,"context_line":"    );"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"A new nova object model for resource pools will be introduced. This object"}],"source_content_type":"text/x-rst","patch_set":9,"id":"dab17558_3dfe7637","line":242,"updated":"2016-05-09 18:33:06.000000000","message":"Actually, this can be done when we do the migration of these tables to the API database, so no worries....","commit_id":"9aff785c0a5a253fe69bf01aef211302d434e900"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"5a936a1d188710d75f731fc7be07779ab847bb3e","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        FOREIGN KEY fk_aggregates (aggregate_id)"},{"line_number":240,"context_line":"            REFERENCES aggregates (id),"},{"line_number":241,"context_line":"        FOREIGN KEY fk_resource_providers (resource_provider_id),"},{"line_number":242,"context_line":"            REFERENCES resource_providers (id)"},{"line_number":243,"context_line":"    );"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"A new nova object model for resource pools will be introduced. This object"}],"source_content_type":"text/x-rst","patch_set":9,"id":"dab17558_e403bb40","line":242,"updated":"2016-05-09 17:11:20.000000000","message":"The migration to make this table (318) merged a while ago without the foreign keys (in Ia28be42a75e0977faf9bbc91d1ad9d8661b99230, merged March 1st).\n\nIs it the case now that the foreign key should be added in another migration. As far as I can recall there\u0027s no deployed code that is using this table.","commit_id":"9aff785c0a5a253fe69bf01aef211302d434e900"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2605169a76110b01a5820db298ddc798882a1487","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        FOREIGN KEY fk_aggregates (aggregate_id)"},{"line_number":240,"context_line":"            REFERENCES aggregates (id),"},{"line_number":241,"context_line":"        FOREIGN KEY fk_resource_providers (resource_provider_id),"},{"line_number":242,"context_line":"            REFERENCES resource_providers (id)"},{"line_number":243,"context_line":"    );"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"A new nova object model for resource pools will be introduced. This object"}],"source_content_type":"text/x-rst","patch_set":9,"id":"dab17558_47e1e9cf","line":242,"in_reply_to":"dab17558_e403bb40","updated":"2016-05-09 17:34:12.000000000","message":"Ugh. If nothing is using that table yet in the code, then yeah we\u0027d need a new migration to add the fkeys.","commit_id":"9aff785c0a5a253fe69bf01aef211302d434e900"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9b56684933f6b490989110ae5ecccbfb96e5facf","unresolved":false,"context_lines":[{"line_number":685,"context_line":".. note::"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"    The above returned response is intentionally the same as the returned"},{"line_number":688,"context_line":"    response for `POST /resource_pools`"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"The returned HTTP response codes shall be:"},{"line_number":691,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"dab17558_1df9f24d","line":688,"updated":"2016-05-09 18:33:06.000000000","message":"Gotcha, fixed.","commit_id":"9aff785c0a5a253fe69bf01aef211302d434e900"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"5a936a1d188710d75f731fc7be07779ab847bb3e","unresolved":false,"context_lines":[{"line_number":685,"context_line":".. note::"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"    The above returned response is intentionally the same as the returned"},{"line_number":688,"context_line":"    response for `POST /resource_pools`"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"The returned HTTP response codes shall be:"},{"line_number":691,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"dab17558_048d1f7b","line":688,"updated":"2016-05-09 17:11:20.000000000","message":"This asymmetry is weird. There\u0027s a bit of this throughout and it would not be my first choice. I don\u0027t see any huge value in returning a value to the POST, just send a location of where the real resource can be found.\n\nBy returning a body you are saying that the body is a representation of \"/resource_pools/{uuid}/inventories\" which is not true.\n\nI\u0027m not inclined to block over this kind of thing, but I think it is worth thinking about since this is going to a greenfield API to some extent.","commit_id":"9aff785c0a5a253fe69bf01aef211302d434e900"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9b56684933f6b490989110ae5ecccbfb96e5facf","unresolved":false,"context_lines":[{"line_number":705,"context_line":".. note::"},{"line_number":706,"context_line":""},{"line_number":707,"context_line":"    `{resource_class}` must validate against the following regular expression:"},{"line_number":708,"context_line":"    ^[A-Z\\_]+$"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"Here is an example HTTP request payload::"},{"line_number":711,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"dab17558_7d963ef1","line":708,"updated":"2016-05-09 18:33:06.000000000","message":"Done.","commit_id":"9aff785c0a5a253fe69bf01aef211302d434e900"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"5a936a1d188710d75f731fc7be07779ab847bb3e","unresolved":false,"context_lines":[{"line_number":705,"context_line":".. note::"},{"line_number":706,"context_line":""},{"line_number":707,"context_line":"    `{resource_class}` must validate against the following regular expression:"},{"line_number":708,"context_line":"    ^[A-Z\\_]+$"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"Here is an example HTTP request payload::"},{"line_number":711,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"dab17558_845c6fee","line":708,"updated":"2016-05-09 17:11:20.000000000","message":"While I think this is worth saying, isn\u0027t it more correct to say:\n\n`{resource_class}` must be the name of a resource_class that exists\n\nEven if we assume the eventual existince of dynamic resource classes, they must exist before before used here, and all resource classes are `^[A-Z_]+$`.","commit_id":"9aff785c0a5a253fe69bf01aef211302d434e900"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2605169a76110b01a5820db298ddc798882a1487","unresolved":false,"context_lines":[{"line_number":705,"context_line":".. note::"},{"line_number":706,"context_line":""},{"line_number":707,"context_line":"    `{resource_class}` must validate against the following regular expression:"},{"line_number":708,"context_line":"    ^[A-Z\\_]+$"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"Here is an example HTTP request payload::"},{"line_number":711,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"dab17558_c722f900","line":708,"in_reply_to":"dab17558_845c6fee","updated":"2016-05-09 17:34:12.000000000","message":"Yeah, good point. I got tripped up on the existence check of the resource class in the last patch set, but if we are just checking that it exists first, then we\u0027ll get a 404 if it doesn\u0027t, we wouldn\u0027t validate the name is correct. So we can probably remove this note, I think I added the confusion.","commit_id":"9aff785c0a5a253fe69bf01aef211302d434e900"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9b56684933f6b490989110ae5ecccbfb96e5facf","unresolved":false,"context_lines":[{"line_number":871,"context_line":"   --max-unit\u003d1 \\"},{"line_number":872,"context_line":"   --step-size\u003d1 \\"},{"line_number":873,"context_line":"   --allocation-ratio\u003d1.0`"},{"line_number":874,"context_line":"* `openstack resource-pool update inventory $UUID \\"},{"line_number":875,"context_line":"   --resource-class\u003dDISK_GB \\"},{"line_number":876,"context_line":"   --total\u003d1024 \\"},{"line_number":877,"context_line":"   --reserved\u003d450 \\"}],"source_content_type":"text/x-rst","patch_set":9,"id":"dab17558_5d99ba1e","line":874,"updated":"2016-05-09 18:33:06.000000000","message":"Actually, I should have removed the above and just had the set inventory one. Removed in latest patch.","commit_id":"9aff785c0a5a253fe69bf01aef211302d434e900"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"5a936a1d188710d75f731fc7be07779ab847bb3e","unresolved":false,"context_lines":[{"line_number":871,"context_line":"   --max-unit\u003d1 \\"},{"line_number":872,"context_line":"   --step-size\u003d1 \\"},{"line_number":873,"context_line":"   --allocation-ratio\u003d1.0`"},{"line_number":874,"context_line":"* `openstack resource-pool update inventory $UUID \\"},{"line_number":875,"context_line":"   --resource-class\u003dDISK_GB \\"},{"line_number":876,"context_line":"   --total\u003d1024 \\"},{"line_number":877,"context_line":"   --reserved\u003d450 \\"}],"source_content_type":"text/x-rst","patch_set":9,"id":"dab17558_a436d34f","line":874,"updated":"2016-05-09 17:11:20.000000000","message":"I was going to comment somewhere that my questions on the earlier revisions about what\u0027s supposed to happen with inventories was not supposed to inspire additional endpoints, merely clarify behaviors.\n\nI see that to support this commandline that could be straightforward way of doings but it would also be entirely okay for the action of this command to be:\n\n* GET the resource pool\n* modify the data\n* PUT the resource pool back\n\nDoing it that way would:\n\n* require less complexity on the server side\n* make it easier to use etags to avoid lost updates[1] (that first GET is required)\n* avoid the asymmetry that I\u0027m complaining about above\n\nI feel like we\u0027re falling into the trap of creating lots of endpoints to facilitate interactions with a smaller number of resources. The resources we\u0027ve got are already represented in a way that allow the necessary interactions.\n\n[1] https://review.openstack.org/#/c/301846/","commit_id":"9aff785c0a5a253fe69bf01aef211302d434e900"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"5a936a1d188710d75f731fc7be07779ab847bb3e","unresolved":false,"context_lines":[{"line_number":922,"context_line":"----------"},{"line_number":923,"context_line":""},{"line_number":924,"context_line":"* Create database models and migrations for new `resource_provider_aggregates`"},{"line_number":925,"context_line":"  table."},{"line_number":926,"context_line":"* Create `nova.objects` models for `ResourcePool`"},{"line_number":927,"context_line":"* Create REST API controllers for resource pool querying and handling"},{"line_number":928,"context_line":"* Modify resource tracker to pull information on aggregates the compute node is"}],"source_content_type":"text/x-rst","patch_set":9,"id":"dab17558_2495c3dd","line":925,"updated":"2016-05-09 17:11:20.000000000","message":"This is done, except for the foreign keys.","commit_id":"9aff785c0a5a253fe69bf01aef211302d434e900"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"5a936a1d188710d75f731fc7be07779ab847bb3e","unresolved":false,"context_lines":[{"line_number":923,"context_line":""},{"line_number":924,"context_line":"* Create database models and migrations for new `resource_provider_aggregates`"},{"line_number":925,"context_line":"  table."},{"line_number":926,"context_line":"* Create `nova.objects` models for `ResourcePool`"},{"line_number":927,"context_line":"* Create REST API controllers for resource pool querying and handling"},{"line_number":928,"context_line":"* Modify resource tracker to pull information on aggregates the compute node is"},{"line_number":929,"context_line":"  associated and the resource pools available for those aggregates. If the"}],"source_content_type":"text/x-rst","patch_set":9,"id":"dab17558_84710fe3","line":926,"updated":"2016-05-09 17:11:20.000000000","message":"Dan encouraged me to extend instead of subclass ResourceProvider so in the WIP there is no ResourcePool object.","commit_id":"9aff785c0a5a253fe69bf01aef211302d434e900"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"e80ede5a7e7e5667415894aa313795a4a94a8a27","unresolved":false,"context_lines":[{"line_number":79,"context_line":"1) The cloud deployer creates an aggregate representing all the compute"},{"line_number":80,"context_line":"   nodes in row 1, racks 6 through 10::"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    $AGG_UUID\u003d`openstack aggregate create r1rck0610`"},{"line_number":83,"context_line":"    # for all compute nodes in the system that are in racks 6-10 in row 1..."},{"line_number":84,"context_line":"    openstack aggregate add host $AGG_UUID $HOSTNAME"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"dab17558_9ccb1fa5","line":82,"range":{"start_line":82,"start_character":15,"end_line":82,"end_character":24},"updated":"2016-05-09 21:12:14.000000000","message":"fair enough...","commit_id":"0cd06cc1e47713139628de6b9e304330c1d5108a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"e80ede5a7e7e5667415894aa313795a4a94a8a27","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"2) The cloud deployer creates a resource pool representing the NFS share::"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    $RP_UUID\u003d`openstack resource-pool create \"/mnt/nfs/row1racks0610/\" \\"},{"line_number":89,"context_line":"        --aggregate-uuid\u003d$AGG_UUID`"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"3) The cloud deployer updates the resource pool\u0027s capacity of shared disk::"}],"source_content_type":"text/x-rst","patch_set":10,"id":"dab17558_dcfac7bc","line":88,"range":{"start_line":88,"start_character":46,"end_line":88,"end_character":69},"updated":"2016-05-09 21:12:14.000000000","message":"so I suppose this is just a string for the name. Okay.","commit_id":"0cd06cc1e47713139628de6b9e304330c1d5108a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"e80ede5a7e7e5667415894aa313795a4a94a8a27","unresolved":false,"context_lines":[{"line_number":91,"context_line":"3) The cloud deployer updates the resource pool\u0027s capacity of shared disk::"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    openstack resource-pool update inventory $RP_UUID \\"},{"line_number":94,"context_line":"        --resource-class\u003dDISK_GB \\"},{"line_number":95,"context_line":"        --total\u003d100000 --reserved\u003d1000 \\"},{"line_number":96,"context_line":"        --min-unit\u003d50 --max-unit\u003d10000 --step-size\u003d10 \\"},{"line_number":97,"context_line":"        --allocation-ratio\u003d1.0"}],"source_content_type":"text/x-rst","patch_set":10,"id":"dab17558_9cb15fe4","line":94,"range":{"start_line":94,"start_character":8,"end_line":94,"end_character":32},"updated":"2016-05-09 21:12:14.000000000","message":"I don\u0027t see below a REST resource for knowing (GET /resource_classes) all the resource classes.\n\nAre we supposing all the resource classes are the same for all the clouds, ie. Nova upstream ones ?\n\nAFAICS, the resource_class_id is an Integer for the resource provider but it can be different between 2 clouds, right? If so, we should maybe leave the operator discover it, nope?","commit_id":"0cd06cc1e47713139628de6b9e304330c1d5108a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"10ef7a025d79af75cc5d86a5c44d2d6a264cb396","unresolved":false,"context_lines":[{"line_number":91,"context_line":"3) The cloud deployer updates the resource pool\u0027s capacity of shared disk::"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    openstack resource-pool update inventory $RP_UUID \\"},{"line_number":94,"context_line":"        --resource-class\u003dDISK_GB \\"},{"line_number":95,"context_line":"        --total\u003d100000 --reserved\u003d1000 \\"},{"line_number":96,"context_line":"        --min-unit\u003d50 --max-unit\u003d10000 --step-size\u003d10 \\"},{"line_number":97,"context_line":"        --allocation-ratio\u003d1.0"}],"source_content_type":"text/x-rst","patch_set":10,"id":"dab17558_fc2b4b92","line":94,"range":{"start_line":94,"start_character":8,"end_line":94,"end_character":32},"in_reply_to":"dab17558_9cb15fe4","updated":"2016-05-09 21:21:17.000000000","message":"Nevermind my question. I just forgot that resource classes are clearly defined in the nova tree with Enums which means they are consistent across all clouds. All good here, no need for them being discovered (well, at least until we assume those as static :) )","commit_id":"0cd06cc1e47713139628de6b9e304330c1d5108a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"e80ede5a7e7e5667415894aa313795a4a94a8a27","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    Instead of cloud deployer manually updating the resource pool\u0027s inventory,"},{"line_number":168,"context_line":"    it\u0027s more likely that a script would call the `neutron subnet-XXX` commands"},{"line_number":169,"context_line":"    to determine capacity and reserved amounts."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"5) The cloud user creates a port in Neutron, asking for an IP out of a"},{"line_number":172,"context_line":"   particular subnet::"}],"source_content_type":"text/x-rst","patch_set":10,"id":"dab17558_bcf42387","line":169,"updated":"2016-05-09 21:12:14.000000000","message":"++","commit_id":"0cd06cc1e47713139628de6b9e304330c1d5108a"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"8aa6d7f2f644a985c2437143b610e9b2f1ec4c30","unresolved":false,"context_lines":[{"line_number":369,"context_line":"      },"},{"line_number":370,"context_line":"      \"links\": ["},{"line_number":371,"context_line":"        {"},{"line_number":372,"context_line":"          \"rel\": \"aggregates\","},{"line_number":373,"context_line":"          \"url\": \"/resource_pools/eaaf1c04-ced2-40e4-89a2-87edded06d64/aggregates\""},{"line_number":374,"context_line":"        }"},{"line_number":375,"context_line":"      ]"}],"source_content_type":"text/x-rst","patch_set":10,"id":"dab17558_b61c4414","line":372,"updated":"2016-05-09 20:15:36.000000000","message":"do we need/want links for inventories URL\n\nI\u0027d vote yes.","commit_id":"0cd06cc1e47713139628de6b9e304330c1d5108a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c2bc454c06dd4420848a487e4bcfbcc44b564f91","unresolved":false,"context_lines":[{"line_number":415,"context_line":"    When deleting a resource pool, all inventory records for the pool are also"},{"line_number":416,"context_line":"    deleted, as are all mappings from the resource pool to aggregates."},{"line_number":417,"context_line":"    **However**, if there are any allocation records tied to the resource pool,"},{"line_number":418,"context_line":"    the resource pool cannot be deleted"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"The returned HTTP response codes shall be:"},{"line_number":421,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"dab17558_279f7cb5","line":418,"updated":"2016-05-09 21:39:35.000000000","message":"that could litterally be impossible to delete a resource pool in a large cloud, but I\u0027m fine with that.","commit_id":"0cd06cc1e47713139628de6b9e304330c1d5108a"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"8aa6d7f2f644a985c2437143b610e9b2f1ec4c30","unresolved":false,"context_lines":[{"line_number":523,"context_line":"*****************************************"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"Shall add one or more inventory records for a resource pool specified by"},{"line_number":526,"context_line":"`{uuid}`."},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"Here is an example HTTP request payload::"},{"line_number":529,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"dab17558_765bfc2e","line":526,"updated":"2016-05-09 20:15:36.000000000","message":"So this is a create only action, to make N new resources. I was only completely sure of this once I read the response code info below.","commit_id":"0cd06cc1e47713139628de6b9e304330c1d5108a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c2bc454c06dd4420848a487e4bcfbcc44b564f91","unresolved":false,"context_lines":[{"line_number":591,"context_line":"    `resource-providers` and `resource-providers-allocations` blueprint specs)."},{"line_number":592,"context_line":"    If some non-Nova things have consumed some amount of resources in the pool,"},{"line_number":593,"context_line":"    the \"reserved\" field should be used to adjust the total capacity of the"},{"line_number":594,"context_line":"    resource pool."},{"line_number":595,"context_line":""},{"line_number":596,"context_line":"Here is an example returned response::"},{"line_number":597,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"dab17558_c7cb1052","line":594,"updated":"2016-05-09 21:39:35.000000000","message":"++","commit_id":"0cd06cc1e47713139628de6b9e304330c1d5108a"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"8aa6d7f2f644a985c2437143b610e9b2f1ec4c30","unresolved":false,"context_lines":[{"line_number":707,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found or the"},{"line_number":708,"context_line":"  resource class with `{resource_class}` name was not found"},{"line_number":709,"context_line":"* `409 Conflict` if there exist allocations records of the specified resource"},{"line_number":710,"context_line":"  class and resource pool"},{"line_number":711,"context_line":""},{"line_number":712,"context_line":"`GET /resource_pools/{uuid}/inventories`"},{"line_number":713,"context_line":"****************************************"}],"source_content_type":"text/x-rst","patch_set":10,"id":"dab17558_565fd8e4","line":710,"updated":"2016-05-09 20:15:36.000000000","message":"Do we need to provide an admin command somewhere to clean up orphaned allocations or shall we let operators do that via their own SQL?\n\nI\u0027m imagining a catastrophic failure of a DISK_GB resource. It dies in a fire, how do existing allocations get reconciled? It doesn\u0027t strictly matter because those allocations will be correctly orphaned, so they are disconnected nodes of information, but I suppose someone will like to clean it up.\n\nI vote for \"their own SQL\".","commit_id":"0cd06cc1e47713139628de6b9e304330c1d5108a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c2bc454c06dd4420848a487e4bcfbcc44b564f91","unresolved":false,"context_lines":[{"line_number":707,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found or the"},{"line_number":708,"context_line":"  resource class with `{resource_class}` name was not found"},{"line_number":709,"context_line":"* `409 Conflict` if there exist allocations records of the specified resource"},{"line_number":710,"context_line":"  class and resource pool"},{"line_number":711,"context_line":""},{"line_number":712,"context_line":"`GET /resource_pools/{uuid}/inventories`"},{"line_number":713,"context_line":"****************************************"}],"source_content_type":"text/x-rst","patch_set":10,"id":"dab17558_4713a0b8","line":710,"in_reply_to":"dab17558_565fd8e4","updated":"2016-05-09 21:39:35.000000000","message":"that\u0027s a good question, but I don\u0027t really like a nova-manage command for that. Maybe we should see if there could be a real problem during the implementation phase, but I don\u0027t see it a prereq.","commit_id":"0cd06cc1e47713139628de6b9e304330c1d5108a"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"28efc559e94e1717357add9e36f925308f5b4d29","unresolved":false,"context_lines":[{"line_number":822,"context_line":"  --resource-class\u003dDISK_GB`"},{"line_number":823,"context_line":"* `openstack resource-pool add aggregate $UUID $AGG_UUID`"},{"line_number":824,"context_line":"* `openstack resource-pool delete aggregate $UUID $AGG_UUID`"},{"line_number":825,"context_line":""},{"line_number":826,"context_line":"Performance Impact"},{"line_number":827,"context_line":"------------------"},{"line_number":828,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"dab17558_f01b6719","line":825,"updated":"2016-05-10 02:51:58.000000000","message":"Is there a need to add another CLI command: `openstack resource-pool list aggregate $UUID` to list the aggregates\u0027 *name* and id of a resource pool of id $UUID?\n\nI\u0027m just wondering if `openstack resource-pool show $UUID` is already doing the same thing.","commit_id":"0cd06cc1e47713139628de6b9e304330c1d5108a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c2bc454c06dd4420848a487e4bcfbcc44b564f91","unresolved":false,"context_lines":[{"line_number":884,"context_line":"inventory and usage information for each resource pool assigned to each"},{"line_number":885,"context_line":"aggregate so that filters like the `DiskFilter` can query not just the host\u0027s"},{"line_number":886,"context_line":"`local_gb` value but also the aggregate\u0027s inventory information for share disk"},{"line_number":887,"context_line":"storage."},{"line_number":888,"context_line":""},{"line_number":889,"context_line":"* Docs and example cronjob scripts for updating capacity and usage information"},{"line_number":890,"context_line":"  for a shared resource pool of disk"}],"source_content_type":"text/x-rst","patch_set":10,"id":"dab17558_c7031041","line":887,"updated":"2016-05-09 21:39:35.000000000","message":"\"I love it when a plan comes together\" (H. Smith).","commit_id":"0cd06cc1e47713139628de6b9e304330c1d5108a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c2bc454c06dd4420848a487e4bcfbcc44b564f91","unresolved":false,"context_lines":[{"line_number":907,"context_line":"* The part of the `resource-providers-allocations` blueprint that involves"},{"line_number":908,"context_line":"  migrating the `inventories`, `allocations`, `aggregates`,"},{"line_number":909,"context_line":"  `resource_providers` tables to the top-level API database must be completed"},{"line_number":910,"context_line":"  before this"},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"Testing"},{"line_number":913,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":10,"id":"dab17558_27cbfc1f","line":910,"updated":"2016-05-09 21:39:35.000000000","message":"thanks for adding this.","commit_id":"0cd06cc1e47713139628de6b9e304330c1d5108a"},{"author":{"_account_id":1865,"name":"Andrea Rosa","email":"andrea.rosa@gmail.com","username":"andrea-rosa-m"},"change_message_id":"cdb82ae98dde7b0f927dff824e4b8f22bc2b6808","unresolved":false,"context_lines":[{"line_number":920,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"Developer docs should be added that detail the new resource pool functionality,"},{"line_number":923,"context_line":"how external scripts can keep capacity and usage information updated for a"},{"line_number":924,"context_line":"resource pool."},{"line_number":925,"context_line":""},{"line_number":926,"context_line":"References"},{"line_number":927,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":10,"id":"dab17558_3e192723","line":924,"range":{"start_line":923,"start_character":0,"end_line":924,"end_character":13},"updated":"2016-05-10 11:22:18.000000000","message":"I think that is a very important point to document.","commit_id":"0cd06cc1e47713139628de6b9e304330c1d5108a"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"ff55e1d52a4e433ac7ad2679aa75e1f9d16e0753","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    openstack resource-pool create \"routed network rack 1 row 3\" \\"},{"line_number":137,"context_line":"        --uuid\u003d$SUBNET_UUID \\"},{"line_number":138,"context_line":"        --aggregate-uuid\u003d$AGG_UUID"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":".. note::"},{"line_number":141,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_403565d9","line":138,"updated":"2016-05-13 15:21:27.000000000","message":"Just something to note, but with the move of aggregates to the api db it is no longer necessary to associate a resource-pool with an aggregate at create time.","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"ff55e1d52a4e433ac7ad2679aa75e1f9d16e0753","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        --resource-class\u003dIPV4_ADDRESS \\"},{"line_number":161,"context_line":"        --total\u003d254 --reserved\u003d5 \\"},{"line_number":162,"context_line":"        --min-unit\u003d1 --max-unit\u003d1 --step-size\u003d1 \\"},{"line_number":163,"context_line":"        --allocation-ratio\u003d1.0"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":".. note::"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_404f25be","line":163,"updated":"2016-05-13 15:21:27.000000000","message":"Is there a description of all of these fields in another spec? Most are obvious but min-unit, max-unit, and step-size could use some explanation.","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"9a8095564ccd66ed79635d604f6e35ce3c670ecc","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        --resource-class\u003dIPV4_ADDRESS \\"},{"line_number":161,"context_line":"        --total\u003d254 --reserved\u003d5 \\"},{"line_number":162,"context_line":"        --min-unit\u003d1 --max-unit\u003d1 --step-size\u003d1 \\"},{"line_number":163,"context_line":"        --allocation-ratio\u003d1.0"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":".. note::"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_46a8b9db","line":163,"in_reply_to":"dab17558_404f25be","updated":"2016-05-15 12:55:16.000000000","message":"They are in http://specs.openstack.org/openstack/nova-specs/specs/mitaka/approved/resource-providers.html#proposed-change\n\nI agree could do with a brief summary in here too.","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"ff55e1d52a4e433ac7ad2679aa75e1f9d16e0753","unresolved":false,"context_lines":[{"line_number":191,"context_line":"   aggregates."},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"What this gives the cloud user is basic network affinity during scheduling,"},{"line_number":194,"context_line":"with the cloud user only needing to specify a port ID."},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"Scenario 2b: Live migration of instance booted in scenario 2a"},{"line_number":197,"context_line":"-------------------------------------------------------------"}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_c0eb1511","line":194,"updated":"2016-05-13 15:21:27.000000000","message":"Presumably this works the other way as well? If a user does not specify a port and Nova schedules to a host connected to a specific subnet then network allocation will take that into account?","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"ff55e1d52a4e433ac7ad2679aa75e1f9d16e0753","unresolved":false,"context_lines":[{"line_number":211,"context_line":"match the `IPV4_ADDRESS` resource class for the instance UUID as a consumer."},{"line_number":212,"context_line":"From this list we can identify the aggregates associated with the resource"},{"line_number":213,"context_line":"provider and from the list of aggregates we can determine the compute hosts"},{"line_number":214,"context_line":"that can serve as target destinations for the migration."},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"Alternatives"},{"line_number":217,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_a0c89175","line":214,"updated":"2016-05-13 15:21:27.000000000","message":"This will also apply to volume or shared storage pools as well I\u0027m guessing?\n\nHow will the scheduler know when to limit? If a compute is using local disk then the resource pool is limited to that node and the scheduler shouldn\u0027t care about migrating to a separate disk pool. If it\u0027s using shared storage then the scheduler should keep the instance within that pool if possible. How will those be distinguished?","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7e0b1068d8cc6872590791ae9d53ee11f8ac98da","unresolved":false,"context_lines":[{"line_number":281,"context_line":"is modified and sent back to the server. For example, if the client"},{"line_number":282,"context_line":"needs to disassociate an aggregate, it should `GET` the resource"},{"line_number":283,"context_line":"pool, remove the aggregate uuid from the `aggregates` list in the"},{"line_number":284,"context_line":"representation and `PUT` the representation back to the server."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"The following new REST API calls will be added:"},{"line_number":287,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_62e8a017","line":284,"updated":"2016-05-12 18:41:27.000000000","message":"If two clients concurrently wanted to update inventory records for two different resource classes on the same resource pool, with this setup there is a strong potential for them each clobbering the other\u0027s update. With the way I had it before, where the inventories/ resource was separately-updateable from the resource-pool itself, both clients could concurrently update or add inventory records for different resource classes with no possibility of clobbering each other\u0027s updates due to consistent read issues.\n\nBTW, yes, I\u0027m interested in understanding how far away this is from strict REST...","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"40d9329f33deb2ba5cc9b50629e7f2bd5751f353","unresolved":false,"context_lines":[{"line_number":281,"context_line":"is modified and sent back to the server. For example, if the client"},{"line_number":282,"context_line":"needs to disassociate an aggregate, it should `GET` the resource"},{"line_number":283,"context_line":"pool, remove the aggregate uuid from the `aggregates` list in the"},{"line_number":284,"context_line":"representation and `PUT` the representation back to the server."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"The following new REST API calls will be added:"},{"line_number":287,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_abc39289","line":284,"updated":"2016-05-12 13:56:15.000000000","message":"Yes, this is strict REST, but it also means that two clients cannot add two different aggregates or inventory records concurrently. Such are the limitations of strict REST.","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"e01e8dda851231ae0025148ddf319e977073297d","unresolved":false,"context_lines":[{"line_number":281,"context_line":"is modified and sent back to the server. For example, if the client"},{"line_number":282,"context_line":"needs to disassociate an aggregate, it should `GET` the resource"},{"line_number":283,"context_line":"pool, remove the aggregate uuid from the `aggregates` list in the"},{"line_number":284,"context_line":"representation and `PUT` the representation back to the server."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"The following new REST API calls will be added:"},{"line_number":287,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_76086529","line":284,"in_reply_to":"dab17558_62e8a017","updated":"2016-05-12 19:24:13.000000000","message":"No, with ETags, if you try to PUT something back and the thing on the server no longer has the Etag you send, you get a 409, see: https://review.openstack.org/#/c/301846/\n\nyes, if you address individual inventories, you could update them at the same time someone else updates another, _but_ you\u0027d still have the same problem if someone wanted to update _this_ inventory at the same time. You\u0027d still need etags then, so that\u0027s just moving the problem around.\n\nIf you model the resource as the entire resource-pool then you have a simple API and straightforward single representation that can accomplish all the necessary functions (create resource pool, change aggregates, change resources).\n\nsome missing REST bits:\n\n* more links (hypermedia as the engine of...); not really that necessary in this instance because \n* content negotiation/multiple representations\n\nA reason for the single resource model I\u0027ve proposed is to try to give us the minimum sufficient API while maintaining (minimal) good form.","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"9cf28d1755047696ab65e16668e5f7b59e65b370","unresolved":false,"context_lines":[{"line_number":281,"context_line":"is modified and sent back to the server. For example, if the client"},{"line_number":282,"context_line":"needs to disassociate an aggregate, it should `GET` the resource"},{"line_number":283,"context_line":"pool, remove the aggregate uuid from the `aggregates` list in the"},{"line_number":284,"context_line":"representation and `PUT` the representation back to the server."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"The following new REST API calls will be added:"},{"line_number":287,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_e176293d","line":284,"in_reply_to":"dab17558_76086529","updated":"2016-05-13 12:54:19.000000000","message":"Quote \"model the resource as the entire resource-pool then you have a simple API and straightforward single representation that can accomplish all the necessary functions\". It looks like \"you have a single interface and it can do everything\".\n\nThis \"resource pool\" resource is so complicated that I prefer not to design it as a single resource as a whole.","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"f28df54130fe52e261435c0445c8833d497e7ce7","unresolved":false,"context_lines":[{"line_number":281,"context_line":"is modified and sent back to the server. For example, if the client"},{"line_number":282,"context_line":"needs to disassociate an aggregate, it should `GET` the resource"},{"line_number":283,"context_line":"pool, remove the aggregate uuid from the `aggregates` list in the"},{"line_number":284,"context_line":"representation and `PUT` the representation back to the server."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"The following new REST API calls will be added:"},{"line_number":287,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_ad92819d","line":284,"in_reply_to":"dab17558_abc39289","updated":"2016-05-12 16:13:12.000000000","message":"That\u0027s good in this case, isn\u0027t it? It would be very confusing for client A and client B to make those changes concurrently, and the chance of transaction failure goes up for the capacity versus used checks?\n\nAlso, this is _so_ far from strict REST, but we can debate that in some other venue.","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"9a8095564ccd66ed79635d604f6e35ce3c670ecc","unresolved":false,"context_lines":[{"line_number":281,"context_line":"is modified and sent back to the server. For example, if the client"},{"line_number":282,"context_line":"needs to disassociate an aggregate, it should `GET` the resource"},{"line_number":283,"context_line":"pool, remove the aggregate uuid from the `aggregates` list in the"},{"line_number":284,"context_line":"representation and `PUT` the representation back to the server."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"The following new REST API calls will be added:"},{"line_number":287,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_a6afe5e1","line":284,"in_reply_to":"dab17558_e176293d","updated":"2016-05-15 12:55:16.000000000","message":"In the main response I\u0027ll add some options for how to proceed from here.","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7e0b1068d8cc6872590791ae9d53ee11f8ac98da","unresolved":false,"context_lines":[{"line_number":372,"context_line":"          \"type\": \"string\""},{"line_number":373,"context_line":"        },"},{"line_number":374,"context_line":"        \"uuid\": {"},{"line_number":375,"context_line":"          \"type\": \"uuid\""},{"line_number":376,"context_line":"        },"},{"line_number":377,"context_line":"        \"aggregates\": {"},{"line_number":378,"context_line":"          \"type\": \"array\","}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_42ed9c24","line":375,"updated":"2016-05-12 18:41:27.000000000","message":"It was originally \"string\". Matt asked me to change this to \"uuid\" to match existing JSONSchema representations in Nova where we have a \"uuid\" type definition in JSONSchema snippets.","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"f28df54130fe52e261435c0445c8833d497e7ce7","unresolved":false,"context_lines":[{"line_number":372,"context_line":"          \"type\": \"string\""},{"line_number":373,"context_line":"        },"},{"line_number":374,"context_line":"        \"uuid\": {"},{"line_number":375,"context_line":"          \"type\": \"uuid\""},{"line_number":376,"context_line":"        },"},{"line_number":377,"context_line":"        \"aggregates\": {"},{"line_number":378,"context_line":"          \"type\": \"array\","}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_ad6e0194","line":375,"updated":"2016-05-12 16:13:12.000000000","message":"turns out no such type in the python implementation of jsonschema, at least not by default","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"40d9329f33deb2ba5cc9b50629e7f2bd5751f353","unresolved":false,"context_lines":[{"line_number":417,"context_line":"          },"},{"line_number":418,"context_line":"          \"additionalProperties\": False"},{"line_number":419,"context_line":"        }"},{"line_number":420,"context_line":"      },"},{"line_number":421,"context_line":"      \"additionalProperties\": False"},{"line_number":422,"context_line":"    }"},{"line_number":423,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_8bc04e7e","line":420,"updated":"2016-05-12 13:56:15.000000000","message":"We actually should have \"required\": [\"name\", \"uuid\", \"aggregates\", \"resources\"] here now that we\u0027re being strictly REST and the above schema is also used to validate the PUT request, which must contain all fields for the entire representation of the resource pool resource and all of the collection subresources like aggregates and inventories.","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"9a8095564ccd66ed79635d604f6e35ce3c670ecc","unresolved":false,"context_lines":[{"line_number":417,"context_line":"          },"},{"line_number":418,"context_line":"          \"additionalProperties\": False"},{"line_number":419,"context_line":"        }"},{"line_number":420,"context_line":"      },"},{"line_number":421,"context_line":"      \"additionalProperties\": False"},{"line_number":422,"context_line":"    }"},{"line_number":423,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_e6b9ed2f","line":420,"in_reply_to":"dab17558_4da035a6","updated":"2016-05-15 12:55:16.000000000","message":"BTW: I haven\u0027t done this yet, as I figured I wouldn\u0027t make a new version until the conversation about the API concludes and we can make a new version after that. Didn\u0027t want to disrupt the state we\u0027re building now.","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"f28df54130fe52e261435c0445c8833d497e7ce7","unresolved":false,"context_lines":[{"line_number":417,"context_line":"          },"},{"line_number":418,"context_line":"          \"additionalProperties\": False"},{"line_number":419,"context_line":"        }"},{"line_number":420,"context_line":"      },"},{"line_number":421,"context_line":"      \"additionalProperties\": False"},{"line_number":422,"context_line":"    }"},{"line_number":423,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_4da035a6","line":420,"in_reply_to":"dab17558_8bc04e7e","updated":"2016-05-12 16:13:12.000000000","message":"I\u0027ve made those corrections in the WIP already, I\u0027ll paste them back in here shortly. The optionality of everything but \u0027total\u0027 in the resource object has implications for the Inventory object which I\u0027ve dealt with in: Ie770d7d6f8b52fdfffad8867267322ecde1d597a","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"40d9329f33deb2ba5cc9b50629e7f2bd5751f353","unresolved":false,"context_lines":[{"line_number":587,"context_line":"* `openstack resource-pool delete inventory $UUID \\"},{"line_number":588,"context_line":"  --resource-class\u003dDISK_GB`"},{"line_number":589,"context_line":"* `openstack resource-pool add aggregate $UUID $AGG_UUID`"},{"line_number":590,"context_line":"* `openstack resource-pool delete aggregate $UUID $AGG_UUID`"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"Performance Impact"},{"line_number":593,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_ebbd9a03","line":590,"updated":"2016-05-12 13:56:15.000000000","message":"Now that we only have the PUT /resource-pools REST call, do the above CLI commands make sense? For instance, openstack resource-pool set inventory is going to need to pull all inventory for the resource pool then construct a JSON body for the request to PUT /resource-pools that contains all the current (at the time of the REST request at least) aggregates and inventories information for the resource pool and update just the inventory corresponding to the --resource-class\u003dDISK_GB resource and then write all the full representation back to the server. The openstack resource-pool set inventory CLI command ***gives the user the impression that the scope of the changes they are making is limited to only updating the inventory for that particular resource class**, however that isn\u0027t the contract of the single PUT /resource-pools REST API call.\n\nPerhaps it would be better to only have a single:\n\n openstack resource-pool update\n\ncommand?\n\nAnother reason why REST is a mismatch when it comes to more traditional transactional models of data-centric applications. :)","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7e0b1068d8cc6872590791ae9d53ee11f8ac98da","unresolved":false,"context_lines":[{"line_number":587,"context_line":"* `openstack resource-pool delete inventory $UUID \\"},{"line_number":588,"context_line":"  --resource-class\u003dDISK_GB`"},{"line_number":589,"context_line":"* `openstack resource-pool add aggregate $UUID $AGG_UUID`"},{"line_number":590,"context_line":"* `openstack resource-pool delete aggregate $UUID $AGG_UUID`"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"Performance Impact"},{"line_number":593,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_a2f28804","line":590,"updated":"2016-05-12 18:41:27.000000000","message":"When I said \"gives the user the impression that the scope of changes...\" I was referring to the fact that if I as a user of the openstack client do something like this:\n\n openstack resource-pool update inventory $POOL_UUID \\\n    --resource-class\u003dDISK_GB --reserved\u003d400\n\nI would presume that the only thing that was being updated in the above call would be the inventory record for DISK_GB for the resource pool. However, with this REST API, what *actually* would occur would be a full read of the entire resource-pool representation, including the resource pool name, all aggregates and all inventory records at the time the GET /resource-pools/{pool_uuid} was called (just prior to the client having to write the PUT /resource-pools payload) and then writing out that existing data along with the new inventory reserved amount for the DISK_GB inventory record and then sending all that data back to the server which would need to UPDATE resource_pools SET name \u003d $uploaded_name; issue a series of INSERT, UPDATE, and DELETE operations for inventory records (basically replacing the representation of all inventory records for the resource pool with the data uploaded in the payload) and isue a series of INSERT and DELETE records in the resource_provider_aggregates table for each aggregate in the uploaded data.\n\nIt\u0027s the difference between the user thinking a simple UPDATE inventories SET reserved \u003d $new_reserved WHERE resource_provider_id \u003d $POOL_ID AND resource_class_id \u003d DISK_GB; would be the only thing executed and instead a whole *slew* of UPDATE, INSERT and DELETE statements needing to be executing in order to fully replace the entire resource pool representation with what has been uploaded in the payload body of the PUT request.","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"9cf28d1755047696ab65e16668e5f7b59e65b370","unresolved":false,"context_lines":[{"line_number":587,"context_line":"* `openstack resource-pool delete inventory $UUID \\"},{"line_number":588,"context_line":"  --resource-class\u003dDISK_GB`"},{"line_number":589,"context_line":"* `openstack resource-pool add aggregate $UUID $AGG_UUID`"},{"line_number":590,"context_line":"* `openstack resource-pool delete aggregate $UUID $AGG_UUID`"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"Performance Impact"},{"line_number":593,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_7c4f80be","line":590,"in_reply_to":"dab17558_5648c187","updated":"2016-05-13 12:54:19.000000000","message":"The CLI has a fine-grained resource management interface for users. It is the *user requirement* to manage these resources:\n- resource provider metadata\n- its aggregates\n- its inventories\n\nHowever, the API layer doesn\u0027t model those resources individually, instead, it treats a bunch of resources as a whole, bluntly. It is not intuitive, and it causes the implementation very complicated and unnecessary as @Jay says.\n\nWhy not provide sub-resources for the resource pool. It doesn\u0027t mean that the parent resource is break apart and scattered around, it is still structured and well organized.","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"9a8095564ccd66ed79635d604f6e35ce3c670ecc","unresolved":false,"context_lines":[{"line_number":587,"context_line":"* `openstack resource-pool delete inventory $UUID \\"},{"line_number":588,"context_line":"  --resource-class\u003dDISK_GB`"},{"line_number":589,"context_line":"* `openstack resource-pool add aggregate $UUID $AGG_UUID`"},{"line_number":590,"context_line":"* `openstack resource-pool delete aggregate $UUID $AGG_UUID`"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"Performance Impact"},{"line_number":593,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_e690cd97","line":590,"in_reply_to":"dab17558_7c4f80be","updated":"2016-05-15 12:55:16.000000000","message":"I guess it is a matter of opinion on where it is most effective to manage the complexity. My tendency is to want the API\u0027s interface (that is the resources that are present in the API) to be as constrained as possible, and thus not particularly granular. This causes some complexity in the server side mapping of those resources to the data-store (especially when the data store was designed and build before the API) but to my mind means that the HTTP API is its most flexible. We shouldn\u0027t be building the API for openstackclient, we should be building it for http clients.\n\nAll that said, see my bigger comment in the patch reply.","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"e01e8dda851231ae0025148ddf319e977073297d","unresolved":false,"context_lines":[{"line_number":587,"context_line":"* `openstack resource-pool delete inventory $UUID \\"},{"line_number":588,"context_line":"  --resource-class\u003dDISK_GB`"},{"line_number":589,"context_line":"* `openstack resource-pool add aggregate $UUID $AGG_UUID`"},{"line_number":590,"context_line":"* `openstack resource-pool delete aggregate $UUID $AGG_UUID`"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"Performance Impact"},{"line_number":593,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_5648c187","line":590,"in_reply_to":"dab17558_a2f28804","updated":"2016-05-12 19:24:13.000000000","message":"That\u0027s not an entirely accurate representation of what happens. \n\nYes, the GET causes a phat amount of SELECTing (three of them, but two are joins, one rather complicated).\n\nBut when you do a PUT, writes could only happen if \u0027name\u0027, \u0027aggregates\u0027 or \u0027resources\u0027 have changed. The logic for that is not fully correct for that yet (because I\u0027m still trying to figure out how to best take advantage of obj_get_chages()) but it ought to be doable.\n\nAll that said: I think one could make a fairly reasonable argument for changing the principal conceptual object in this resource management to be the Inventory (this is a thinlg, it has Inventory of a class, these are Allocations, they consume Inventory).\n\nBut, presumably in part because of aggregates needing to be in the mix we have reified a thing called the resource-pool and made the API around that. In my mind, as I\u0027m trying to imagine an operator managing their resource pools, there are two main actions I want to do:\n\n* create a resource pool that is appropriately inventoried and associated with aggregates\n* add some more aggregates as other things want to use these resources\n* correct inventory when I put more spindles in the array\n\nThese aren\u0027t frequent activities, are they?\n\nIf what we really want is for people to be able to do these in the lowest cost at the persistence layer, why don\u0027t we skip the HTTP part? They\u0027re for admins after all.\n\nHowever, if we do want to do it over HTTP and we want to do it in a simple and mostly correct fashion at the API level that will almost certainly make the persistence layer more complex, especially with ovo in the middle. I don\u0027t really see that as a problem. This portion is not the bottleneck. It\u0027s when we\u0027re making scheduling decisions off the allocations that is, yeah?","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"f28df54130fe52e261435c0445c8833d497e7ce7","unresolved":false,"context_lines":[{"line_number":587,"context_line":"* `openstack resource-pool delete inventory $UUID \\"},{"line_number":588,"context_line":"  --resource-class\u003dDISK_GB`"},{"line_number":589,"context_line":"* `openstack resource-pool add aggregate $UUID $AGG_UUID`"},{"line_number":590,"context_line":"* `openstack resource-pool delete aggregate $UUID $AGG_UUID`"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"Performance Impact"},{"line_number":593,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_cd25450b","line":590,"in_reply_to":"dab17558_ebbd9a03","updated":"2016-05-12 16:13:12.000000000","message":"I\u0027m agnostic on this (as I don\u0027t think we should write client code, we should just right APIs). There\u0027s no reason why you can\u0027t have a bunch of commands which internally take this form:\n\nGET /resource_pool/{uuid}\nmanipulate the data\nPUT /resource_pool{uuid}\n\nI don\u0027t understand your statement \"gives the user the impression that the scope of the changes they are making is limited to only updating the inventory for that particular resource class**, however that isn\u0027t the contract of the single PUT /resource-pools REST API call\"\n\nIf the only change that is made to the representation is changing an inventory, then it matches both the user\u0027s desires and the apis contract. \n\nI feel like I\u0027m not fully understanding your concern.","commit_id":"77ed6e2d2a32e48bd95ce2d3e8cd63d6181c395f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"25fe03f6ae0a76137dee5ba86ce88165d67e8f69","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"3) The cloud deployer updates the resource pool\u0027s capacity of shared disk::"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    openstack resource-pool update inventory $RP_UUID \\"},{"line_number":94,"context_line":"        --resource-class\u003dDISK_GB \\"},{"line_number":95,"context_line":"        --total\u003d100000 --reserved\u003d1000 \\"},{"line_number":96,"context_line":"        --min-unit\u003d50 --max-unit\u003d10000 --step-size\u003d10 \\"}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_bfe97e1c","line":93,"updated":"2016-05-16 16:14:40.000000000","message":"s/update/set/ to match CLI calls below...","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"25fe03f6ae0a76137dee5ba86ce88165d67e8f69","unresolved":false,"context_lines":[{"line_number":156,"context_line":""},{"line_number":157,"context_line":"4) The cloud deployer updates the resource pool\u0027s capacity of IPv4 addresses::"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    openstack resource-pool update inventory $RP_UUID \\"},{"line_number":160,"context_line":"        --resource-class\u003dIPV4_ADDRESS \\"},{"line_number":161,"context_line":"        --total\u003d254 --reserved\u003d5 \\"},{"line_number":162,"context_line":"        --min-unit\u003d1 --max-unit\u003d1 --step-size\u003d1 \\"}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_9fee3a20","line":159,"updated":"2016-05-16 16:14:40.000000000","message":"s/update/set/ to match CLI calls below.","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"00a0403ece5d7b1de4e863196f8d8d9aa0e1db31","unresolved":false,"context_lines":[{"line_number":267,"context_line":"header containing an ETag that matches the server\u0027s current ETag for"},{"line_number":268,"context_line":"the resource."},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"The API changes adds resources to:"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"* `GET` a list of resource pools"},{"line_number":273,"context_line":"* `POST` a new resource pool"}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_b1f9bc50","line":270,"range":{"start_line":270,"start_character":16,"end_line":270,"end_character":20},"updated":"2016-05-16 15:01:28.000000000","message":"nit: add","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"25fe03f6ae0a76137dee5ba86ce88165d67e8f69","unresolved":false,"context_lines":[{"line_number":267,"context_line":"header containing an ETag that matches the server\u0027s current ETag for"},{"line_number":268,"context_line":"the resource."},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"The API changes adds resources to:"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"* `GET` a list of resource pools"},{"line_number":273,"context_line":"* `POST` a new resource pool"}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_ffef861a","line":270,"updated":"2016-05-16 16:14:40.000000000","message":"s/adds resources/add resource endpoints/","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"e1949c2423df1bf0d7e5c37d81ec4060eccc75d3","unresolved":false,"context_lines":[{"line_number":267,"context_line":"header containing an ETag that matches the server\u0027s current ETag for"},{"line_number":268,"context_line":"the resource."},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"The API changes adds resources to:"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"* `GET` a list of resource pools"},{"line_number":273,"context_line":"* `POST` a new resource pool"}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_f704d47e","line":270,"in_reply_to":"dab17558_b1f9bc50","updated":"2016-05-16 15:11:34.000000000","message":"thanks","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"727147f8452607bbf0d8fd37fbbe78a37fa13d4d","unresolved":false,"context_lines":[{"line_number":272,"context_line":"* `GET` a list of resource pools"},{"line_number":273,"context_line":"* `POST` a new resource pool"},{"line_number":274,"context_line":"* `GET` a single resource pool with links to its sub-resources"},{"line_number":275,"context_line":"* `PUT` a single resource pool to changes its name"},{"line_number":276,"context_line":"* `DELETE` a single resource pool and its associated inventories (if"},{"line_number":277,"context_line":"  no allocations are present) and aggregates (the association is"},{"line_number":278,"context_line":"  removed, not the aggregates themselves)"}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_d2043e16","line":275,"range":{"start_line":275,"start_character":34,"end_line":275,"end_character":41},"updated":"2016-05-16 15:32:05.000000000","message":"change","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"25fe03f6ae0a76137dee5ba86ce88165d67e8f69","unresolved":false,"context_lines":[{"line_number":272,"context_line":"* `GET` a list of resource pools"},{"line_number":273,"context_line":"* `POST` a new resource pool"},{"line_number":274,"context_line":"* `GET` a single resource pool with links to its sub-resources"},{"line_number":275,"context_line":"* `PUT` a single resource pool to changes its name"},{"line_number":276,"context_line":"* `DELETE` a single resource pool and its associated inventories (if"},{"line_number":277,"context_line":"  no allocations are present) and aggregates (the association is"},{"line_number":278,"context_line":"  removed, not the aggregates themselves)"}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_dff442f2","line":275,"updated":"2016-05-16 16:14:40.000000000","message":"s/changes/change/","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"00a0403ece5d7b1de4e863196f8d8d9aa0e1db31","unresolved":false,"context_lines":[{"line_number":436,"context_line":""},{"line_number":437,"context_line":"Example::"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    GET /resource_pools/eaaf1c04-ced2-40e4-89a2-87edded06d64"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"    Content-type: application/json"},{"line_number":442,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_51ae902e","line":439,"range":{"start_line":439,"start_character":4,"end_line":439,"end_character":7},"updated":"2016-05-16 15:01:28.000000000","message":"PUT","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"e1949c2423df1bf0d7e5c37d81ec4060eccc75d3","unresolved":false,"context_lines":[{"line_number":436,"context_line":""},{"line_number":437,"context_line":"Example::"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    GET /resource_pools/eaaf1c04-ced2-40e4-89a2-87edded06d64"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"    Content-type: application/json"},{"line_number":442,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_97ec68bc","line":439,"in_reply_to":"dab17558_51ae902e","updated":"2016-05-16 15:11:34.000000000","message":"thanks","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"25fe03f6ae0a76137dee5ba86ce88165d67e8f69","unresolved":false,"context_lines":[{"line_number":506,"context_line":""},{"line_number":507,"context_line":"The returned HTTP response code will be one of the following:"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"* `200 OK` if the the resource pools exists."},{"line_number":510,"context_line":"* `404 Not Found` if the resource pool identified by `{uuid}` was"},{"line_number":511,"context_line":"  not found."},{"line_number":512,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_3fde2e6d","line":509,"updated":"2016-05-16 16:14:40.000000000","message":"s/the the/the/","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"00a0403ece5d7b1de4e863196f8d8d9aa0e1db31","unresolved":false,"context_lines":[{"line_number":521,"context_line":"    Content-Type: application/json"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"    {"},{"line_number":524,"context_line":"      \"resource_class\": \"DISK_GB\","},{"line_number":525,"context_line":"      \"total\": 2048,"},{"line_number":526,"context_line":"      \"reserved\": 512,"},{"line_number":527,"context_line":"      \"min_unit\": 10,"}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_ec74079d","line":524,"range":{"start_line":524,"start_character":6,"end_line":524,"end_character":33},"updated":"2016-05-16 15:01:28.000000000","message":"Assume the dynamic resource can also be referred by its name.","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"e1949c2423df1bf0d7e5c37d81ec4060eccc75d3","unresolved":false,"context_lines":[{"line_number":521,"context_line":"    Content-Type: application/json"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"    {"},{"line_number":524,"context_line":"      \"resource_class\": \"DISK_GB\","},{"line_number":525,"context_line":"      \"total\": 2048,"},{"line_number":526,"context_line":"      \"reserved\": 512,"},{"line_number":527,"context_line":"      \"min_unit\": 10,"}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_9743c8ae","line":524,"in_reply_to":"dab17558_ec74079d","updated":"2016-05-16 15:11:34.000000000","message":"yes","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"00a0403ece5d7b1de4e863196f8d8d9aa0e1db31","unresolved":false,"context_lines":[{"line_number":553,"context_line":"            \"step_size\": {"},{"line_number":554,"context_line":"                \"type\": \"integer\""},{"line_number":555,"context_line":"            },"},{"line_number":556,"context_line":"            \"used\": {"},{"line_number":557,"context_line":"                \"type\": \"integer\""},{"line_number":558,"context_line":"            }."},{"line_number":559,"context_line":"            \"allocation_ratio\": {"},{"line_number":560,"context_line":"                \"type\": \"number\""},{"line_number":561,"context_line":"            },"}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_cca023f7","line":558,"range":{"start_line":556,"start_character":12,"end_line":558,"end_character":14},"updated":"2016-05-16 15:01:28.000000000","message":"the \"used\" field?","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"e1949c2423df1bf0d7e5c37d81ec4060eccc75d3","unresolved":false,"context_lines":[{"line_number":555,"context_line":"            },"},{"line_number":556,"context_line":"            \"used\": {"},{"line_number":557,"context_line":"                \"type\": \"integer\""},{"line_number":558,"context_line":"            }."},{"line_number":559,"context_line":"            \"allocation_ratio\": {"},{"line_number":560,"context_line":"                \"type\": \"number\""},{"line_number":561,"context_line":"            },"}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_57ccc088","line":558,"in_reply_to":"dab17558_cca023f7","updated":"2016-05-16 15:11:34.000000000","message":"Yeah, that shouldn\u0027t be there that\u0027s a pasto.","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"00a0403ece5d7b1de4e863196f8d8d9aa0e1db31","unresolved":false,"context_lines":[{"line_number":586,"context_line":"  not found"},{"line_number":587,"context_line":"* `400 Bad Request` for bad or invalid syntax (for example an"},{"line_number":588,"context_line":"  invalid resource class)"},{"line_number":589,"context_line":""},{"line_number":590,"context_line":"`GET /resource_pools/{uuid}/inventories/{resource_class}`"},{"line_number":591,"context_line":"**********************************************************"},{"line_number":592,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_ec37e7ad","line":589,"updated":"2016-05-16 15:01:28.000000000","message":"`409 Conflict` if there exists an inventory of the same resource class.","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"e1949c2423df1bf0d7e5c37d81ec4060eccc75d3","unresolved":false,"context_lines":[{"line_number":586,"context_line":"  not found"},{"line_number":587,"context_line":"* `400 Bad Request` for bad or invalid syntax (for example an"},{"line_number":588,"context_line":"  invalid resource class)"},{"line_number":589,"context_line":""},{"line_number":590,"context_line":"`GET /resource_pools/{uuid}/inventories/{resource_class}`"},{"line_number":591,"context_line":"**********************************************************"},{"line_number":592,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_d7943038","line":589,"in_reply_to":"dab17558_ec37e7ad","updated":"2016-05-16 15:11:34.000000000","message":"Yes","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"25fe03f6ae0a76137dee5ba86ce88165d67e8f69","unresolved":false,"context_lines":[{"line_number":624,"context_line":""},{"line_number":625,"context_line":"    PUT /resource_pools/eaaf1c04-ced2-40e4-89a2-87edded06d64/inventories/DISK_GB"},{"line_number":626,"context_line":"    {"},{"line_number":627,"context_line":"      \"resource_class\": \"DISK_GB\","},{"line_number":628,"context_line":"      \"total\": 1024,"},{"line_number":629,"context_line":"      \"reserved\": 512,"},{"line_number":630,"context_line":"      \"min_unit\": 10,"}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_1fdb6a7d","line":627,"updated":"2016-05-16 16:14:40.000000000","message":"Technically, this doesn\u0027t need to be here, and in fact, should be ignored by the server, yes?","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"00a0403ece5d7b1de4e863196f8d8d9aa0e1db31","unresolved":false,"context_lines":[{"line_number":645,"context_line":"* `409 Conflict` if the changes `total`, `reserved` or"},{"line_number":646,"context_line":"  `allocation_ratio` would causes existing allocations to be in"},{"line_number":647,"context_line":"  conflict with proposed capacity"},{"line_number":648,"context_line":""},{"line_number":649,"context_line":"`DELETE /resource_pools/{uuid}/inventories/{resource_class}`"},{"line_number":650,"context_line":"*************************************************************"},{"line_number":651,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_4c7a7325","line":648,"updated":"2016-05-16 15:01:28.000000000","message":"Can a inventory change its \"resource_class\" field? It is becoming a totally different kind of inventory if its resouce_class is changed.","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"25fe03f6ae0a76137dee5ba86ce88165d67e8f69","unresolved":false,"context_lines":[{"line_number":645,"context_line":"* `409 Conflict` if the changes `total`, `reserved` or"},{"line_number":646,"context_line":"  `allocation_ratio` would causes existing allocations to be in"},{"line_number":647,"context_line":"  conflict with proposed capacity"},{"line_number":648,"context_line":""},{"line_number":649,"context_line":"`DELETE /resource_pools/{uuid}/inventories/{resource_class}`"},{"line_number":650,"context_line":"*************************************************************"},{"line_number":651,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_7fe4363b","line":648,"updated":"2016-05-16 16:14:40.000000000","message":"Yeah, ditch the resource_class in the payload.","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"e1949c2423df1bf0d7e5c37d81ec4060eccc75d3","unresolved":false,"context_lines":[{"line_number":645,"context_line":"* `409 Conflict` if the changes `total`, `reserved` or"},{"line_number":646,"context_line":"  `allocation_ratio` would causes existing allocations to be in"},{"line_number":647,"context_line":"  conflict with proposed capacity"},{"line_number":648,"context_line":""},{"line_number":649,"context_line":"`DELETE /resource_pools/{uuid}/inventories/{resource_class}`"},{"line_number":650,"context_line":"*************************************************************"},{"line_number":651,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_17b238e5","line":648,"in_reply_to":"dab17558_4c7a7325","updated":"2016-05-16 15:11:34.000000000","message":"No, it can\u0027t.\n\nI considered leaving the \u0027resource_class\u0027 field out of the PUT body, but it was in the example that Jay gave, so I left it in. I reckon it is redundant, so could go.","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"00a0403ece5d7b1de4e863196f8d8d9aa0e1db31","unresolved":false,"context_lines":[{"line_number":667,"context_line":"* `409 Conflict` if there are existing allocations for this"},{"line_number":668,"context_line":"  inventory"},{"line_number":669,"context_line":""},{"line_number":670,"context_line":"`GET /resource_pools/{uuid}/aggregates`"},{"line_number":671,"context_line":""},{"line_number":672,"context_line":"Get a list of aggregates associated with this resource pool."},{"line_number":673,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_cc94a338","line":670,"updated":"2016-05-16 15:01:28.000000000","message":"nit: ************","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"e1949c2423df1bf0d7e5c37d81ec4060eccc75d3","unresolved":false,"context_lines":[{"line_number":667,"context_line":"* `409 Conflict` if there are existing allocations for this"},{"line_number":668,"context_line":"  inventory"},{"line_number":669,"context_line":""},{"line_number":670,"context_line":"`GET /resource_pools/{uuid}/aggregates`"},{"line_number":671,"context_line":""},{"line_number":672,"context_line":"Get a list of aggregates associated with this resource pool."},{"line_number":673,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_b7c1ac31","line":670,"in_reply_to":"dab17558_cc94a338","updated":"2016-05-16 15:11:34.000000000","message":"thanks","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"727147f8452607bbf0d8fd37fbbe78a37fa13d4d","unresolved":false,"context_lines":[{"line_number":673,"context_line":""},{"line_number":674,"context_line":"Example::"},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"    GET /resource_pools/eaaf1c04-ced2-40e4-89a2-87edded06d64/aggregates"},{"line_number":677,"context_line":""},{"line_number":678,"context_line":"    {\"aggregates\":"},{"line_number":679,"context_line":"      ["}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_72b1128f","line":676,"updated":"2016-05-16 15:32:05.000000000","message":"(moved from @702) nit: It may be more friendly with each aggregates\u0027 id and name listed.","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"25fe03f6ae0a76137dee5ba86ce88165d67e8f69","unresolved":false,"context_lines":[{"line_number":673,"context_line":""},{"line_number":674,"context_line":"Example::"},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"    GET /resource_pools/eaaf1c04-ced2-40e4-89a2-87edded06d64/aggregates"},{"line_number":677,"context_line":""},{"line_number":678,"context_line":"    {\"aggregates\":"},{"line_number":679,"context_line":"      ["}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_5fe17229","line":676,"updated":"2016-05-16 16:14:40.000000000","message":"I\u0027d prefer not to return name of the aggregate since the PUT does not require specifying the names.","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"00a0403ece5d7b1de4e863196f8d8d9aa0e1db31","unresolved":false,"context_lines":[{"line_number":699,"context_line":""},{"line_number":700,"context_line":"Example::"},{"line_number":701,"context_line":""},{"line_number":702,"context_line":"    PUT /resource_pools/eaaf1c04-ced2-40e4-89a2-87edded06d64/aggregates"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":"    ["},{"line_number":705,"context_line":"        \"21d7c4aa-d0b6-41b1-8513-12a1eac17c0c\","}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_6c277712","line":702,"updated":"2016-05-16 15:01:28.000000000","message":"It may be more friendly with each aggregates\u0027 id and name listed.","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"727147f8452607bbf0d8fd37fbbe78a37fa13d4d","unresolved":false,"context_lines":[{"line_number":699,"context_line":""},{"line_number":700,"context_line":"Example::"},{"line_number":701,"context_line":""},{"line_number":702,"context_line":"    PUT /resource_pools/eaaf1c04-ced2-40e4-89a2-87edded06d64/aggregates"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":"    ["},{"line_number":705,"context_line":"        \"21d7c4aa-d0b6-41b1-8513-12a1eac17c0c\","}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_f2bce26d","line":702,"in_reply_to":"dab17558_6c277712","updated":"2016-05-16 15:32:05.000000000","message":"Sorry, this comment is in the wrong place.","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"25fe03f6ae0a76137dee5ba86ce88165d67e8f69","unresolved":false,"context_lines":[{"line_number":789,"context_line":"their shared disk storage, create any host aggregates that may need to be"},{"line_number":790,"context_line":"created for any compute nodes that utilize that shared storage, associate the"},{"line_number":791,"context_line":"resource pool with those aggregates, and schedule (cronjob or the like) some"},{"line_number":792,"context_line":"script to periodically run `openstack resource-pool update inventory $UUID"},{"line_number":793,"context_line":"--resource-class\u003dDISK_GB --total\u003dX --reserved\u003dY`."},{"line_number":794,"context_line":""},{"line_number":795,"context_line":"We should include a sample script along with the documentation for this."}],"source_content_type":"text/x-rst","patch_set":13,"id":"dab17558_bfd05e54","line":792,"updated":"2016-05-16 16:14:40.000000000","message":"s/update/set/","commit_id":"553aee370e73f7fb56e6dd5449fa03d574e9fc31"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"cd6af82c82dd32582c9df6d76ac69d2916dd0335","unresolved":false,"context_lines":[{"line_number":86,"context_line":"2) The cloud deployer creates a resource pool representing the NFS share::"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    $RP_UUID\u003d`openstack resource-pool create \"/mnt/nfs/row1racks0610/\" \\"},{"line_number":89,"context_line":"        --aggregate-uuid\u003d$AGG_UUID`"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"3) The cloud deployer updates the resource pool\u0027s capacity of shared disk::"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_2b2c2b01","line":89,"updated":"2016-05-16 17:53:39.000000000","message":"This seems to contradict the list of openstack client commands to be added below. The pool will be created and then a second command called for the aggregate association.","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e984407d947b64b0cdf6603ce9e92f7a5031c13f","unresolved":false,"context_lines":[{"line_number":86,"context_line":"2) The cloud deployer creates a resource pool representing the NFS share::"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    $RP_UUID\u003d`openstack resource-pool create \"/mnt/nfs/row1racks0610/\" \\"},{"line_number":89,"context_line":"        --aggregate-uuid\u003d$AGG_UUID`"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"3) The cloud deployer updates the resource pool\u0027s capacity of shared disk::"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_b15fee3f","line":89,"in_reply_to":"dab17558_2b2c2b01","updated":"2016-05-16 19:23:38.000000000","message":"L761 has the same command. In previous iterations of the spec it\u0027s basically been pointed out (if I remember correctly) that the REST APIs will be very specific and the CLIs can just use multiple APIs to provide a nice front-end, like creating the pool and associating an aggregate at the same time.","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"bd98682638db5c84738536ced7d91f8487e434ca","unresolved":false,"context_lines":[{"line_number":199,"context_line":"Assume that the virtual machine launched in step #6 of Scenario 2a needs to be"},{"line_number":200,"context_line":"live-migrated -- perhaps because the compute host is failing or being upgraded."},{"line_number":201,"context_line":"Live migration moves a workload from a source host to a destination host,"},{"line_number":202,"context_line":"keeping the workload\u0027s networking setup in-tact. In the case where an instance"},{"line_number":203,"context_line":"was booted with a port that is associated with a particular resource pool"},{"line_number":204,"context_line":"containing a routed network\u0027s set of IP addresses, we need to ensure that the"},{"line_number":205,"context_line":"target host is in the same aggregate as the source host (since the routed"}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_10e4f9dd","line":202,"range":{"start_line":202,"start_character":40,"end_line":202,"end_character":47},"updated":"2016-05-16 18:17:47.000000000","message":"errant hyphen","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"bd98682638db5c84738536ced7d91f8487e434ca","unresolved":false,"context_lines":[{"line_number":206,"context_line":"network only spans the compute hosts in a particular aggregate)."},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"With the generic resource pool information, we can have the scheduler (or"},{"line_number":209,"context_line":"conductor) limit the set of compute nodes used in determining the"},{"line_number":210,"context_line":"live-migration\u0027s destination host by examining the resource providers that"},{"line_number":211,"context_line":"match the `IPV4_ADDRESS` resource class for the instance UUID as a consumer."},{"line_number":212,"context_line":"From this list we can identify the aggregates associated with the resource"},{"line_number":213,"context_line":"provider and from the list of aggregates we can determine the compute hosts"},{"line_number":214,"context_line":"that can serve as target destinations for the migration."},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"Alternatives"},{"line_number":217,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_6b43d4af","line":214,"range":{"start_line":209,"start_character":11,"end_line":214,"end_character":56},"updated":"2016-05-16 18:17:47.000000000","message":"I believe that this is going to end up being more complicated than it is stated here, but that\u0027s something that will have to be in code to determine.","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"a7c7d14c4b7da5af9dfe3a7e77791a698e84b938","unresolved":false,"context_lines":[{"line_number":211,"context_line":"match the `IPV4_ADDRESS` resource class for the instance UUID as a consumer."},{"line_number":212,"context_line":"From this list we can identify the aggregates associated with the resource"},{"line_number":213,"context_line":"provider and from the list of aggregates we can determine the compute hosts"},{"line_number":214,"context_line":"that can serve as target destinations for the migration."},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"Alternatives"},{"line_number":217,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_0b32085e","line":214,"updated":"2016-05-16 17:32:02.000000000","message":"I worked out my question in IRC with Jay. What wasn\u0027t clear to me is that a resource class could be associated with an aggregate/pool (like IPV4_ADDRESS) or a compute node (like DISK_GB) and the scheduling difference will be based on that. A class associated with an aggregate is restrictive in that the scheduler should pick a host within that aggregate for a move. A class associated with a compute host is obviously not restrictive or the instance would never be able to move.\n\nI had assumed that a compute would be a pool of 1 for something like DISK_GB which would have left no distinction for the scheduler to base a decision on.","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e984407d947b64b0cdf6603ce9e92f7a5031c13f","unresolved":false,"context_lines":[{"line_number":377,"context_line":"            \"uuid\": {"},{"line_number":378,"context_line":"                \"type\": \"uuid\""},{"line_number":379,"context_line":"            },"},{"line_number":380,"context_line":"            \"required\": ["},{"line_number":381,"context_line":"                \"name\""},{"line_number":382,"context_line":"            ]"},{"line_number":383,"context_line":"        }"},{"line_number":384,"context_line":"        \"additionalProperties\": False"},{"line_number":385,"context_line":"    }"}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_74f0d4fd","line":382,"range":{"start_line":380,"start_character":12,"end_line":382,"end_character":13},"updated":"2016-05-16 19:23:38.000000000","message":"I\u0027m pretty sure that \u0027required\u0027 goes up a level, e.g.:\n\nhttps://github.com/openstack/nova/blob/a9691bfb920fd6caca39218ae3104a3a30f177ea/nova/api/openstack/compute/schemas/servers.py#L25-L47","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"d0b30e91881e9a62fb6171e453cd5f32df0aec05","unresolved":false,"context_lines":[{"line_number":379,"context_line":"            },"},{"line_number":380,"context_line":"            \"required\": ["},{"line_number":381,"context_line":"                \"name\""},{"line_number":382,"context_line":"            ]"},{"line_number":383,"context_line":"        }"},{"line_number":384,"context_line":"        \"additionalProperties\": False"},{"line_number":385,"context_line":"    }"}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_9f6911c1","line":382,"in_reply_to":"dab17558_74f0d4fd","updated":"2016-05-16 19:33:57.000000000","message":"indeed","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e984407d947b64b0cdf6603ce9e92f7a5031c13f","unresolved":false,"context_lines":[{"line_number":449,"context_line":"* `204 No Content` if the request was successful and the resource"},{"line_number":450,"context_line":"  pool was updated."},{"line_number":451,"context_line":"* `400 Bad Request` for bad or invalid syntax."},{"line_number":452,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` does not exist."},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"`DELETE /resource_pools/{uuid}`"},{"line_number":455,"context_line":"********************************"}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_1464e8b6","line":452,"updated":"2016-05-16 19:23:38.000000000","message":"409 if another resource pool with the given name already exists.","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"d0b30e91881e9a62fb6171e453cd5f32df0aec05","unresolved":false,"context_lines":[{"line_number":449,"context_line":"* `204 No Content` if the request was successful and the resource"},{"line_number":450,"context_line":"  pool was updated."},{"line_number":451,"context_line":"* `400 Bad Request` for bad or invalid syntax."},{"line_number":452,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` does not exist."},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"`DELETE /resource_pools/{uuid}`"},{"line_number":455,"context_line":"********************************"}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_9f97518f","line":452,"in_reply_to":"dab17558_1464e8b6","updated":"2016-05-16 19:33:57.000000000","message":"tru dat\n\nI had thought that we weren\u0027t uniq on the names, but we are.","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e984407d947b64b0cdf6603ce9e92f7a5031c13f","unresolved":false,"context_lines":[{"line_number":535,"context_line":"    {"},{"line_number":536,"context_line":"        \"type\": \"object\","},{"line_number":537,"context_line":"        \"properties\": {"},{"line_number":538,"context_line":"            \"resource_class\": {"},{"line_number":539,"context_line":"                \"type\": \"string\""},{"line_number":540,"context_line":"            },"},{"line_number":541,"context_line":"            \"total\": {"},{"line_number":542,"context_line":"                \"type\": \"integer\""},{"line_number":543,"context_line":"            },"}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_f4ee84eb","line":540,"range":{"start_line":538,"start_character":12,"end_line":540,"end_character":14},"updated":"2016-05-16 19:23:38.000000000","message":"I think at one point in a prior revision we had a regex so this could only have underscores and upper-case letters.","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"d0b30e91881e9a62fb6171e453cd5f32df0aec05","unresolved":false,"context_lines":[{"line_number":537,"context_line":"        \"properties\": {"},{"line_number":538,"context_line":"            \"resource_class\": {"},{"line_number":539,"context_line":"                \"type\": \"string\""},{"line_number":540,"context_line":"            },"},{"line_number":541,"context_line":"            \"total\": {"},{"line_number":542,"context_line":"                \"type\": \"integer\""},{"line_number":543,"context_line":"            },"}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_ffd5bd42","line":540,"in_reply_to":"dab17558_f4ee84eb","updated":"2016-05-16 19:33:57.000000000","message":"Yeah, in my rush to get it done by the scheduler meeting I didn\u0027t have a chance to recall the syntax for representing that.","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e984407d947b64b0cdf6603ce9e92f7a5031c13f","unresolved":false,"context_lines":[{"line_number":715,"context_line":"`GET /resource_pools/{uuid}/usages`"},{"line_number":716,"context_line":"***********************************"},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"Retrieve a list of usage information for resources associated with"},{"line_number":719,"context_line":"the resource pool identified by `{uuid}`."},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"Example::"}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_54b2f0e5","line":718,"range":{"start_line":718,"start_character":19,"end_line":718,"end_character":36},"updated":"2016-05-16 19:23:38.000000000","message":"So this is just a list of resource class totals for the given resource pool, or allocation totals for the given resource class in that pool? I think I\u0027m confused because we don\u0027t talk about allocations in this spec.","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"d0b30e91881e9a62fb6171e453cd5f32df0aec05","unresolved":false,"context_lines":[{"line_number":715,"context_line":"`GET /resource_pools/{uuid}/usages`"},{"line_number":716,"context_line":"***********************************"},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"Retrieve a list of usage information for resources associated with"},{"line_number":719,"context_line":"the resource pool identified by `{uuid}`."},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"Example::"}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_3f110505","line":718,"in_reply_to":"dab17558_54b2f0e5","updated":"2016-05-16 19:33:57.000000000","message":"It\u0027s a dictionary with resource_class: \"usage for that class in this pool\" pairs.\n\nthe right hand side is the sum of allocations for the resource class.","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e984407d947b64b0cdf6603ce9e92f7a5031c13f","unresolved":false,"context_lines":[{"line_number":746,"context_line":"Notifications impact"},{"line_number":747,"context_line":"--------------------"},{"line_number":748,"context_line":""},{"line_number":749,"context_line":"We should create new notification messages for when resource pools are created,"},{"line_number":750,"context_line":"destroyed, updated, associated with an aggregate and disassociated from an"},{"line_number":751,"context_line":"aggregate."},{"line_number":752,"context_line":""},{"line_number":753,"context_line":"Other end user impact"},{"line_number":754,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_d448a0b5","line":751,"range":{"start_line":749,"start_character":0,"end_line":751,"end_character":10},"updated":"2016-05-16 19:23:38.000000000","message":"How about inventory create/update/delete operations?","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3900cc0d3d379f4092e213f18fbb94d8c5227982","unresolved":false,"context_lines":[{"line_number":748,"context_line":""},{"line_number":749,"context_line":"We should create new notification messages for when resource pools are created,"},{"line_number":750,"context_line":"destroyed, updated, associated with an aggregate and disassociated from an"},{"line_number":751,"context_line":"aggregate."},{"line_number":752,"context_line":""},{"line_number":753,"context_line":"Other end user impact"},{"line_number":754,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_3f846509","line":751,"in_reply_to":"dab17558_3f28e532","updated":"2016-05-16 19:35:56.000000000","message":"I think it\u0027s probably just more about being complete.","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"d0b30e91881e9a62fb6171e453cd5f32df0aec05","unresolved":false,"context_lines":[{"line_number":748,"context_line":""},{"line_number":749,"context_line":"We should create new notification messages for when resource pools are created,"},{"line_number":750,"context_line":"destroyed, updated, associated with an aggregate and disassociated from an"},{"line_number":751,"context_line":"aggregate."},{"line_number":752,"context_line":""},{"line_number":753,"context_line":"Other end user impact"},{"line_number":754,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_3f28e532","line":751,"in_reply_to":"dab17558_d448a0b5","updated":"2016-05-16 19:33:57.000000000","message":"We can do that if you like. What\u0027s the expected uses of those notifications, or is it simply a matter of being complete?","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"cd6af82c82dd32582c9df6d76ac69d2916dd0335","unresolved":false,"context_lines":[{"line_number":823,"context_line":"  instance is requesting some amount of DISK_GB resources and the compute node"},{"line_number":824,"context_line":"  is associated with a resource pool that contains available DISK_GB inventory,"},{"line_number":825,"context_line":"  then the resource tracker shall claim the resources (write an allocation"},{"line_number":826,"context_line":"  record) against the resource pool, not the compute node itself."},{"line_number":827,"context_line":"* Modify the scheduler to look at resource pool information for aggregates"},{"line_number":828,"context_line":"  associated with compute nodes to determine if request can be fulfilled by the"},{"line_number":829,"context_line":"  resource pool"}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_abd2dbfd","line":826,"updated":"2016-05-16 17:53:39.000000000","message":"My understanding from IRC was that this bit wasn\u0027t quite worked out. If a compute has local DISK_GB but is also in a pool of shared DISK_GB there\u0027s no mechanism for knowing which one to use. Unless what this work item is saying is that a pooled resource takes precedence over a local resource.","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e984407d947b64b0cdf6603ce9e92f7a5031c13f","unresolved":false,"context_lines":[{"line_number":823,"context_line":"  instance is requesting some amount of DISK_GB resources and the compute node"},{"line_number":824,"context_line":"  is associated with a resource pool that contains available DISK_GB inventory,"},{"line_number":825,"context_line":"  then the resource tracker shall claim the resources (write an allocation"},{"line_number":826,"context_line":"  record) against the resource pool, not the compute node itself."},{"line_number":827,"context_line":"* Modify the scheduler to look at resource pool information for aggregates"},{"line_number":828,"context_line":"  associated with compute nodes to determine if request can be fulfilled by the"},{"line_number":829,"context_line":"  resource pool"}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_d4f6e05b","line":826,"in_reply_to":"dab17558_abd2dbfd","updated":"2016-05-16 19:23:38.000000000","message":"Hmm, we could also have a config option for that...","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e984407d947b64b0cdf6603ce9e92f7a5031c13f","unresolved":false,"context_lines":[{"line_number":828,"context_line":"  associated with compute nodes to determine if request can be fulfilled by the"},{"line_number":829,"context_line":"  resource pool"},{"line_number":830,"context_line":""},{"line_number":831,"context_line":"For this particular step, the changes to the existing filter scheduler should"},{"line_number":832,"context_line":"be minimal. Right now, the host manager queries the list of all aggregates in"},{"line_number":833,"context_line":"the deployment upon each call to `select_destinations()`. This call to"},{"line_number":834,"context_line":"`nova.objects.AggregateList.get_all()` returns a set of aggregate objects that"}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_f42cc4ad","line":831,"updated":"2016-05-16 19:23:38.000000000","message":"This formats a bit weird in ReST with the above bullet, I would have probably nested it under that one or just continued the prose in that bullet. But not a big deal.","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"d0b30e91881e9a62fb6171e453cd5f32df0aec05","unresolved":false,"context_lines":[{"line_number":828,"context_line":"  associated with compute nodes to determine if request can be fulfilled by the"},{"line_number":829,"context_line":"  resource pool"},{"line_number":830,"context_line":""},{"line_number":831,"context_line":"For this particular step, the changes to the existing filter scheduler should"},{"line_number":832,"context_line":"be minimal. Right now, the host manager queries the list of all aggregates in"},{"line_number":833,"context_line":"the deployment upon each call to `select_destinations()`. This call to"},{"line_number":834,"context_line":"`nova.objects.AggregateList.get_all()` returns a set of aggregate objects that"}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_7fe54d07","line":831,"in_reply_to":"dab17558_f42cc4ad","updated":"2016-05-16 19:33:57.000000000","message":"can do","commit_id":"8e4645250ad46b8ed38ec5e731ce9e49ec9e06a2"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"592f2297f2797d7be047e56f68bf1ad61dca443a","unresolved":false,"context_lines":[{"line_number":291,"context_line":"* `GET` a list, by resource class, of usages"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"This provides granular access to the resources that matter while"},{"line_number":294,"context_line":"providing straightfoward access to usage information."},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"Details follow."},{"line_number":297,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"dab17558_c46f2590","line":294,"range":{"start_line":294,"start_character":10,"end_line":294,"end_character":24},"updated":"2016-05-17 13:06:29.000000000","message":"s/straightfoward/straightforward/","commit_id":"d1caf4eaac31786775c3109700b617a51c0d0155"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a09823c1cb8610de15d3ac9bcc0b7c9fa045f9df","unresolved":false,"context_lines":[{"line_number":384,"context_line":"        },"},{"line_number":385,"context_line":"        \"required\": ["},{"line_number":386,"context_line":"            \"name\""},{"line_number":387,"context_line":"        ]"},{"line_number":388,"context_line":"        \"additionalProperties\": False"},{"line_number":389,"context_line":"    }"},{"line_number":390,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"dab17558_f7bfa1cd","line":387,"range":{"start_line":387,"start_character":8,"end_line":387,"end_character":9},"updated":"2016-05-16 21:51:15.000000000","message":"missing a comma here","commit_id":"d1caf4eaac31786775c3109700b617a51c0d0155"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a09823c1cb8610de15d3ac9bcc0b7c9fa045f9df","unresolved":false,"context_lines":[{"line_number":758,"context_line":"Notifications impact"},{"line_number":759,"context_line":"--------------------"},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"We should create new notification messages for when resource pools are created,"},{"line_number":762,"context_line":"destroyed, updated, associated with an aggregate and disassociated from an"},{"line_number":763,"context_line":"aggregate."},{"line_number":764,"context_line":""},{"line_number":765,"context_line":"Other end user impact"},{"line_number":766,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":16,"id":"dab17558_37ada99b","line":763,"range":{"start_line":761,"start_character":0,"end_line":763,"end_character":10},"updated":"2016-05-16 21:51:15.000000000","message":"Doesn\u0027t mention anything about notifications or creating/update/delete inventories, but we don\u0027t have to explicitly call that out, it could just come up when implementing it.","commit_id":"d1caf4eaac31786775c3109700b617a51c0d0155"}]}
