)]}'
{"specs/mitaka/approved/generic-resource-pools.rst":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"68687765de755bb39cb1eb98763f65458bd533e8","unresolved":false,"context_lines":[{"line_number":67,"context_line":"* This approach is not generic and assumes the only shared resource is disk"},{"line_number":68,"context_line":"  space"},{"line_number":69,"context_line":"* This information isn\u0027t really configuration data but rather system inventory"},{"line_number":70,"context_line":"  data, and therefore belongs in the database, not configuration files"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"Data model impact"},{"line_number":73,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"7a740942_0ad6d3f0","line":70,"updated":"2015-12-08 12:49:35.000000000","message":"One issue I\u0027ve been unable to resolve in my brain while reviewing these specs and other context is that everything belonging \"in the database\" is nice in that you have a single source of authority but isn\u0027t it very vulnerable to being out of date? Each of the resources is the only thing that actually knows, right now, what its state is. If it forgets, or is unable because of network partition or otherwise, to update the database, things go wonky. Presumably there are a variety of ways around this (reslient data stores, resilient message queues, etc and making a clear separation between resource existence and value and use (which seems to be happening in some of the other specs)).\n\nBut there\u0027s still that lingering thing in the back of my head which says \"the locus of agency feels wrong here\". I\u0027ll try to keep it quiet.","commit_id":"f46175164708565f41ed737800b7a4001155bff7"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"218d78d319d5b0669389b6f933e0ba76b8c09bc9","unresolved":false,"context_lines":[{"line_number":67,"context_line":"* This approach is not generic and assumes the only shared resource is disk"},{"line_number":68,"context_line":"  space"},{"line_number":69,"context_line":"* This information isn\u0027t really configuration data but rather system inventory"},{"line_number":70,"context_line":"  data, and therefore belongs in the database, not configuration files"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"Data model impact"},{"line_number":73,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"7a740942_d3545155","line":70,"in_reply_to":"7a740942_0ad6d3f0","updated":"2015-12-11 09:20:02.000000000","message":"No, your intuition is guiding you correctly, Chris :) However, this particular spec isn\u0027t really changing the current state of affairs in Nova with regards to those failure domains. RIght now, if a nova-compute daemon goes down, the periodic task that runs to update the compute host\u0027s inventory record in the database (compute_nodes table) doesn\u0027t occur. This eventually causes the node to be excluded from scheduling because its last_updated_at timestamp in the services table in the database is old.\n\nBut, our model is that *eventually* the failure will be corrected and then the compute node (which is a resource provider) will update the database\u0027s known state of its inventory, and things will just end up reconciling.","commit_id":"f46175164708565f41ed737800b7a4001155bff7"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"5315426fffe253ea9f2f9c9923206b5b36304048","unresolved":false,"context_lines":[{"line_number":86,"context_line":"Note that `resource_class_id` is the identifier for the class of resources"},{"line_number":87,"context_line":"provided by the resource pool. This identifier comes from the"},{"line_number":88,"context_line":"`resource_classes` table in the API database that is introduce in the"},{"line_number":89,"context_line":"`resource-classes` blueprint."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"*Note*: Although the `resource_classes` table is in the API database, the"},{"line_number":92,"context_line":"`resource_pools` table should be in local Nova database. This is because the"}],"source_content_type":"text/x-rst","patch_set":2,"id":"7a740942_0c32f310","line":89,"updated":"2015-12-04 15:53:51.000000000","message":"Link? I can find the \u0027resource-objects\u0027 BP, but don\u0027t see \u0027resource-classes\u0027.","commit_id":"f46175164708565f41ed737800b7a4001155bff7"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"218d78d319d5b0669389b6f933e0ba76b8c09bc9","unresolved":false,"context_lines":[{"line_number":86,"context_line":"Note that `resource_class_id` is the identifier for the class of resources"},{"line_number":87,"context_line":"provided by the resource pool. This identifier comes from the"},{"line_number":88,"context_line":"`resource_classes` table in the API database that is introduce in the"},{"line_number":89,"context_line":"`resource-classes` blueprint."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"*Note*: Although the `resource_classes` table is in the API database, the"},{"line_number":92,"context_line":"`resource_pools` table should be in local Nova database. This is because the"}],"source_content_type":"text/x-rst","patch_set":2,"id":"7a740942_d3d1b1fc","line":89,"in_reply_to":"7a740942_0c32f310","updated":"2015-12-11 09:20:02.000000000","message":"Sorry, Ed! Here it is: https://review.openstack.org/256297","commit_id":"f46175164708565f41ed737800b7a4001155bff7"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"68687765de755bb39cb1eb98763f65458bd533e8","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    {"},{"line_number":120,"context_line":"        \"name\": \"Global NFS share\","},{"line_number":121,"context_line":"        \"resource_class_name\": \"disk\""},{"line_number":122,"context_line":"    }"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"Here is an example returned response::"}],"source_content_type":"text/x-rst","patch_set":2,"id":"7a740942_aa077f80","line":121,"updated":"2015-12-08 12:49:35.000000000","message":"Ed this is a post to create the thing named Global NFS Share, initialized with no capacity or use yet set. The response gives the resulting ID.","commit_id":"f46175164708565f41ed737800b7a4001155bff7"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"5315426fffe253ea9f2f9c9923206b5b36304048","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    {"},{"line_number":120,"context_line":"        \"name\": \"Global NFS share\","},{"line_number":121,"context_line":"        \"resource_class_name\": \"disk\""},{"line_number":122,"context_line":"    }"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"Here is an example returned response::"}],"source_content_type":"text/x-rst","patch_set":2,"id":"7a740942_ccb62b8a","line":121,"updated":"2015-12-04 15:53:51.000000000","message":"It seems odd to link via name instead of ID. I understand that resource classes aren\u0027t going to be a free-for-all, but \u0027name\u0027 is not a unique constraint.","commit_id":"f46175164708565f41ed737800b7a4001155bff7"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"fd2c76caf3c2cdbf85fd70b5429790bfc9ee6b27","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    {"},{"line_number":120,"context_line":"        \"name\": \"Global NFS share\","},{"line_number":121,"context_line":"        \"resource_class_name\": \"disk\""},{"line_number":122,"context_line":"    }"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"Here is an example returned response::"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a7e1126_5614fa42","line":121,"in_reply_to":"7a740942_aa077f80","updated":"2015-12-17 16:35:02.000000000","message":"I meant \u0027resource_class_name\u0027 is an odd choice for linking. The resource classes are in the API database, and have \u0027id\u0027 as their PK, with a unique constraint on \u0027name\u0027. The old DBA in me likes links such as this to be on the ID, not the name, which is meaningful and can change. The note below on lines 157-8 acknowledges this problem.","commit_id":"f46175164708565f41ed737800b7a4001155bff7"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"68687765de755bb39cb1eb98763f65458bd533e8","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        \"name\": \"Global NFS share\","},{"line_number":153,"context_line":"        \"capacity\": 1024,"},{"line_number":154,"context_line":"        \"used\": 450"},{"line_number":155,"context_line":"    }"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"*Note*: It is NOT possible to change the resource class once a resource pool"},{"line_number":158,"context_line":"has been created."}],"source_content_type":"text/x-rst","patch_set":2,"id":"7a740942_ca0a0b8a","line":155,"updated":"2015-12-08 12:49:35.000000000","message":"This suggests that name can be changed. Intentional, desired?\n\nHow about PATCH or better to just avoid that morass?","commit_id":"f46175164708565f41ed737800b7a4001155bff7"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"68687765de755bb39cb1eb98763f65458bd533e8","unresolved":false,"context_lines":[{"line_number":248,"context_line":"  with the aggregate"},{"line_number":249,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found"},{"line_number":250,"context_line":"* `400 Bad Request` if the resource pool was found but the aggregate with ID"},{"line_number":251,"context_line":"  `{id}` was not found"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"`DELETE /resource_pools/{uuid}/aggregates/{id}`"},{"line_number":254,"context_line":"***********************************************"}],"source_content_type":"text/x-rst","patch_set":2,"id":"7a740942_6afd176d","line":251,"updated":"2015-12-08 12:49:35.000000000","message":"\\o/ good http","commit_id":"f46175164708565f41ed737800b7a4001155bff7"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"68687765de755bb39cb1eb98763f65458bd533e8","unresolved":false,"context_lines":[{"line_number":321,"context_line":"created for any compute nodes that utilize that shared storage, associate the"},{"line_number":322,"context_line":"resource pool with those aggregates, and schedule (cronjob or the like) some"},{"line_number":323,"context_line":"script to periodically run `nova resource-pool-update $UUID --capacity\u003dX"},{"line_number":324,"context_line":"--used\u003dY`."},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"We should include a sample script along with the documentation for this."},{"line_number":327,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"7a740942_8a008367","line":324,"updated":"2015-12-08 12:49:35.000000000","message":"I think this part is actually kind of the crux of the biscuit and feels a bit glossed over. It relates to the comment I made above about the source of authority staying up to date and is perhaps the simplest and most reliable solution: it has clear boundaries of responsibility. You are responsible for telling me your capacity and usage. As long as you do that regularly we\u0027ll get along just fine.","commit_id":"f46175164708565f41ed737800b7a4001155bff7"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"68687765de755bb39cb1eb98763f65458bd533e8","unresolved":false,"context_lines":[{"line_number":337,"context_line":"-----------"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"Primary assignee:"},{"line_number":340,"context_line":"  cdent"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"Other contributors:"},{"line_number":343,"context_line":"  jaypipes"}],"source_content_type":"text/x-rst","patch_set":2,"id":"7a740942_2afcef6e","line":340,"updated":"2015-12-08 12:49:35.000000000","message":"Oh well, how about that. Yeah, as I was reading above I was thinking, \"hey, I bet I could do this\".","commit_id":"f46175164708565f41ed737800b7a4001155bff7"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"9ac1a26aa75be1c5d7103ded9930a06a2cd26094","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    CREATE TABLE resource_pools ("},{"line_number":79,"context_line":"        uuid VARCHAR(64) NOT NULL PRIMARY KEY,"},{"line_number":80,"context_line":"        name VARCHAR(200) NOT NULL,"},{"line_number":81,"context_line":"        created_on DATETIME NOT NULL,"},{"line_number":82,"context_line":"        updated_on DATETIME NOT NULL,"},{"line_number":83,"context_line":"        resource_class_id INT UNSIGNED NOT NULL"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7a5de9d1_8c7b8b7b","line":80,"updated":"2016-01-27 10:11:37.000000000","message":"For IPAM, having external_resource_uuid (for the segment id), so we don\u0027t have to abuse the name.\n\n(see resource pools)","commit_id":"5fe88d5fc77fd4aca012f7368cabb19fedb26be8"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"40fb3138c0c2400f46c79248e12983a5d3942202","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    CREATE TABLE resource_pools ("},{"line_number":79,"context_line":"        uuid VARCHAR(64) NOT NULL PRIMARY KEY,"},{"line_number":80,"context_line":"        name VARCHAR(200) NOT NULL,"},{"line_number":81,"context_line":"        created_on DATETIME NOT NULL,"},{"line_number":82,"context_line":"        updated_on DATETIME NOT NULL,"},{"line_number":83,"context_line":"        resource_class_id INT UNSIGNED NOT NULL"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7a5de9d1_eca55fb5","line":80,"in_reply_to":"7a5de9d1_8c7b8b7b","updated":"2016-01-27 10:16:51.000000000","message":"Its kinda the same for Ceph, to use its volume-id, maybe NFS uses a URI?\n\nThat means name does not need to be unique, but the external_resource_uuid should have a unique constraint.","commit_id":"5fe88d5fc77fd4aca012f7368cabb19fedb26be8"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"ac96335ebb9f4b421f15d7fc15c08dfa21be5421","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    CREATE TABLE resource_pools ("},{"line_number":79,"context_line":"        uuid VARCHAR(64) NOT NULL PRIMARY KEY,"},{"line_number":80,"context_line":"        name VARCHAR(200) NOT NULL,"},{"line_number":81,"context_line":"        created_on DATETIME NOT NULL,"},{"line_number":82,"context_line":"        updated_on DATETIME NOT NULL,"},{"line_number":83,"context_line":"        resource_class_id INT UNSIGNED NOT NULL"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7a5de9d1_7d310dec","line":80,"in_reply_to":"7a5de9d1_eca55fb5","updated":"2016-01-27 15:10:33.000000000","message":"To be more clear what we want to store is an identifier that will be available for use during scheduling.  As an example if a port is passed in and a segment id can be looked up for it which should affect where the host lands then that segment id should be stored here.  If it\u0027s a volume with some piece of data available to Nova which affects where an instance should be then that id needs to be here.  However users should never pass this data in or need to be exposed to it, except that it may be visible in the Neutron/Cinder API.","commit_id":"5fe88d5fc77fd4aca012f7368cabb19fedb26be8"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"fd2eaefc6ace41f029b7639bcd5698897a794f3e","unresolved":false,"context_lines":[{"line_number":395,"context_line":"  https://bugs.launchpad.net/nova/+bug/1315988"},{"line_number":396,"context_line":"* VMWare: available disk spaces(hypervisor-list) only based on a single"},{"line_number":397,"context_line":"  datastore instead of all available datastores from cluster"},{"line_number":398,"context_line":"  https://bugs.launchpad.net/nova/+bug/1347039 "},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"History"},{"line_number":401,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7a5de9d1_46a3329f","line":398,"range":{"start_line":398,"start_character":46,"end_line":398,"end_character":47},"updated":"2016-01-27 09:37:21.000000000","message":"Turns out thats causing the test break.","commit_id":"5fe88d5fc77fd4aca012f7368cabb19fedb26be8"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"990ea9ae4d8e2874d0f90c17773159ca13d83a4c","unresolved":false,"context_lines":[{"line_number":78,"context_line":"1) The cloud deployer creates an aggregate representing all the compute"},{"line_number":79,"context_line":"   nodes in row 1, racks 6 through 10::"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    $AGG_ID\u003d`nova aggregate-create \"row 1, racks 6-10\"`"},{"line_number":82,"context_line":"    # for all compute nodes in the system that are in racks 6-10 in row 1..."},{"line_number":83,"context_line":"    nova aggregate-add-host $AGG_ID $HOSTNAME"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a5de9d1_fb7bc279","line":81,"updated":"2016-01-27 16:45:51.000000000","message":"I\u0027m going to overlook this terrible aggregate name :)","commit_id":"963e65836bc14c1e88df2d9e88a63b4f8d10cd70"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"13a38fe103d61e4f710dc601a2552f63220756ad","unresolved":false,"context_lines":[{"line_number":78,"context_line":"1) The cloud deployer creates an aggregate representing all the compute"},{"line_number":79,"context_line":"   nodes in row 1, racks 6 through 10::"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    $AGG_ID\u003d`nova aggregate-create \"row 1, racks 6-10\"`"},{"line_number":82,"context_line":"    # for all compute nodes in the system that are in racks 6-10 in row 1..."},{"line_number":83,"context_line":"    nova aggregate-add-host $AGG_ID $HOSTNAME"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a5de9d1_d1cb4571","line":81,"in_reply_to":"7a5de9d1_fb7bc279","updated":"2016-01-27 16:59:21.000000000","message":"Done","commit_id":"963e65836bc14c1e88df2d9e88a63b4f8d10cd70"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"990ea9ae4d8e2874d0f90c17773159ca13d83a4c","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    # for all compute nodes in the system that are in racks 1 in row 3..."},{"line_number":113,"context_line":"    nova aggregate-add-host $AGG_ID $HOSTNAME"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"2) The cloud deployer creates a resource pool that exposes the `DISK` resource"},{"line_number":116,"context_line":"   class representing the NFS share::"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    RP_ID\u003d`nova resource-pool-create \"routed network rack 1 row 3\" \\"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a5de9d1_5e31a4a1","line":115,"range":{"start_line":115,"start_character":64,"end_line":115,"end_character":68},"updated":"2016-01-27 16:45:51.000000000","message":"Not DISK here.","commit_id":"963e65836bc14c1e88df2d9e88a63b4f8d10cd70"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"13a38fe103d61e4f710dc601a2552f63220756ad","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    # for all compute nodes in the system that are in racks 1 in row 3..."},{"line_number":113,"context_line":"    nova aggregate-add-host $AGG_ID $HOSTNAME"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"2) The cloud deployer creates a resource pool that exposes the `DISK` resource"},{"line_number":116,"context_line":"   class representing the NFS share::"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    RP_ID\u003d`nova resource-pool-create \"routed network rack 1 row 3\" \\"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a5de9d1_91c5cd5c","line":115,"range":{"start_line":115,"start_character":64,"end_line":115,"end_character":68},"in_reply_to":"7a5de9d1_5e31a4a1","updated":"2016-01-27 16:59:21.000000000","message":"Done","commit_id":"963e65836bc14c1e88df2d9e88a63b4f8d10cd70"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"990ea9ae4d8e2874d0f90c17773159ca13d83a4c","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    nova aggregate-add-host $AGG_ID $HOSTNAME"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"2) The cloud deployer creates a resource pool that exposes the `DISK` resource"},{"line_number":116,"context_line":"   class representing the NFS share::"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    RP_ID\u003d`nova resource-pool-create \"routed network rack 1 row 3\" \\"},{"line_number":119,"context_line":"        --resource-class\u003d\"IPV4\" --external-id\u003d\"rnA\" \\"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a5de9d1_de1d9410","line":116,"range":{"start_line":116,"start_character":26,"end_line":116,"end_character":35},"updated":"2016-01-27 16:45:51.000000000","message":"routed network","commit_id":"963e65836bc14c1e88df2d9e88a63b4f8d10cd70"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"13a38fe103d61e4f710dc601a2552f63220756ad","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    nova aggregate-add-host $AGG_ID $HOSTNAME"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"2) The cloud deployer creates a resource pool that exposes the `DISK` resource"},{"line_number":116,"context_line":"   class representing the NFS share::"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    RP_ID\u003d`nova resource-pool-create \"routed network rack 1 row 3\" \\"},{"line_number":119,"context_line":"        --resource-class\u003d\"IPV4\" --external-id\u003d\"rnA\" \\"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a5de9d1_31a179aa","line":116,"range":{"start_line":116,"start_character":26,"end_line":116,"end_character":35},"in_reply_to":"7a5de9d1_de1d9410","updated":"2016-01-27 16:59:21.000000000","message":"Done","commit_id":"963e65836bc14c1e88df2d9e88a63b4f8d10cd70"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"990ea9ae4d8e2874d0f90c17773159ca13d83a4c","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    NET_ID\u003d`neutron net-create \"routed network\"`"},{"line_number":129,"context_line":"    SEG_ID\u003d`neutron segment-create $NET_ID`"},{"line_number":130,"context_line":"    neutron subnet-create $SEG_ID --cidr\u003d192.168.10.1/24"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"5) The cloud user creates a port in Neutron, asking for an IP out of a particular subnet::"},{"line_number":133,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a5de9d1_fe98906c","line":130,"updated":"2016-01-27 16:45:51.000000000","message":"Presumably the \"rnA\" network id is something retrieved from here, or passed in here.","commit_id":"963e65836bc14c1e88df2d9e88a63b4f8d10cd70"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"83402b73a7cac99ab24dbea3a4168c349104f0fa","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    NET_ID\u003d`neutron net-create \"routed network\"`"},{"line_number":129,"context_line":"    SEG_ID\u003d`neutron segment-create $NET_ID`"},{"line_number":130,"context_line":"    neutron subnet-create $SEG_ID --cidr\u003d192.168.10.1/24"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"5) The cloud user creates a port in Neutron, asking for an IP out of a particular subnet::"},{"line_number":133,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a5de9d1_91e2ad9e","line":130,"in_reply_to":"7a5de9d1_71761140","updated":"2016-01-27 17:02:33.000000000","message":"Right, but where\u0027s the link with the Neutron side?","commit_id":"963e65836bc14c1e88df2d9e88a63b4f8d10cd70"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"13a38fe103d61e4f710dc601a2552f63220756ad","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    NET_ID\u003d`neutron net-create \"routed network\"`"},{"line_number":129,"context_line":"    SEG_ID\u003d`neutron segment-create $NET_ID`"},{"line_number":130,"context_line":"    neutron subnet-create $SEG_ID --cidr\u003d192.168.10.1/24"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"5) The cloud user creates a port in Neutron, asking for an IP out of a particular subnet::"},{"line_number":133,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a5de9d1_71761140","line":130,"in_reply_to":"7a5de9d1_fe98906c","updated":"2016-01-27 16:59:21.000000000","message":"@alaski: Actually no, \"rnA\" is the *external* identifier for the segment ID of the routed network in Neutron.","commit_id":"963e65836bc14c1e88df2d9e88a63b4f8d10cd70"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"036465ae92f718797938492fd754f0d1b18df594","unresolved":false,"context_lines":[{"line_number":97,"context_line":"--------------------------------------------------------"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"In this (future) scenario, we are assuming the Neutron routed networks"},{"line_number":100,"context_line":"functionality is available in our deployment. There are a set of routed"},{"line_number":101,"context_line":"networks, each containing a set of IP addresses, that represent the physical"},{"line_number":102,"context_line":"network topology in the datacenter. Let us assume that routed network with the"},{"line_number":103,"context_line":"identifier `rnA` represents the subnet IP pool for all compute nodes in rack 1"},{"line_number":104,"context_line":"in row 3 of the datacenter. This subnet has a CIDR of `192.168.10.1/24`. Let us"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7a5de9d1_55b401f1","line":101,"range":{"start_line":100,"start_character":65,"end_line":101,"end_character":8},"updated":"2016-01-28 10:58:35.000000000","message":"Super nit-picky:  This might be clearer as \"network L2 segments with routing between them\" or something like that.  It might help to match Neutron\u0027s terminology by using \"segment\" to refer to each of the L2 broadcast domains.","commit_id":"acbac76e36ab95a121eef1e16abfccf79f642f3f"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"036465ae92f718797938492fd754f0d1b18df594","unresolved":false,"context_lines":[{"line_number":100,"context_line":"functionality is available in our deployment. There are a set of routed"},{"line_number":101,"context_line":"networks, each containing a set of IP addresses, that represent the physical"},{"line_number":102,"context_line":"network topology in the datacenter. Let us assume that routed network with the"},{"line_number":103,"context_line":"identifier `rnA` represents the subnet IP pool for all compute nodes in rack 1"},{"line_number":104,"context_line":"in row 3 of the datacenter. This subnet has a CIDR of `192.168.10.1/24`. Let us"},{"line_number":105,"context_line":"also assume that unmanaged devices are consuming the bottom 5 IP addresses on"},{"line_number":106,"context_line":"the subnet."}],"source_content_type":"text/x-rst","patch_set":5,"id":"7a5de9d1_18dec06d","line":103,"range":{"start_line":103,"start_character":12,"end_line":103,"end_character":15},"updated":"2016-01-28 10:58:35.000000000","message":"Maybe \"segmentA\"","commit_id":"acbac76e36ab95a121eef1e16abfccf79f642f3f"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"036465ae92f718797938492fd754f0d1b18df594","unresolved":false,"context_lines":[{"line_number":105,"context_line":"also assume that unmanaged devices are consuming the bottom 5 IP addresses on"},{"line_number":106,"context_line":"the subnet."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"1) The cloud deployer creates an aggregate representing all the compute"},{"line_number":109,"context_line":"   nodes in row 3, racks 1 through 5::"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    AGG_ID\u003d`nova aggregate-create \"row 3, rack 1\"`"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7a5de9d1_98bab0e0","line":108,"range":{"start_line":108,"start_character":7,"end_line":108,"end_character":22},"updated":"2016-01-28 10:58:35.000000000","message":"I notice that the cloud deployer is going to have a little bit of duplicate work to do.  Essentially, he/she has to tell Neutron and Nova the same mapping of hosts to segments in just slightly different ways.  Any ideas?  Maybe Neutron could manage the aggregates in Nova on behalf of the deployer?","commit_id":"acbac76e36ab95a121eef1e16abfccf79f642f3f"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"bb1cb709bb67e407321c3f5ecf9e53ad60c08d53","unresolved":false,"context_lines":[{"line_number":105,"context_line":"also assume that unmanaged devices are consuming the bottom 5 IP addresses on"},{"line_number":106,"context_line":"the subnet."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"1) The cloud deployer creates an aggregate representing all the compute"},{"line_number":109,"context_line":"   nodes in row 3, racks 1 through 5::"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    AGG_ID\u003d`nova aggregate-create \"row 3, rack 1\"`"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7a5de9d1_1816b255","line":108,"range":{"start_line":108,"start_character":7,"end_line":108,"end_character":22},"in_reply_to":"7a5de9d1_98bab0e0","updated":"2016-01-28 14:29:26.000000000","message":"So in the common use cases, they probably need these aggregates for other things anyways.\n\nI think we are OK for now.","commit_id":"acbac76e36ab95a121eef1e16abfccf79f642f3f"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"036465ae92f718797938492fd754f0d1b18df594","unresolved":false,"context_lines":[{"line_number":116,"context_line":"   resource class representing the routed network\u0027s pool of IPs::"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    RP_ID\u003d`nova resource-pool-create \"routed network rack 1 row 3\" \\"},{"line_number":119,"context_line":"        --resource-class\u003d\"IPV4\" --external-id\u003d\"rnA\" \\"},{"line_number":120,"context_line":"        --capacity\u003d254 --reserved\u003d5"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"3) The cloud deployer associates the aggregate with the resource pool::"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7a5de9d1_f8c1642f","line":119,"range":{"start_line":119,"start_character":26,"end_line":119,"end_character":30},"updated":"2016-01-28 10:58:35.000000000","message":"Note:  You may have already had this in mind but the whole thing will work just as well with IPV6.  In fact, we fully expect to support dual stack deployments which will use both simultaneously.\n\nThinking about this, it is extremely unlikely that anyone will ever use an IPv6 subnet small enough to ever be exhausted.  However, it will still be necessary to make use of resource pools for IPv6 restrict live migration.\n\nA typical IPv6 subnet (/64) has around 18 quintillion addresses.  Seems silly to even bother recording inventory and allocations with this many addresses.  But, I suspect we\u0027ll still have to do so in order for the live migrate to work correctly.\n\n  --capacity\u003d18446744073709551616","commit_id":"acbac76e36ab95a121eef1e16abfccf79f642f3f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"c9bf21cd9a81fedf853e7c00d678f518bdec8cda","unresolved":false,"context_lines":[{"line_number":116,"context_line":"   resource class representing the routed network\u0027s pool of IPs::"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    RP_ID\u003d`nova resource-pool-create \"routed network rack 1 row 3\" \\"},{"line_number":119,"context_line":"        --resource-class\u003d\"IPV4\" --external-id\u003d\"rnA\" \\"},{"line_number":120,"context_line":"        --capacity\u003d254 --reserved\u003d5"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"3) The cloud deployer associates the aggregate with the resource pool::"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7a5de9d1_b57e95e2","line":119,"updated":"2016-01-28 09:59:59.000000000","message":"if it\u0027s IPV4_ADDRESS above should it be here?","commit_id":"acbac76e36ab95a121eef1e16abfccf79f642f3f"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"bb1cb709bb67e407321c3f5ecf9e53ad60c08d53","unresolved":false,"context_lines":[{"line_number":116,"context_line":"   resource class representing the routed network\u0027s pool of IPs::"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    RP_ID\u003d`nova resource-pool-create \"routed network rack 1 row 3\" \\"},{"line_number":119,"context_line":"        --resource-class\u003d\"IPV4\" --external-id\u003d\"rnA\" \\"},{"line_number":120,"context_line":"        --capacity\u003d254 --reserved\u003d5"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"3) The cloud deployer associates the aggregate with the resource pool::"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7a5de9d1_2b5f96e6","line":119,"range":{"start_line":119,"start_character":26,"end_line":119,"end_character":30},"in_reply_to":"7a5de9d1_f8c1642f","updated":"2016-01-28 14:29:26.000000000","message":"FWIW, its not quite that simple, as you still have switch table issues with IPv6, so you don\u0027t want to hand out loads, but it should be easy to give more IP address than you have physical space, so yeah, you shouldn\u0027t really hit that problem.","commit_id":"acbac76e36ab95a121eef1e16abfccf79f642f3f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"c9bf21cd9a81fedf853e7c00d678f518bdec8cda","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    nova resource-pool-aggregate-associate $AGG_ID $RP_ID"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"4) The network administrator creates a network and routed network segments representing broadcast domains for each rack in row 3::"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    NET_ID\u003d`neutron net-create \"routed network\"`"},{"line_number":129,"context_line":"    SEG_ID\u003d`neutron segment-create $NET_ID`"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7a5de9d1_5583a1cc","line":126,"updated":"2016-01-28 09:59:59.000000000","message":"test fail on this line length","commit_id":"acbac76e36ab95a121eef1e16abfccf79f642f3f"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"036465ae92f718797938492fd754f0d1b18df594","unresolved":false,"context_lines":[{"line_number":126,"context_line":"4) The network administrator creates a network and routed network segments representing broadcast domains for each rack in row 3::"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    NET_ID\u003d`neutron net-create \"routed network\"`"},{"line_number":129,"context_line":"    SEG_ID\u003d`neutron segment-create $NET_ID`"},{"line_number":130,"context_line":"    neutron subnet-create $SEG_ID --cidr\u003d192.168.10.1/24"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"5) The cloud user creates a port in Neutron, asking for an IP out of a particular subnet::"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7a5de9d1_33c87d55","line":129,"range":{"start_line":129,"start_character":12,"end_line":129,"end_character":42},"updated":"2016-01-28 10:58:35.000000000","message":"Note that this is subject to change but the general idea that you create multiple segments underneath a network and then create subnets on those segments will remain pretty much the same.","commit_id":"acbac76e36ab95a121eef1e16abfccf79f642f3f"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"036465ae92f718797938492fd754f0d1b18df594","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    NET_ID\u003d`neutron net-create \"routed network\"`"},{"line_number":129,"context_line":"    SEG_ID\u003d`neutron segment-create $NET_ID`"},{"line_number":130,"context_line":"    neutron subnet-create $SEG_ID --cidr\u003d192.168.10.1/24"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"5) The cloud user creates a port in Neutron, asking for an IP out of a particular subnet::"},{"line_number":133,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"7a5de9d1_931291b3","line":130,"range":{"start_line":130,"start_character":25,"end_line":130,"end_character":26},"updated":"2016-01-28 10:58:35.000000000","message":"nit:  --segment-id $SEG_ID might be clearer to distinguish this from creating a port using a $NET_ID.  There is still the caveat that the exact syntax is subject to change and so this is all meant to just give the reader an idea of what we\u0027re doing.","commit_id":"acbac76e36ab95a121eef1e16abfccf79f642f3f"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"036465ae92f718797938492fd754f0d1b18df594","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"5) The cloud user creates a port in Neutron, asking for an IP out of a particular subnet::"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    PORT_ID\u003d`neutron port-create --network-id\u003d$SUBNET_ID`"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"6) The cloud user boots an instance, specifying the ID of the port created"},{"line_number":137,"context_line":"   in step 5::"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7a5de9d1_4e09ce2b","line":134,"range":{"start_line":134,"start_character":47,"end_line":134,"end_character":56},"updated":"2016-01-28 10:58:35.000000000","message":"While this is a valid use case that should be considered, I don\u0027t expect this to be the common use case.  I expect the common use case -- and the one that we will encourage -- will result in a port that does not have an IP address:\n\nPORT_ID\u003d$(neutron port-create --network-id\u003d$NET_ID)\n\nSo, in this more common case, the scheduler would not be constrained in the same way.  The scheduler should only be constrained by availability of an IP addresses in the segments but won\u0027t be constrained to any one particular segment.","commit_id":"acbac76e36ab95a121eef1e16abfccf79f642f3f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"c9bf21cd9a81fedf853e7c00d678f518bdec8cda","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    nova boot --network port_id\u003d$PORT_ID"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"7) During (or perhaps before) the scheduling process, Nova will want to answer"},{"line_number":142,"context_line":"   the question, \"is this port ID a member of a resource pool containing `IPV4`"},{"line_number":143,"context_line":"   resources?\". In order to answer this question, Nova would issue the"},{"line_number":144,"context_line":"   following SQL queries::"},{"line_number":145,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"7a5de9d1_75881de8","line":142,"updated":"2016-01-28 09:59:59.000000000","message":"_ADDRESS?","commit_id":"acbac76e36ab95a121eef1e16abfccf79f642f3f"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"036465ae92f718797938492fd754f0d1b18df594","unresolved":false,"context_lines":[{"line_number":144,"context_line":"   following SQL queries::"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    SELECT rp.uuid FROM resource_pools rp"},{"line_number":147,"context_line":"    WHERE rp.external_id \u003d $SEG_ID;"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"   If the above query returned a record, then the Nova scheduler would be able"},{"line_number":150,"context_line":"   to winnow the set of compute nodes used in placement decisions by querying"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7a5de9d1_eee43a3c","line":147,"range":{"start_line":147,"start_character":28,"end_line":147,"end_character":34},"updated":"2016-01-28 10:58:35.000000000","message":"There is a little bit of a leap here.  First, Nova will have to resolve the PORT_ID into a SEG_ID which probably means a call in to Neutron.  Whether Neutron returns a SEG_ID or None as a result of this call will be indicate which of the use cases I mentioned in my comment on L134 is being used.","commit_id":"acbac76e36ab95a121eef1e16abfccf79f642f3f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"c9bf21cd9a81fedf853e7c00d678f518bdec8cda","unresolved":false,"context_lines":[{"line_number":244,"context_line":"    );"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"REST API impact"},{"line_number":247,"context_line":"---------------"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"*Note*: *ALL* below API calls are meant only for cloud administrators."},{"line_number":250,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"7a5de9d1_156e892f","line":247,"updated":"2016-01-28 09:59:59.000000000","message":"Just to note, the resource class identifiers used in this section are out of date with the resource-classes spec, but that\u0027s okay.","commit_id":"acbac76e36ab95a121eef1e16abfccf79f642f3f"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"bb1cb709bb67e407321c3f5ecf9e53ad60c08d53","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":"*Note*: *ALL* below API calls are meant only for cloud administrators."},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"The following new Compute API calls will be added:"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"`POST /resource_pools`"},{"line_number":254,"context_line":"**********************"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7a5de9d1_0b9dfa58","line":251,"updated":"2016-01-28 14:29:26.000000000","message":"I think we want to make this into a separate scheduler API, like we did with the volume API just before we split it out of Nova?","commit_id":"acbac76e36ab95a121eef1e16abfccf79f642f3f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"df1db1c33c7319e61d144f727c504cafbd112223","unresolved":false,"context_lines":[{"line_number":30,"context_line":"certain resources, Nova naively calculates resource usage and availability by"},{"line_number":31,"context_line":"simply summing amounts across all compute nodes in its database. This ends up"},{"line_number":32,"context_line":"causing a number of problems [1] with usage and capacity amounts being"},{"line_number":33,"context_line":"incorrect."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Use Cases"},{"line_number":36,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"5a5ae5dd_31bd1902","line":33,"updated":"2016-02-08 21:09:12.000000000","message":"@johnthetubaguy: I\u0027ll add a note to the section on REST API below that it should be done in a different directory than /nova/api/openstack/compute, sure.","commit_id":"bd0ccb2c4d85fa0005a51df2fe3e1a2fa83de728"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"638dae4fbfe880bc82e77d02d1a405d444b96c3b","unresolved":false,"context_lines":[{"line_number":30,"context_line":"certain resources, Nova naively calculates resource usage and availability by"},{"line_number":31,"context_line":"simply summing amounts across all compute nodes in its database. This ends up"},{"line_number":32,"context_line":"causing a number of problems [1] with usage and capacity amounts being"},{"line_number":33,"context_line":"incorrect."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Use Cases"},{"line_number":36,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7a5de9d1_4d302ae9","line":33,"updated":"2016-02-02 11:59:47.000000000","message":"Maybe lets also note that any API should be separate from the compute API, so its easier to extract from the project as later date without the need for any API proxy work.","commit_id":"bd0ccb2c4d85fa0005a51df2fe3e1a2fa83de728"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"638dae4fbfe880bc82e77d02d1a405d444b96c3b","unresolved":false,"context_lines":[{"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 local to the"},{"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"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7a5de9d1_5b2467c5","line":48,"range":{"start_line":48,"start_character":60,"end_line":48,"end_character":72},"updated":"2016-02-02 11:59:47.000000000","message":"Nit: sometimes they are only connected to a subset of hosts, so maybe something like:\n\n\"are attached to, or close to\"?","commit_id":"bd0ccb2c4d85fa0005a51df2fe3e1a2fa83de728"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"df1db1c33c7319e61d144f727c504cafbd112223","unresolved":false,"context_lines":[{"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 local to the"},{"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"}],"source_content_type":"text/x-rst","patch_set":6,"id":"5a5ae5dd_51b8d510","line":48,"updated":"2016-02-08 21:09:12.000000000","message":"done.","commit_id":"bd0ccb2c4d85fa0005a51df2fe3e1a2fa83de728"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"df1db1c33c7319e61d144f727c504cafbd112223","unresolved":false,"context_lines":[{"line_number":52,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"We propose to introduce the concept of a `resource pool` in Nova, and to create"},{"line_number":55,"context_line":"an API that allows the querying and management of these resource pools. A"},{"line_number":56,"context_line":"resource pool will not be specifically associated with shared storage. Instead,"},{"line_number":57,"context_line":"the resource pool will be a container and manager of any class of resources"},{"line_number":58,"context_line":"(thus the term \"generic resource pool\" is used here). Naturally, the"}],"source_content_type":"text/x-rst","patch_set":6,"id":"5a5ae5dd_f139c1a4","line":55,"updated":"2016-02-08 21:09:12.000000000","message":"No, a REST API. See below.","commit_id":"bd0ccb2c4d85fa0005a51df2fe3e1a2fa83de728"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"638dae4fbfe880bc82e77d02d1a405d444b96c3b","unresolved":false,"context_lines":[{"line_number":52,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"We propose to introduce the concept of a `resource pool` in Nova, and to create"},{"line_number":55,"context_line":"an API that allows the querying and management of these resource pools. A"},{"line_number":56,"context_line":"resource pool will not be specifically associated with shared storage. Instead,"},{"line_number":57,"context_line":"the resource pool will be a container and manager of any class of resources"},{"line_number":58,"context_line":"(thus the term \"generic resource pool\" is used here). Naturally, the"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7a5de9d1_edfd5609","line":55,"range":{"start_line":55,"start_character":0,"end_line":55,"end_character":6},"updated":"2016-02-02 11:59:47.000000000","message":"a scheduler API?","commit_id":"bd0ccb2c4d85fa0005a51df2fe3e1a2fa83de728"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"df1db1c33c7319e61d144f727c504cafbd112223","unresolved":false,"context_lines":[{"line_number":85,"context_line":"2) The cloud deployer creates a resource pool that exposes the `DISK` resource"},{"line_number":86,"context_line":"   class representing the NFS share::"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    $RP_ID\u003d`nova resource-pool-create \"/mnt/nfs/row1racks0610/\" \\"},{"line_number":89,"context_line":"        --external-id\u003d\"34372241-2c0c-4da3-a08e-19ffb6367ace\" \\"},{"line_number":90,"context_line":"        --capacity\u003d100000 --reserved\u003d1000"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"5a5ae5dd_113d7d8e","line":88,"updated":"2016-02-08 21:09:12.000000000","message":"Eventually, but right now this is Nova...","commit_id":"bd0ccb2c4d85fa0005a51df2fe3e1a2fa83de728"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"638dae4fbfe880bc82e77d02d1a405d444b96c3b","unresolved":false,"context_lines":[{"line_number":85,"context_line":"2) The cloud deployer creates a resource pool that exposes the `DISK` resource"},{"line_number":86,"context_line":"   class representing the NFS share::"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    $RP_ID\u003d`nova resource-pool-create \"/mnt/nfs/row1racks0610/\" \\"},{"line_number":89,"context_line":"        --external-id\u003d\"34372241-2c0c-4da3-a08e-19ffb6367ace\" \\"},{"line_number":90,"context_line":"        --capacity\u003d100000 --reserved\u003d1000"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"7a5de9d1_0d9f92b5","line":88,"range":{"start_line":88,"start_character":12,"end_line":88,"end_character":16},"updated":"2016-02-02 11:59:47.000000000","message":"scheduler? or gantt?","commit_id":"bd0ccb2c4d85fa0005a51df2fe3e1a2fa83de728"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"638dae4fbfe880bc82e77d02d1a405d444b96c3b","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"3) The cloud deployer associates the aggregate with the resource pool::"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    nova resource-pool-aggregate-associate $AGG_ID $RP_ID"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Scenario 2a: Using Neutron routed networks functionality"},{"line_number":97,"context_line":"--------------------------------------------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7a5de9d1_8dab82d6","line":94,"range":{"start_line":94,"start_character":4,"end_line":94,"end_character":8},"updated":"2016-02-02 11:59:47.000000000","message":"scheduler? or gantt?","commit_id":"bd0ccb2c4d85fa0005a51df2fe3e1a2fa83de728"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"915225c463defc460a3461879ff6bfac2df85c3d","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    nova resource-pool-aggregate-associate $AGG_ID $RP_ID"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"4) The network administrator creates a network and routed network segments representing"},{"line_number":127,"context_line":"   broadcast domains for each rack in row 3::"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    NET_ID\u003d`neutron net-create \"routed network\"`"}],"source_content_type":"text/x-rst","patch_set":6,"id":"5a5ae5dd_77b76af5","line":126,"updated":"2016-02-05 11:26:36.000000000","message":"nit: this line makes mr. Jenkins unhappy","commit_id":"bd0ccb2c4d85fa0005a51df2fe3e1a2fa83de728"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"915225c463defc460a3461879ff6bfac2df85c3d","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    SEG_ID\u003d`neutron segment-create $NET_ID`"},{"line_number":131,"context_line":"    neutron subnet-create $SEG_ID --cidr\u003d192.168.10.1/24"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"5) The cloud user creates a port in Neutron, asking for an IP out of a particular subnet::"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    PORT_ID\u003d`neutron port-create --network-id\u003d$SUBNET_ID`"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"5a5ae5dd_d7c65e67","line":133,"updated":"2016-02-05 11:26:36.000000000","message":"Same as above","commit_id":"bd0ccb2c4d85fa0005a51df2fe3e1a2fa83de728"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"638dae4fbfe880bc82e77d02d1a405d444b96c3b","unresolved":false,"context_lines":[{"line_number":132,"context_line":""},{"line_number":133,"context_line":"5) The cloud user creates a port in Neutron, asking for an IP out of a particular subnet::"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    PORT_ID\u003d`neutron port-create --network-id\u003d$SUBNET_ID`"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"6) The cloud user boots an instance, specifying the ID of the port created"},{"line_number":138,"context_line":"   in step 5::"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7a5de9d1_b06b35f1","line":135,"updated":"2016-02-02 11:59:47.000000000","message":"Honestly, I think the more interesting case is when this port is only bound the the NET_ID, so we need to pick the correct segment that has available IP addresses for that network.\n\nThis case you mention is basically covered by the live-migrate case you have below.","commit_id":"bd0ccb2c4d85fa0005a51df2fe3e1a2fa83de728"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"df1db1c33c7319e61d144f727c504cafbd112223","unresolved":false,"context_lines":[{"line_number":145,"context_line":"   following SQL queries::"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    SELECT rp.uuid FROM resource_pools rp"},{"line_number":148,"context_line":"    WHERE rp.external_id \u003d $SEG_ID;"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"   If the above query returned a record, then the Nova scheduler would be able"},{"line_number":151,"context_line":"   to winnow the set of compute nodes used in placement decisions by querying"}],"source_content_type":"text/x-rst","patch_set":6,"id":"5a5ae5dd_b13fc985","line":148,"updated":"2016-02-08 21:09:12.000000000","message":"@johnthetubaguy: that is precisely what I was thinking to do, yes. But, frankly, we\u0027re a ways away from this all being reality in Neutron, so we can tackle this problem later, IMHO.","commit_id":"bd0ccb2c4d85fa0005a51df2fe3e1a2fa83de728"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"22e132ed6c8e4f4d336f226d2f01243582b07a55","unresolved":false,"context_lines":[{"line_number":145,"context_line":"   following SQL queries::"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    SELECT rp.uuid FROM resource_pools rp"},{"line_number":148,"context_line":"    WHERE rp.external_id \u003d $SEG_ID;"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"   If the above query returned a record, then the Nova scheduler would be able"},{"line_number":151,"context_line":"   to winnow the set of compute nodes used in placement decisions by querying"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7a5de9d1_299d5e59","line":148,"updated":"2016-01-28 14:55:14.000000000","message":"I know that\u0027s something which has been discussed so I just want to clarify :\nthe user provides a $PORT_ID as part of the RequestSpec (which is not the case yet) and somewhere a translation is made to get a $SEG_ID before we narrow by doing the above SQL query?","commit_id":"bd0ccb2c4d85fa0005a51df2fe3e1a2fa83de728"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"638dae4fbfe880bc82e77d02d1a405d444b96c3b","unresolved":false,"context_lines":[{"line_number":145,"context_line":"   following SQL queries::"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    SELECT rp.uuid FROM resource_pools rp"},{"line_number":148,"context_line":"    WHERE rp.external_id \u003d $SEG_ID;"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"   If the above query returned a record, then the Nova scheduler would be able"},{"line_number":151,"context_line":"   to winnow the set of compute nodes used in placement decisions by querying"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7a5de9d1_c3294939","line":148,"in_reply_to":"7a5de9d1_299d5e59","updated":"2016-02-02 11:59:47.000000000","message":"Yes, you need to get the port info from neutron, to get the segment_id.\n\nI think this means, when passed in port_uuids, we will have to list them in the conductor, before we call the scheduler, somewhere in here:\nhttps://github.com/openstack/nova/blob/master/nova/conductor/manager.py#L369\n\nThat or it should feature in the request_networks stuff, somehow? I am a bit unsure.","commit_id":"bd0ccb2c4d85fa0005a51df2fe3e1a2fa83de728"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"22e132ed6c8e4f4d336f226d2f01243582b07a55","unresolved":false,"context_lines":[{"line_number":190,"context_line":""},{"line_number":191,"context_line":"The above query will return only the compute hosts that are in the same"},{"line_number":192,"context_line":"aggregate as the one associated with the resource pool representing the IPv4"},{"line_number":193,"context_line":"routed network that the instance was originally launched in."},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"Alternatives"},{"line_number":196,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7a5de9d1_c9404aa8","line":193,"updated":"2016-01-28 14:55:14.000000000","message":"Since the scheduler doesn\u0027t know whether it\u0027s a move operation or an instance creation where it\u0027s being called (by select_destinations() ), I guess you plan to do that call against the instance UUID anyway, no ?","commit_id":"bd0ccb2c4d85fa0005a51df2fe3e1a2fa83de728"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"638dae4fbfe880bc82e77d02d1a405d444b96c3b","unresolved":false,"context_lines":[{"line_number":190,"context_line":""},{"line_number":191,"context_line":"The above query will return only the compute hosts that are in the same"},{"line_number":192,"context_line":"aggregate as the one associated with the resource pool representing the IPv4"},{"line_number":193,"context_line":"routed network that the instance was originally launched in."},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"Alternatives"},{"line_number":196,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7a5de9d1_e3fd6509","line":193,"in_reply_to":"7a5de9d1_c9404aa8","updated":"2016-02-02 11:59:47.000000000","message":"So this is the same case you get when a port_uuid already has an association with a segment. We need a host on the given segment.\n\nI do wonder if its worth mentioning the case where you want to live-migrate within the same shared storage cluster to avoid a block-migration?","commit_id":"bd0ccb2c4d85fa0005a51df2fe3e1a2fa83de728"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"df1db1c33c7319e61d144f727c504cafbd112223","unresolved":false,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":"*Note*: *ALL* below API calls are meant only for cloud administrators."},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"The following new Compute API calls will be added:"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"`POST /resource_pools`"},{"line_number":255,"context_line":"**********************"}],"source_content_type":"text/x-rst","patch_set":6,"id":"5a5ae5dd_d142850e","line":252,"updated":"2016-02-08 21:09:12.000000000","message":"We don\u0027t have a scheduler REST API, though, John. I will add a note that these should be in a non-compute directory of the nova/api/openstack module.","commit_id":"bd0ccb2c4d85fa0005a51df2fe3e1a2fa83de728"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"638dae4fbfe880bc82e77d02d1a405d444b96c3b","unresolved":false,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":"*Note*: *ALL* below API calls are meant only for cloud administrators."},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"The following new Compute API calls will be added:"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"`POST /resource_pools`"},{"line_number":255,"context_line":"**********************"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7a5de9d1_a3a9ad92","line":252,"updated":"2016-02-02 11:59:47.000000000","message":"yeah, lets make these scheduler ones.","commit_id":"bd0ccb2c4d85fa0005a51df2fe3e1a2fa83de728"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"aabcc44af5c5e31cd19529f90ff74c64ff8edf64","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    # for all compute nodes in the system that are in racks 6-10 in row 1..."},{"line_number":83,"context_line":"    nova aggregate-add-host $AGG_ID $HOSTNAME"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"2) The cloud deployer creates a resource pool that exposes the `DISK` resource"},{"line_number":86,"context_line":"   class representing the NFS share::"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    $RP_ID\u003d`nova resource-pool-create \"/mnt/nfs/row1racks0610/\" \\"}],"source_content_type":"text/x-rst","patch_set":7,"id":"5a5ae5dd_12f6b6d7","line":85,"updated":"2016-02-09 12:17:03.000000000","message":"DISK_GB","commit_id":"49988d88d2c187ac527f2ca5582bdb2f5fc61550"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"aabcc44af5c5e31cd19529f90ff74c64ff8edf64","unresolved":false,"context_lines":[{"line_number":85,"context_line":"2) The cloud deployer creates a resource pool that exposes the `DISK` resource"},{"line_number":86,"context_line":"   class representing the NFS share::"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    $RP_ID\u003d`nova resource-pool-create \"/mnt/nfs/row1racks0610/\" \\"},{"line_number":89,"context_line":"        --external-id\u003d\"34372241-2c0c-4da3-a08e-19ffb6367ace\" \\"},{"line_number":90,"context_line":"        --capacity\u003d100000 --reserved\u003d1000"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"5a5ae5dd_b20242b3","line":88,"updated":"2016-02-09 12:17:03.000000000","message":"--resource-class\u003d\u0027DISK_GB\u0027","commit_id":"49988d88d2c187ac527f2ca5582bdb2f5fc61550"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"575d15503670ce85b164e64b3be7a113d624b6c7","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"3) The cloud deployer associates the aggregate with the resource pool::"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    nova resource-pool-aggregate-associate $AGG_ID $RP_ID"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Scenario 2a: Using Neutron routed networks functionality"},{"line_number":97,"context_line":"--------------------------------------------------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"5a5ae5dd_66af1a7e","line":94,"updated":"2016-02-09 17:05:27.000000000","message":"Hi Giridhar, sorry for the delayed reply!\n\nSo, the host aggregate doesn\u0027t have an available capacity or usage. The host aggregate is simply a collection of compute hosts, nothing more. One or more resource pools may be associated with a host aggregate, but for the initial scope of this blueprint, we are sticking with emulating the existing situation in Nova where one uses shared storage: there can only be a single shared storage pool serving disk resources for virtual machine images.\n\nRegarding your question about how the \"selected shared disk information is sent down to the driver\", in the future, when we allow multiple resource pools for a particular resource class (say, disk) to be attached to a single host aggregate, then when the scheduler claims some resources for an instance, it would claim directly out of one of those pools, and the launch request that the compute host receives would contain that information.\n\nHowever, for this generic resource pools spec, we are simply focused on the use case of a single shared resource pool of a resource class. See the resource-providers-scheduler blueprint for more information about how the scheduler will use the resource pools inventory information.","commit_id":"49988d88d2c187ac527f2ca5582bdb2f5fc61550"},{"author":{"_account_id":16929,"name":"Giridhar Jayavelu","email":"gjayavelu@vmware.com","username":"gjayavelu"},"change_message_id":"7e8df883f2d4a26e3c8a484229cd3a76e203bab1","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"3) The cloud deployer associates the aggregate with the resource pool::"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    nova resource-pool-aggregate-associate $AGG_ID $RP_ID"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Scenario 2a: Using Neutron routed networks functionality"},{"line_number":97,"context_line":"--------------------------------------------------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"5a5ae5dd_ad366fe5","line":94,"updated":"2016-02-09 07:19:37.000000000","message":"would be great if you can add some notes on how the usage and available capacity for the host aggregate will be calculated by using resource pool.\n\nI\u0027m trying to understand the scenario when there are multiple shared disks and corresponding resource pools, then how the selected shared disk information is sent down to the driver.\n\nFor example, if there are 2 disk resource pools A \u0026 B associated to one host aggregate. When we boot an instance, assuming resource pool A is selected, then \u0027used\u0027 value in resource pool A will be updated. But, is there a guarantee that the instance will be placed on shared disk that corresponds to resource pool A?","commit_id":"49988d88d2c187ac527f2ca5582bdb2f5fc61550"},{"author":{"_account_id":16929,"name":"Giridhar Jayavelu","email":"gjayavelu@vmware.com","username":"gjayavelu"},"change_message_id":"d4e241e8b162f2acfb5b7e68102cf477280b36c1","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"3) The cloud deployer associates the aggregate with the resource pool::"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    nova resource-pool-aggregate-associate $AGG_ID $RP_ID"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Scenario 2a: Using Neutron routed networks functionality"},{"line_number":97,"context_line":"--------------------------------------------------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"5a5ae5dd_1100e2a9","line":94,"in_reply_to":"5a5ae5dd_66af1a7e","updated":"2016-02-09 17:19:06.000000000","message":"Hi Jay,\nNo problem and thanks for the details.\n\nWith single shared resource pool for a resource class, it makes sense.","commit_id":"49988d88d2c187ac527f2ca5582bdb2f5fc61550"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"aabcc44af5c5e31cd19529f90ff74c64ff8edf64","unresolved":false,"context_lines":[{"line_number":116,"context_line":"   resource class representing the routed network\u0027s pool of IPs::"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    RP_ID\u003d`nova resource-pool-create \"routed network rack 1 row 3\" \\"},{"line_number":119,"context_line":"        --resource-class\u003d\"IPV4\" --external-id\u003d\"rnA\" \\"},{"line_number":120,"context_line":"        --capacity\u003d254 --reserved\u003d5"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"3) The cloud deployer associates the aggregate with the resource pool::"}],"source_content_type":"text/x-rst","patch_set":7,"id":"5a5ae5dd_d2ffbea8","line":119,"updated":"2016-02-09 12:17:03.000000000","message":"IPV4_ADDRESS","commit_id":"49988d88d2c187ac527f2ca5582bdb2f5fc61550"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ed371332d1825d03915de20910072e0097c52978","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"What this gives the cloud user is basic network affinity during scheduling,"},{"line_number":162,"context_line":"with the cloud user only needing to specify a port ID they created in a"},{"line_number":163,"context_line":"particular subnet."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"Scenario 2b: Live migration of instance booted in scenario 2a"},{"line_number":166,"context_line":"-------------------------------------------------------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3a57f1b5_f3a53ab5","line":163,"updated":"2016-02-09 18:59:30.000000000","message":"I really think we need to cover the details around who the IP reserved count is updated by Neutron.\n\nThe hope is to avoid an extra expensive migration, or similar for this case, by worrying about how that works now.","commit_id":"49988d88d2c187ac527f2ca5582bdb2f5fc61550"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ed371332d1825d03915de20910072e0097c52978","unresolved":false,"context_lines":[{"line_number":252,"context_line":""},{"line_number":253,"context_line":"*Note*: All of the below API calls should be implemented in"},{"line_number":254,"context_line":"`/nova/api/openstack/scheduler/`, **not** in `/nova/api/openstack/compute/`"},{"line_number":255,"context_line":"since these calls will be part of the split-out scheduler REST API."},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"The following new REST API calls will be added:"},{"line_number":258,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"3a57f1b5_f3f21a6f","line":255,"updated":"2016-02-09 18:59:30.000000000","message":"we should probably be clear that we are using microversions, and this starts with version 1.0? next version is 1.1 even if its backwards in compatible, etc, etc.","commit_id":"49988d88d2c187ac527f2ca5582bdb2f5fc61550"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"aabcc44af5c5e31cd19529f90ff74c64ff8edf64","unresolved":false,"context_lines":[{"line_number":266,"context_line":"    {"},{"line_number":267,"context_line":"        \"name\": \"Global NFS share\","},{"line_number":268,"context_line":"        \"external_id\": \"34372241-2c0c-4da3-a08e-19ffb6367ace\","},{"line_number":269,"context_line":"        \"resource_class\": \"DISK\","},{"line_number":270,"context_line":"        \"capacity\": 2048,"},{"line_number":271,"context_line":"        \"reserved\": 10,"},{"line_number":272,"context_line":"        \"min_unit\": 1,"}],"source_content_type":"text/x-rst","patch_set":7,"id":"5a5ae5dd_722b6a34","line":269,"updated":"2016-02-09 12:17:03.000000000","message":"DISK_GB","commit_id":"49988d88d2c187ac527f2ca5582bdb2f5fc61550"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"aabcc44af5c5e31cd19529f90ff74c64ff8edf64","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        \"uuid\": \"eaaf1c04-ced2-40e4-89a2-87edded06d64\","},{"line_number":284,"context_line":"        \"external_id\": \"34372241-2c0c-4da3-a08e-19ffb6367ace\","},{"line_number":285,"context_line":"        \"name\": \"Global NFS share\","},{"line_number":286,"context_line":"        \"resource_class\": \"disk\","},{"line_number":287,"context_line":"        \"capacity\": 2048,"},{"line_number":288,"context_line":"        \"reserved\": 10,"},{"line_number":289,"context_line":"        \"allocation_ratio\": 1.0,"}],"source_content_type":"text/x-rst","patch_set":7,"id":"5a5ae5dd_923066a0","line":286,"updated":"2016-02-09 12:17:03.000000000","message":"DISK_GB","commit_id":"49988d88d2c187ac527f2ca5582bdb2f5fc61550"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ed371332d1825d03915de20910072e0097c52978","unresolved":false,"context_lines":[{"line_number":299,"context_line":"          \"url\": \"/resource_pools/eaaf1c04-ced2-40e4-89a2-87edded06d64/aggregates\""},{"line_number":300,"context_line":"        }"},{"line_number":301,"context_line":"      ]"},{"line_number":302,"context_line":"    }"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"`PUT /resource_pools/{uuid}`"},{"line_number":305,"context_line":"****************************"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3a57f1b5_9382c6c7","line":302,"updated":"2016-02-09 18:59:30.000000000","message":"We need JSON schema for incoming payloads for the POST and PUT requests, as per what the spec template requests.","commit_id":"49988d88d2c187ac527f2ca5582bdb2f5fc61550"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"aabcc44af5c5e31cd19529f90ff74c64ff8edf64","unresolved":false,"context_lines":[{"line_number":365,"context_line":"        \"uuid\": \"b6b065cc-fcd9-4342-a7b0-2aed2d146518\","},{"line_number":366,"context_line":"        \"external_id\": \"34372241-2c0c-4da3-a08e-19ffb6367ace\","},{"line_number":367,"context_line":"        \"name\": \"RBD volume group\","},{"line_number":368,"context_line":"        \"resource_class\": \"DISK\","},{"line_number":369,"context_line":"        \"capacity\": 2048,"},{"line_number":370,"context_line":"        \"reserved\": 10,"},{"line_number":371,"context_line":"        \"allocation_ratio\": 1.0,"}],"source_content_type":"text/x-rst","patch_set":7,"id":"5a5ae5dd_3225f25b","line":368,"updated":"2016-02-09 12:17:03.000000000","message":"DISK_GB","commit_id":"49988d88d2c187ac527f2ca5582bdb2f5fc61550"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"aabcc44af5c5e31cd19529f90ff74c64ff8edf64","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        {"},{"line_number":395,"context_line":"          \"uuid\": \"b6b065cc-fcd9-4342-a7b0-2aed2d146518\","},{"line_number":396,"context_line":"          \"name\": \"RBD volume group\","},{"line_number":397,"context_line":"          \"resource_class\": \"DISK\","},{"line_number":398,"context_line":"          \"capacity\": 2048,"},{"line_number":399,"context_line":"          \"reserved\": 10,"},{"line_number":400,"context_line":"          \"allocation_ratio\": 1.0,"}],"source_content_type":"text/x-rst","patch_set":7,"id":"5a5ae5dd_522aee2d","line":397,"updated":"2016-02-09 12:17:03.000000000","message":"DISK_GB","commit_id":"49988d88d2c187ac527f2ca5582bdb2f5fc61550"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"aabcc44af5c5e31cd19529f90ff74c64ff8edf64","unresolved":false,"context_lines":[{"line_number":411,"context_line":"        {"},{"line_number":412,"context_line":"          \"uuid\": \"eaaf1c04-ced2-40e4-89a2-87edded06d64\","},{"line_number":413,"context_line":"          \"name\": \"Global NFS share\","},{"line_number":414,"context_line":"          \"resource_class\": \"DISK\","},{"line_number":415,"context_line":"          \"capacity\": 1024,"},{"line_number":416,"context_line":"          \"reserved\": 10,"},{"line_number":417,"context_line":"          \"allocation_ratio\": 1.0,"}],"source_content_type":"text/x-rst","patch_set":7,"id":"5a5ae5dd_f21f5a07","line":414,"updated":"2016-02-09 12:17:03.000000000","message":"DISK_GB","commit_id":"49988d88d2c187ac527f2ca5582bdb2f5fc61550"},{"author":{"_account_id":16929,"name":"Giridhar Jayavelu","email":"gjayavelu@vmware.com","username":"gjayavelu"},"change_message_id":"3c4a55c3993f1fcbedf524d38b11252f84a365d1","unresolved":false,"context_lines":[{"line_number":417,"context_line":"          \"allocation_ratio\": 1.0,"},{"line_number":418,"context_line":"          \"min_unit\": 1,"},{"line_number":419,"context_line":"          \"max_unit\": 100,"},{"line_number":420,"context_line":"          \"used\": 450,"},{"line_number":421,"context_line":"          \"links\": ["},{"line_number":422,"context_line":"            {"},{"line_number":423,"context_line":"              \"rel\": \"aggregates\","}],"source_content_type":"text/x-rst","patch_set":7,"id":"5a5ae5dd_a2c0be7d","line":420,"updated":"2016-02-09 06:43:18.000000000","message":"Can the \u0027used\u0027 value be above \u0027reserved\u0027 value?\nI was under the impression that reserved value is upper limit for resource pool. Please correct me if I understood wrong.","commit_id":"49988d88d2c187ac527f2ca5582bdb2f5fc61550"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c16aa4ce87dc787b7c8de05b0410cb87e90391b6","unresolved":false,"context_lines":[{"line_number":85,"context_line":"2) The cloud deployer creates a resource pool that exposes the `DISK_GB`"},{"line_number":86,"context_line":"   resource class representing the NFS share::"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    $RP_ID\u003d`nova resource-pool-create \"/mnt/nfs/row1racks0610/\" \\"},{"line_number":89,"context_line":"        --external-id\u003d\"34372241-2c0c-4da3-a08e-19ffb6367ace\" \\"},{"line_number":90,"context_line":"        --capacity\u003d100000 --reserved\u003d1000 --resource-class\u003dDISK_GB"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a57f1b5_2f619b05","line":88,"updated":"2016-02-12 00:08:23.000000000","message":"As mentioned on IRC, I don\u0027t actually want to have the cell ID leak out of the REST API for the scheduler, which adding a --cell-id parameter to this command would indeed do. The reason I don\u0027t want this to happen is because the concept of a cell is really an implementation detail of Nova. Cells are scaling units in Nova but are not exposed to the end-user. It\u0027s not as if an end-user should even know a cell exists. Since this REST API is supposed to represent a split-out scheduler, we need to ensure that any Nova-internal implementation details like a cell ID are not exposed or expected as input in the request payload.\n\nAfter thinking about this problem area some more, I think that the resource_pools table along with the tables introduced in the resource-providers blueprint (resource_providers, inventories, allocations) should actually be placed in an entirely new database: the placement DB. This placement DB will be essentially airlifted out of Nova when the scheduler is broken out into its own service.","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"722baabc6e57b4ad8d72918cf886aa9466cfad9e","unresolved":false,"context_lines":[{"line_number":85,"context_line":"2) The cloud deployer creates a resource pool that exposes the `DISK_GB`"},{"line_number":86,"context_line":"   resource class representing the NFS share::"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    $RP_ID\u003d`nova resource-pool-create \"/mnt/nfs/row1racks0610/\" \\"},{"line_number":89,"context_line":"        --external-id\u003d\"34372241-2c0c-4da3-a08e-19ffb6367ace\" \\"},{"line_number":90,"context_line":"        --capacity\u003d100000 --reserved\u003d1000 --resource-class\u003dDISK_GB"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a57f1b5_de628516","line":88,"updated":"2016-02-09 19:17:26.000000000","message":"Because the resource pools database tables are contained in the cells databases this command will need to somehow indicate which cell to create the resource pool in. Each cell has a UUID which can be referenced for this purpose.\n\nAnd if a resource pool spans cells it will need to be created for each cell.","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":18247,"name":"Mark Doffman","email":"mdoffman@linux.vnet.ibm.com","username":"doffm"},"change_message_id":"a608f7d11f74ad88bbaef44a138cd8aa0abed6cf","unresolved":false,"context_lines":[{"line_number":85,"context_line":"2) The cloud deployer creates a resource pool that exposes the `DISK_GB`"},{"line_number":86,"context_line":"   resource class representing the NFS share::"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    $RP_ID\u003d`nova resource-pool-create \"/mnt/nfs/row1racks0610/\" \\"},{"line_number":89,"context_line":"        --external-id\u003d\"34372241-2c0c-4da3-a08e-19ffb6367ace\" \\"},{"line_number":90,"context_line":"        --capacity\u003d100000 --reserved\u003d1000 --resource-class\u003dDISK_GB"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a57f1b5_82add69c","line":88,"in_reply_to":"3a57f1b5_2f619b05","updated":"2016-02-12 18:20:24.000000000","message":"The concept of putting this in a separate \u0027placement DB\u0027 was also discussed on IRC. Sylvain was especially dismissive of doing this NOW. (Not dismissive of doing it at-some-point).\n\nThe real issue with cells is that the \u0027aggregates\u0027 table is contained within the API database, (Probably) whereas the resource providers will go in the cell database. What is your opinion of the \u0027aggregates\u0027 table? It makes some sense to put this in the placement db as well, as aggregates are used for placement decisions.\n\nI was writing up a spec for cells-resource providers, but if you are sure that the REST api must not include the cell id then i\u0027ll have to change ideas. I think that the cell ID in the rest API is ugly, but I was OK with it as the API isn\u0027t user facing. (Admin or operator)\n\nHow soon can we implement the placement db? If its going to be a long way off then we need to make a cells design that moves resource pools to the API db in the meantime.\n\nOn IRC moving resource providers to the API db was explicitly ruled out for fear of a large write load on an un-partitioned global database.","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a442e9a15f9f9c57744b6167e6235e0c6e7f78e2","unresolved":false,"context_lines":[{"line_number":85,"context_line":"2) The cloud deployer creates a resource pool that exposes the `DISK_GB`"},{"line_number":86,"context_line":"   resource class representing the NFS share::"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    $RP_ID\u003d`nova resource-pool-create \"/mnt/nfs/row1racks0610/\" \\"},{"line_number":89,"context_line":"        --external-id\u003d\"34372241-2c0c-4da3-a08e-19ffb6367ace\" \\"},{"line_number":90,"context_line":"        --capacity\u003d100000 --reserved\u003d1000 --resource-class\u003dDISK_GB"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a57f1b5_46098730","line":88,"in_reply_to":"3a57f1b5_6d026671","updated":"2016-02-11 11:58:14.000000000","message":"I had a catchup on IRC, I get why we want the resource tables in the child DB, but yeah, we probably need the child-cell uuid at this point.","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"69b1bc34a029e3ac360872ddd71e7a04e077ff68","unresolved":false,"context_lines":[{"line_number":85,"context_line":"2) The cloud deployer creates a resource pool that exposes the `DISK_GB`"},{"line_number":86,"context_line":"   resource class representing the NFS share::"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    $RP_ID\u003d`nova resource-pool-create \"/mnt/nfs/row1racks0610/\" \\"},{"line_number":89,"context_line":"        --external-id\u003d\"34372241-2c0c-4da3-a08e-19ffb6367ace\" \\"},{"line_number":90,"context_line":"        --capacity\u003d100000 --reserved\u003d1000 --resource-class\u003dDISK_GB"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a57f1b5_325d4515","line":88,"in_reply_to":"3a57f1b5_82add69c","updated":"2016-02-12 22:13:43.000000000","message":"So, like Mark said, I think having a DB for the scheduler should be only when we could cut it, not now.\nFWIW, I\u0027m fine having the resource-* tables being in the cells DB like we merged and the relationship with aggregates being intersected by another mapping table in the API DB saying which cell is the related resource* table.","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"69aa70ffacf96503dfa7bb0510e3c7df5da7b380","unresolved":false,"context_lines":[{"line_number":85,"context_line":"2) The cloud deployer creates a resource pool that exposes the `DISK_GB`"},{"line_number":86,"context_line":"   resource class representing the NFS share::"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    $RP_ID\u003d`nova resource-pool-create \"/mnt/nfs/row1racks0610/\" \\"},{"line_number":89,"context_line":"        --external-id\u003d\"34372241-2c0c-4da3-a08e-19ffb6367ace\" \\"},{"line_number":90,"context_line":"        --capacity\u003d100000 --reserved\u003d1000 --resource-class\u003dDISK_GB"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a57f1b5_6d026671","line":88,"in_reply_to":"3a57f1b5_de628516","updated":"2016-02-11 11:00:27.000000000","message":"oh +1, good catch.\n\nI guess we are assuming host aggregates are also local to each child? The scheduler can find all the hosts related to multiple aggregates across multiple cells.\n\nBut the resource tables are in the scheduler DB, centrally so they can span cells, so the API DB? Is that what the current patches have done?","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"9c8772712594b1f6dcf5d0dccf1fa83500e906a2","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    CREATE TABLE resource_pools ("},{"line_number":216,"context_line":"        uuid CHAR(36) NOT NULL PRIMARY KEY,"},{"line_number":217,"context_line":"        name VARCHAR(200) NOT NULL,"},{"line_number":218,"context_line":"        resource_class_id INT UNSIGNED NOT NULL,"},{"line_number":219,"context_line":"        external_id VARCHAR(255) NOT NULL,"},{"line_number":220,"context_line":"        created_on DATETIME NOT NULL,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dae33548_6bece4c7","line":217,"updated":"2016-02-15 16:18:35.000000000","message":"I guess we\u0027re utf-8 here if we\u0027re supporting user produced human-serving names?","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"9c8772712594b1f6dcf5d0dccf1fa83500e906a2","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        uuid CHAR(36) NOT NULL PRIMARY KEY,"},{"line_number":217,"context_line":"        name VARCHAR(200) NOT NULL,"},{"line_number":218,"context_line":"        resource_class_id INT UNSIGNED NOT NULL,"},{"line_number":219,"context_line":"        external_id VARCHAR(255) NOT NULL,"},{"line_number":220,"context_line":"        created_on DATETIME NOT NULL,"},{"line_number":221,"context_line":"        updated_on DATETIME NOT NULL,"},{"line_number":222,"context_line":"        UNIQUE KEY (external_id)"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dae33548_6b3a2438","line":219,"updated":"2016-02-15 16:18:35.000000000","message":"external_id is not a uuid, this is a bummer. We need to nail down this id stuff someday...","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"439edf1610b942f76a0c64e03a383365c5b3405c","unresolved":false,"context_lines":[{"line_number":231,"context_line":""},{"line_number":232,"context_line":".. note::"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    The `external_id` is an identifier that can be supplied by the creator of"},{"line_number":235,"context_line":"    the resource pool to indicate some externally-created identifier for the"},{"line_number":236,"context_line":"    pool. Examples of this might be a Cinder storage pool ID, a Neutron subnet"},{"line_number":237,"context_line":"    pool segment ID, or a Ceph volume group identifier."}],"source_content_type":"text/x-rst","patch_set":8,"id":"dae33548_c4168c54","line":234,"updated":"2016-02-16 15:58:25.000000000","message":"You say \"can be\" here, suggesting it is optional, but external_id is NOT NULL above. Which is it?","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"f19b0e0279f5bcfeb18ff4c25fa3a49750369348","unresolved":false,"context_lines":[{"line_number":245,"context_line":"        PRIMARY KEY (aggregate_id, resource_pool_uuid),"},{"line_number":246,"context_line":"    );"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"REST API impact"},{"line_number":249,"context_line":"---------------"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"*Note*: *ALL* below API calls are meant only for cloud administrators."}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a57f1b5_f6cb7a51","line":248,"updated":"2016-02-11 13:44:40.000000000","message":"Anything with REST API impact should have API Impact in the commit message so it\u0027s caught be the API team review filters.","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"f19b0e0279f5bcfeb18ff4c25fa3a49750369348","unresolved":false,"context_lines":[{"line_number":247,"context_line":""},{"line_number":248,"context_line":"REST API impact"},{"line_number":249,"context_line":"---------------"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"*Note*: *ALL* below API calls are meant only for cloud administrators."},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"*Note*: All of the below API calls should be implemented in"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a57f1b5_56484e87","line":250,"updated":"2016-02-11 13:44:40.000000000","message":"This should fundamentally register as a new API served by nova. That means a top level service type: \u0027placement\u0027 seeming the most appropriate.\n\nIt also means a new entry in enabled_apis - https://github.com/openstack/nova/blob/4c42235e1403cb8fce309efce2034d1962be995e/nova/service.py#L60\n\nThis should start on a different port, possibly with even a different command in nova/cmd to start it.","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c16aa4ce87dc787b7c8de05b0410cb87e90391b6","unresolved":false,"context_lines":[{"line_number":247,"context_line":""},{"line_number":248,"context_line":"REST API impact"},{"line_number":249,"context_line":"---------------"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"*Note*: *ALL* below API calls are meant only for cloud administrators."},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"*Note*: All of the below API calls should be implemented in"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a57f1b5_4f5e5745","line":250,"updated":"2016-02-12 00:08:23.000000000","message":"done.","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c16aa4ce87dc787b7c8de05b0410cb87e90391b6","unresolved":false,"context_lines":[{"line_number":251,"context_line":"*Note*: *ALL* below API calls are meant only for cloud administrators."},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"*Note*: All of the below API calls should be implemented in"},{"line_number":254,"context_line":"`/nova/api/openstack/scheduler/`, **not** in `/nova/api/openstack/compute/`"},{"line_number":255,"context_line":"since these calls will be part of the split-out scheduler REST API."},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"The following new REST API calls will be added:"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a57f1b5_ef562329","line":254,"updated":"2016-02-12 00:08:23.000000000","message":"done.","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"f19b0e0279f5bcfeb18ff4c25fa3a49750369348","unresolved":false,"context_lines":[{"line_number":251,"context_line":"*Note*: *ALL* below API calls are meant only for cloud administrators."},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"*Note*: All of the below API calls should be implemented in"},{"line_number":254,"context_line":"`/nova/api/openstack/scheduler/`, **not** in `/nova/api/openstack/compute/`"},{"line_number":255,"context_line":"since these calls will be part of the split-out scheduler REST API."},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"The following new REST API calls will be added:"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a57f1b5_b6dc2213","line":254,"updated":"2016-02-11 13:44:40.000000000","message":"s/scheduler/placement/","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c16aa4ce87dc787b7c8de05b0410cb87e90391b6","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        {"},{"line_number":395,"context_line":"          \"uuid\": \"b6b065cc-fcd9-4342-a7b0-2aed2d146518\","},{"line_number":396,"context_line":"          \"name\": \"RBD volume group\","},{"line_number":397,"context_line":"          \"resource_class\": \"DISK_GB\","},{"line_number":398,"context_line":"          \"capacity\": 2048,"},{"line_number":399,"context_line":"          \"reserved\": 10,"},{"line_number":400,"context_line":"          \"allocation_ratio\": 1.0,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a57f1b5_0f54df1e","line":397,"updated":"2016-02-12 00:08:23.000000000","message":"done.","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":16929,"name":"Giridhar Jayavelu","email":"gjayavelu@vmware.com","username":"gjayavelu"},"change_message_id":"f17926b54f48be5e4c848e0f52b442bfc8d8135e","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        {"},{"line_number":395,"context_line":"          \"uuid\": \"b6b065cc-fcd9-4342-a7b0-2aed2d146518\","},{"line_number":396,"context_line":"          \"name\": \"RBD volume group\","},{"line_number":397,"context_line":"          \"resource_class\": \"DISK_GB\","},{"line_number":398,"context_line":"          \"capacity\": 2048,"},{"line_number":399,"context_line":"          \"reserved\": 10,"},{"line_number":400,"context_line":"          \"allocation_ratio\": 1.0,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a57f1b5_5341ae38","line":397,"updated":"2016-02-09 18:55:17.000000000","message":"nit: external_id missing","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c16aa4ce87dc787b7c8de05b0410cb87e90391b6","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        },"},{"line_number":411,"context_line":"        {"},{"line_number":412,"context_line":"          \"uuid\": \"eaaf1c04-ced2-40e4-89a2-87edded06d64\","},{"line_number":413,"context_line":"          \"name\": \"Global NFS share\","},{"line_number":414,"context_line":"          \"resource_class\": \"DISK_GB\","},{"line_number":415,"context_line":"          \"capacity\": 1024,"},{"line_number":416,"context_line":"          \"reserved\": 10,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a57f1b5_af334b13","line":413,"updated":"2016-02-12 00:08:23.000000000","message":"done.","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":16929,"name":"Giridhar Jayavelu","email":"gjayavelu@vmware.com","username":"gjayavelu"},"change_message_id":"f17926b54f48be5e4c848e0f52b442bfc8d8135e","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        },"},{"line_number":411,"context_line":"        {"},{"line_number":412,"context_line":"          \"uuid\": \"eaaf1c04-ced2-40e4-89a2-87edded06d64\","},{"line_number":413,"context_line":"          \"name\": \"Global NFS share\","},{"line_number":414,"context_line":"          \"resource_class\": \"DISK_GB\","},{"line_number":415,"context_line":"          \"capacity\": 1024,"},{"line_number":416,"context_line":"          \"reserved\": 10,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a57f1b5_733e2aba","line":413,"updated":"2016-02-09 18:55:17.000000000","message":"same as above.","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"ee2fd8650a169de259bd51e39ce10aac540dc47a","unresolved":false,"context_lines":[{"line_number":439,"context_line":"  with the aggregate"},{"line_number":440,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found"},{"line_number":441,"context_line":"* `400 Bad Request` if the resource pool was found but the aggregate with ID"},{"line_number":442,"context_line":"  `{id}` was not found"},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"`DELETE /resource_pools/{uuid}/aggregates/{id}`"},{"line_number":445,"context_line":"***********************************************"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dae33548_9d71f20e","line":442,"updated":"2016-02-18 16:17:49.000000000","message":"Strictly speaking this should still be 404","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"ee2fd8650a169de259bd51e39ce10aac540dc47a","unresolved":false,"context_lines":[{"line_number":452,"context_line":"  with the aggregate"},{"line_number":453,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found"},{"line_number":454,"context_line":"* `400 Bad Request` if the resource pool was found but the aggregate with ID"},{"line_number":455,"context_line":"  `{id}` was not found"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"`GET /resource_pools/{uuid}/aggregates`"},{"line_number":458,"context_line":"***************************************"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dae33548_fd62be3c","line":455,"updated":"2016-02-18 16:17:49.000000000","message":"ditto","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"439edf1610b942f76a0c64e03a383365c5b3405c","unresolved":false,"context_lines":[{"line_number":494,"context_line":"functionality:"},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"* `nova resource-pool-list`"},{"line_number":497,"context_line":"* `nova resource-pool-show $UUID`"},{"line_number":498,"context_line":"* `nova resource-pool-create \"Global NFS share\" --resource-class\u003ddisk`"},{"line_number":499,"context_line":"* `nova resource-pool-delete $UUID`"},{"line_number":500,"context_line":"* `nova resource-pool-update $UUID --capacity\u003d1024 --reserved\u003d450`"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dae33548_2f3c71c7","line":497,"updated":"2016-02-16 15:58:25.000000000","message":"Do we need to be able to retrieve/show by `external_id`?","commit_id":"a85c2efba44f20839a7719b8343dcc8aa373d94f"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"897c82e534b6e7e189e4f8f4a2c2c2404ba00443","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"2) The cloud deployer creates a resource pool representing the NFS share::"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    $RP_UUID\u003d`nova resource-pool-create \"/mnt/nfs/row1racks0610/\"`"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"3) The cloud deployer updates the resource pool\u0027s capacity of shared disk::"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"bae84128_a6c10b83","line":97,"updated":"2016-02-19 20:56:08.000000000","message":"Just recording our conversation here for posterity. Because the plan right now is to have aggregates in the API db and use the mapping of aggregates to cells to know where to create the resource-pools this command should take an aggregrate uuid.","commit_id":"19e57407a0b18ea65b229dffe84489a7ce3b4785"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"65ca9bb6ab6b78dea559428e4da9c90b5d30240c","unresolved":false,"context_lines":[{"line_number":270,"context_line":"    ADD COLUMN can_host INT NOT NULL;"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"The `generation` and `can_host` fields are internal implementation fields that"},{"line_number":273,"context_line":"respectively allow for atomic allocation operations and tell the scheduler"},{"line_number":274,"context_line":"whether the resource provider can be a destination for an instance to land on"},{"line_number":275,"context_line":"(hint: a resource pool never can be the target for an instance). Neither of"},{"line_number":276,"context_line":"these fields are ever exposed through the RESTful API."}],"source_content_type":"text/x-rst","patch_set":10,"id":"bae84128_0a173c52","line":273,"updated":"2016-02-19 11:44:49.000000000","message":"I\u0027m aware of generation from the benchmark stuff but it would be good to see the reasoning for it here. I\u0027m suspicious of a magic column that is required to \"lock\" the database effectively, but that is based on my ignorance and lack of familiarity with the solution.","commit_id":"19e57407a0b18ea65b229dffe84489a7ce3b4785"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"65ca9bb6ab6b78dea559428e4da9c90b5d30240c","unresolved":false,"context_lines":[{"line_number":379,"context_line":"    {"},{"line_number":380,"context_line":"      \"resource_pool\": {"},{"line_number":381,"context_line":"        \"uuid\": \"eaaf1c04-ced2-40e4-89a2-87edded06d64\","},{"line_number":382,"context_line":"        \"external_id\": \"34372241-2c0c-4da3-a08e-19ffb6367ace\","},{"line_number":383,"context_line":"        \"name\": \"Global NFS share\","},{"line_number":384,"context_line":"        \"resources\": ["},{"line_number":385,"context_line":"          {"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bae84128_bdd49847","line":382,"updated":"2016-02-19 11:44:49.000000000","message":"Looks like we\u0027re no longer providing this in the post (nor tracking it in the db) so this goes away?","commit_id":"19e57407a0b18ea65b229dffe84489a7ce3b4785"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"65ca9bb6ab6b78dea559428e4da9c90b5d30240c","unresolved":false,"context_lines":[{"line_number":420,"context_line":"            \"min_unit\": 1,"},{"line_number":421,"context_line":"            \"max_unit\": 100,"},{"line_number":422,"context_line":"            \"step_size\": 1"},{"line_number":423,"context_line":"          }"},{"line_number":424,"context_line":"        ]"},{"line_number":425,"context_line":"    }"},{"line_number":426,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"bae84128_3d48882d","line":423,"updated":"2016-02-19 11:44:49.000000000","message":"I despise lists of anonymous dicts. Makes testing and client code more complex. I know they make sense some of the time, but in this case would it make sense to have a dict, where the key is the resource_class?","commit_id":"19e57407a0b18ea65b229dffe84489a7ce3b4785"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"65ca9bb6ab6b78dea559428e4da9c90b5d30240c","unresolved":false,"context_lines":[{"line_number":609,"context_line":"  with the aggregate"},{"line_number":610,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found"},{"line_number":611,"context_line":"* `400 Bad Request` if the resource pool was found but the aggregate with ID"},{"line_number":612,"context_line":"  `{id}` was not found"},{"line_number":613,"context_line":""},{"line_number":614,"context_line":"`DELETE /resource_pools/{uuid}/aggregates/{id}`"},{"line_number":615,"context_line":"***********************************************"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bae84128_9d6274d7","line":612,"updated":"2016-02-19 11:44:49.000000000","message":"This should still be 404, otherwise we\u0027re not treating the URL as a true resource.","commit_id":"19e57407a0b18ea65b229dffe84489a7ce3b4785"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"65ca9bb6ab6b78dea559428e4da9c90b5d30240c","unresolved":false,"context_lines":[{"line_number":622,"context_line":"  with the aggregate"},{"line_number":623,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found"},{"line_number":624,"context_line":"* `400 Bad Request` if the resource pool was found but the aggregate with ID"},{"line_number":625,"context_line":"  `{id}` was not found"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"`GET /resource_pools/{uuid}/aggregates`"},{"line_number":628,"context_line":"***************************************"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bae84128_bd9f78b3","line":625,"updated":"2016-02-19 11:44:49.000000000","message":"ditto","commit_id":"19e57407a0b18ea65b229dffe84489a7ce3b4785"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"65ca9bb6ab6b78dea559428e4da9c90b5d30240c","unresolved":false,"context_lines":[{"line_number":717,"context_line":""},{"line_number":718,"context_line":"* Create database models and migrations for updated `resource_providers` and"},{"line_number":719,"context_line":"  the new `resource_provider_aggregates` tables."},{"line_number":720,"context_line":"* Create `nova.objects` models for `ResourcePool`"},{"line_number":721,"context_line":"* Create REST API controllers for resource pool querying and handling"},{"line_number":722,"context_line":"* Modify resource tracker to pull information on aggregates the compute node is"},{"line_number":723,"context_line":"  associated with and determine if disk capacity and usage tracking should be"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bae84128_fdb8e0e7","line":720,"updated":"2016-02-19 11:44:49.000000000","message":"For clarity: What distinguishes a ResourcePool from a ResourceProvider with a name? Is it the associated aggregate?\n\nFrom the naive implementor\u0027s standpoint navigating the gap between the SQL goals and the nova.objects stuff is challenging.","commit_id":"19e57407a0b18ea65b229dffe84489a7ce3b4785"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"6ef9672fd1816d33682d87de6b6e25b50f38e44e","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"2) The cloud deployer creates a resource pool representing the NFS share::"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    $RP_UUID\u003d`nova resource-pool-create \"/mnt/nfs/row1racks0610/\"`"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"3) The cloud deployer updates the resource pool\u0027s capacity of shared disk::"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_fc76023d","line":97,"updated":"2016-02-19 21:58:11.000000000","message":"You updated the example below to take an aggregate uuid for this command. This should be updated as well.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7912505f7c431ab8685f1f40df664846486d0334","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"2) The cloud deployer creates a resource pool representing the NFS share::"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    $RP_UUID\u003d`nova resource-pool-create \"/mnt/nfs/row1racks0610/\"`"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"3) The cloud deployer updates the resource pool\u0027s capacity of shared disk::"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_b3157241","line":97,"updated":"2016-02-22 19:40:06.000000000","message":"done.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7912505f7c431ab8685f1f40df664846486d0334","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    checks using the following formula: ((TOTAL - RESERVED) * ALLOCATION_RATIO)"},{"line_number":113,"context_line":"    - USED \u003e\u003d REQUESTED_AMOUNT"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"3) The cloud deployer then associates the aggregate with the resource pool::"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    nova resource-pool-aggregate-associate $AGG_ID $RP_UUID"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_9312ee55","line":115,"updated":"2016-02-22 19:40:06.000000000","message":"done. I just removed this step, now that the aggregate is associated up front with the call to resource-pool-create.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"36e7b64d92fd8083726c5c9253895d0bbc08139e","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    checks using the following formula: ((TOTAL - RESERVED) * ALLOCATION_RATIO)"},{"line_number":113,"context_line":"    - USED \u003e\u003d REQUESTED_AMOUNT"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"3) The cloud deployer then associates the aggregate with the resource pool::"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    nova resource-pool-aggregate-associate $AGG_ID $RP_UUID"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_12c58d3b","line":115,"range":{"start_line":115,"start_character":0,"end_line":115,"end_character":3},"updated":"2016-02-19 23:47:43.000000000","message":"nit : 4)","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"6ef9672fd1816d33682d87de6b6e25b50f38e44e","unresolved":false,"context_lines":[{"line_number":194,"context_line":"   the question, \"if this port ID a member of a resource pool containing"},{"line_number":195,"context_line":"   `IPV4_ADDRESS` resources, which compute nodes are possible target"},{"line_number":196,"context_line":"   destinations that are associated with that IPv4 subnet?\"."},{"line_number":197,"context_line":"   "},{"line_number":198,"context_line":"   Nova asks Neutron about any ports that the user has specified in the boot"},{"line_number":199,"context_line":"   command. The port\u0027s segment UUID will be returned in the port details from"},{"line_number":200,"context_line":"   Neutron for any port that is in a routed network."}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_1c8da631","line":197,"updated":"2016-02-19 21:58:11.000000000","message":"Whitespace.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7912505f7c431ab8685f1f40df664846486d0334","unresolved":false,"context_lines":[{"line_number":194,"context_line":"   the question, \"if this port ID a member of a resource pool containing"},{"line_number":195,"context_line":"   `IPV4_ADDRESS` resources, which compute nodes are possible target"},{"line_number":196,"context_line":"   destinations that are associated with that IPv4 subnet?\"."},{"line_number":197,"context_line":"   "},{"line_number":198,"context_line":"   Nova asks Neutron about any ports that the user has specified in the boot"},{"line_number":199,"context_line":"   command. The port\u0027s segment UUID will be returned in the port details from"},{"line_number":200,"context_line":"   Neutron for any port that is in a routed network."}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_f31b7a71","line":197,"updated":"2016-02-22 19:40:06.000000000","message":"done.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"36e7b64d92fd8083726c5c9253895d0bbc08139e","unresolved":false,"context_lines":[{"line_number":197,"context_line":"   "},{"line_number":198,"context_line":"   Nova asks Neutron about any ports that the user has specified in the boot"},{"line_number":199,"context_line":"   command. The port\u0027s segment UUID will be returned in the port details from"},{"line_number":200,"context_line":"   Neutron for any port that is in a routed network."},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"   The Nova scheduler would be able to determine the set of compute nodes used"},{"line_number":203,"context_line":"   in placement decisions by querying the `resource_provider_aggregates` table,"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_cdb0aa8e","line":200,"updated":"2016-02-19 23:47:43.000000000","message":"Maybe you should explain it should be an asynchronous call to Neutron, so probably in the conductor...\n\nBtw. it\u0027s also a cells v2 discussion because I wouldn\u0027t like to have this Neutron call made synchronously in the API but we don\u0027t have yet an \u0027API conductor\u0027","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7912505f7c431ab8685f1f40df664846486d0334","unresolved":false,"context_lines":[{"line_number":197,"context_line":"   "},{"line_number":198,"context_line":"   Nova asks Neutron about any ports that the user has specified in the boot"},{"line_number":199,"context_line":"   command. The port\u0027s segment UUID will be returned in the port details from"},{"line_number":200,"context_line":"   Neutron for any port that is in a routed network."},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"   The Nova scheduler would be able to determine the set of compute nodes used"},{"line_number":203,"context_line":"   in placement decisions by querying the `resource_provider_aggregates` table,"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_d318f677","line":200,"updated":"2016-02-22 19:40:06.000000000","message":"This was meant to be a discussion of the use case, really, not the implementation. I\u0027d prefer to just leave this as-is, since it\u0027s already long in the tooth.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7912505f7c431ab8685f1f40df664846486d0334","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    ON rpa.aggregate_id \u003d ag.aggregate_id"},{"line_number":209,"context_line":"    JOIN resource_providers rp"},{"line_number":210,"context_line":"    ON rpa.resource_provider_id \u003d rp.id"},{"line_number":211,"context_line":"    WHERE rp.uuid \u003d $SEG_UUID;"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"What this gives the cloud user is basic network affinity during scheduling,"},{"line_number":214,"context_line":"with the cloud user only needing to specify a port ID they created in a"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_33284286","line":211,"updated":"2016-02-22 19:40:06.000000000","message":"No, it\u0027s not like the all-hosts filter at all. I was above trying to show how a future proposed scheduler that uses the resource-providers could query the schema to determine the compute hosts that matched a condition that involved aggregates.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"36e7b64d92fd8083726c5c9253895d0bbc08139e","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    ON rpa.aggregate_id \u003d ag.aggregate_id"},{"line_number":209,"context_line":"    JOIN resource_providers rp"},{"line_number":210,"context_line":"    ON rpa.resource_provider_id \u003d rp.id"},{"line_number":211,"context_line":"    WHERE rp.uuid \u003d $SEG_UUID;"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"What this gives the cloud user is basic network affinity during scheduling,"},{"line_number":214,"context_line":"with the cloud user only needing to specify a port ID they created in a"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_ed7e4ead","line":211,"updated":"2016-02-19 23:47:43.000000000","message":"So it\u0027s like a \u0027all-hosts\u0027 filter, right? I mean it should be something plugged like a stevedore plugin.\n\nOr if this a scheduler main call, how to know to use the segment UUID ? Would it be provided by the ReqSpec?","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7912505f7c431ab8685f1f40df664846486d0334","unresolved":false,"context_lines":[{"line_number":239,"context_line":"    ON rp.id \u003d a.resource_provider_id"},{"line_number":240,"context_line":"    AND a.consumer_id \u003d $INSTANCE_UUID"},{"line_number":241,"context_line":"    AND a.resource_class_id \u003d IPV4_ADDRESS;"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"The above query will return only the compute hosts that are in the same"},{"line_number":244,"context_line":"aggregate as the one associated with the resource pool representing the IPv4"},{"line_number":245,"context_line":"routed network that the instance was originally launched in."}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_132d3e95","line":242,"updated":"2016-02-22 19:40:06.000000000","message":"I don\u0027t see your point here. The point I am making above is that with the resource-providers schema and the tables introduced in this spec, the scheduler would be able to answer the question \"which compute nodes can I send this workload to, given some constraints that I know about the resources that were originally requested?\"","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"36e7b64d92fd8083726c5c9253895d0bbc08139e","unresolved":false,"context_lines":[{"line_number":239,"context_line":"    ON rp.id \u003d a.resource_provider_id"},{"line_number":240,"context_line":"    AND a.consumer_id \u003d $INSTANCE_UUID"},{"line_number":241,"context_line":"    AND a.resource_class_id \u003d IPV4_ADDRESS;"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"The above query will return only the compute hosts that are in the same"},{"line_number":244,"context_line":"aggregate as the one associated with the resource pool representing the IPv4"},{"line_number":245,"context_line":"routed network that the instance was originally launched in."}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_482648bb","line":242,"updated":"2016-02-19 23:47:43.000000000","message":"So, how the scheduler knows it\u0027s a move operation and not something like just a boot ? TBH, the scheduler should be blind and not know that.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7912505f7c431ab8685f1f40df664846486d0334","unresolved":false,"context_lines":[{"line_number":242,"context_line":""},{"line_number":243,"context_line":"The above query will return only the compute hosts that are in the same"},{"line_number":244,"context_line":"aggregate as the one associated with the resource pool representing the IPv4"},{"line_number":245,"context_line":"routed network that the instance was originally launched in."},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"Alternatives"},{"line_number":248,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_731e4a60","line":245,"updated":"2016-02-22 19:40:06.000000000","message":"Honestly, I don\u0027t understand your point here. The existing filter scheduler operates on aggregate information in addition to host information.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"36e7b64d92fd8083726c5c9253895d0bbc08139e","unresolved":false,"context_lines":[{"line_number":242,"context_line":""},{"line_number":243,"context_line":"The above query will return only the compute hosts that are in the same"},{"line_number":244,"context_line":"aggregate as the one associated with the resource pool representing the IPv4"},{"line_number":245,"context_line":"routed network that the instance was originally launched in."},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"Alternatives"},{"line_number":248,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_685cec25","line":245,"updated":"2016-02-19 23:47:43.000000000","message":"See, you\u0027re changing a lot of how the FilterScheduler works today because the queries are not by host like filters do atm. TBH, it needs to be a different scheduler driver, but if so, how to help the current FilterScheduler?","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"f5876e8fb796b7daae3f61ecd96a1913c3bb24c3","unresolved":false,"context_lines":[{"line_number":272,"context_line":"    ADD COLUMN can_host INT NOT NULL;"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"The `generation` and `can_host` fields are internal implementation fields that"},{"line_number":275,"context_line":"respectively allow for atomic allocation operations and tell the scheduler"},{"line_number":276,"context_line":"whether the resource provider can be a destination for an instance to land on"},{"line_number":277,"context_line":"(hint: a resource pool never can be the target for an instance). Neither of"},{"line_number":278,"context_line":"these fields are ever exposed through the RESTful API."}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_5c11eeab","line":275,"updated":"2016-02-19 22:08:30.000000000","message":"I\u0027m aware of generation from the benchmark stuff but it would be good to see the reasoning for it here. I\u0027m suspicious of a magic column that is required to \"lock\" the database effectively, but that is based on my ignorance and lack of familiarity with the solution.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7912505f7c431ab8685f1f40df664846486d0334","unresolved":false,"context_lines":[{"line_number":272,"context_line":"    ADD COLUMN can_host INT NOT NULL;"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"The `generation` and `can_host` fields are internal implementation fields that"},{"line_number":275,"context_line":"respectively allow for atomic allocation operations and tell the scheduler"},{"line_number":276,"context_line":"whether the resource provider can be a destination for an instance to land on"},{"line_number":277,"context_line":"(hint: a resource pool never can be the target for an instance). Neither of"},{"line_number":278,"context_line":"these fields are ever exposed through the RESTful API."}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_532346a7","line":275,"updated":"2016-02-22 19:40:06.000000000","message":"I\u0027m going to break this out into a separate blueprint per conversation this morning. I\u0027ll include some explanation there.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"f5876e8fb796b7daae3f61ecd96a1913c3bb24c3","unresolved":false,"context_lines":[{"line_number":390,"context_line":"    {"},{"line_number":391,"context_line":"      \"resource_pool\": {"},{"line_number":392,"context_line":"        \"uuid\": \"eaaf1c04-ced2-40e4-89a2-87edded06d64\","},{"line_number":393,"context_line":"        \"external_id\": \"34372241-2c0c-4da3-a08e-19ffb6367ace\","},{"line_number":394,"context_line":"        \"name\": \"Global NFS share\","},{"line_number":395,"context_line":"        \"aggregates\": ["},{"line_number":396,"context_line":"            \"cd2ca052-6f9a-4b49-b466-f913e528d3cb\""}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_dc74defe","line":393,"updated":"2016-02-19 22:08:30.000000000","message":"I think we\u0027ve decided that the external_id goes away in favor of allow the uuid field to be external if one is provided (at least that is how I read the note above.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"0c1d8ac0563473e01e1d1ddd6461535b6e3504e3","unresolved":false,"context_lines":[{"line_number":390,"context_line":"    {"},{"line_number":391,"context_line":"      \"resource_pool\": {"},{"line_number":392,"context_line":"        \"uuid\": \"eaaf1c04-ced2-40e4-89a2-87edded06d64\","},{"line_number":393,"context_line":"        \"external_id\": \"34372241-2c0c-4da3-a08e-19ffb6367ace\","},{"line_number":394,"context_line":"        \"name\": \"Global NFS share\","},{"line_number":395,"context_line":"        \"aggregates\": ["},{"line_number":396,"context_line":"            \"cd2ca052-6f9a-4b49-b466-f913e528d3cb\""}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_8aab051d","line":393,"updated":"2016-02-21 15:37:55.000000000","message":"If we are going to use the real resources real uuid for identification then we\u0027ll need to have a plan for those resources (if any) which use a non-uuid for their id. We\u0027ve discussed this before just sticking it in here as a reminder.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7912505f7c431ab8685f1f40df664846486d0334","unresolved":false,"context_lines":[{"line_number":390,"context_line":"    {"},{"line_number":391,"context_line":"      \"resource_pool\": {"},{"line_number":392,"context_line":"        \"uuid\": \"eaaf1c04-ced2-40e4-89a2-87edded06d64\","},{"line_number":393,"context_line":"        \"external_id\": \"34372241-2c0c-4da3-a08e-19ffb6367ace\","},{"line_number":394,"context_line":"        \"name\": \"Global NFS share\","},{"line_number":395,"context_line":"        \"aggregates\": ["},{"line_number":396,"context_line":"            \"cd2ca052-6f9a-4b49-b466-f913e528d3cb\""}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_b33c52c9","line":393,"updated":"2016-02-22 19:40:06.000000000","message":"Yes, good catch. Removed.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7912505f7c431ab8685f1f40df664846486d0334","unresolved":false,"context_lines":[{"line_number":548,"context_line":"            \"min_unit\": 1,"},{"line_number":549,"context_line":"            \"max_unit\": 100,"},{"line_number":550,"context_line":"            \"step_size\": 1,"},{"line_number":551,"context_line":"            \"used\": 10"},{"line_number":552,"context_line":"          }"},{"line_number":553,"context_line":"        ],"},{"line_number":554,"context_line":"        \"links\": ["}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_93394eda","line":551,"updated":"2016-02-22 19:40:06.000000000","message":"I can do that too, sure.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"f5876e8fb796b7daae3f61ecd96a1913c3bb24c3","unresolved":false,"context_lines":[{"line_number":548,"context_line":"            \"min_unit\": 1,"},{"line_number":549,"context_line":"            \"max_unit\": 100,"},{"line_number":550,"context_line":"            \"step_size\": 1,"},{"line_number":551,"context_line":"            \"used\": 10"},{"line_number":552,"context_line":"          }"},{"line_number":553,"context_line":"        ],"},{"line_number":554,"context_line":"        \"links\": ["}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_7ce8327d","line":551,"updated":"2016-02-19 22:08:30.000000000","message":"I despise lists of anonymous dicts. Makes testing and client code more complex. I know they make sense some of the time, but in this case would it make sense to have a dict, where the key is the resource_class?","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"0c1d8ac0563473e01e1d1ddd6461535b6e3504e3","unresolved":false,"context_lines":[{"line_number":548,"context_line":"            \"min_unit\": 1,"},{"line_number":549,"context_line":"            \"max_unit\": 100,"},{"line_number":550,"context_line":"            \"step_size\": 1,"},{"line_number":551,"context_line":"            \"used\": 10"},{"line_number":552,"context_line":"          }"},{"line_number":553,"context_line":"        ],"},{"line_number":554,"context_line":"        \"links\": ["}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_6aa68154","line":551,"updated":"2016-02-21 15:37:55.000000000","message":"In that case I would still prefer {resources: {the_class: [{objects of that class}]}. The issue is with accessing the thing I actually want when using the api instead of having to dig around chaotic.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"4759d1bb1a5efaed1203fc003efcd4de4dd3c913","unresolved":false,"context_lines":[{"line_number":548,"context_line":"            \"min_unit\": 1,"},{"line_number":549,"context_line":"            \"max_unit\": 100,"},{"line_number":550,"context_line":"            \"step_size\": 1,"},{"line_number":551,"context_line":"            \"used\": 10"},{"line_number":552,"context_line":"          }"},{"line_number":553,"context_line":"        ],"},{"line_number":554,"context_line":"        \"links\": ["}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_88d84955","line":551,"in_reply_to":"bae84128_7ce8327d","updated":"2016-02-20 06:51:41.000000000","message":"IMHO it\u0027s not a good idea in the case where you\u0027ll have multiple resources of the same class.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7912505f7c431ab8685f1f40df664846486d0334","unresolved":false,"context_lines":[{"line_number":672,"context_line":""},{"line_number":673,"context_line":"* `20O OK` if the call was successful"},{"line_number":674,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found"},{"line_number":675,"context_line":"* `404 Not Found` if the resource pool was found but the aggregate with ID"},{"line_number":676,"context_line":"  `{uuid}` was not found"},{"line_number":677,"context_line":""},{"line_number":678,"context_line":"Security impact"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_f3325af1","line":675,"updated":"2016-02-22 19:40:06.000000000","message":"Done. Nice catch. Copy paste stuff....","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"f5876e8fb796b7daae3f61ecd96a1913c3bb24c3","unresolved":false,"context_lines":[{"line_number":672,"context_line":""},{"line_number":673,"context_line":"* `20O OK` if the call was successful"},{"line_number":674,"context_line":"* `404 Not Found` if a resource pool with `{uuid}` was not found"},{"line_number":675,"context_line":"* `404 Not Found` if the resource pool was found but the aggregate with ID"},{"line_number":676,"context_line":"  `{uuid}` was not found"},{"line_number":677,"context_line":""},{"line_number":678,"context_line":"Security impact"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_3cc7ca13","line":675,"updated":"2016-02-19 22:08:30.000000000","message":"don\u0027t need this one, we\u0027re listing all aggregates (not aggregate uuid provided) so presumably empty list then","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"f5876e8fb796b7daae3f61ecd96a1913c3bb24c3","unresolved":false,"context_lines":[{"line_number":748,"context_line":""},{"line_number":749,"context_line":"* Create database models and migrations for updated `resource_providers` and"},{"line_number":750,"context_line":"  the new `resource_provider_aggregates` tables."},{"line_number":751,"context_line":"* Create `nova.objects` models for `ResourcePool`"},{"line_number":752,"context_line":"* Create REST API controllers for resource pool querying and handling"},{"line_number":753,"context_line":"* Modify resource tracker to pull information on aggregates the compute node is"},{"line_number":754,"context_line":"  associated with and determine if disk capacity and usage tracking should be"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_9cfff633","line":751,"updated":"2016-02-19 22:08:30.000000000","message":"For clarity: What distinguishes a ResourcePool from a ResourceProvider with a name? Is it the associated aggregate?\n\nFrom the naive implementor\u0027s standpoint navigating the gap between the SQL goals and the nova.objects stuff is challenging.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7912505f7c431ab8685f1f40df664846486d0334","unresolved":false,"context_lines":[{"line_number":748,"context_line":""},{"line_number":749,"context_line":"* Create database models and migrations for updated `resource_providers` and"},{"line_number":750,"context_line":"  the new `resource_provider_aggregates` tables."},{"line_number":751,"context_line":"* Create `nova.objects` models for `ResourcePool`"},{"line_number":752,"context_line":"* Create REST API controllers for resource pool querying and handling"},{"line_number":753,"context_line":"* Modify resource tracker to pull information on aggregates the compute node is"},{"line_number":754,"context_line":"  associated with and determine if disk capacity and usage tracking should be"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_d32f5686","line":751,"updated":"2016-02-22 19:40:06.000000000","message":"Yes, you are correct. A ResourcePool is simply a resource provider with a name and one or more aggregate relations.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7912505f7c431ab8685f1f40df664846486d0334","unresolved":false,"context_lines":[{"line_number":755,"context_line":"  skipped if a resource pool is tracking that information separately"},{"line_number":756,"context_line":"* Modify the scheduler to look at resource pool information for aggregates"},{"line_number":757,"context_line":"  associated with compute nodes to determine if request can be fulfilled by the"},{"line_number":758,"context_line":"  resource pool"},{"line_number":759,"context_line":"* Docs and example cronjob scripts for updating capacity and usage information"},{"line_number":760,"context_line":"  for a shared resource pool of disk"},{"line_number":761,"context_line":"* Functional integration tests in a multi-node devstack environment with shared"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_334fa26c","line":758,"updated":"2016-02-22 19:40:06.000000000","message":"Done.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"36e7b64d92fd8083726c5c9253895d0bbc08139e","unresolved":false,"context_lines":[{"line_number":755,"context_line":"  skipped if a resource pool is tracking that information separately"},{"line_number":756,"context_line":"* Modify the scheduler to look at resource pool information for aggregates"},{"line_number":757,"context_line":"  associated with compute nodes to determine if request can be fulfilled by the"},{"line_number":758,"context_line":"  resource pool"},{"line_number":759,"context_line":"* Docs and example cronjob scripts for updating capacity and usage information"},{"line_number":760,"context_line":"  for a shared resource pool of disk"},{"line_number":761,"context_line":"* Functional integration tests in a multi-node devstack environment with shared"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_a8ac34ee","line":758,"updated":"2016-02-19 23:47:43.000000000","message":"I\u0027d like to see more of that, and how we should modify the scheduler, either by adding a new driver or modifying the FilterScheduler.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"36e7b64d92fd8083726c5c9253895d0bbc08139e","unresolved":false,"context_lines":[{"line_number":759,"context_line":"* Docs and example cronjob scripts for updating capacity and usage information"},{"line_number":760,"context_line":"  for a shared resource pool of disk"},{"line_number":761,"context_line":"* Functional integration tests in a multi-node devstack environment with shared"},{"line_number":762,"context_line":"  storage"},{"line_number":763,"context_line":""},{"line_number":764,"context_line":"Dependencies"},{"line_number":765,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bae84128_e85f5c0c","line":762,"updated":"2016-02-19 23:47:43.000000000","message":"See, that spec is becoming huuuge. TBH, it\u0027s very hard to review 800+ lines so I\u0027m a bit worried to miss anything important. That\u0027s just a note, but we need to make sure that this spec is a direction that could be a bit modified in the implementation details if needed.","commit_id":"314808fe9da97575827c2a2b7009cdcf5450ac44"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"42b5e7eede19bf9a0a47e463c0004da2239fae55","unresolved":false,"context_lines":[{"line_number":181,"context_line":""},{"line_number":182,"context_line":"   Nova asks Neutron about any ports that the user has specified in the boot"},{"line_number":183,"context_line":"   command. The port\u0027s segment UUID will be returned in the port details from"},{"line_number":184,"context_line":"   Neutron for any port that is in a routed network."},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"   The Nova scheduler (or conductor) would be able to determine the set of"},{"line_number":187,"context_line":"   compute nodes used in placement decisions by looking at the aggregates that"}],"source_content_type":"text/x-rst","patch_set":12,"id":"bae84128_5dc33a38","line":184,"updated":"2016-02-23 10:06:01.000000000","message":"like I said in PS11, that leaves some open question about the implementation details but since it\u0027s just an example, let\u0027s leave that conversation out of this spec.","commit_id":"0d6836df17d90fce70d5abbe3b654b12ca7bb36b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"42b5e7eede19bf9a0a47e463c0004da2239fae55","unresolved":false,"context_lines":[{"line_number":186,"context_line":"   The Nova scheduler (or conductor) would be able to determine the set of"},{"line_number":187,"context_line":"   compute nodes used in placement decisions by looking at the aggregates that"},{"line_number":188,"context_line":"   the resource pool was associated with, which will in turn allow it to"},{"line_number":189,"context_line":"   identify the compute nodes associated with those aggregates."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"What this gives the cloud user is basic network affinity during scheduling,"},{"line_number":192,"context_line":"with the cloud user only needing to specify a port ID they created in a"}],"source_content_type":"text/x-rst","patch_set":12,"id":"bae84128_1d4252ae","line":189,"updated":"2016-02-23 10:06:01.000000000","message":"that leaves the question on how you plan to query that (I suppose by using the Computenode object facade) and how to replace the existing call to ComputeNodeList.get_all() but we can sort that out when reviewing the implementation patches.","commit_id":"0d6836df17d90fce70d5abbe3b654b12ca7bb36b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"42b5e7eede19bf9a0a47e463c0004da2239fae55","unresolved":false,"context_lines":[{"line_number":210,"context_line":"match the `IPV4_ADDRESS` resource class for the instance UUID as a consumer."},{"line_number":211,"context_line":"From this list we can identify the aggregates associated with the resource"},{"line_number":212,"context_line":"provider and from the list of aggregates we can determine the compute hosts"},{"line_number":213,"context_line":"that can serve as target destinations for the migration."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"Alternatives"},{"line_number":216,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":12,"id":"bae84128_b871b4aa","line":213,"updated":"2016-02-23 10:06:01.000000000","message":"So, I have some implementation concerns here (how you plan to check that, either in the HostManager or within a dedicated filter (if so, per host)) or perhaps you want to provide an object Facade for this, but given the agreement we had yesterday, I can leave those concerns to the implementation patch reviews.","commit_id":"0d6836df17d90fce70d5abbe3b654b12ca7bb36b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"42b5e7eede19bf9a0a47e463c0004da2239fae55","unresolved":false,"context_lines":[{"line_number":240,"context_line":"A new nova object model for resource pools will be introduced. This object"},{"line_number":241,"context_line":"model will be a thin facade over the `resource_providers` table and allow"},{"line_number":242,"context_line":"querying for the aggregates associated with the resource pool along with the"},{"line_number":243,"context_line":"inventory and allocation records for the pool."},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"REST API impact"},{"line_number":246,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":12,"id":"bae84128_78f0ccfe","line":243,"updated":"2016-02-23 10:06:01.000000000","message":"okay, that helps me a little bit and is enough for me to accept the spec. Thanks for adding that, we\u0027ll see how to use that in the patches reviews.","commit_id":"0d6836df17d90fce70d5abbe3b654b12ca7bb36b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"42b5e7eede19bf9a0a47e463c0004da2239fae55","unresolved":false,"context_lines":[{"line_number":243,"context_line":"inventory and allocation records for the pool."},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"REST API impact"},{"line_number":246,"context_line":"---------------"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"*ALL* below API calls are meant only for cloud administrators."},{"line_number":249,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"bae84128_38680487","line":246,"updated":"2016-02-23 10:06:01.000000000","message":"While the overall section seems good to me, most resources are very tied to the implementation details that will pop up when writing code. I\u0027m fine with that, we could amend the spec later if needed.","commit_id":"0d6836df17d90fce70d5abbe3b654b12ca7bb36b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"42b5e7eede19bf9a0a47e463c0004da2239fae55","unresolved":false,"context_lines":[{"line_number":252,"context_line":"since these calls will be part of the split-out scheduler REST API.  There"},{"line_number":253,"context_line":"should be a wholly separate placement API endpoint, started on a different port"},{"line_number":254,"context_line":"than the Nova API, and served by a different service daemon defined in"},{"line_number":255,"context_line":"`/nova/cmd/placement-api.py`."},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"The following new REST API calls will be added:"},{"line_number":258,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"bae84128_580228b5","line":255,"updated":"2016-02-23 10:06:01.000000000","message":"so the service type would be \u0027placement\u0027 I guess. Better than \u0027scheduler\u0027 for sure.","commit_id":"0d6836df17d90fce70d5abbe3b654b12ca7bb36b"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"0e210f32f84f28b6ab72870b2088aa09d8371bbc","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        ],"},{"line_number":272,"context_line":"        \"resources\": {"},{"line_number":273,"context_line":"          \"DISK_GB\": {"},{"line_number":274,"context_line":"            \"capacity\": 2048,"},{"line_number":275,"context_line":"            \"reserved\": 100,"},{"line_number":276,"context_line":"            \"allocation_ratio\": 1.0,"},{"line_number":277,"context_line":"            \"min_unit\": 1,"}],"source_content_type":"text/x-rst","patch_set":12,"id":"9aed3d3a_4c2639cf","line":274,"updated":"2016-02-26 18:52:49.000000000","message":"Is this intentionally capacity rather than the \u0027total\u0027 used in the Inventory object and model?\n\nSame comment in several other representations.","commit_id":"0d6836df17d90fce70d5abbe3b654b12ca7bb36b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a071de68d443e99e345005a242d7360d92f35c24","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        ],"},{"line_number":272,"context_line":"        \"resources\": {"},{"line_number":273,"context_line":"          \"DISK_GB\": {"},{"line_number":274,"context_line":"            \"capacity\": 2048,"},{"line_number":275,"context_line":"            \"reserved\": 100,"},{"line_number":276,"context_line":"            \"allocation_ratio\": 1.0,"},{"line_number":277,"context_line":"            \"min_unit\": 1,"}],"source_content_type":"text/x-rst","patch_set":12,"id":"7af24918_dfe33832","line":274,"updated":"2016-03-06 16:43:39.000000000","message":"No, just a mistake. Fixed.","commit_id":"0d6836df17d90fce70d5abbe3b654b12ca7bb36b"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"844844964eb78fae339f988baffea884fc199244","unresolved":false,"context_lines":[{"line_number":484,"context_line":"            \"cd2ca052-6f9a-4b49-b466-f913e528d3cb\""},{"line_number":485,"context_line":"        ],"},{"line_number":486,"context_line":"        \"resources\": {"},{"line_number":487,"context_line":"          \"DISK_GB\": {"},{"line_number":488,"context_line":"            \"capacity\": 2048,"},{"line_number":489,"context_line":"            \"reserved\": 100,"},{"line_number":490,"context_line":"            \"allocation_ratio\": 1.0,"}],"source_content_type":"text/x-rst","patch_set":12,"id":"bae84128_2a6c0acf","line":487,"range":{"start_line":487,"start_character":10,"end_line":487,"end_character":22},"updated":"2016-02-23 20:03:32.000000000","message":"Nit: Shouldn\u0027t be:\n  \"DISK_GB\": [{…}],\nso the class can have multiple resource objects, just like Chris suggested?","commit_id":"0d6836df17d90fce70d5abbe3b654b12ca7bb36b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8bcd9c45a479f1b231ca85295b632c92d634fe14","unresolved":false,"context_lines":[{"line_number":484,"context_line":"            \"cd2ca052-6f9a-4b49-b466-f913e528d3cb\""},{"line_number":485,"context_line":"        ],"},{"line_number":486,"context_line":"        \"resources\": {"},{"line_number":487,"context_line":"          \"DISK_GB\": {"},{"line_number":488,"context_line":"            \"capacity\": 2048,"},{"line_number":489,"context_line":"            \"reserved\": 100,"},{"line_number":490,"context_line":"            \"allocation_ratio\": 1.0,"}],"source_content_type":"text/x-rst","patch_set":12,"id":"bae84128_aa7f7aa9","line":487,"range":{"start_line":487,"start_character":10,"end_line":487,"end_character":22},"in_reply_to":"bae84128_2a6c0acf","updated":"2016-02-23 20:15:38.000000000","message":"Hi Roman,\n\nNo, there would only ever be a single row per resource class for the resource provider. Each row is an entry in the \"resources\" dict, keyed by the resource class name.","commit_id":"0d6836df17d90fce70d5abbe3b654b12ca7bb36b"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"4346fa483e5d45a871311bdad5be18f4c8f1b529","unresolved":false,"context_lines":[{"line_number":484,"context_line":"            \"cd2ca052-6f9a-4b49-b466-f913e528d3cb\""},{"line_number":485,"context_line":"        ],"},{"line_number":486,"context_line":"        \"resources\": {"},{"line_number":487,"context_line":"          \"DISK_GB\": {"},{"line_number":488,"context_line":"            \"capacity\": 2048,"},{"line_number":489,"context_line":"            \"reserved\": 100,"},{"line_number":490,"context_line":"            \"allocation_ratio\": 1.0,"}],"source_content_type":"text/x-rst","patch_set":12,"id":"bae84128_b19eca04","line":487,"range":{"start_line":487,"start_character":10,"end_line":487,"end_character":22},"in_reply_to":"bae84128_aa7f7aa9","updated":"2016-02-23 21:43:50.000000000","message":"Hm. So you\u0027re saying, within the single resource pool there is no way to have more than one class of resource? I was thinking on the situation, that we have i.e. disk_gb resource class for both, an array of hdd disks and array of ssd - so it might be easily distinguished… or I\u0027m missing something obvious :)","commit_id":"0d6836df17d90fce70d5abbe3b654b12ca7bb36b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"42b5e7eede19bf9a0a47e463c0004da2239fae55","unresolved":false,"context_lines":[{"line_number":708,"context_line":"inventory and usage information for each resource pool assigned to each"},{"line_number":709,"context_line":"aggregate so that filters like the `DiskFilter` can query not just the host\u0027s"},{"line_number":710,"context_line":"`local_gb` value but also the aggregate\u0027s inventory information for share disk"},{"line_number":711,"context_line":"storage."},{"line_number":712,"context_line":""},{"line_number":713,"context_line":"* Docs and example cronjob scripts for updating capacity and usage information"},{"line_number":714,"context_line":"  for a shared resource pool of disk"}],"source_content_type":"text/x-rst","patch_set":12,"id":"bae84128_78da8c4d","line":711,"updated":"2016-02-23 10:06:01.000000000","message":"Thanks for adding that, it makes that a bit clearer to me that we will keep a per-host basis filtering then.","commit_id":"0d6836df17d90fce70d5abbe3b654b12ca7bb36b"}],"specs/newton/approved/generic-resource-pools.rst":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"030ae433ef695392683616771abdf7ec9563eade","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 --network port_id\u003d$PORT_ID"},{"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 a member of a resource pool containing"}],"source_content_type":"text/x-rst","patch_set":14,"id":"1af94dfe_49c23dea","line":175,"updated":"2016-03-18 12:56:17.000000000","message":"@edleafe: Nice catch. Fixed.","commit_id":"911eda6705f4b569e4eaebb1c605ed254f33feb5"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"eade0987ccc3a899fc49f8c320c88581582ee523","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 --network port_id\u003d$PORT_ID"},{"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 a member of a resource pool containing"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5aef4532_455a302b","line":175,"range":{"start_line":175,"start_character":14,"end_line":175,"end_character":40},"updated":"2016-03-09 21:07:11.000000000","message":"I am assuming that this is supposed to be the `--nic`` command, correct? If so, the user should have to supply the $SUBNET_ID in the previous step as the net-id argument. This will save a call to Neutron to get the subnet ID, so that we can determine if there is an associated resource pool for the subnet:\n\n    nova boot --nic port-id\u003d$PORT_ID,net-id\u003d$SUBNET_ID","commit_id":"911eda6705f4b569e4eaebb1c605ed254f33feb5"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"030ae433ef695392683616771abdf7ec9563eade","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    nova boot --network port_id\u003d$PORT_ID"},{"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 a member of a resource pool containing"},{"line_number":179,"context_line":"   `IPV4_ADDRESS` resources, which compute nodes are possible target"},{"line_number":180,"context_line":"   destinations that are associated with that IPv4 subnet?\"."},{"line_number":181,"context_line":""}],"source_content_type":"text/x-rst","patch_set":14,"id":"1af94dfe_a9b5c17e","line":178,"updated":"2016-03-18 12:56:17.000000000","message":"Done.","commit_id":"911eda6705f4b569e4eaebb1c605ed254f33feb5"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"cb72c0bf94af2f515b30b83caa2235158fb34589","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    nova boot --network port_id\u003d$PORT_ID"},{"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 a member of a resource pool containing"},{"line_number":179,"context_line":"   `IPV4_ADDRESS` resources, which compute nodes are possible target"},{"line_number":180,"context_line":"   destinations that are associated with that IPv4 subnet?\"."},{"line_number":181,"context_line":""}],"source_content_type":"text/x-rst","patch_set":14,"id":"5aef4532_69bf4caa","line":178,"range":{"start_line":178,"start_character":26,"end_line":178,"end_character":42},"updated":"2016-03-09 19:46:26.000000000","message":"port ID is a member","commit_id":"911eda6705f4b569e4eaebb1c605ed254f33feb5"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"eade0987ccc3a899fc49f8c320c88581582ee523","unresolved":false,"context_lines":[{"line_number":179,"context_line":"   `IPV4_ADDRESS` resources, which compute nodes are possible target"},{"line_number":180,"context_line":"   destinations that are associated with that IPv4 subnet?\"."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"   Nova asks Neutron about any ports that the user has specified in the boot"},{"line_number":183,"context_line":"   command. The port\u0027s segment UUID will be returned in the port details from"},{"line_number":184,"context_line":"   Neutron for any port that is in a routed network."},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"   The Nova scheduler (or conductor) would be able to determine the set of"}],"source_content_type":"text/x-rst","patch_set":14,"id":"5aef4532_457fd065","line":183,"range":{"start_line":182,"start_character":3,"end_line":183,"end_character":12},"updated":"2016-03-09 21:07:11.000000000","message":"If we have them specify the $SUBNET_ID in the command, we can save having to make this call.","commit_id":"911eda6705f4b569e4eaebb1c605ed254f33feb5"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"030ae433ef695392683616771abdf7ec9563eade","unresolved":false,"context_lines":[{"line_number":180,"context_line":"   destinations that are associated with that IPv4 subnet?\"."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"   Nova asks Neutron about any ports that the user has specified in the boot"},{"line_number":183,"context_line":"   command. The port\u0027s segment UUID will be returned in the port details from"},{"line_number":184,"context_line":"   Neutron for any port that is in a routed network."},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"   The Nova scheduler (or conductor) would be able to determine the set of"}],"source_content_type":"text/x-rst","patch_set":14,"id":"1af94dfe_89b8c576","line":183,"updated":"2016-03-18 12:56:17.000000000","message":"ack. removed.","commit_id":"911eda6705f4b569e4eaebb1c605ed254f33feb5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"4335048d2a136710e73ec08ee696a19735113202","unresolved":false,"context_lines":[{"line_number":384,"context_line":"            \"step_size\": 1"},{"line_number":385,"context_line":"          }"},{"line_number":386,"context_line":"        },"},{"line_number":387,"context_line":"    }"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"The following JSONSchema document shall inform the request payload::"},{"line_number":390,"context_line":""}],"source_content_type":"text/x-rst","patch_set":14,"id":"1af94dfe_35cda485","line":387,"updated":"2016-03-17 20:46:46.000000000","message":"In strict PUT semantics this means that the resource_pool at uuid will have no aggregates. Is that:\n\n* oops, there\u0027s supposed to be some aggregates in there\n* on purpose:\n** the aggregates stay, they only matter in POST\n** this is a removal of the aggregates","commit_id":"911eda6705f4b569e4eaebb1c605ed254f33feb5"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"030ae433ef695392683616771abdf7ec9563eade","unresolved":false,"context_lines":[{"line_number":384,"context_line":"            \"step_size\": 1"},{"line_number":385,"context_line":"          }"},{"line_number":386,"context_line":"        },"},{"line_number":387,"context_line":"    }"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"The following JSONSchema document shall inform the request payload::"},{"line_number":390,"context_line":""}],"source_content_type":"text/x-rst","patch_set":14,"id":"1af94dfe_e9b34996","line":387,"updated":"2016-03-18 12:56:17.000000000","message":"On purpose. Aggregates stay. They only matter on POST. To replace aggregates, use PUT /resource_pools/{id}/aggregates.","commit_id":"911eda6705f4b569e4eaebb1c605ed254f33feb5"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"030ae433ef695392683616771abdf7ec9563eade","unresolved":false,"context_lines":[{"line_number":386,"context_line":"        },"},{"line_number":387,"context_line":"    }"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"The following JSONSchema document shall inform the request payload::"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"    {"},{"line_number":392,"context_line":"      \"type\": \"object\","}],"source_content_type":"text/x-rst","patch_set":14,"id":"1af94dfe_c9ae4d2d","line":389,"updated":"2016-03-18 12:56:17.000000000","message":"Fixed. Also added minItems: 1 to the aggregates array property.","commit_id":"911eda6705f4b569e4eaebb1c605ed254f33feb5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"f85cfebbdc21126215b5dba9861ed2e6553cd693","unresolved":false,"context_lines":[{"line_number":386,"context_line":"        },"},{"line_number":387,"context_line":"    }"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"The following JSONSchema document shall inform the request payload::"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"    {"},{"line_number":392,"context_line":"      \"type\": \"object\","}],"source_content_type":"text/x-rst","patch_set":14,"id":"3afc51ec_f0789ac6","line":389,"updated":"2016-03-14 20:13:40.000000000","message":"This schema is not correct in a couple ways: int, and float should be integer and number. resource_class can\u0027t required because it is no longer there. The nesting of the additionalProperties is not quite right. I think the following is close to what you\u0027re really after:\n\n    {\n    \"type\": \"object\",\n    \"properties\": {\n        \"name\": {\n            \"type\": \"string\"\n        },\n        \"uuid\": {\n            \"type\": \"string\"\n        },\n        \"aggregates\": {\n            \"type\": \"array\",\n            \"items\": {\n                \"type\": \"string\"\n            }\n        },\n        \"resources\": {\n            \"type\": \"object\",\n            \"patternProperties\": {\n                \"^(/[^/]+)+$\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                        \"total\": {\n                            \"type\": \"integer\"\n                        },\n                        \"reserved\": {\n                            \"type\": \"integer\"\n                        },\n                        \"min_unit\": {\n                            \"type\": \"integer\"\n                        },\n                        \"max_unit\": {\n                            \"type\": \"integer\"\n                        },\n                        \"step_size\": {\n                            \"type\": \"integer\"\n                        },\n                        \"allocation_ratio\": {\n                            \"type\": \"number\"\n                        },\n                    },\n                    \"additionalProperties\": False,\n                }\n            },\n            \"additionalProperties\": False,\n        }\n    },\n    \"additionalProperties\": False\n   }","commit_id":"911eda6705f4b569e4eaebb1c605ed254f33feb5"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"030ae433ef695392683616771abdf7ec9563eade","unresolved":false,"context_lines":[{"line_number":501,"context_line":"          }"},{"line_number":502,"context_line":"        ]"},{"line_number":503,"context_line":"      }"},{"line_number":504,"context_line":"    }"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"`GET /resource_pools`"},{"line_number":507,"context_line":"*********************"}],"source_content_type":"text/x-rst","patch_set":14,"id":"1af94dfe_29aa5119","line":504,"updated":"2016-03-18 12:56:17.000000000","message":"Fixed. Was a mistake.","commit_id":"911eda6705f4b569e4eaebb1c605ed254f33feb5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"855d2f247f9289b00c32113ff68856daf399c879","unresolved":false,"context_lines":[{"line_number":501,"context_line":"          }"},{"line_number":502,"context_line":"        ]"},{"line_number":503,"context_line":"      }"},{"line_number":504,"context_line":"    }"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"`GET /resource_pools`"},{"line_number":507,"context_line":"*********************"}],"source_content_type":"text/x-rst","patch_set":14,"id":"1af94dfe_efdfed37","line":504,"updated":"2016-03-17 20:00:33.000000000","message":"In this links are at the same level as uuid. In the post response, they are at the same level as resource_pool. Is should be the same. Which is it?","commit_id":"911eda6705f4b569e4eaebb1c605ed254f33feb5"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"e6eec2354e62249e244f8489ecdb69e303fe7e24","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"As an advanced Neutron user, I wish to use the new routed networks"},{"line_number":43,"context_line":"functionality and be able to have Nova understand that a particular pre-created"},{"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"}],"source_content_type":"text/x-rst","patch_set":15,"id":"fa0719c6_3e75fff8","line":44,"range":{"start_line":44,"start_character":43,"end_line":44,"end_character":54},"updated":"2016-03-21 22:03:03.000000000","message":"For clarity, I would remove these 2 words. Routed networks are made up of a number of segments","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"c9283fe0dbaca86587d2ed07ea7dacf1f631d080","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`nova 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":15,"id":"fa0719c6_9eecd690","line":89,"range":{"start_line":89,"start_character":8,"end_line":89,"end_character":35},"updated":"2016-03-22 20:56:06.000000000","message":"in this model what will be the aggregation for bandwidth guarantee between VM(s)on same physical NIC?\n\nfor example let say I have physical NIC 10GB and I launched 2 VM with bandwidth guarantee of 5GB each. The next VM with 5GB of bandwidth guarantee should fail what will be the aggregate-uuid for such resource?","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"c9283fe0dbaca86587d2ed07ea7dacf1f631d080","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":"    nova resource-pool-update-inventory $RP_UUID \\"},{"line_number":94,"context_line":"        --resource-class\u003dDISK_GB \\"},{"line_number":95,"context_line":"        --capacity\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":15,"id":"fa0719c6_4fa563b3","line":94,"updated":"2016-03-22 20:56:06.000000000","message":"wouldn\u0027t  we want to save the resource capabilities as well?\nfor example we have disk resource and it\u0027s capabilities are \ncapacity, Rotational speed, Average latency .. \nsome capabilities  like capacity can be aggregate and some are fixed capabilities  like  Rotational speed. \n\nI just want to see how can I link this spec to my spec \nhttps://review.openstack.org/#/c/286073/ for scheduling with device capabilities (Note: my spec talks about scheduling with NIC capabilities, but see Daniel Berrange comment for more generic approach)","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"e6eec2354e62249e244f8489ecdb69e303fe7e24","unresolved":false,"context_lines":[{"line_number":110,"context_line":"In this (future) scenario, we are assuming the Neutron routed networks"},{"line_number":111,"context_line":"functionality is available in our deployment. There are a set of routed"},{"line_number":112,"context_line":"networks, each containing a set of IP addresses, that represent the physical"},{"line_number":113,"context_line":"network topology in the datacenter. Let us assume that routed network with the"},{"line_number":114,"context_line":"identifier `rnA` represents the subnet IP pool for all compute nodes in rack 1"},{"line_number":115,"context_line":"in row 3 of the datacenter. This subnet has a CIDR of `192.168.10.1/24`. Let us"},{"line_number":116,"context_line":"also assume that unmanaged devices are consuming the bottom 5 IP addresses on"}],"source_content_type":"text/x-rst","patch_set":15,"id":"fa0719c6_d9269d67","line":113,"range":{"start_line":113,"start_character":36,"end_line":113,"end_character":69},"updated":"2016-03-21 22:03:03.000000000","message":"I would replace this by: \u0027Routed networks are made up of several individual segments. While routed networks span the entire data center, each individual segment is associated with a subset of compute hosts (an aggregate in the terminology of this spec). Let us assume that the segment...\u0027","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"e6eec2354e62249e244f8489ecdb69e303fe7e24","unresolved":false,"context_lines":[{"line_number":112,"context_line":"networks, each containing a set of IP addresses, that represent the physical"},{"line_number":113,"context_line":"network topology in the datacenter. Let us assume that routed network with the"},{"line_number":114,"context_line":"identifier `rnA` represents the subnet IP pool for all compute nodes in rack 1"},{"line_number":115,"context_line":"in row 3 of the datacenter. This subnet has a CIDR of `192.168.10.1/24`. Let us"},{"line_number":116,"context_line":"also assume that unmanaged devices are consuming the bottom 5 IP addresses on"},{"line_number":117,"context_line":"the subnet."},{"line_number":118,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"fa0719c6_b9ec89c8","line":115,"range":{"start_line":115,"start_character":55,"end_line":115,"end_character":70},"updated":"2016-03-21 22:03:03.000000000","message":"Nit. When you create a subnet, Neutron will accept a cidr in this format. However, it internally changes it to \u0027192.168.10.0/24\u0027 (this is what comes back in the response, see example here: http://paste.openstack.org/show/491364/). So, while acceptable, \u0027192.168.10.1/24\u0027 looks weird","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"e6eec2354e62249e244f8489ecdb69e303fe7e24","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    $NET_UUID\u003d`neutron net-create \"routed network\"`"},{"line_number":123,"context_line":"    $SEG_UUID\u003d`neutron segment-create $NET_UUID`"},{"line_number":124,"context_line":"    $SUBNET_UUID\u003d`neutron 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::"}],"source_content_type":"text/x-rst","patch_set":15,"id":"fa0719c6_5921edfa","line":124,"range":{"start_line":124,"start_character":57,"end_line":124,"end_character":72},"updated":"2016-03-21 22:03:03.000000000","message":"Nit. Per comment to line 115, I would change this to 192.168.10.0/24","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"e6eec2354e62249e244f8489ecdb69e303fe7e24","unresolved":false,"context_lines":[{"line_number":153,"context_line":"4) The cloud deployer updates the resource pool\u0027s capacity of IPv4 addresses::"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    nova resource-pool-update-inventory $RP_UUID \\"},{"line_number":156,"context_line":"        --resource-class\u003dIPV4_ADDRESS \\"},{"line_number":157,"context_line":"        --capacity\u003d254 --reserved\u003d5 \\"},{"line_number":158,"context_line":"        --min-unit\u003d1 --max-unit\u003d1 --step-size\u003d1 \\"},{"line_number":159,"context_line":"        --allocation-ratio\u003d1.0"}],"source_content_type":"text/x-rst","patch_set":15,"id":"fa0719c6_d9b69d89","line":156,"range":{"start_line":156,"start_character":25,"end_line":156,"end_character":37},"updated":"2016-03-21 22:03:03.000000000","message":"Do we need an \u0027IPV6_ADDRESS\u0027 resource class? IPv6 ranges are huge, so maybe we don\u0027t. At least, let\u0027s debate it a little bit","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"e6eec2354e62249e244f8489ecdb69e303fe7e24","unresolved":false,"context_lines":[{"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::"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    PORT_UUID\u003d`neutron port-create --network-id\u003d$SUBNET_UUID`"},{"line_number":171,"context_line":""},{"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::"}],"source_content_type":"text/x-rst","patch_set":15,"id":"fa0719c6_0bf9d880","line":170,"range":{"start_line":170,"start_character":15,"end_line":170,"end_character":60},"updated":"2016-03-21 22:03:03.000000000","message":"The correct command is:\n\nneutron port-create --fixed-ip subnet_id\u003d$SUBNET_UUID","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"e6eec2354e62249e244f8489ecdb69e303fe7e24","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":15,"id":"fa0719c6_cee88e7f","line":175,"range":{"start_line":175,"start_character":38,"end_line":175,"end_character":61},"updated":"2016-03-21 22:03:03.000000000","message":"This shouldn\u0027t be here. You don\u0027t specify the subnet in an instance boot. The command is: \n\nnova boot --nic port_id\u003d$PORT_UUID\n\nI see, though, why you want to have the subnet uuid here. In step 7 you want to use it to access the corresponding resource pool... Currently, in the api for Neutron within Nova, we have method _process_requested_networks in http://git.openstack.org/cgit/openstack/nova/tree/nova/network/neutronv2/api.py#n340. In line 400, this method does a show port (if you passed a port in the boot command). The show port returns the subnet ids from where the port got ip addresses. Please see example here: http://paste.openstack.org/show/491366/\n\nSo we have the necessary data already, without having to change commands or adding calls to Neutron during an instance boot","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"be559c32e8d0f9172d751cdf2e6dda3311dacad8","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":15,"id":"fa0719c6_5ef830c3","line":175,"range":{"start_line":175,"start_character":38,"end_line":175,"end_character":61},"in_reply_to":"fa0719c6_cee88e7f","updated":"2016-03-23 22:55:42.000000000","message":"The subnet ID is needed to determine the associated aggregate for that resource pool. Yes, it can be gotten from the port ID by querying Neutron, but the user must already have it from when they created the port on the subnet, so why not pass it in here?","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b224345304a06051283ca7d599311caef57558dc","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":15,"id":"da0c15f0_2c2807e2","line":189,"updated":"2016-03-28 10:37:13.000000000","message":"But nova eventually makes that call to get all of the security group info and whatnot. Is that somewhere way further along in the process?","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"ddc58e447b1011397e8e7d40d617b4a8f59f82cb","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":15,"id":"fa0719c6_ab5c2c26","line":189,"updated":"2016-03-21 20:57:16.000000000","message":"Is it necessary for them to specify the subnet-ID again on the boot command? That association is already present in the port itself.","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"be559c32e8d0f9172d751cdf2e6dda3311dacad8","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":15,"id":"fa0719c6_5e1f9007","line":189,"in_reply_to":"fa0719c6_ab5c2c26","updated":"2016-03-23 22:55:42.000000000","message":"When the user creates a port, they get back a port ID, not an entire port object containing that information. Since they had to specify the subnet ID when creating the port, specifying it here saves Nova a call to Neutron to get that information.","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"e6eec2354e62249e244f8489ecdb69e303fe7e24","unresolved":false,"context_lines":[{"line_number":196,"context_line":"Live migration moves a workload from a source host to a destination host,"},{"line_number":197,"context_line":"keeping the workload\u0027s networking setup in-tact. In the case where an instance"},{"line_number":198,"context_line":"was booted with a port that is associated with a particular resource pool"},{"line_number":199,"context_line":"containing a routed network\u0027s set of IP addresses, we need to ensure that the"},{"line_number":200,"context_line":"target host is in the same aggregate as the source host (since the routed"},{"line_number":201,"context_line":"network only spans the compute hosts in a particular aggregate)."},{"line_number":202,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"fa0719c6_c1821f00","line":199,"range":{"start_line":199,"start_character":30,"end_line":199,"end_character":49},"updated":"2016-03-21 22:03:03.000000000","message":"I would change this to: segment","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"e6eec2354e62249e244f8489ecdb69e303fe7e24","unresolved":false,"context_lines":[{"line_number":197,"context_line":"keeping the workload\u0027s networking setup in-tact. In the case where an instance"},{"line_number":198,"context_line":"was booted with a port that is associated with a particular resource pool"},{"line_number":199,"context_line":"containing a routed network\u0027s set of IP addresses, we need to ensure that the"},{"line_number":200,"context_line":"target host is in the same aggregate as the source host (since the routed"},{"line_number":201,"context_line":"network only spans the compute hosts in a particular aggregate)."},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"With the generic resource pool information, we can have the scheduler (or"},{"line_number":204,"context_line":"conductor) limit the set of compute nodes used in determining the"}],"source_content_type":"text/x-rst","patch_set":15,"id":"fa0719c6_81b667da","line":201,"range":{"start_line":200,"start_character":67,"end_line":201,"end_character":18},"updated":"2016-03-21 22:03:03.000000000","message":"I would change this to: routed network segments only span","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"ddc58e447b1011397e8e7d40d617b4a8f59f82cb","unresolved":false,"context_lines":[{"line_number":203,"context_line":"With the generic resource pool information, we can have the scheduler (or"},{"line_number":204,"context_line":"conductor) limit the set of compute nodes used in determining the"},{"line_number":205,"context_line":"live-migration\u0027s destination host by examining the resource providers that"},{"line_number":206,"context_line":"match the `IPV4_ADDRESS` resource class for the instance UUID as a consumer."},{"line_number":207,"context_line":"From this list we can identify the aggregates associated with the resource"},{"line_number":208,"context_line":"provider and from the list of aggregates we can determine the compute hosts"},{"line_number":209,"context_line":"that can serve as target destinations for the migration."}],"source_content_type":"text/x-rst","patch_set":15,"id":"fa0719c6_0b42783e","line":206,"updated":"2016-03-21 20:57:16.000000000","message":"what about IPv6 deployments? There should be so many addresses that tracking them isn\u0027t particularily required. However, we do need to keep the segment associations for reference during scheduling to ensure that the VM lands on the correct segment for the IP.","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"ddc58e447b1011397e8e7d40d617b4a8f59f82cb","unresolved":false,"context_lines":[{"line_number":206,"context_line":"match the `IPV4_ADDRESS` resource class for the instance UUID as a consumer."},{"line_number":207,"context_line":"From this list we can identify the aggregates associated with the resource"},{"line_number":208,"context_line":"provider and from the list of aggregates we can determine the compute hosts"},{"line_number":209,"context_line":"that can serve as target destinations for the migration."},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"Alternatives"},{"line_number":212,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":15,"id":"fa0719c6_eb3e24b7","line":209,"updated":"2016-03-21 20:57:16.000000000","message":"Will it be possible to force a migration that violates these constraints? In the routed networks deployments where a segment is scoped to a single rack, it\u0027s very possible that the entire rack may need to be taken down at one point. In that case, the VMs need to be moved to a different rack where they will land in a different segment and get a different IP address.","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"be559c32e8d0f9172d751cdf2e6dda3311dacad8","unresolved":false,"context_lines":[{"line_number":206,"context_line":"match the `IPV4_ADDRESS` resource class for the instance UUID as a consumer."},{"line_number":207,"context_line":"From this list we can identify the aggregates associated with the resource"},{"line_number":208,"context_line":"provider and from the list of aggregates we can determine the compute hosts"},{"line_number":209,"context_line":"that can serve as target destinations for the migration."},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"Alternatives"},{"line_number":212,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":15,"id":"fa0719c6_afc67465","line":209,"in_reply_to":"fa0719c6_eb3e24b7","updated":"2016-03-23 22:55:42.000000000","message":"That is an excellent question, as it raises the requirement on the Neutron side to be able to migrate a routed network to another location with similar capacity, preserving the subnet ID. That will have to happen before Nova could migrate instances off of a rack.","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":7789,"name":"John Wood","email":"john.wood@rackspace.com","username":"woodster"},"change_message_id":"1762b4de00522678b193a9bf3587419c838d075b","unresolved":false,"context_lines":[{"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),"},{"line_number":234,"context_line":"    );"}],"source_content_type":"text/x-rst","patch_set":15,"id":"bab6814e_b5bfd1a8","line":231,"updated":"2016-05-20 22:45:55.000000000","message":"It seems like this should reference an inventory record instead? A resource provider might have more than one resource tracked against it, and a pool is just dealing with one resource type at a time correct?","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":7789,"name":"John Wood","email":"john.wood@rackspace.com","username":"woodster"},"change_message_id":"1762b4de00522678b193a9bf3587419c838d075b","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        \"aggregates\": ["},{"line_number":266,"context_line":"            \"cd2ca052-6f9a-4b49-b466-f913e528d3cb\""},{"line_number":267,"context_line":"        ],"},{"line_number":268,"context_line":"        \"resources\": {"},{"line_number":269,"context_line":"          \"DISK_GB\": {"},{"line_number":270,"context_line":"            \"total\": 2048,"},{"line_number":271,"context_line":"            \"reserved\": 100,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"bab6814e_95044d4a","line":268,"updated":"2016-05-20 22:45:55.000000000","message":"This seems like the \u0027inventories\u0027 table of this spec: http://specs.openstack.org/openstack/nova-specs/specs/mitaka/approved/resource-providers.html\n\nPerhaps this API call under the hood creates an inventory record for the pool?\n\nOverall it seems a pool is really just the association of aggregate(s) to an inventory, correct?","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"c9283fe0dbaca86587d2ed07ea7dacf1f631d080","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        ],"},{"line_number":268,"context_line":"        \"resources\": {"},{"line_number":269,"context_line":"          \"DISK_GB\": {"},{"line_number":270,"context_line":"            \"total\": 2048,"},{"line_number":271,"context_line":"            \"reserved\": 100,"},{"line_number":272,"context_line":"            \"allocation_ratio\": 1.0,"},{"line_number":273,"context_line":"            \"min_unit\": 1,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"fa0719c6_3f5cc8ec","line":270,"range":{"start_line":270,"start_character":11,"end_line":270,"end_character":25},"updated":"2016-03-22 20:56:06.000000000","message":"what the different between capacity and total?\nIn L95 you pass the  --capacity but in the rest you use total","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"c9283fe0dbaca86587d2ed07ea7dacf1f631d080","unresolved":false,"context_lines":[{"line_number":490,"context_line":"            \"min_unit\": 1,"},{"line_number":491,"context_line":"            \"max_unit\": 100,"},{"line_number":492,"context_line":"            \"step_size\": 1,"},{"line_number":493,"context_line":"            \"used\": 450"},{"line_number":494,"context_line":"          }"},{"line_number":495,"context_line":"        }"},{"line_number":496,"context_line":"      },"}],"source_content_type":"text/x-rst","patch_set":15,"id":"fa0719c6_1f4bc488","line":493,"range":{"start_line":493,"start_character":12,"end_line":493,"end_character":23},"updated":"2016-03-22 20:56:06.000000000","message":"Is it possible that external services like neutorn-server will claim and release resource amount? I just think about the bandwidth grantee use case and how to claim/release resource amount that nova is not aware of","commit_id":"83445bc7937077fa6c29c87c8a2dbb5dee6a2a39"}]}
