)]}'
{"specs/newton/approved/custom-resource-classes.rst":[{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"b07fa4115227493d62d2ad8c73da50ce94669a15","unresolved":false,"context_lines":[{"line_number":78,"context_line":"The `nova.objects.fields.ResourceClass` is an Enum field that lists the"},{"line_number":79,"context_line":"standard known resource classes like VCPU, MEMORY_MB, DISK_GB, etc. We will"},{"line_number":80,"context_line":"need to make some modifications to this class and the object models that have a"},{"line_number":81,"context_line":"`ResourceClass` field (`Allocation` and `Inventory` object models). We will"},{"line_number":82,"context_line":"create a new `ResourceClass` **object model** that is wire-compatible with the"},{"line_number":83,"context_line":"`ResourceClass` Enum field."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"This new `ResourceClass` object model would look up its integer index values in"},{"line_number":86,"context_line":"a new API database `resource_classes` table instead of the currently hard-coded"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_18ca156f","line":83,"range":{"start_line":81,"start_character":68,"end_line":83,"end_character":27},"updated":"2016-08-18 18:06:38.000000000","message":"How exactly do you plan to do this? A versioned object has an envelope in its wire format that a field doesn\u0027t have, they necessarily need to be different right?","commit_id":"7a46dc53f6e0e57b2212f7c4a6f8ab18f09158af"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d83ff35f403569e5de5653c6057c4e73f3310796","unresolved":false,"context_lines":[{"line_number":78,"context_line":"The `nova.objects.fields.ResourceClass` is an Enum field that lists the"},{"line_number":79,"context_line":"standard known resource classes like VCPU, MEMORY_MB, DISK_GB, etc. We will"},{"line_number":80,"context_line":"need to make some modifications to this class and the object models that have a"},{"line_number":81,"context_line":"`ResourceClass` field (`Allocation` and `Inventory` object models). We will"},{"line_number":82,"context_line":"create a new `ResourceClass` **object model** that is wire-compatible with the"},{"line_number":83,"context_line":"`ResourceClass` Enum field."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"This new `ResourceClass` object model would look up its integer index values in"},{"line_number":86,"context_line":"a new API database `resource_classes` table instead of the currently hard-coded"}],"source_content_type":"text/x-rst","patch_set":7,"id":"1ac06dbe_b5b6a8f6","line":83,"range":{"start_line":81,"start_character":68,"end_line":83,"end_character":27},"in_reply_to":"1ac06dbe_523f9786","updated":"2016-08-23 16:02:31.000000000","message":"If you meant me, I don\u0027t recall that conversation, or I didn\u0027t know we were talking about this at the time :)\n\nBut yeah, we can\u0027t really change the format of a field without a major version bump for a couple of reasons.\n\nThat said, I\u0027m not really sure why we need to, as this just resolves to a string that is the enum key. So, as long as what we receive is a string, we\u0027re okay, and as long as we make sure to convert new values to something older nodes will accept (or just avoid sending them in the first place) then we\u0027d be okay.\n\nSo I think we probably could just convert this to a straight string value from here on out, and just use that string to look up in the table on either side (perhaps with some @property magic to make it easy,\n\nI\u0027m not sure that adding a new object type (to be nested inside the others) is really warranted. Feels a bit overkill to me.","commit_id":"7a46dc53f6e0e57b2212f7c4a6f8ab18f09158af"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"5c95a08ee08b759afc4b5d0b3438bda7fc70923b","unresolved":false,"context_lines":[{"line_number":78,"context_line":"The `nova.objects.fields.ResourceClass` is an Enum field that lists the"},{"line_number":79,"context_line":"standard known resource classes like VCPU, MEMORY_MB, DISK_GB, etc. We will"},{"line_number":80,"context_line":"need to make some modifications to this class and the object models that have a"},{"line_number":81,"context_line":"`ResourceClass` field (`Allocation` and `Inventory` object models). We will"},{"line_number":82,"context_line":"create a new `ResourceClass` **object model** that is wire-compatible with the"},{"line_number":83,"context_line":"`ResourceClass` Enum field."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"This new `ResourceClass` object model would look up its integer index values in"},{"line_number":86,"context_line":"a new API database `resource_classes` table instead of the currently hard-coded"}],"source_content_type":"text/x-rst","patch_set":7,"id":"1ac06dbe_e3c23c33","line":83,"range":{"start_line":81,"start_character":68,"end_line":83,"end_character":27},"in_reply_to":"1ac06dbe_a1b524ef","updated":"2016-08-23 13:21:35.000000000","message":"I would appreciate some clarity. Looking at the other response I think what\u0027s being proposed is actually to add a new ResourceClass object field to objects that currently have a ResourceClass enum, and then stop populating/using the enum.\n\nSo something like:\n\n    fields \u003d {\u0027resource_class\u0027: fields.ResourceClass, # Enum, deprecated\n              \u0027resource_class\u0027: fields.ObjectField(\u0027ResourceClass\u0027),\n    }\n\nbut what\u0027s described in this spec comes across as changing from\n\n    fields \u003d {\u0027resource_class\u0027: fields.ResourceClass}\n\nto\n\n    fields \u003d \u0027resource_class\u0027: fields.ObjectField(\u0027ResourceClass\u0027)\n\nand expecting those to be the same over the wire.\n\nI\u0027m either not clear on what is meant here or not clear on how this is going to be accomplished. More words would be helpful :)","commit_id":"7a46dc53f6e0e57b2212f7c4a6f8ab18f09158af"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"861f543cf885fdcc4fd476263c307c8f37a12dba","unresolved":false,"context_lines":[{"line_number":78,"context_line":"The `nova.objects.fields.ResourceClass` is an Enum field that lists the"},{"line_number":79,"context_line":"standard known resource classes like VCPU, MEMORY_MB, DISK_GB, etc. We will"},{"line_number":80,"context_line":"need to make some modifications to this class and the object models that have a"},{"line_number":81,"context_line":"`ResourceClass` field (`Allocation` and `Inventory` object models). We will"},{"line_number":82,"context_line":"create a new `ResourceClass` **object model** that is wire-compatible with the"},{"line_number":83,"context_line":"`ResourceClass` Enum field."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"This new `ResourceClass` object model would look up its integer index values in"},{"line_number":86,"context_line":"a new API database `resource_classes` table instead of the currently hard-coded"}],"source_content_type":"text/x-rst","patch_set":7,"id":"1ac06dbe_523f9786","line":83,"range":{"start_line":81,"start_character":68,"end_line":83,"end_character":27},"in_reply_to":"1ac06dbe_e3c23c33","updated":"2016-08-23 13:42:34.000000000","message":"Hi guys,\n\nYeah, I chatted a little with Dan about this. Looks like there\u0027s no backwards compatible way of *changing* the resource_class field type so more likely we will need to add a resource_class_obj \"hidden\" field to the fields collection and use some @property magic method to mask the differences in over-the-wire representation, deprecating the old field in a major object version bump.\n\nMake sense?","commit_id":"7a46dc53f6e0e57b2212f7c4a6f8ab18f09158af"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"e57c46001682169dcbbc9abbf443f59d07959d7e","unresolved":false,"context_lines":[{"line_number":78,"context_line":"The `nova.objects.fields.ResourceClass` is an Enum field that lists the"},{"line_number":79,"context_line":"standard known resource classes like VCPU, MEMORY_MB, DISK_GB, etc. We will"},{"line_number":80,"context_line":"need to make some modifications to this class and the object models that have a"},{"line_number":81,"context_line":"`ResourceClass` field (`Allocation` and `Inventory` object models). We will"},{"line_number":82,"context_line":"create a new `ResourceClass` **object model** that is wire-compatible with the"},{"line_number":83,"context_line":"`ResourceClass` Enum field."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"This new `ResourceClass` object model would look up its integer index values in"},{"line_number":86,"context_line":"a new API database `resource_classes` table instead of the currently hard-coded"}],"source_content_type":"text/x-rst","patch_set":7,"id":"1ac06dbe_a1b524ef","line":83,"range":{"start_line":81,"start_character":68,"end_line":83,"end_character":27},"in_reply_to":"3ac371cc_18ca156f","updated":"2016-08-22 14:24:04.000000000","message":"So, Jay replied to that question in https://review.openstack.org/#/c/312696/5/specs/newton/approved/resource-providers-dynamic-resource-classes.rst@83 \n\nWe can tho probably clarify this section.","commit_id":"7a46dc53f6e0e57b2212f7c4a6f8ab18f09158af"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"60a6278c8f8158772a69d83cfa140548ccd21713","unresolved":false,"context_lines":[{"line_number":160,"context_line":"`GET /resource_classes`"},{"line_number":161,"context_line":"***********************"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Return a list of all resource classes defined for this Nova deployment."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"Example::"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_f2dd4643","line":163,"updated":"2016-08-16 09:17:20.000000000","message":"Are we expecting to need filtering or pagination here (I hope not, as that would imply really long lists of custom classes and that would not be great).","commit_id":"7a46dc53f6e0e57b2212f7c4a6f8ab18f09158af"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d83ff35f403569e5de5653c6057c4e73f3310796","unresolved":false,"context_lines":[{"line_number":160,"context_line":"`GET /resource_classes`"},{"line_number":161,"context_line":"***********************"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Return a list of all resource classes defined for this Nova deployment."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"Example::"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"1ac06dbe_15805cf4","line":163,"in_reply_to":"3ac371cc_f2dd4643","updated":"2016-08-23 16:02:31.000000000","message":"I think we probably will end up with fairly massive lists of these things if we open this up. I think we\u0027ve heard from ironic shops that they have very high numbers of machine types, each one of which would be a resource class in this case.","commit_id":"7a46dc53f6e0e57b2212f7c4a6f8ab18f09158af"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dbd10a166cc42989121c4794937365b9b8be52e9","unresolved":false,"context_lines":[{"line_number":41,"context_line":"containing an algorithm or entire software program that is accelerated. Each of"},{"line_number":42,"context_line":"these algorithms has one or more contexts that can be consumed by a guest"},{"line_number":43,"context_line":"virtual machine. I wish to allow my users to specify to launch an instance and"},{"line_number":44,"context_line":"have the instance consume one or the contexts for a particular algorithm that I"},{"line_number":45,"context_line":"have loaded onto the FPGAs on a compute node."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":8,"id":"1a95cdbc_6442b7af","line":44,"range":{"start_line":44,"start_character":30,"end_line":44,"end_character":33},"updated":"2016-10-10 14:34:05.000000000","message":"s/or/or more/?","commit_id":"0d7689f36bdea91e7c8ccae2076efa6de4ff304c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dbd10a166cc42989121c4794937365b9b8be52e9","unresolved":false,"context_lines":[{"line_number":79,"context_line":"standard known resource classes like VCPU, MEMORY_MB, DISK_GB, etc. We will"},{"line_number":80,"context_line":"need to make some modifications to this class and the object models that have a"},{"line_number":81,"context_line":"`ResourceClass` field (`Allocation` and `Inventory` object models). We will sort during the"},{"line_number":82,"context_line":"implementation phase the details about that, probably a StringField field type that could allow us"},{"line_number":83,"context_line":"not touching the object version anytime a new class is added."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"This new `ResourceClass` object model would look up its integer index values in"}],"source_content_type":"text/x-rst","patch_set":8,"id":"1a95cdbc_c471cb0d","line":82,"updated":"2016-10-10 14:34:05.000000000","message":"You\u0027ll probably get dinged by zuul for having this line too long.","commit_id":"0d7689f36bdea91e7c8ccae2076efa6de4ff304c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8c2ac6867eb5fdc09f644f4b79d2272047fd67e0","unresolved":false,"context_lines":[{"line_number":160,"context_line":"`GET /resource_classes`"},{"line_number":161,"context_line":"***********************"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Return a list of all resource classes defined for this Nova deployment. Pagination could be"},{"line_number":164,"context_line":"envisaged during the implementation phase if we consider that it could become a very long list."},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"Example::"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"1a95cdbc_e465e71d","line":164,"range":{"start_line":163,"start_character":72,"end_line":164,"end_character":95},"updated":"2016-10-10 14:35:39.000000000","message":"If you page, any ideas on what the marker is going to be? The resource class name, or the DB id field of the dynamic resource classes?","commit_id":"0d7689f36bdea91e7c8ccae2076efa6de4ff304c"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"e26ab668d6528525601b09d940c43ee303535bf7","unresolved":false,"context_lines":[{"line_number":160,"context_line":"`GET /resource_classes`"},{"line_number":161,"context_line":"***********************"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Return a list of all resource classes defined for this Nova deployment. Pagination could be"},{"line_number":164,"context_line":"envisaged during the implementation phase if we consider that it could become a very long list."},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"Example::"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"1a95cdbc_3fad169b","line":164,"range":{"start_line":163,"start_character":72,"end_line":164,"end_character":95},"in_reply_to":"1a95cdbc_e465e71d","updated":"2016-10-10 14:43:08.000000000","message":"I\u0027d think it would be an implementation detail but given it\u0027s a REST API detail, it\u0027s rather a design discussion.\n\nSo, to answer your question, I\u0027d rather think of an ordered list of custom resource providers by name, that would work.","commit_id":"0d7689f36bdea91e7c8ccae2076efa6de4ff304c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"79fad7c4e1d45c8248d437f3788d97b7d770b339","unresolved":false,"context_lines":[{"line_number":218,"context_line":"      \"type\": \"object\","},{"line_number":219,"context_line":"      \"properties\": {"},{"line_number":220,"context_line":"        \"name\": {"},{"line_number":221,"context_line":"          \"type\": \"string\""},{"line_number":222,"context_line":"        },"},{"line_number":223,"context_line":"    },"},{"line_number":224,"context_line":"      \"required\": ["}],"source_content_type":"text/x-rst","patch_set":8,"id":"1a95cdbc_a4059f14","line":221,"updated":"2016-10-10 14:38:22.000000000","message":"Do we have additional formatting rules on this value, like no special characters?","commit_id":"0d7689f36bdea91e7c8ccae2076efa6de4ff304c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"79fad7c4e1d45c8248d437f3788d97b7d770b339","unresolved":false,"context_lines":[{"line_number":266,"context_line":"The response body is empty and the response code will be a `204 No Content`"},{"line_number":267,"context_line":"upon successful name change."},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"A `404 Not Found` response code will be returned if no such resource class"},{"line_number":270,"context_line":"matching the name is found."},{"line_number":271,"context_line":"A `409 Conflict` response code will be returned if there are existing"},{"line_number":272,"context_line":"inventories or allocations for the resource class."},{"line_number":273,"context_line":"A `409 Conflict` response code will be returned if there is an existing"},{"line_number":274,"context_line":"resource class with the same name."},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"`DELETE /resource_classes/{name}`"},{"line_number":277,"context_line":"*********************************"}],"source_content_type":"text/x-rst","patch_set":8,"id":"1a95cdbc_df76f2a2","line":274,"range":{"start_line":269,"start_character":0,"end_line":274,"end_character":34},"updated":"2016-10-10 14:38:22.000000000","message":"nit: bullet this list.","commit_id":"0d7689f36bdea91e7c8ccae2076efa6de4ff304c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"79fad7c4e1d45c8248d437f3788d97b7d770b339","unresolved":false,"context_lines":[{"line_number":285,"context_line":"The response body is empty and the response code will be a `204 No Content`"},{"line_number":286,"context_line":"upon successful deletion."},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"A `404 Not Found` response code will be returned if no such resource class"},{"line_number":289,"context_line":"matching the name is found."},{"line_number":290,"context_line":"A `400 Bad Request` response code will be returned if name is for a standard"},{"line_number":291,"context_line":"resource class -- i.e. VCPU or MEMORY_MB."},{"line_number":292,"context_line":"A `409 Conflict` response code will be returned if there are existing"},{"line_number":293,"context_line":"inventories or allocations for the resource class."},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"Security impact"},{"line_number":296,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":8,"id":"1a95cdbc_5f6bc2b6","line":293,"range":{"start_line":288,"start_character":0,"end_line":293,"end_character":50},"updated":"2016-10-10 14:38:22.000000000","message":"ditto","commit_id":"0d7689f36bdea91e7c8ccae2076efa6de4ff304c"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"fc4b28de00a60d7a2e7a9f0439080ebc11f77ced","unresolved":false,"context_lines":[{"line_number":56,"context_line":"  for all resource classes (standard and dynamic)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"* An additional placement REST API call for creating, modifying, deleting and"},{"line_number":59,"context_line":"  querying custom resource classes"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"Alternatives"},{"line_number":62,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa6399be_fd745cfe","line":59,"updated":"2016-10-11 14:45:30.000000000","message":"If we allow arbitrary user defined resource classes, we create a problem for upgrades if we ever need to add more standard resource classes, as we could clash with a admin defined class on upgrade.\n\nIOW, I think we need to have some kind of namespacing enforced on site-local resource classes defined via this API, so that they can never clash with Nova defined classes.\n\nThis could be as simple as requiring  an X_ prefix on all site local classes,","commit_id":"0aedc41324ae520e07013ad281298df1232dfeb0"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c5aa34ed8eba2267d0f8600d18b2dbae435da67e","unresolved":false,"context_lines":[{"line_number":56,"context_line":"  for all resource classes (standard and dynamic)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"* An additional placement REST API call for creating, modifying, deleting and"},{"line_number":59,"context_line":"  querying custom resource classes"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"Alternatives"},{"line_number":62,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a77a97e_74462150","line":59,"in_reply_to":"fa6399be_134d423e","updated":"2016-11-17 17:39:35.000000000","message":"There\u0027s no project-specific namespace. Standard resource classes are those that are defined (currently) in Nova\u0027s nova/objects/fields.py ResourceClass.STANDARD enumeration.\n\nAll others are prefixed with CUSTOM_ to differentiate them.","commit_id":"0aedc41324ae520e07013ad281298df1232dfeb0"},{"author":{"_account_id":9452,"name":"James Penick","email":"penick@verizonmedia.com","username":"epim"},"change_message_id":"68fde036635aae1849edada5a000b4b7336f66f4","unresolved":false,"context_lines":[{"line_number":56,"context_line":"  for all resource classes (standard and dynamic)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"* An additional placement REST API call for creating, modifying, deleting and"},{"line_number":59,"context_line":"  querying custom resource classes"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"Alternatives"},{"line_number":62,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa6399be_134d423e","line":59,"in_reply_to":"fa6399be_fd745cfe","updated":"2016-10-12 18:49:38.000000000","message":"+1. project namespaces should be protected and distinct from deployer namespaces.","commit_id":"0aedc41324ae520e07013ad281298df1232dfeb0"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c5aa34ed8eba2267d0f8600d18b2dbae435da67e","unresolved":false,"context_lines":[{"line_number":56,"context_line":"  for all resource classes (standard and dynamic)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"* An additional placement REST API call for creating, modifying, deleting and"},{"line_number":59,"context_line":"  querying custom resource classes"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"Alternatives"},{"line_number":62,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a77a97e_d406151b","line":59,"in_reply_to":"fa6399be_fd745cfe","updated":"2016-11-17 17:39:35.000000000","message":"Just following up on this...\n\nAll custom resource classes will be prefixed with \"CUSTOM_\". I\u0027ve added that to the latest revised spec.","commit_id":"0aedc41324ae520e07013ad281298df1232dfeb0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"94efa17c1d436a4b4952c5055ff85e8427b01abc","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    CREATE TABLE resource_classes ("},{"line_number":72,"context_line":"        id INT NOT NULL,"},{"line_number":73,"context_line":"        name VARCHAR(80) NOT NULL,"},{"line_number":74,"context_line":"        PRIMARY KEY (id),"},{"line_number":75,"context_line":"        UNIQUE INDEX (name)"},{"line_number":76,"context_line":"    );"}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa6399be_8e5fcb0d","line":73,"range":{"start_line":73,"start_character":21,"end_line":73,"end_character":23},"updated":"2016-10-10 20:44:44.000000000","message":"nit: 255 in the code change.","commit_id":"0aedc41324ae520e07013ad281298df1232dfeb0"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c5aa34ed8eba2267d0f8600d18b2dbae435da67e","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    CREATE TABLE resource_classes ("},{"line_number":72,"context_line":"        id INT NOT NULL,"},{"line_number":73,"context_line":"        name VARCHAR(80) NOT NULL,"},{"line_number":74,"context_line":"        PRIMARY KEY (id),"},{"line_number":75,"context_line":"        UNIQUE INDEX (name)"},{"line_number":76,"context_line":"    );"}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a77a97e_94757d99","line":73,"range":{"start_line":73,"start_character":21,"end_line":73,"end_character":23},"in_reply_to":"fa6399be_8e5fcb0d","updated":"2016-11-17 17:39:35.000000000","message":"Done","commit_id":"0aedc41324ae520e07013ad281298df1232dfeb0"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"5706aeead3440d9f77f2b93049d19dc373ffd6a0","unresolved":false,"context_lines":[{"line_number":88,"context_line":"Enum index values. We would want to create some constants on this"},{"line_number":89,"context_line":"`ResourceClass` object model for the existing integer and string constants from"},{"line_number":90,"context_line":"the Enum `ResourceClass` for the \"standardized\" resource classes so that when"},{"line_number":91,"context_line":"clouds refer to one of those resource classes, they always refer to the same"},{"line_number":92,"context_line":"string/integer combination."},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"This new `ResourceClass` object model might look something like this::"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa6399be_930a64d1","line":92,"range":{"start_line":91,"start_character":47,"end_line":92,"end_character":27},"updated":"2016-10-11 19:36:38.000000000","message":"Not that I don\u0027t think this is a good idea, but is there any reason it\u0027s needed? Looking at the API proposal below it appears that the integers are not exposed so if they were different between clouds end users would not even be aware.","commit_id":"0aedc41324ae520e07013ad281298df1232dfeb0"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c5aa34ed8eba2267d0f8600d18b2dbae435da67e","unresolved":false,"context_lines":[{"line_number":88,"context_line":"Enum index values. We would want to create some constants on this"},{"line_number":89,"context_line":"`ResourceClass` object model for the existing integer and string constants from"},{"line_number":90,"context_line":"the Enum `ResourceClass` for the \"standardized\" resource classes so that when"},{"line_number":91,"context_line":"clouds refer to one of those resource classes, they always refer to the same"},{"line_number":92,"context_line":"string/integer combination."},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"This new `ResourceClass` object model might look something like this::"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a77a97e_74b9c114","line":92,"range":{"start_line":91,"start_character":47,"end_line":92,"end_character":27},"in_reply_to":"fa6399be_930a64d1","updated":"2016-11-17 17:39:35.000000000","message":"It\u0027s just an easy way to tell if a resource_class_id is \"standard\" or not by seeing if the ID is below a certain number.","commit_id":"0aedc41324ae520e07013ad281298df1232dfeb0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"94efa17c1d436a4b4952c5055ff85e8427b01abc","unresolved":false,"context_lines":[{"line_number":149,"context_line":"REST API impact"},{"line_number":150,"context_line":"---------------"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"A set of new REST API commands will be created on the placement REST API:"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"* `GET /resource_classes`: Returns list of all resource classes (standard as"},{"line_number":155,"context_line":"  well as dynamic)"}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa6399be_8eb6eb3b","line":152,"updated":"2016-10-10 20:44:44.000000000","message":"It\u0027s not clear to me from the spec if this will be added to the placement REST API with a microversion, but I\u0027d think it should.","commit_id":"0aedc41324ae520e07013ad281298df1232dfeb0"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c5aa34ed8eba2267d0f8600d18b2dbae435da67e","unresolved":false,"context_lines":[{"line_number":149,"context_line":"REST API impact"},{"line_number":150,"context_line":"---------------"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"A set of new REST API commands will be created on the placement REST API:"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"* `GET /resource_classes`: Returns list of all resource classes (standard as"},{"line_number":155,"context_line":"  well as dynamic)"}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a77a97e_f4431111","line":152,"in_reply_to":"fa6399be_8eb6eb3b","updated":"2016-11-17 17:39:35.000000000","message":"Done","commit_id":"0aedc41324ae520e07013ad281298df1232dfeb0"},{"author":{"_account_id":9452,"name":"James Penick","email":"penick@verizonmedia.com","username":"epim"},"change_message_id":"cde775e38d4fc752fd398ce5085485006342d220","unresolved":false,"context_lines":[{"line_number":162,"context_line":"***********************"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"Return a list of all resource classes defined for this Nova deployment."},{"line_number":165,"context_line":"Pagination could be envisaged during the implementation phase if we consider"},{"line_number":166,"context_line":"that it could become a very long list, where the marker could be a resource"},{"line_number":167,"context_line":"class name and the list be alphabetically sorted by name."},{"line_number":168,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa6399be_5a62d5d9","line":165,"updated":"2016-10-10 18:57:15.000000000","message":"I\u0027ll have thousands of resource classes, so pagination will be useful in my environment","commit_id":"0aedc41324ae520e07013ad281298df1232dfeb0"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c5aa34ed8eba2267d0f8600d18b2dbae435da67e","unresolved":false,"context_lines":[{"line_number":162,"context_line":"***********************"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"Return a list of all resource classes defined for this Nova deployment."},{"line_number":165,"context_line":"Pagination could be envisaged during the implementation phase if we consider"},{"line_number":166,"context_line":"that it could become a very long list, where the marker could be a resource"},{"line_number":167,"context_line":"class name and the list be alphabetically sorted by name."},{"line_number":168,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a77a97e_b43279a5","line":165,"in_reply_to":"fa6399be_4e3e93b9","updated":"2016-11-17 17:39:35.000000000","message":"I would prefer to add pagination after releasing the initial microversion so as not to complicate the patch series unnecessarily. We can add paging before actually adding the Ironic node handling in the resource tracker (the thing that will auto-create resource classes and resource providers).","commit_id":"0aedc41324ae520e07013ad281298df1232dfeb0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"94efa17c1d436a4b4952c5055ff85e8427b01abc","unresolved":false,"context_lines":[{"line_number":162,"context_line":"***********************"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"Return a list of all resource classes defined for this Nova deployment."},{"line_number":165,"context_line":"Pagination could be envisaged during the implementation phase if we consider"},{"line_number":166,"context_line":"that it could become a very long list, where the marker could be a resource"},{"line_number":167,"context_line":"class name and the list be alphabetically sorted by name."},{"line_number":168,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa6399be_4e3e93b9","line":165,"in_reply_to":"fa6399be_5a62d5d9","updated":"2016-10-10 20:44:44.000000000","message":"Yup, I think paging is going to have to be built in to the REST API from the start, but the REST API code hasn\u0027t started as far as I can tell.","commit_id":"0aedc41324ae520e07013ad281298df1232dfeb0"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"a834f71d766cfc38ac2d4b6168c0ec84371d5dd4","unresolved":false,"context_lines":[{"line_number":221,"context_line":"      \"type\": \"object\","},{"line_number":222,"context_line":"      \"properties\": {"},{"line_number":223,"context_line":"        \"name\": {"},{"line_number":224,"context_line":"          \"type\": \"string\""},{"line_number":225,"context_line":"        },"},{"line_number":226,"context_line":"    },"},{"line_number":227,"context_line":"      \"required\": ["}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa6399be_3ca42b56","line":224,"updated":"2016-10-11 08:29:47.000000000","message":"\u0027/\u0027 can\u0027t be accepted, due to we will use the name in the URL. So this is pretty similar with tag api also, so we can just follow this https://github.com/openstack/api-wg/blob/master/guidelines/tags.rst#tags-restrictions\n\nThe schema can be: https://github.com/openstack/nova/blob/master/nova/api/openstack/compute/schemas/server_tags.py#L13\n\nAlso need to define the max length of the name.\n\nAlthough this is admin-only API, maybe worth to have limitation for how much resource class for user can added.","commit_id":"0aedc41324ae520e07013ad281298df1232dfeb0"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"de6a31e50d4a72e0a28e52f89496ecd39146937b","unresolved":false,"context_lines":[{"line_number":221,"context_line":"      \"type\": \"object\","},{"line_number":222,"context_line":"      \"properties\": {"},{"line_number":223,"context_line":"        \"name\": {"},{"line_number":224,"context_line":"          \"type\": \"string\""},{"line_number":225,"context_line":"        },"},{"line_number":226,"context_line":"    },"},{"line_number":227,"context_line":"      \"required\": ["}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa6399be_6ff8a0e6","line":224,"in_reply_to":"fa6399be_3ca42b56","updated":"2016-10-11 09:18:29.000000000","message":"The existed resource class schema is \u0027^[0-9A-Z_]+$\u0027, so probably we just need match that one?","commit_id":"0aedc41324ae520e07013ad281298df1232dfeb0"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c5aa34ed8eba2267d0f8600d18b2dbae435da67e","unresolved":false,"context_lines":[{"line_number":221,"context_line":"      \"type\": \"object\","},{"line_number":222,"context_line":"      \"properties\": {"},{"line_number":223,"context_line":"        \"name\": {"},{"line_number":224,"context_line":"          \"type\": \"string\""},{"line_number":225,"context_line":"        },"},{"line_number":226,"context_line":"    },"},{"line_number":227,"context_line":"      \"required\": ["}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a77a97e_f4287135","line":224,"in_reply_to":"fa6399be_6ff8a0e6","updated":"2016-11-17 17:39:35.000000000","message":"Done","commit_id":"0aedc41324ae520e07013ad281298df1232dfeb0"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"a834f71d766cfc38ac2d4b6168c0ec84371d5dd4","unresolved":false,"context_lines":[{"line_number":272,"context_line":"* A `404 Not Found` response code will be returned if no such resource class"},{"line_number":273,"context_line":"matching the name is found."},{"line_number":274,"context_line":"* A `409 Conflict` response code will be returned if there are existing"},{"line_number":275,"context_line":"inventories or allocations for the resource class."},{"line_number":276,"context_line":"* A `409 Conflict` response code will be returned if there is an existing"},{"line_number":277,"context_line":"resource class with the same name."},{"line_number":278,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa6399be_9c2ff7a0","line":275,"updated":"2016-10-11 08:29:47.000000000","message":"This is just the rename of resource class. In the db, inventories and allocations reference to the resource class index. So it is ok for any existing inventories and allocation refer to this resource class.","commit_id":"0aedc41324ae520e07013ad281298df1232dfeb0"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c5aa34ed8eba2267d0f8600d18b2dbae435da67e","unresolved":false,"context_lines":[{"line_number":272,"context_line":"* A `404 Not Found` response code will be returned if no such resource class"},{"line_number":273,"context_line":"matching the name is found."},{"line_number":274,"context_line":"* A `409 Conflict` response code will be returned if there are existing"},{"line_number":275,"context_line":"inventories or allocations for the resource class."},{"line_number":276,"context_line":"* A `409 Conflict` response code will be returned if there is an existing"},{"line_number":277,"context_line":"resource class with the same name."},{"line_number":278,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a77a97e_b4c0b951","line":275,"in_reply_to":"fa6399be_9c2ff7a0","updated":"2016-11-17 17:39:35.000000000","message":"Done","commit_id":"0aedc41324ae520e07013ad281298df1232dfeb0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"59d38883787234482d2d71939aee0afc51a9b6b4","unresolved":false,"context_lines":[{"line_number":318,"context_line":"Other deployer impact"},{"line_number":319,"context_line":"---------------------"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"None."},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"Developer impact"},{"line_number":324,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":9,"id":"ba5da102_d600c303","line":321,"updated":"2016-11-02 17:01:31.000000000","message":"Around L16 in https://etherpad.openstack.org/p/ocata-nova-summit-resource-providers-quantitative there is talk about upgrade impacts if you don\u0027t have the node.resource_class (from ironic v1.21) mapped to ironic flavor extra_specs, but I\u0027m fuzzy on the details. I think we should be clear about that.","commit_id":"0aedc41324ae520e07013ad281298df1232dfeb0"}],"specs/newton/approved/resource-providers-dynamic-resource-classes.rst":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91707b6250e4043c9c4bb9f327006bbbf845c27a","unresolved":false,"context_lines":[{"line_number":24,"context_line":"OpenStack clouds is not possible."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"We require a method for cloud administrators to create new resource classes"},{"line_number":27,"context_line":"that represent atomically allocatable units of some resource. "},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Use Cases"},{"line_number":30,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_84f6b4d4","line":27,"updated":"2016-05-17 14:55:52.000000000","message":"done :)","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"9eb6ba136b22808f7ec6ae5bc4b86f775e5c0544","unresolved":false,"context_lines":[{"line_number":24,"context_line":"OpenStack clouds is not possible."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"We require a method for cloud administrators to create new resource classes"},{"line_number":27,"context_line":"that represent atomically allocatable units of some resource. "},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Use Cases"},{"line_number":30,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"1a122d0e_636952f8","line":27,"updated":"2016-05-04 19:37:32.000000000","message":"zomg, it\u0027s the big red square","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91707b6250e4043c9c4bb9f327006bbbf845c27a","unresolved":false,"context_lines":[{"line_number":53,"context_line":"service to place the given instance on the specific node."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"It is not possible to run more than one such process per Nova region, because"},{"line_number":56,"context_line":"every `nova-compute` process will report on all available baremetal nodes in "},{"line_number":57,"context_line":"the baremetal service it connects to.  This single `nova-compute` process is a"},{"line_number":58,"context_line":"bottleneck for workload scheduling and placement; for very large deployments,"},{"line_number":59,"context_line":"it is not possible to scale out this process. It is therefore also a single"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_e40180b0","line":56,"updated":"2016-05-17 14:55:52.000000000","message":"done.","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"9eb6ba136b22808f7ec6ae5bc4b86f775e5c0544","unresolved":false,"context_lines":[{"line_number":53,"context_line":"service to place the given instance on the specific node."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"It is not possible to run more than one such process per Nova region, because"},{"line_number":56,"context_line":"every `nova-compute` process will report on all available baremetal nodes in "},{"line_number":57,"context_line":"the baremetal service it connects to.  This single `nova-compute` process is a"},{"line_number":58,"context_line":"bottleneck for workload scheduling and placement; for very large deployments,"},{"line_number":59,"context_line":"it is not possible to scale out this process. It is therefore also a single"}],"source_content_type":"text/x-rst","patch_set":1,"id":"1a122d0e_e6ed70f1","line":56,"updated":"2016-05-04 19:37:32.000000000","message":"nit","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91707b6250e4043c9c4bb9f327006bbbf845c27a","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    BASE_AGG_UUID\u003d`openstack aggregate create iron_base_aggregate`"},{"line_number":114,"context_line":"    NFV_ADD_UUID\u003d`openstack aggregate create iron_nfv_aggregate`"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"The cloud operator would like 7 of the `nova-compute` daemons to manage the"},{"line_number":117,"context_line":"`IRON_BASE` resources and 3 to manage the `IRON_NFV` resources, and therefore"},{"line_number":118,"context_line":"they link the first seven of the compute nodes with the first aggregate and the"},{"line_number":119,"context_line":"last three with the second aggregate::"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_c4fc3cb7","line":116,"updated":"2016-05-17 14:55:52.000000000","message":"@jpenick: Yup, that is absolutely correct. I\u0027ve added a note here indicating that. Thanks for bringing it up.","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":9452,"name":"James Penick","email":"penick@verizonmedia.com","username":"epim"},"change_message_id":"d7f27b334a09008de6d4993ef50e6dc4cbce829e","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    BASE_AGG_UUID\u003d`openstack aggregate create iron_base_aggregate`"},{"line_number":114,"context_line":"    NFV_ADD_UUID\u003d`openstack aggregate create iron_nfv_aggregate`"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"The cloud operator would like 7 of the `nova-compute` daemons to manage the"},{"line_number":117,"context_line":"`IRON_BASE` resources and 3 to manage the `IRON_NFV` resources, and therefore"},{"line_number":118,"context_line":"they link the first seven of the compute nodes with the first aggregate and the"},{"line_number":119,"context_line":"last three with the second aggregate::"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_554f0abd","line":116,"updated":"2016-05-06 22:59:19.000000000","message":"If I create a third aggregate, say FANCY_NEW_AGGREGATE\u003d$(openstack aggregate create fancy_pants_aggregate) with hardware that does not exist in either of the other two aggregates, is the hardware in this aggregate unavailable for scheduling until I spin up new compute processes and associate them with this aggregate?\n\nThis behavior is fine, if that\u0027s the case. I just want to be sure.","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91707b6250e4043c9c4bb9f327006bbbf845c27a","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"The cloud operator would like 7 of the `nova-compute` daemons to manage the"},{"line_number":117,"context_line":"`IRON_BASE` resources and 3 to manage the `IRON_NFV` resources, and therefore"},{"line_number":118,"context_line":"they link the first seven of the compute nodes with the first aggregate and the"},{"line_number":119,"context_line":"last three with the second aggregate::"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    for x in `seq 11 18`; do"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_242ee842","line":118,"updated":"2016-05-17 14:55:52.000000000","message":"@vdrok: Thanks for the question(s)! Yes, there currently exists a resource audit mechanism within the nova-compute daemon that queries the virt driver (in this case the ironic virt driver) and compares what the virt driver\u0027s view of its resource usage/inventory is with what the Nova database\u0027s view of that usage/inventory is. We currently default to trusting the Nova database\u0027s view of the resource inventory/usage, and if there is a disagreement between the virt driver and the Nova database, we emit warnings in the nova-compute log files about that mismatched view. Operators would then be able to determine any causes for the mismatch by looking at the nova-compute log.\n\nLong term, the plan is to have the new placement API be much more query and user-friendly so that any such mismatches can be queried via RESTful API instead of grepping through log files.","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"49a0bda11e27c1fd909d0f2b6327165b9690ac70","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"The cloud operator would like 7 of the `nova-compute` daemons to manage the"},{"line_number":117,"context_line":"`IRON_BASE` resources and 3 to manage the `IRON_NFV` resources, and therefore"},{"line_number":118,"context_line":"they link the first seven of the compute nodes with the first aggregate and the"},{"line_number":119,"context_line":"last three with the second aggregate::"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    for x in `seq 11 18`; do"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_55fa0e44","line":118,"updated":"2016-05-16 10:12:58.000000000","message":"So IIUC nova will use resource pool usage to report available resources? Should it do some checks, e.g. if number of hypervisor nodes !\u003d number of ironic nodes issue some warning?","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"637eeca41e0e74bf430c63e5491c21413b1a7eb2","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"The cloud operator would like 7 of the `nova-compute` daemons to manage the"},{"line_number":117,"context_line":"`IRON_BASE` resources and 3 to manage the `IRON_NFV` resources, and therefore"},{"line_number":118,"context_line":"they link the first seven of the compute nodes with the first aggregate and the"},{"line_number":119,"context_line":"last three with the second aggregate::"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    for x in `seq 11 18`; do"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_46bfbdcf","line":118,"in_reply_to":"dab17558_55fa0e44","updated":"2016-05-17 12:41:40.000000000","message":"Sorry, the previous comment is wrong, I mean if the number of ironic nodes !\u003d number of resources in ironic-related resource pools (is there any way to distinguish those? Maybe it\u0027s too much to just give a warning...)","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91707b6250e4043c9c4bb9f327006bbbf845c27a","unresolved":false,"context_lines":[{"line_number":123,"context_line":"    done"},{"line_number":124,"context_line":"    for x in `seq 19 21`; do"},{"line_number":125,"context_line":"        openstack aggregate add host $NFV_ADD_UUID \u002710.0.3.$x\u0027"},{"line_number":126,"context_line":"    done"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Now the cloud operator creates two generic resource pools, one for each"},{"line_number":129,"context_line":"hardware configuration::"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_043124a2","line":126,"updated":"2016-05-17 14:55:52.000000000","message":"@melwitt: Good question. The answer is yes; the operator can choose to spin up as many nova-compute daemons as they wish and associate each nova-compute daemon with as many aggregates (and thus resource pools) as they wish. The placement API (scheduler API) being developed in the context of the generic-resource-pools blueprint and associated specs will place the bare metal instance that matches the requested dynamic resource class on a nova-compute that is associated with an aggregate that is associated with a resource pool that has \u003e1 available inventory of that requested resource class.","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a44c49102661dc6fcd316daa934cf8d1535b8ba9","unresolved":false,"context_lines":[{"line_number":123,"context_line":"    done"},{"line_number":124,"context_line":"    for x in `seq 19 21`; do"},{"line_number":125,"context_line":"        openstack aggregate add host $NFV_ADD_UUID \u002710.0.3.$x\u0027"},{"line_number":126,"context_line":"    done"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Now the cloud operator creates two generic resource pools, one for each"},{"line_number":129,"context_line":"hardware configuration::"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_afa42357","line":126,"updated":"2016-05-06 22:24:25.000000000","message":"Can an operator link a nova-compute daemon to more than one aggregate? For example, if a deployment is comprised of 10 aggregates and we want 2 nova-compute daemons managing them. Can we link 5 aggregates with one daemon and the other 5 aggregates with the second daemon?","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91707b6250e4043c9c4bb9f327006bbbf845c27a","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        --max-unit\u003d1 --min-unit\u003d1 --allocation-ratio\u003d1.0"},{"line_number":156,"context_line":"    openstack resource-pool update inventory $NFV_IRON_RP_UUID \\"},{"line_number":157,"context_line":"        --resource-class\u003dIRON_NFV --total\u003d250 --reserved\u003d0 \\"},{"line_number":158,"context_line":"        --max-unit\u003d1 --min-unit\u003d1 --allocation-ratio\u003d1.0"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"The cloud admin would need to indicate that the Nova flavors offered for"},{"line_number":161,"context_line":"baremetal instances indicated that one `IRON_BASE` or `IRON_NFV` resource was"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_6424705f","line":158,"updated":"2016-05-17 14:55:52.000000000","message":"@rloo: So, when discussing this with jroll and others, I said that *either* we can have ironic call the above CLI commands via some hook in Ironic whenever new nodes are enrolled with Ironic, *or* we can have the ironic Nova virt driver use some sort of periodic task that would poll Ironic for total node counts of each node configuration and update the resource pool inventory records accordingly. Or, a third option would be to have Ironic emit a notification on some to\npic queue whenever its node inventory was updated and have an external daemon be responsible for updating the resource pool inventory information in Nova.\n\nPersonally, I think having Ironic simply call out to Nova (or the broken out scheduler service when that happens) whenever its inventory is updated would be the best solution, but any of the above proposed solutions would work.","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"58fe697583e0441aab1b82fac3986e5f013a046a","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        --max-unit\u003d1 --min-unit\u003d1 --allocation-ratio\u003d1.0"},{"line_number":156,"context_line":"    openstack resource-pool update inventory $NFV_IRON_RP_UUID \\"},{"line_number":157,"context_line":"        --resource-class\u003dIRON_NFV --total\u003d250 --reserved\u003d0 \\"},{"line_number":158,"context_line":"        --max-unit\u003d1 --min-unit\u003d1 --allocation-ratio\u003d1.0"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"The cloud admin would need to indicate that the Nova flavors offered for"},{"line_number":161,"context_line":"baremetal instances indicated that one `IRON_BASE` or `IRON_NFV` resource was"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_d02d5147","line":158,"updated":"2016-05-10 18:12:35.000000000","message":"I\u0027m a bit lost here. If we are talking about ironic managing the baremetal nodes and the number of these nodes may change over time, why would the cloud operator set up this inventory outside of ironic. Won\u0027t the numbers get out of sync?\n\n(I probably need to read up on generic resource pools...)","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91707b6250e4043c9c4bb9f327006bbbf845c27a","unresolved":false,"context_lines":[{"line_number":161,"context_line":"baremetal instances indicated that one `IRON_BASE` or `IRON_NFV` resource was"},{"line_number":162,"context_line":"consumed. Let\u0027s say that the Nova flavors are called \"metal.gold\" and"},{"line_number":163,"context_line":"\"metal.platinum\". The \"metal.gold\" flavor would consume one `IRON_BASE`"},{"line_number":164,"context_line":"resource and the \"nova.platinum\" flavor would consume one `IRON_NFV` resource::"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    openstack flavor set metal.gold \\"},{"line_number":167,"context_line":"        --property resources:IRON_BASE:1"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_4427ac62","line":164,"updated":"2016-05-17 14:55:52.000000000","message":"@cdent, @melwitt: So, yeah, I know this part is ewww, but unfortunately, this is the only mechanism we have in our existing API to indicate some \"custom\" quantitiative amounts are requested by the Compute API user during POST /servers. :(","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"9eb6ba136b22808f7ec6ae5bc4b86f775e5c0544","unresolved":false,"context_lines":[{"line_number":161,"context_line":"baremetal instances indicated that one `IRON_BASE` or `IRON_NFV` resource was"},{"line_number":162,"context_line":"consumed. Let\u0027s say that the Nova flavors are called \"metal.gold\" and"},{"line_number":163,"context_line":"\"metal.platinum\". The \"metal.gold\" flavor would consume one `IRON_BASE`"},{"line_number":164,"context_line":"resource and the \"nova.platinum\" flavor would consume one `IRON_NFV` resource::"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    openstack flavor set metal.gold \\"},{"line_number":167,"context_line":"        --property resources:IRON_BASE:1"}],"source_content_type":"text/x-rst","patch_set":1,"id":"1a122d0e_86ac7cee","line":164,"updated":"2016-05-04 19:37:32.000000000","message":"I was all cool until this part, cruising along.\n\nBut yeah, your note clarifies it. But nnngh.","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a44c49102661dc6fcd316daa934cf8d1535b8ba9","unresolved":false,"context_lines":[{"line_number":161,"context_line":"baremetal instances indicated that one `IRON_BASE` or `IRON_NFV` resource was"},{"line_number":162,"context_line":"consumed. Let\u0027s say that the Nova flavors are called \"metal.gold\" and"},{"line_number":163,"context_line":"\"metal.platinum\". The \"metal.gold\" flavor would consume one `IRON_BASE`"},{"line_number":164,"context_line":"resource and the \"nova.platinum\" flavor would consume one `IRON_NFV` resource::"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    openstack flavor set metal.gold \\"},{"line_number":167,"context_line":"        --property resources:IRON_BASE:1"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_ef746bd0","line":164,"in_reply_to":"1a122d0e_86ac7cee","updated":"2016-05-06 22:24:25.000000000","message":"I find this part confusing too. Does this just mean an operator setting up end-user friendly aliases?","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91707b6250e4043c9c4bb9f327006bbbf845c27a","unresolved":false,"context_lines":[{"line_number":164,"context_line":"resource and the \"nova.platinum\" flavor would consume one `IRON_NFV` resource::"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    openstack flavor set metal.gold \\"},{"line_number":167,"context_line":"        --property resources:IRON_BASE:1"},{"line_number":168,"context_line":"    openstack flavor set metal.platinum \\"},{"line_number":169,"context_line":"        --property resources:IRON_NFV:1"},{"line_number":170,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_a422d84f","line":167,"updated":"2016-05-17 14:55:52.000000000","message":"@vdrok: Yes, number of IRON_BASE resources that are consumed by the user who launches an instance with this flavor. This interface sucks, but it is unfortunately what we have today in Nova :(","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"49a0bda11e27c1fd909d0f2b6327165b9690ac70","unresolved":false,"context_lines":[{"line_number":164,"context_line":"resource and the \"nova.platinum\" flavor would consume one `IRON_NFV` resource::"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    openstack flavor set metal.gold \\"},{"line_number":167,"context_line":"        --property resources:IRON_BASE:1"},{"line_number":168,"context_line":"    openstack flavor set metal.platinum \\"},{"line_number":169,"context_line":"        --property resources:IRON_NFV:1"},{"line_number":170,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_ef14424e","line":167,"updated":"2016-05-16 10:12:58.000000000","message":"Not sure what is :1 here, number of resources consumed?","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91707b6250e4043c9c4bb9f327006bbbf845c27a","unresolved":false,"context_lines":[{"line_number":188,"context_line":"    The operator could also choose to use a single aggregate and assign that"},{"line_number":189,"context_line":"    aggregate to all compute nodes and have a single generic resource pool"},{"line_number":190,"context_line":"    containing multiple inventory records, one for the IRON_BASE and one for"},{"line_number":191,"context_line":"    the IRON_NFV resource class."},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"FPGA slot context resources"},{"line_number":194,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_841d1411","line":191,"updated":"2016-05-17 14:55:52.000000000","message":"@melwitt: I\u0027m not quite understanding your question below. I\u0027ll find you on IRC to discuss further and make sure I fully grasp what you\u0027re describing.","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a44c49102661dc6fcd316daa934cf8d1535b8ba9","unresolved":false,"context_lines":[{"line_number":188,"context_line":"    The operator could also choose to use a single aggregate and assign that"},{"line_number":189,"context_line":"    aggregate to all compute nodes and have a single generic resource pool"},{"line_number":190,"context_line":"    containing multiple inventory records, one for the IRON_BASE and one for"},{"line_number":191,"context_line":"    the IRON_NFV resource class."},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"FPGA slot context resources"},{"line_number":194,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_2ab7813a","line":191,"updated":"2016-05-06 22:24:25.000000000","message":"This part is interesting because I\u0027m trying to make mental map of how Ironic will update capacity and where it will go on the Nova side. Please correct me if I\u0027m wrong. It appears there are two ways:\n\n\n1. Ironic calls the REST API to update capacity of a resource pool. Ironic must always update capacity of one pool, otherwise it must know something about topology on the Nova side. But, I think this works because in Nova you could have X aggregates all associated with one resource pool and Ironic will update capacity of the one pool with various inventory records.\n\nWhat I\u0027m not sure about is, how will this work for affinity? As that\u0027s determined by what aggregate inventory lands in. It seems like in the REST API scenario, Ironic would always have to push to a \"catch all\" resource pool and on the Nova side an operator would move [newly appearing inventory] to other pools to get things separated into different aggregates. It seems like existing records would be fine because Ironic will push an update to a record with a UUID, and if that record is already mapped to an aggregate, it will be found and updated and retain its association with its aggregate.\n\n\n2. Ironic virt driver queries Ironic to pull inventory info. Newly appearing inventory again has to go somewhere, to a default resource pool perhaps, where it can be re-associated by an operator if desired. Existing records find themselves by UUID.","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"49a0bda11e27c1fd909d0f2b6327165b9690ac70","unresolved":false,"context_lines":[{"line_number":188,"context_line":"    The operator could also choose to use a single aggregate and assign that"},{"line_number":189,"context_line":"    aggregate to all compute nodes and have a single generic resource pool"},{"line_number":190,"context_line":"    containing multiple inventory records, one for the IRON_BASE and one for"},{"line_number":191,"context_line":"    the IRON_NFV resource class."},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"FPGA slot context resources"},{"line_number":194,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_9875cb99","line":191,"in_reply_to":"dab17558_2ab7813a","updated":"2016-05-16 10:12:58.000000000","message":"Second option sounds better to me :)","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"a34783a41ae37b91025154d3e27fb9041c66a139","unresolved":false,"context_lines":[{"line_number":206,"context_line":"a compute node."},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"The difference between this use case and the use case that uses generic"},{"line_number":209,"context_line":"resource pools is that there is no resource pool concept here. The FPGA program"},{"line_number":210,"context_line":"contexts are resources that are local to a particular compute node and may only"},{"line_number":211,"context_line":"be consumed by instances on that compute node. By contrast, resources provided"},{"line_number":212,"context_line":"by a resource pool may be consumed by instances on many compute nodes."},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"Therefore, we will need some method to allow the operator to tell Nova that a"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_f3d5a3b9","line":211,"range":{"start_line":209,"start_character":63,"end_line":211,"end_character":46},"updated":"2016-05-06 03:44:04.000000000","message":"It seems to me that the FPGA is simply a compute-node-inventory provided by a compute-node, just like other compute-node resources VCPU and RAM. It is not related to the concept \"generic-resource-pool\".","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"a34783a41ae37b91025154d3e27fb9041c66a139","unresolved":false,"context_lines":[{"line_number":251,"context_line":"    # Assume the compute nodes are named cn1 through cn20"},{"line_number":252,"context_line":"    # and that the first eight compute nodes have the PROG_OVS program"},{"line_number":253,"context_line":"    for x in `seq 1 8`; do"},{"line_number":254,"context_line":"        openstack compute-node update inventory cn$x \\"},{"line_number":255,"context_line":"            --resource-class\u003dPROG_OVS \\"},{"line_number":256,"context_line":"            --total\u003d4 --reserved\u003d0 --min-unit\u003d1 --max-unit\u003d1"},{"line_number":257,"context_line":"    done"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_732c13ac","line":254,"range":{"start_line":254,"start_character":18,"end_line":254,"end_character":47},"updated":"2016-05-06 03:44:04.000000000","message":"Yup, FPGA is actually a resource of compute-node-inventory rather than a resource-pool-inventory.","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91707b6250e4043c9c4bb9f327006bbbf845c27a","unresolved":false,"context_lines":[{"line_number":264,"context_line":""},{"line_number":265,"context_line":".. note::"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    The `openstack compute-node update inventory` CLI call above does not"},{"line_number":268,"context_line":"    currently exist and would be added in the scope of this blueprint."},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"The NFV cloud admin wants their virtual network function manager (VNFM) to"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_e4186020","line":267,"updated":"2016-05-17 14:55:52.000000000","message":"@Yingxin: yes, you are correct that they are both resource providers. There is very little difference between compute nodes and resource pools, the only difference being that a compute node can be a target for a select_destinations() call (in the scheduler) while a resource pool cannot (it doesn\u0027t actually host/manage any resources itself).\n\nI am considering a less duplicative way of structuring the CLI calls here. Let\u0027s chat on IRC...","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"a34783a41ae37b91025154d3e27fb9041c66a139","unresolved":false,"context_lines":[{"line_number":264,"context_line":""},{"line_number":265,"context_line":".. note::"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    The `openstack compute-node update inventory` CLI call above does not"},{"line_number":268,"context_line":"    currently exist and would be added in the scope of this blueprint."},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"The NFV cloud admin wants their virtual network function manager (VNFM) to"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_4e3e82b9","line":267,"range":{"start_line":267,"start_character":9,"end_line":267,"end_character":48},"updated":"2016-05-06 03:44:04.000000000","message":"Do we really need to distinguish the type of resource-provider from CLI (i.e. resource-pool and compute-node)?\n\nA single command `openstack resource-provider update inventory ...` can simply replace the two commands `openstack compute-node update inventory ...` and `openstack resource-pool update inventory ...`.\n\nThat two commands share the exact same behavior according to this bp, and apparently the only difference between the two kinds of resource providers is the existence of aggregates and the value of `can_host` field.","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"49a0bda11e27c1fd909d0f2b6327165b9690ac70","unresolved":false,"context_lines":[{"line_number":264,"context_line":""},{"line_number":265,"context_line":".. note::"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    The `openstack compute-node update inventory` CLI call above does not"},{"line_number":268,"context_line":"    currently exist and would be added in the scope of this blueprint."},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"The NFV cloud admin wants their virtual network function manager (VNFM) to"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_4f5e2e46","line":267,"range":{"start_line":267,"start_character":9,"end_line":267,"end_character":48},"in_reply_to":"dab17558_4e3e82b9","updated":"2016-05-16 10:12:58.000000000","message":"But the objects are different - resource pool and compute node, so separate commands make sense to me.","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"8366c8426f4898870039b8e2dab2d4ab89b47d78","unresolved":false,"context_lines":[{"line_number":264,"context_line":""},{"line_number":265,"context_line":".. note::"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    The `openstack compute-node update inventory` CLI call above does not"},{"line_number":268,"context_line":"    currently exist and would be added in the scope of this blueprint."},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"The NFV cloud admin wants their virtual network function manager (VNFM) to"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab6814e_7626a169","line":267,"in_reply_to":"dab17558_e4186020","updated":"2016-05-18 15:28:33.000000000","message":"Thanks :) I\u0027m trying my best to be responsive.","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91707b6250e4043c9c4bb9f327006bbbf845c27a","unresolved":false,"context_lines":[{"line_number":286,"context_line":"    # And a similar flavor for the crypto-centric VNFs"},{"line_number":287,"context_line":"    openstack flavor create nfv.ovs auto 4096 4 0"},{"line_number":288,"context_line":"    openstack flavor set nfv.ovs \\"},{"line_number":289,"context_line":"        --property resources:PROG_OVS:1"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":".. note::"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_c4139cff","line":289,"updated":"2016-05-17 14:55:52.000000000","message":"@rloo: Nice catch. Fixed.","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"58fe697583e0441aab1b82fac3986e5f013a046a","unresolved":false,"context_lines":[{"line_number":286,"context_line":"    # And a similar flavor for the crypto-centric VNFs"},{"line_number":287,"context_line":"    openstack flavor create nfv.ovs auto 4096 4 0"},{"line_number":288,"context_line":"    openstack flavor set nfv.ovs \\"},{"line_number":289,"context_line":"        --property resources:PROG_OVS:1"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":".. note::"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_15a34b01","line":289,"updated":"2016-05-10 18:12:35.000000000","message":"These two flavors are the same. I think you want nfv.ovs \u0026 nfv.crypto and other changes :)","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"9eb6ba136b22808f7ec6ae5bc4b86f775e5c0544","unresolved":false,"context_lines":[{"line_number":310,"context_line":"  resource classes above a certain integer index range"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"* REST API for adding new resource classes"},{"line_number":313,"context_line":"  "},{"line_number":314,"context_line":" This REST API would extend the new placement API added in the"},{"line_number":315,"context_line":" `generic-resource-pools` blueprint with the ability to add custom resource"},{"line_number":316,"context_line":" classes"}],"source_content_type":"text/x-rst","patch_set":1,"id":"1a122d0e_06bfccd0","line":313,"updated":"2016-05-04 19:37:32.000000000","message":"nit","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"49a0bda11e27c1fd909d0f2b6327165b9690ac70","unresolved":false,"context_lines":[{"line_number":318,"context_line":"* REST API for setting dynamic resource class inventory records for a compute"},{"line_number":319,"context_line":"  node"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"* Changes to the scheduler to look for \"resource:$RESOURCE_CLASS:$AMOUNT\" extra"},{"line_number":322,"context_line":"  specs codes for requested amounts of a dynamic resource class in a flavor and"},{"line_number":323,"context_line":"  consider these requested resource amounts in the same way as any other"},{"line_number":324,"context_line":"  resource class"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_2a463821","line":321,"updated":"2016-05-16 10:12:58.000000000","message":"Is it possible to request 2 resource classes at the same time?","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"637eeca41e0e74bf430c63e5491c21413b1a7eb2","unresolved":false,"context_lines":[{"line_number":318,"context_line":"* REST API for setting dynamic resource class inventory records for a compute"},{"line_number":319,"context_line":"  node"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"* Changes to the scheduler to look for \"resource:$RESOURCE_CLASS:$AMOUNT\" extra"},{"line_number":322,"context_line":"  specs codes for requested amounts of a dynamic resource class in a flavor and"},{"line_number":323,"context_line":"  consider these requested resource amounts in the same way as any other"},{"line_number":324,"context_line":"  resource class"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dab17558_094306b0","line":321,"in_reply_to":"dab17558_2a463821","updated":"2016-05-17 12:41:40.000000000","message":"Here I mean 2 possibilities, in case of ironic: give me a node of any of these classes; or maybe request a specific node type and some amount of shared storage?","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"9eb6ba136b22808f7ec6ae5bc4b86f775e5c0544","unresolved":false,"context_lines":[{"line_number":342,"context_line":"constants on this `ResourceClass` object model for the existing integer and"},{"line_number":343,"context_line":"string constants from the Enum `ResourceClass` for the \"standardized\" resource"},{"line_number":344,"context_line":"classes so that when clouds refer to one of those resource classes, they always"},{"line_number":345,"context_line":"refer to the same string/integer combination."},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"This new `ResourceClass` object model might look something like this::"},{"line_number":348,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"1a122d0e_a6e7f810","line":345,"updated":"2016-05-04 19:37:32.000000000","message":"Heh. This is quite a lot like how I implemented the first version of resource classes because I assumed \"well of course we\u0027re going to want to let operators define their own classes\"\n\nhttps://review.openstack.org/#/c/263497/\nhttps://review.openstack.org/#/c/263496/\n\nWe then decided no we didn\u0027t want to do that. I agree that coming back round to this way of doing things provides the needed flexibility but also it is clear that the idea _only_ works because of the structuring and constraints provided by the whole resource providers concept.","commit_id":"7b978e4bada846d814c5feee5aee9585475a91e8"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"595682f96f4623cbffd8b4bd5a955d15850a4509","unresolved":false,"context_lines":[{"line_number":44,"context_line":"a single Ironic baremetal node can serve one and only one Nova instance at a"},{"line_number":45,"context_line":"time."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"There is currently a single `nova-compute` daemon that \"manages\" all Ironic"},{"line_number":48,"context_line":"baremetal nodes in a deployment. It exposes all baremetal nodes\u0027 details to the"},{"line_number":49,"context_line":"Nova scheduler as though they were discrete hypervisors, where the hypervisor"},{"line_number":50,"context_line":"name is the baremetal node UUID. The Nova scheduler determines the unique"},{"line_number":51,"context_line":"combination of (host, node) on which to place a requested instance workload,"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_88aa806f","line":48,"range":{"start_line":47,"start_character":0,"end_line":48,"end_character":32},"updated":"2016-05-26 15:56:59.000000000","message":"I think I asked the question previously to jroll, but it seems possible to shard your baremetal cloud so that you can run multiple nova-computes, each one responsible for a subset of your Ironic nodes (exclusively).\nOf course, most of the deployers, I guess, run a single n-cpu process for all their baremetal nodes, but Nova doesn\u0027t prevent to do the above, maybe just Ironic. TBC by jroll or any other Ironic contributor hanging around.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8f114690c4ea6d26d19273d372096cbb9f5504c7","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"750 of these machines correspond to this configuration:"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"* dual-socket 8-core Intel CPU with hyperthreading"},{"line_number":81,"context_line":"* 128GB RAM"},{"line_number":82,"context_line":"* 800GB HDD"},{"line_number":83,"context_line":"* 2x1GB NICs"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9abb7d3a_684d7099","line":80,"updated":"2016-06-01 15:46:15.000000000","message":"Could we distill this down to just \"configA\" and \"configB\" ? Giving these fake machines details seems unnecessary.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8f114690c4ea6d26d19273d372096cbb9f5504c7","unresolved":false,"context_lines":[{"line_number":93,"context_line":"* 2x1GB NICs"},{"line_number":94,"context_line":"* 2x10GB NICs (SR-IOV enabled)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"We will call this configuration `IRON_NFV`."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"The cloud operator wants to use 10 `nova-compute` daemons for managing Ironic"},{"line_number":99,"context_line":"instances, so they start 10 `nova-compute` daemons, possibly in containers::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9abb7d3a_c80a9c25","line":96,"updated":"2016-06-01 15:46:15.000000000","message":"I would avoid using the dreaded TLA here. Can\u0027t this just be \"IRON_GOLD\" or something? Aside from the metallurgical significance, I think just thinking about these as \"silver vs. gold\" or \"base vs premium\" is plenty to get this point across. The spec is already large and has plenty of stuff for people to be confused about. I\u0027d keep it simpler wherever possible.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"595682f96f4623cbffd8b4bd5a955d15850a4509","unresolved":false,"context_lines":[{"line_number":96,"context_line":"We will call this configuration `IRON_NFV`."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"The cloud operator wants to use 10 `nova-compute` daemons for managing Ironic"},{"line_number":99,"context_line":"instances, so they start 10 `nova-compute` daemons, possibly in containers::"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    # Assume 10 containers with IP addresses 10.0.3.11 through 10.0.3.21"},{"line_number":102,"context_line":"    # have been created and contain the nova-compute packages..."}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_9193c85a","line":99,"range":{"start_line":99,"start_character":52,"end_line":99,"end_character":76},"updated":"2016-05-26 15:56:59.000000000","message":"Well, you\u0027re already talking about NFV, you also want to say another buzzword ? Is that a challenge ? ;-)\n\nOkay, let me be better grown up, I don\u0027t think discussing about containers here is really needed for the spec.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"595682f96f4623cbffd8b4bd5a955d15850a4509","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    # have been created and contain the nova-compute packages..."},{"line_number":103,"context_line":"    for x in `seq 11 21`; do"},{"line_number":104,"context_line":"        ssh user@10.0.3.$x \u0027service nova-compute start\u0027"},{"line_number":105,"context_line":"    done"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Starting the `nova-compute` service daemon in each container will create a"},{"line_number":108,"context_line":"compute node record in the Nova database for that host/IP address."}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_312c9c01","line":105,"updated":"2016-05-26 15:56:59.000000000","message":"Again, not needed. Reviewing specs is already taking time, please be concise.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1e8ef33eaa374158c0c0a0d924fac5bb4ac10819","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    done"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Starting the `nova-compute` service daemon in each container will create a"},{"line_number":108,"context_line":"compute node record in the Nova database for that host/IP address."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"We will need an aggregate to associate a generic resource pool with, so the"},{"line_number":111,"context_line":"cloud operator creates one for each hardware configuration::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_ea5acb29","line":108,"updated":"2016-05-23 21:16:11.000000000","message":"@edleafe: Well, it\u0027s actually in the scope of this spec because the use case that this blueprint enables is having multiple nova-compute processes handling Ironic nodes, which currently is not possible. Therefore, I included the above as an indicator of how an Ironic deployer might set things up...","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"61cb84294b0f8c42897249fe7b16b93f58c2968a","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    done"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Starting the `nova-compute` service daemon in each container will create a"},{"line_number":108,"context_line":"compute node record in the Nova database for that host/IP address."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"We will need an aggregate to associate a generic resource pool with, so the"},{"line_number":111,"context_line":"cloud operator creates one for each hardware configuration::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_4bdc1d73","line":108,"updated":"2016-05-20 14:57:41.000000000","message":"This is outside the scope of this spec. Just assume that they have the nova-computes they want.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"595682f96f4623cbffd8b4bd5a955d15850a4509","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    done"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Starting the `nova-compute` service daemon in each container will create a"},{"line_number":108,"context_line":"compute node record in the Nova database for that host/IP address."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"We will need an aggregate to associate a generic resource pool with, so the"},{"line_number":111,"context_line":"cloud operator creates one for each hardware configuration::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_71e584a2","line":108,"in_reply_to":"bab6814e_ea5acb29","updated":"2016-05-26 15:56:59.000000000","message":"Using containers is not a pre-requisite, right? Operators could just use separate machines for n-cpus?","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8f114690c4ea6d26d19273d372096cbb9f5504c7","unresolved":false,"context_lines":[{"line_number":158,"context_line":"    The `openstack resource-class create` CLI call above does not currently"},{"line_number":159,"context_line":"    exist and would be added in the scope of this blueprint."},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"Now the cloud operator can set the inventory of the two resource pools create"},{"line_number":162,"context_line":"earlier::"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    openstack resource-pool set inventory $BASE_IRON_RP_UUID \\"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9abb7d3a_28db681c","line":161,"range":{"start_line":161,"start_character":71,"end_line":161,"end_character":77},"updated":"2016-06-01 15:46:15.000000000","message":"\"created\"","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1e8ef33eaa374158c0c0a0d924fac5bb4ac10819","unresolved":false,"context_lines":[{"line_number":162,"context_line":"earlier::"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    openstack resource-pool set inventory $BASE_IRON_RP_UUID \\"},{"line_number":165,"context_line":"        --resource-class\u003dIRON_BASE --total\u003d750 --reserved\u003d0 \\"},{"line_number":166,"context_line":"        --max-unit\u003d1 --min-unit\u003d1 --allocation-ratio\u003d1.0"},{"line_number":167,"context_line":"    openstack resource-pool set inventory $NFV_IRON_RP_UUID \\"},{"line_number":168,"context_line":"        --resource-class\u003dIRON_NFV --total\u003d250 --reserved\u003d0 \\"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_4a403736","line":165,"updated":"2016-05-23 21:16:11.000000000","message":"Guys, please see below. I propose having the Ironic virt driver or an external script update the vaue of the total and reserved amounts for the resource pool.\n\n@lucas: There is nothing in this proposal about maintenance mode of Ironic nodes because this proposal is only about allowing Nova operators to create resource classes themselves instead of allowing only the standard resource classes that are in Nova (VCPU, DISK_GB, MEMORY_MB, etc). Whether an Ironic node cannot be contacted over the management/IPMI network is entirely an implementation detail of the Nova Ironic virt driver and is not something that we deal with in this spec.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"d1cd5ddfb0bf89ce12de17cce36bed66b647cfbe","unresolved":false,"context_lines":[{"line_number":162,"context_line":"earlier::"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    openstack resource-pool set inventory $BASE_IRON_RP_UUID \\"},{"line_number":165,"context_line":"        --resource-class\u003dIRON_BASE --total\u003d750 --reserved\u003d0 \\"},{"line_number":166,"context_line":"        --max-unit\u003d1 --min-unit\u003d1 --allocation-ratio\u003d1.0"},{"line_number":167,"context_line":"    openstack resource-pool set inventory $NFV_IRON_RP_UUID \\"},{"line_number":168,"context_line":"        --resource-class\u003dIRON_NFV --total\u003d250 --reserved\u003d0 \\"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_8172e4e3","line":165,"range":{"start_line":165,"start_character":10,"end_line":165,"end_character":34},"updated":"2016-05-18 15:19:50.000000000","message":"Just a thought... Can we define a special/smart kind of \"resource class\" called \"per-host resource class\" that its total value will be automatically up-to-date with `sum(hosts)` associated with its resource provider?\n\nOtherwise, the admin needs to check manually whether the total is equal to the number of associated hosts. And he/she also needs to manually update the \"total\" value either after the association is changed or whenever a new host is added/deleted from an aggregate.\n\nThat^ work is tedious because an aggregate can be associated with multiple resource pools, and the admin needs to check every association.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":10511,"name":"Ligong Duan","email":"duanlg@live.cn","username":"duanlg"},"change_message_id":"3724e11d74fe8416b969c106ca686a8b0533745f","unresolved":false,"context_lines":[{"line_number":162,"context_line":"earlier::"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    openstack resource-pool set inventory $BASE_IRON_RP_UUID \\"},{"line_number":165,"context_line":"        --resource-class\u003dIRON_BASE --total\u003d750 --reserved\u003d0 \\"},{"line_number":166,"context_line":"        --max-unit\u003d1 --min-unit\u003d1 --allocation-ratio\u003d1.0"},{"line_number":167,"context_line":"    openstack resource-pool set inventory $NFV_IRON_RP_UUID \\"},{"line_number":168,"context_line":"        --resource-class\u003dIRON_NFV --total\u003d250 --reserved\u003d0 \\"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3aaa91ec_65353ed9","line":165,"in_reply_to":"bab6814e_09e10cd1","updated":"2016-06-27 02:25:31.000000000","message":"Currently ironic has the feature of hardware auto-discovery(ironic set-provision-state manage/inspect), then \"ironic node-show\" will reports hardware details, such as GPU count, memory size, disk size and other specific hardwares, such as GPU. I am wondering whether these host aggregates can be created automatically based on these information.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"87fd398b0c877cfe94082c23d85e0b180fa750be","unresolved":false,"context_lines":[{"line_number":162,"context_line":"earlier::"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    openstack resource-pool set inventory $BASE_IRON_RP_UUID \\"},{"line_number":165,"context_line":"        --resource-class\u003dIRON_BASE --total\u003d750 --reserved\u003d0 \\"},{"line_number":166,"context_line":"        --max-unit\u003d1 --min-unit\u003d1 --allocation-ratio\u003d1.0"},{"line_number":167,"context_line":"    openstack resource-pool set inventory $NFV_IRON_RP_UUID \\"},{"line_number":168,"context_line":"        --resource-class\u003dIRON_NFV --total\u003d250 --reserved\u003d0 \\"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_09e10cd1","line":165,"in_reply_to":"bab6814e_31b5587e","updated":"2016-05-24 08:41:12.000000000","message":"Hi @Jay,\n\nThanks for pointing that out. I didn\u0027t mean that nova would control the maintenance mode I just used it as an example of how a node can automatically go out of service.\n\nUnderstood about the external code to update the pool.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"dd2065e6a896c64240ca8a12e2ad32af11eade53","unresolved":false,"context_lines":[{"line_number":162,"context_line":"earlier::"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    openstack resource-pool set inventory $BASE_IRON_RP_UUID \\"},{"line_number":165,"context_line":"        --resource-class\u003dIRON_BASE --total\u003d750 --reserved\u003d0 \\"},{"line_number":166,"context_line":"        --max-unit\u003d1 --min-unit\u003d1 --allocation-ratio\u003d1.0"},{"line_number":167,"context_line":"    openstack resource-pool set inventory $NFV_IRON_RP_UUID \\"},{"line_number":168,"context_line":"        --resource-class\u003dIRON_NFV --total\u003d250 --reserved\u003d0 \\"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_31b5587e","line":165,"in_reply_to":"bab6814e_4a403736","updated":"2016-05-24 08:33:08.000000000","message":"Got it, there\u0027s no relationship between \u0027total\u0027 and number of compute nodes. The \u0027total\u0027 should be updated by external programs.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a40922f7788c46945ee4ca3c3b620a7b8a688de8","unresolved":false,"context_lines":[{"line_number":162,"context_line":"earlier::"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    openstack resource-pool set inventory $BASE_IRON_RP_UUID \\"},{"line_number":165,"context_line":"        --resource-class\u003dIRON_BASE --total\u003d750 --reserved\u003d0 \\"},{"line_number":166,"context_line":"        --max-unit\u003d1 --min-unit\u003d1 --allocation-ratio\u003d1.0"},{"line_number":167,"context_line":"    openstack resource-pool set inventory $NFV_IRON_RP_UUID \\"},{"line_number":168,"context_line":"        --resource-class\u003dIRON_NFV --total\u003d250 --reserved\u003d0 \\"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_7b007d02","line":165,"range":{"start_line":165,"start_character":10,"end_line":165,"end_character":34},"in_reply_to":"bab6814e_8172e4e3","updated":"2016-05-23 16:40:19.000000000","message":"++ indeed, this is very needed. In fact, we should allow the virt driver to control the \"total\" and \"reserved\" values here. For example, in Ironic there\u0027s a periodic task that check if the node is manageable (basically if the BMC is working by getting the node\u0027s power state). If this test fails a couple of times, Ironic will then mark this node as in \"maintenance\"* and this node should then be removed from nova scheduler pool and have the it\u0027s resources subtracted from the total. \n\n* \"maintenance\" is flag in Ironic that indicates to an operator that he needs to manually check a given node. Hardware faulty is expected in bare metal and I would like to see this as part of the design for this proposal.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1e8ef33eaa374158c0c0a0d924fac5bb4ac10819","unresolved":false,"context_lines":[{"line_number":175,"context_line":"resource and the \"nova.platinum\" flavor would consume one `IRON_NFV` resource::"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    openstack flavor set metal.gold \\"},{"line_number":178,"context_line":"        --property resources:IRON_BASE:1"},{"line_number":179,"context_line":"    openstack flavor set metal.platinum \\"},{"line_number":180,"context_line":"        --property resources:IRON_NFV:1"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_2a3df3bb","line":178,"updated":"2016-05-23 21:16:11.000000000","message":"@Yingxin: I don\u0027t really understand what you mean by \"per-host resource classes\", then. *Something* needs to indicate how many of some class of resource are utilized by a request to launch an instance. For Ironic resource classes, the number consumed will typically be 1, since the Ironic resource classes are indivisible.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"d1cd5ddfb0bf89ce12de17cce36bed66b647cfbe","unresolved":false,"context_lines":[{"line_number":175,"context_line":"resource and the \"nova.platinum\" flavor would consume one `IRON_NFV` resource::"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    openstack flavor set metal.gold \\"},{"line_number":178,"context_line":"        --property resources:IRON_BASE:1"},{"line_number":179,"context_line":"    openstack flavor set metal.platinum \\"},{"line_number":180,"context_line":"        --property resources:IRON_NFV:1"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_13300756","line":178,"range":{"start_line":178,"start_character":29,"end_line":178,"end_character":40},"updated":"2016-05-18 15:19:50.000000000","message":"If the IRON_BASE and IRON_NFV are the smart \"per-host resource classes\" as described @165, there is no need to explicitly set its consumption to \"1\" in the flavor because this kind of resources are \"per-host\".","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"dd2065e6a896c64240ca8a12e2ad32af11eade53","unresolved":false,"context_lines":[{"line_number":175,"context_line":"resource and the \"nova.platinum\" flavor would consume one `IRON_NFV` resource::"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    openstack flavor set metal.gold \\"},{"line_number":178,"context_line":"        --property resources:IRON_BASE:1"},{"line_number":179,"context_line":"    openstack flavor set metal.platinum \\"},{"line_number":180,"context_line":"        --property resources:IRON_NFV:1"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_d107ac7f","line":178,"in_reply_to":"bab6814e_2a3df3bb","updated":"2016-05-24 08:33:08.000000000","message":"Sorry, its my misunderstanding of ironic deployment with nova-compute service, please ignore this comment and the comment @165. Ironic resource is \u0027per-bare-metal\u0027, but not \u0027per-compute-node\u0027.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1e8ef33eaa374158c0c0a0d924fac5bb4ac10819","unresolved":false,"context_lines":[{"line_number":184,"context_line":"    The \"resources:IRON_BASE:1\" custom extra-spec property above isn\u0027t what I"},{"line_number":185,"context_line":"    would ideally like to use to represent quantitative resources for an"},{"line_number":186,"context_line":"    instance type. However, this extra specs system is what we currently have"},{"line_number":187,"context_line":"    and it\u0027s out of scope for this spec to fix that."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"At this point, Nova has the information it needs to place requested workloads"},{"line_number":190,"context_line":"to any of the 10 `nova-compute` daemons. Requests for the higher-end"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_8a4a1f54","line":187,"updated":"2016-05-23 21:16:11.000000000","message":"Again, I\u0027m not trying to boil the ocean in this spec. I\u0027m only trying to develop a solution for resource classes that by their nature cannot be standardized and must be able to be added by deployers dynamically.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"61cb84294b0f8c42897249fe7b16b93f58c2968a","unresolved":false,"context_lines":[{"line_number":184,"context_line":"    The \"resources:IRON_BASE:1\" custom extra-spec property above isn\u0027t what I"},{"line_number":185,"context_line":"    would ideally like to use to represent quantitative resources for an"},{"line_number":186,"context_line":"    instance type. However, this extra specs system is what we currently have"},{"line_number":187,"context_line":"    and it\u0027s out of scope for this spec to fix that."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"At this point, Nova has the information it needs to place requested workloads"},{"line_number":190,"context_line":"to any of the 10 `nova-compute` daemons. Requests for the higher-end"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_4be6dd15","line":187,"updated":"2016-05-20 14:57:41.000000000","message":"That\u0027s true, but instead of accepting this, I think it should show that using flavors to handle things like this should be avoided. It sort of works for Ironic, since we already have flavors for different machines, but it really doesn\u0027t work elsewhere.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":7789,"name":"John Wood","email":"john.wood@rackspace.com","username":"woodster"},"change_message_id":"041ee3d24383c30931dab31f444b08d97c29c227","unresolved":false,"context_lines":[{"line_number":199,"context_line":"    The operator could also choose to use a single aggregate and assign that"},{"line_number":200,"context_line":"    aggregate to all compute nodes and have a single generic resource pool"},{"line_number":201,"context_line":"    containing multiple inventory records, one for the IRON_BASE and one for"},{"line_number":202,"context_line":"    the IRON_NFV resource class."},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"FPGA slot context resources"},{"line_number":205,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9abb7d3a_94898bcd","line":202,"updated":"2016-05-27 16:45:48.000000000","message":"I\u0027m a bit confused by this paragraph. If there is just one resource pool for one aggregate, then wouldn\u0027t the two inventory records share from the compute resources in the one aggregate? So a flavor set with either IRON_BASE or IRON_NFV could result in picking one of your two compute types above with no rhyme or reason to it. So what would the two resource classes and inventories buy you in this case?","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"595682f96f4623cbffd8b4bd5a955d15850a4509","unresolved":false,"context_lines":[{"line_number":201,"context_line":"    containing multiple inventory records, one for the IRON_BASE and one for"},{"line_number":202,"context_line":"    the IRON_NFV resource class."},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"FPGA slot context resources"},{"line_number":205,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"A field-programmable gate array (FPGA) is a piece of specialized hardware that"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_d100b004","line":204,"updated":"2016-05-26 15:56:59.000000000","message":"I\u0027d be better if discussing about FPGAs could be done rather on a separate spec, even a backlog one, because I haven\u0027t seen consensus yet, and I wouldn\u0027t stop discussing about that precise spec because of any crucial discussion on FPGA that could trample that spec review.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8f114690c4ea6d26d19273d372096cbb9f5504c7","unresolved":false,"context_lines":[{"line_number":201,"context_line":"    containing multiple inventory records, one for the IRON_BASE and one for"},{"line_number":202,"context_line":"    the IRON_NFV resource class."},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"FPGA slot context resources"},{"line_number":205,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"A field-programmable gate array (FPGA) is a piece of specialized hardware that"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9abb7d3a_088e64cf","line":204,"in_reply_to":"bab6814e_d100b004","updated":"2016-06-01 15:46:15.000000000","message":"I would love to keep this spec to _just_ the dynamic resource changes required to enable ironic.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"595682f96f4623cbffd8b4bd5a955d15850a4509","unresolved":false,"context_lines":[{"line_number":202,"context_line":"    the IRON_NFV resource class."},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"FPGA slot context resources"},{"line_number":205,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"A field-programmable gate array (FPGA) is a piece of specialized hardware that"},{"line_number":208,"context_line":"is typically used to accelerate particular pieces of critical code. Some or all"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_b4c51a8f","line":205,"updated":"2016-05-26 15:56:59.000000000","message":"Up to this, I understood what you\u0027re saying, but all of that is related to generic-resource-pools right? \n\nIf so, you\u0027re maybe missing to clarify *why* you think we should add some dynamicity to that.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1e8ef33eaa374158c0c0a0d924fac5bb4ac10819","unresolved":false,"context_lines":[{"line_number":220,"context_line":"resource pools is that there is no resource pool concept here. The FPGA program"},{"line_number":221,"context_line":"contexts are resources that are local to a particular compute node and may only"},{"line_number":222,"context_line":"be consumed by instances on that compute node. By contrast, resources provided"},{"line_number":223,"context_line":"by a resource pool may be consumed by instances on many compute nodes."},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"Therefore, we will need some method to allow the operator to tell Nova that a"},{"line_number":226,"context_line":"compute node has one or more FPGA program contexts available for instances to"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_6a47fb4b","line":223,"updated":"2016-05-23 21:16:11.000000000","message":"@roman: But a some IP that is programmed into an FPGA on host A cannot be consumed by a guest on host B. That is what I\u0027m getting at here... which is why I say that the FPGA resource contexts are \"local to a compute node\".","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"697834a446ef374340100ff8f06eed393a956f04","unresolved":false,"context_lines":[{"line_number":216,"context_line":"particular piece of embedded systems code that is housed in the FPGA that is on"},{"line_number":217,"context_line":"a compute node."},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"The difference between this use case and the use case that uses generic"},{"line_number":220,"context_line":"resource pools is that there is no resource pool concept here. The FPGA program"},{"line_number":221,"context_line":"contexts are resources that are local to a particular compute node and may only"},{"line_number":222,"context_line":"be consumed by instances on that compute node. By contrast, resources provided"},{"line_number":223,"context_line":"by a resource pool may be consumed by instances on many compute nodes."},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"Therefore, we will need some method to allow the operator to tell Nova that a"},{"line_number":226,"context_line":"compute node has one or more FPGA program contexts available for instances to"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_a18405d4","line":223,"range":{"start_line":219,"start_character":0,"end_line":223,"end_character":70},"updated":"2016-05-19 16:04:07.000000000","message":"Actually, programmed FPGAs with the same IP on several nodes can be gathered together under single resource pool, even if the type of FPGA is different. It doesn\u0027t matter if you have specific cryptographic algorithm on Stratix IV or Stratix V for example, they should offer the same functionality, assuming, that algorithm is in the same version.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"39edcdaf901a303674e96f63a0b048a82704b510","unresolved":false,"context_lines":[{"line_number":220,"context_line":"resource pools is that there is no resource pool concept here. The FPGA program"},{"line_number":221,"context_line":"contexts are resources that are local to a particular compute node and may only"},{"line_number":222,"context_line":"be consumed by instances on that compute node. By contrast, resources provided"},{"line_number":223,"context_line":"by a resource pool may be consumed by instances on many compute nodes."},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"Therefore, we will need some method to allow the operator to tell Nova that a"},{"line_number":226,"context_line":"compute node has one or more FPGA program contexts available for instances to"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_373505db","line":223,"in_reply_to":"bab6814e_6a47fb4b","updated":"2016-05-25 13:20:03.000000000","message":"@Jay, I thought that \u0027generic resource pool\u0027 thing is an entity which gather together same resources within a cluster. But definitely I got it wrong. Again :)\n\nSo, unlike shared storage, which might be shared between guests on different hosts, programmed on FPGA accelerator is a resource which is bound to the host (like CPU), right?","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1e8ef33eaa374158c0c0a0d924fac5bb4ac10819","unresolved":false,"context_lines":[{"line_number":224,"context_line":""},{"line_number":225,"context_line":"Therefore, we will need some method to allow the operator to tell Nova that a"},{"line_number":226,"context_line":"compute node has one or more FPGA program contexts available for instances to"},{"line_number":227,"context_line":"consume. Dynamic resource classes to the rescue."},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"Let\u0027s say that an NFV cloud deployment has 20 baremetal machines that each have"},{"line_number":230,"context_line":"an Altera FPGA. These FPGAs have been loaded with one of two different programs"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_ca7267b0","line":227,"updated":"2016-05-23 21:16:11.000000000","message":"@roman: Your words aren\u0027t harsh at all :) Ed was just explaining that programming/synthesizing the FPGAs is definitely outside the scope of what Nova should be doing. Like you alluded to in Austin, a project like Nomad would be responsible for programming of the FPGAs themselves and keeping the resource inventories up to date as IP was synthesized into an FPGA.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"697834a446ef374340100ff8f06eed393a956f04","unresolved":false,"context_lines":[{"line_number":222,"context_line":"be consumed by instances on that compute node. By contrast, resources provided"},{"line_number":223,"context_line":"by a resource pool may be consumed by instances on many compute nodes."},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"Therefore, we will need some method to allow the operator to tell Nova that a"},{"line_number":226,"context_line":"compute node has one or more FPGA program contexts available for instances to"},{"line_number":227,"context_line":"consume. Dynamic resource classes to the rescue."},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"Let\u0027s say that an NFV cloud deployment has 20 baremetal machines that each have"},{"line_number":230,"context_line":"an Altera FPGA. These FPGAs have been loaded with one of two different programs"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_c122e900","line":227,"range":{"start_line":225,"start_character":0,"end_line":227,"end_character":48},"updated":"2016-05-19 16:04:07.000000000","message":"And what about the case, where we have empty array, or FPGA with currently unused accelerators in place, but there is a request for workload with specific HW acceleration which is not available currently (all contexts in this/other nodes are already taken)?\n\nDo we even try to take advantage on reprogramming ability of FPGAs?","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"a84b331d369dfba6a611f5188e4ad6047d820352","unresolved":false,"context_lines":[{"line_number":222,"context_line":"be consumed by instances on that compute node. By contrast, resources provided"},{"line_number":223,"context_line":"by a resource pool may be consumed by instances on many compute nodes."},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"Therefore, we will need some method to allow the operator to tell Nova that a"},{"line_number":226,"context_line":"compute node has one or more FPGA program contexts available for instances to"},{"line_number":227,"context_line":"consume. Dynamic resource classes to the rescue."},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"Let\u0027s say that an NFV cloud deployment has 20 baremetal machines that each have"},{"line_number":230,"context_line":"an Altera FPGA. These FPGAs have been loaded with one of two different programs"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_bc7a2aef","line":227,"range":{"start_line":225,"start_character":0,"end_line":227,"end_character":48},"in_reply_to":"bab6814e_ab74a935","updated":"2016-05-20 16:42:17.000000000","message":"Ed, sorry about that. Sean already pointed that out in other review (https://review.openstack.org/#/c/318047) and IRC.\n\nWhat I meant here was that perhaps in the future (may be a very distant one ;) we will support the case of (re)programming using external entity to achieve that. Point is, that there is no way, that we can tell such entity to do its job, and make the vm boot postponed until the time programming (or whatever things should be done for other attachable) is done. Without such facility and knowing that hooks will go away eventually, there should be a way to communicate with such service. Or other way around: from such service communicate with Nova through the API, about the state of attachable.\n\nI hope it does make sense, and apologize for my a bit harsh words here.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"61cb84294b0f8c42897249fe7b16b93f58c2968a","unresolved":false,"context_lines":[{"line_number":222,"context_line":"be consumed by instances on that compute node. By contrast, resources provided"},{"line_number":223,"context_line":"by a resource pool may be consumed by instances on many compute nodes."},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"Therefore, we will need some method to allow the operator to tell Nova that a"},{"line_number":226,"context_line":"compute node has one or more FPGA program contexts available for instances to"},{"line_number":227,"context_line":"consume. Dynamic resource classes to the rescue."},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"Let\u0027s say that an NFV cloud deployment has 20 baremetal machines that each have"},{"line_number":230,"context_line":"an Altera FPGA. These FPGAs have been loaded with one of two different programs"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_ab74a935","line":227,"range":{"start_line":225,"start_character":0,"end_line":227,"end_character":48},"in_reply_to":"bab6814e_c122e900","updated":"2016-05-20 14:57:41.000000000","message":"@Roman - this was discussed at the Summit, and decided that handling the programming of FPGAs is way outside the scope of Nova. We are assuming that an operator will handle the programming/deprogramming and associated resource creation/destruction on their own.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"39edcdaf901a303674e96f63a0b048a82704b510","unresolved":false,"context_lines":[{"line_number":224,"context_line":""},{"line_number":225,"context_line":"Therefore, we will need some method to allow the operator to tell Nova that a"},{"line_number":226,"context_line":"compute node has one or more FPGA program contexts available for instances to"},{"line_number":227,"context_line":"consume. Dynamic resource classes to the rescue."},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"Let\u0027s say that an NFV cloud deployment has 20 baremetal machines that each have"},{"line_number":230,"context_line":"an Altera FPGA. These FPGAs have been loaded with one of two different programs"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_c6032975","line":227,"in_reply_to":"bab6814e_ca7267b0","updated":"2016-05-25 13:20:03.000000000","message":"@Jay, I was thinking about a little bit different scenario, where we have a service like Nomad around, and we have host A with FPGA without any accelerator programmed so far.\n\nLet\u0027s also assume, that we have flavor metadata filled with corresponding accelerator ID. Scheduler can distinguish such metadata and filter out all the host but the A one. Given a fact, that Nova does not have such accelerator in place, and there is an FPGA available and capable to hold such accelerator, it send an API call to Nomad (or any other service, if Nomad would not be used), and wait for the result. Result might be \"success\" or \"failure\" with appropriate error message, so that Nova can continue spawning the guest and put the reason of failure to the logs.\n\nSo here we have several interesting aspects looking from resource point of view:\n\n1. We have to track somehow, that we have FPGA available and its status (it might be either unused, provided exclusively to the guest, or have available slots). It would be need for the cases, where whole FPGA would be taken either by VM or by host (the bare metal case).\n\nIt might be modeled as a tree structure, where topmost (root) node would be an FPGA (it\u0027s type, model or any useful information which will be needed to match appropriate chips with available IPs), child node would represent one or more slots, with the information about programmed (or not, in case of free slot) accelerator and number of its contexts (alternatively contexts might be child of slot node).\n\n2. After successful programming, there would be new accelerator, which will have several contexts available to be used by specified number of guests.\n\n3. Nova resources should be updated after successful (re)programming a region. This one may introduce race condition in case of simultaneously requesting accelerator and reprogramming it.\n\n4. There might be a case, that not all slots of an FPGA is taken - for example one of them is taken to accelerate networking and used by Neutron. We have to be aware of that fact either by auto discovery or configuration.\n\nAlso, I\u0027m not sure, another resource tracker within a new service is a good idea, like it was proposed in Nomad - instead of one place where we can have a straight view on all resources, we have two. But maybe I\u0027m wrong and we should have exclusive resource tracking for FPGA/other accelerators separate from the Nova resource tracker.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"dd2065e6a896c64240ca8a12e2ad32af11eade53","unresolved":false,"context_lines":[{"line_number":275,"context_line":""},{"line_number":276,"context_line":".. note::"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    The `openstack compute-node set inventory` CLI call above does not"},{"line_number":279,"context_line":"    currently exist and would be added in the scope of this blueprint."},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"The NFV cloud admin wants their virtual network function manager (VNFM) to"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_77f870c5","line":278,"updated":"2016-05-24 08:33:08.000000000","message":"Is there still a plan to merge the two CLI commands `openstack compute-node ...` and `openstack resource-pool ...`?","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":7789,"name":"John Wood","email":"john.wood@rackspace.com","username":"woodster"},"change_message_id":"041ee3d24383c30931dab31f444b08d97c29c227","unresolved":false,"context_lines":[{"line_number":275,"context_line":""},{"line_number":276,"context_line":".. note::"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    The `openstack compute-node set inventory` CLI call above does not"},{"line_number":279,"context_line":"    currently exist and would be added in the scope of this blueprint."},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"The NFV cloud admin wants their virtual network function manager (VNFM) to"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9abb7d3a_afc1da30","line":278,"in_reply_to":"bab6814e_77f870c5","updated":"2016-05-27 16:45:48.000000000","message":"+1","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"61cb84294b0f8c42897249fe7b16b93f58c2968a","unresolved":false,"context_lines":[{"line_number":297,"context_line":"    # And a similar flavor for the crypto-centric VNFs"},{"line_number":298,"context_line":"    openstack flavor create nfv.crypto auto 4096 4 0"},{"line_number":299,"context_line":"    openstack flavor set nfv.crypto \\"},{"line_number":300,"context_line":"        --property resources:PROG_CRYPTO:1"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":".. note::"},{"line_number":303,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_0b5df578","line":300,"updated":"2016-05-20 14:57:41.000000000","message":"This would, of course, be multiplied by every possible resource combination available as flavors. IOW, if you have tiny, small, medium, large, and x-large (5) flavors, you now need 15: the original 5, all five with OVS, and all 5 with CRYPTO. And if there are hosts that have access to multiple FPGA programs... ugh.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1e8ef33eaa374158c0c0a0d924fac5bb4ac10819","unresolved":false,"context_lines":[{"line_number":297,"context_line":"    # And a similar flavor for the crypto-centric VNFs"},{"line_number":298,"context_line":"    openstack flavor create nfv.crypto auto 4096 4 0"},{"line_number":299,"context_line":"    openstack flavor set nfv.crypto \\"},{"line_number":300,"context_line":"        --property resources:PROG_CRYPTO:1"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":".. note::"},{"line_number":303,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_aa77239e","line":300,"updated":"2016-05-23 21:16:11.000000000","message":"Well, yeah, but that\u0027s not because of this particular spec ;) That\u0027s just the state of poo we currently find ourselves in with flavors in the Compute API!","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"697834a446ef374340100ff8f06eed393a956f04","unresolved":false,"context_lines":[{"line_number":306,"context_line":"    instance type. However, this extra specs system is what we currently have"},{"line_number":307,"context_line":"    and it\u0027s out of scope for this spec to fix that."},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"At this point, Nova has all the information it needs in order to places"},{"line_number":310,"context_line":"instances launched with the \"nfv.ovs\" flavor onto compute nodes with available"},{"line_number":311,"context_line":"FPGA execution contexts for the OVS-specific FPGA program. Likewise, Nova can"},{"line_number":312,"context_line":"place instances launched with the \"nfv.crypto\" flavor to the compute nodes with"},{"line_number":313,"context_line":"available contexts for the crypto-specific FPGA program."},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"Proposed change"},{"line_number":316,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_042cffa9","line":313,"range":{"start_line":309,"start_character":0,"end_line":313,"end_character":56},"updated":"2016-05-19 16:04:07.000000000","message":"Reading this spec, I assume, that programming FPGA is strictly on Operator side, isn\u0027t it?\n\nI can imagine couple of more complex examples to push resource management to the limit, though :) I\u0027m sure that we don\u0027t want to fix all the world at once, but I\u0027d like to be sure, that we don\u0027t close by any chance a way for easily address a need for attach any of the fancy device or function, which may (and most probably will) come in the future, and FPGA is currently one of the most complex available.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1e8ef33eaa374158c0c0a0d924fac5bb4ac10819","unresolved":false,"context_lines":[{"line_number":310,"context_line":"instances launched with the \"nfv.ovs\" flavor onto compute nodes with available"},{"line_number":311,"context_line":"FPGA execution contexts for the OVS-specific FPGA program. Likewise, Nova can"},{"line_number":312,"context_line":"place instances launched with the \"nfv.crypto\" flavor to the compute nodes with"},{"line_number":313,"context_line":"available contexts for the crypto-specific FPGA program."},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"Proposed change"},{"line_number":316,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_0a6d8fcc","line":313,"updated":"2016-05-23 21:16:11.000000000","message":"Yup, programming the FPGA is strictly on the operator side (or a project like Nomad?). What I need from you, though, is to go through this spec and let us know if the proposed interfaces and ability for the operator to specify a custom resource class will solve the specific (and granted, limited) use case described above.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"39edcdaf901a303674e96f63a0b048a82704b510","unresolved":false,"context_lines":[{"line_number":310,"context_line":"instances launched with the \"nfv.ovs\" flavor onto compute nodes with available"},{"line_number":311,"context_line":"FPGA execution contexts for the OVS-specific FPGA program. Likewise, Nova can"},{"line_number":312,"context_line":"place instances launched with the \"nfv.crypto\" flavor to the compute nodes with"},{"line_number":313,"context_line":"available contexts for the crypto-specific FPGA program."},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"Proposed change"},{"line_number":316,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_810c613c","line":313,"in_reply_to":"bab6814e_0a6d8fcc","updated":"2016-05-25 13:20:03.000000000","message":"@Jay, In the shape you were describe it in this BP with narrowed down scope - it might be it. I feel that we should also be careful about potential issues we might have in the future with decisions we made here and now.","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"dd2065e6a896c64240ca8a12e2ad32af11eade53","unresolved":false,"context_lines":[{"line_number":353,"context_line":"constants on this `ResourceClass` object model for the existing integer and"},{"line_number":354,"context_line":"string constants from the Enum `ResourceClass` for the \"standardized\" resource"},{"line_number":355,"context_line":"classes so that when clouds refer to one of those resource classes, they always"},{"line_number":356,"context_line":"refer to the same string/integer combination."},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"This new `ResourceClass` object model might look something like this::"},{"line_number":359,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"bab6814e_f748e08c","line":356,"updated":"2016-05-24 08:33:08.000000000","message":"++\n\nThose `ResourceClass` constants are nova-local. Unlike dynamic resource classes, we may not want users to explicitly control the nova-local inventories with \"static\" resource classes, right?","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":7789,"name":"John Wood","email":"john.wood@rackspace.com","username":"woodster"},"change_message_id":"041ee3d24383c30931dab31f444b08d97c29c227","unresolved":false,"context_lines":[{"line_number":370,"context_line":"        NUMA_CORE \u003d \u0027NUMA_CORE\u0027"},{"line_number":371,"context_line":"        NUMA_THREAD \u003d \u0027NUMA_THREAD\u0027"},{"line_number":372,"context_line":"        NUMA_MEMORY_MB \u003d \u0027NUMA_MEMORY_MB\u0027"},{"line_number":373,"context_line":"        IPV4_ADDRESS \u003d \u0027IPV4_ADDRESS\u0027"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        # These come from the original ResourceClass Enum field. The order"},{"line_number":376,"context_line":"        # below is important"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9abb7d3a_cf06de1f","line":373,"updated":"2016-05-27 16:45:48.000000000","message":"Is this list pretty static now? If this could change, a versioned object would be better instead?","commit_id":"d86b32ab400aa48ca8b8b13646469bc3c289a02a"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"6325424941e9684c259c985a85c86a5240a28523","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        # below is important"},{"line_number":112,"context_line":"        STANDARD_RES_CLASSES \u003d ("},{"line_number":113,"context_line":"            VCPU,"},{"line_number":114,"context_line":"            RAM_MB,"},{"line_number":115,"context_line":"            DISK_GB,"},{"line_number":116,"context_line":"            PCI_DEVICE,"},{"line_number":117,"context_line":"            SRIOV_NET_VF,"}],"source_content_type":"text/x-rst","patch_set":4,"id":"dada55a8_1808da90","line":114,"range":{"start_line":114,"start_character":12,"end_line":114,"end_character":18},"updated":"2016-07-20 02:01:29.000000000","message":"nit: MEMORY_MB","commit_id":"1930c5fa478232d3be306e80556d1132d2586cf9"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a8de2de0f2ec80de53b8c583085dd10a5fbd6250","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        # below is important"},{"line_number":112,"context_line":"        STANDARD_RES_CLASSES \u003d ("},{"line_number":113,"context_line":"            VCPU,"},{"line_number":114,"context_line":"            RAM_MB,"},{"line_number":115,"context_line":"            DISK_GB,"},{"line_number":116,"context_line":"            PCI_DEVICE,"},{"line_number":117,"context_line":"            SRIOV_NET_VF,"}],"source_content_type":"text/x-rst","patch_set":4,"id":"dada55a8_29a9e990","line":114,"range":{"start_line":114,"start_character":12,"end_line":114,"end_character":18},"in_reply_to":"dada55a8_1808da90","updated":"2016-07-20 16:16:01.000000000","message":"Nice catch :) Fixed.","commit_id":"1930c5fa478232d3be306e80556d1132d2586cf9"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"78d78a83d24bb2f6694dd7292ad7e65b45a899d1","unresolved":false,"context_lines":[{"line_number":277,"context_line":"A `404 Not Found` response code will be returned if no such resource class"},{"line_number":278,"context_line":"matching the id is found."},{"line_number":279,"context_line":"A `400 Bad Request` response code will be returned if id is for a standard"},{"line_number":280,"context_line":"resource class -- i.e. that id is greater than"},{"line_number":281,"context_line":"`MIN_CUSTOM_RESOURCE_CLASS_INDEX` from `nova/objects/resource_class.py`."},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"`DELETE /resource_classes/{id}`"}],"source_content_type":"text/x-rst","patch_set":4,"id":"dada55a8_52a3c59e","line":280,"range":{"start_line":280,"start_character":34,"end_line":280,"end_character":41},"updated":"2016-07-18 02:40:15.000000000","message":"nit: not greater","commit_id":"1930c5fa478232d3be306e80556d1132d2586cf9"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a8de2de0f2ec80de53b8c583085dd10a5fbd6250","unresolved":false,"context_lines":[{"line_number":277,"context_line":"A `404 Not Found` response code will be returned if no such resource class"},{"line_number":278,"context_line":"matching the id is found."},{"line_number":279,"context_line":"A `400 Bad Request` response code will be returned if id is for a standard"},{"line_number":280,"context_line":"resource class -- i.e. that id is greater than"},{"line_number":281,"context_line":"`MIN_CUSTOM_RESOURCE_CLASS_INDEX` from `nova/objects/resource_class.py`."},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"`DELETE /resource_classes/{id}`"}],"source_content_type":"text/x-rst","patch_set":4,"id":"dada55a8_2997293b","line":280,"range":{"start_line":280,"start_character":34,"end_line":280,"end_character":41},"in_reply_to":"dada55a8_52a3c59e","updated":"2016-07-20 16:16:01.000000000","message":"Done","commit_id":"1930c5fa478232d3be306e80556d1132d2586cf9"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"78d78a83d24bb2f6694dd7292ad7e65b45a899d1","unresolved":false,"context_lines":[{"line_number":279,"context_line":"A `400 Bad Request` response code will be returned if id is for a standard"},{"line_number":280,"context_line":"resource class -- i.e. that id is greater than"},{"line_number":281,"context_line":"`MIN_CUSTOM_RESOURCE_CLASS_INDEX` from `nova/objects/resource_class.py`."},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"`DELETE /resource_classes/{id}`"},{"line_number":284,"context_line":"*******************************"},{"line_number":285,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"dada55a8_b2ba01bf","line":282,"updated":"2016-07-18 02:40:15.000000000","message":"nit:\nA `409 Conflict` response code will be returned if another resource class exists with the provided name.","commit_id":"1930c5fa478232d3be306e80556d1132d2586cf9"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a8de2de0f2ec80de53b8c583085dd10a5fbd6250","unresolved":false,"context_lines":[{"line_number":279,"context_line":"A `400 Bad Request` response code will be returned if id is for a standard"},{"line_number":280,"context_line":"resource class -- i.e. that id is greater than"},{"line_number":281,"context_line":"`MIN_CUSTOM_RESOURCE_CLASS_INDEX` from `nova/objects/resource_class.py`."},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"`DELETE /resource_classes/{id}`"},{"line_number":284,"context_line":"*******************************"},{"line_number":285,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"dada55a8_49d09df6","line":282,"in_reply_to":"dada55a8_b2ba01bf","updated":"2016-07-20 16:16:01.000000000","message":"Done","commit_id":"1930c5fa478232d3be306e80556d1132d2586cf9"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"78d78a83d24bb2f6694dd7292ad7e65b45a899d1","unresolved":false,"context_lines":[{"line_number":295,"context_line":"A `404 Not Found` response code will be returned if no such resource class"},{"line_number":296,"context_line":"matching the id is found."},{"line_number":297,"context_line":"A `400 Bad Request` response code will be returned if id is for a standard"},{"line_number":298,"context_line":"resource class -- i.e. that id is greater than"},{"line_number":299,"context_line":"`MIN_CUSTOM_RESOURCE_CLASS_INDEX` from `nova/objects/resource_class.py`."},{"line_number":300,"context_line":"A `409 Conflict` response code will be returned if there are existing"},{"line_number":301,"context_line":"inventories or allocations for the resource class."}],"source_content_type":"text/x-rst","patch_set":4,"id":"dada55a8_32a0d190","line":298,"range":{"start_line":298,"start_character":34,"end_line":298,"end_character":41},"updated":"2016-07-18 02:40:15.000000000","message":"nit: not greater","commit_id":"1930c5fa478232d3be306e80556d1132d2586cf9"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a8de2de0f2ec80de53b8c583085dd10a5fbd6250","unresolved":false,"context_lines":[{"line_number":295,"context_line":"A `404 Not Found` response code will be returned if no such resource class"},{"line_number":296,"context_line":"matching the id is found."},{"line_number":297,"context_line":"A `400 Bad Request` response code will be returned if id is for a standard"},{"line_number":298,"context_line":"resource class -- i.e. that id is greater than"},{"line_number":299,"context_line":"`MIN_CUSTOM_RESOURCE_CLASS_INDEX` from `nova/objects/resource_class.py`."},{"line_number":300,"context_line":"A `409 Conflict` response code will be returned if there are existing"},{"line_number":301,"context_line":"inventories or allocations for the resource class."}],"source_content_type":"text/x-rst","patch_set":4,"id":"dada55a8_e961913a","line":298,"range":{"start_line":298,"start_character":34,"end_line":298,"end_character":41},"in_reply_to":"dada55a8_32a0d190","updated":"2016-07-20 16:16:01.000000000","message":"Done","commit_id":"1930c5fa478232d3be306e80556d1132d2586cf9"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e55b1e8aedaf488c0ae021bb27082bec3a5a6143","unresolved":false,"context_lines":[{"line_number":5,"context_line":" http://creativecommons.org/licenses/by/3.0/legalcode"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":8,"context_line":"Resource Providers - Dynamic Resource Classes"},{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://blueprints.launchpad.net/nova/+spec/resource-providers-dynamic-resource-classes"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9ad45d7e_0d5be32f","line":8,"updated":"2016-08-12 14:08:50.000000000","message":"I suppose I could go for \"custom resource classes\"?","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c0a02ae48875a08243d42e0f225fdbb675600852","unresolved":false,"context_lines":[{"line_number":5,"context_line":" http://creativecommons.org/licenses/by/3.0/legalcode"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":8,"context_line":"Resource Providers - Dynamic Resource Classes"},{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://blueprints.launchpad.net/nova/+spec/resource-providers-dynamic-resource-classes"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_d1513d64","line":8,"range":{"start_line":8,"start_character":21,"end_line":8,"end_character":28},"updated":"2016-07-28 14:00:02.000000000","message":"disclaimer: I\u0027m not English-speaking native, but I wonder whether \"dynamic\" is the right wording here. Why not \"User-defined\" resource classes ? \n\nIt\u0027s a nit of course.","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"27fc08bbeac71a9b4d9e422430b5a8a59f114618","unresolved":false,"context_lines":[{"line_number":5,"context_line":" http://creativecommons.org/licenses/by/3.0/legalcode"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":8,"context_line":"Resource Providers - Dynamic Resource Classes"},{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://blueprints.launchpad.net/nova/+spec/resource-providers-dynamic-resource-classes"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_5d6250ae","line":8,"range":{"start_line":8,"start_character":21,"end_line":8,"end_character":28},"in_reply_to":"bacf61ea_d1513d64","updated":"2016-07-29 12:18:19.000000000","message":"I\u0027m not native english speaking myself, but \"dynamic\" prefix for resource classes is doing its role just fine for describing it nature, even though it is defined by user (or rather admin to be precise :)","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c0a02ae48875a08243d42e0f225fdbb675600852","unresolved":false,"context_lines":[{"line_number":50,"context_line":"We propose the addition of a few things:"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"* Changes to the `nova.objects.fields.ResourceClass` Enum to handle dynamic"},{"line_number":53,"context_line":"  resource classes above a certain integer index range"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"* New `resource_classes` database table storing the string -\u003e integer mapping"},{"line_number":56,"context_line":"  for all resource classes (standard and dynamic)"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_ace712e3","line":53,"range":{"start_line":53,"start_character":19,"end_line":53,"end_character":54},"updated":"2016-07-28 14:00:02.000000000","message":"I\u0027m not super I\u0027m super happy with that but I can live with it given it would be like the IANA port list.","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e55b1e8aedaf488c0ae021bb27082bec3a5a6143","unresolved":false,"context_lines":[{"line_number":50,"context_line":"We propose the addition of a few things:"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"* Changes to the `nova.objects.fields.ResourceClass` Enum to handle dynamic"},{"line_number":53,"context_line":"  resource classes above a certain integer index range"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"* New `resource_classes` database table storing the string -\u003e integer mapping"},{"line_number":56,"context_line":"  for all resource classes (standard and dynamic)"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9ad45d7e_6d409f36","line":53,"updated":"2016-08-12 14:08:50.000000000","message":"Right, zactly.","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e55b1e8aedaf488c0ae021bb27082bec3a5a6143","unresolved":false,"context_lines":[{"line_number":53,"context_line":"  resource classes above a certain integer index range"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"* New `resource_classes` database table storing the string -\u003e integer mapping"},{"line_number":56,"context_line":"  for all resource classes (standard and dynamic)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"* An additional placement REST API call for creating, modifying, deleting and"},{"line_number":59,"context_line":"  querying custom resource classes"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9ad45d7e_4d3ddbba","line":56,"updated":"2016-08-12 14:08:50.000000000","message":"See below, I recommend moving away from the Enum field to a ResourceClass object type.","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c0a02ae48875a08243d42e0f225fdbb675600852","unresolved":false,"context_lines":[{"line_number":53,"context_line":"  resource classes above a certain integer index range"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"* New `resource_classes` database table storing the string -\u003e integer mapping"},{"line_number":56,"context_line":"  for all resource classes (standard and dynamic)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"* An additional placement REST API call for creating, modifying, deleting and"},{"line_number":59,"context_line":"  querying custom resource classes"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_4c7e56e5","line":56,"updated":"2016-07-28 14:00:02.000000000","message":"So I guess we would coerce the Enum possible values against that lookup table ?","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e55b1e8aedaf488c0ae021bb27082bec3a5a6143","unresolved":false,"context_lines":[{"line_number":56,"context_line":"  for all resource classes (standard and dynamic)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"* An additional placement REST API call for creating, modifying, deleting and"},{"line_number":59,"context_line":"  querying custom resource classes"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"Alternatives"},{"line_number":62,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9ad45d7e_ad4a9753","line":59,"updated":"2016-08-12 14:08:50.000000000","message":"@cdent: see below.","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"e1d39461afd71dbb47374748cdbaee985d13a6e2","unresolved":false,"context_lines":[{"line_number":56,"context_line":"  for all resource classes (standard and dynamic)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"* An additional placement REST API call for creating, modifying, deleting and"},{"line_number":59,"context_line":"  querying custom resource classes"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"Alternatives"},{"line_number":62,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_531715a3","line":59,"updated":"2016-07-28 12:54:19.000000000","message":"When a resource class is deleted what are the constraints and cascades for the inventories and allocations that are associated with that resource class?","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c0a02ae48875a08243d42e0f225fdbb675600852","unresolved":false,"context_lines":[{"line_number":56,"context_line":"  for all resource classes (standard and dynamic)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"* An additional placement REST API call for creating, modifying, deleting and"},{"line_number":59,"context_line":"  querying custom resource classes"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"Alternatives"},{"line_number":62,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_cc6a461a","line":59,"in_reply_to":"bacf61ea_531715a3","updated":"2016-07-28 14:00:02.000000000","message":"Excellent point, waiting for feedback here. I4d suppose that we should return a 40x when trying to delete a custom resource class still being there for an allocation ?","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c0a02ae48875a08243d42e0f225fdbb675600852","unresolved":false,"context_lines":[{"line_number":61,"context_line":"Alternatives"},{"line_number":62,"context_line":"------------"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"None."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"Data model impact"},{"line_number":67,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_a7ca8b9f","line":64,"updated":"2016-07-28 14:00:02.000000000","message":"Well, we could imagine that resource classes are static object types with a \u0027custom\u0027 type, and then we would only store the \"custom\" resource types. That way, it would prevent operators to trick Nova in order to modify the static list (because it would still be a global variable. But sure, the performance would be a bit slower given we would first lookup in memory and then in DB.","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e55b1e8aedaf488c0ae021bb27082bec3a5a6143","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    CREATE TABLE resource_classes ("},{"line_number":72,"context_line":"        id INT NOT NULL,"},{"line_number":73,"context_line":"        name VARCHAR(100) NOT NULL,"},{"line_number":74,"context_line":"        PRIMARY KEY (id),"},{"line_number":75,"context_line":"        UNIQUE INDEX (name)"},{"line_number":76,"context_line":"    );"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9ad45d7e_8d47d34a","line":73,"updated":"2016-08-12 14:08:50.000000000","message":"@devananda: Honestly, I\u0027m fine with either VARCHAR(80) or VARCHAR(100). It\u0027s minimal difference, really.","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"6be1606c7711c6cbd92eb7f65fb0240503cc1628","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    CREATE TABLE resource_classes ("},{"line_number":72,"context_line":"        id INT NOT NULL,"},{"line_number":73,"context_line":"        name VARCHAR(100) NOT NULL,"},{"line_number":74,"context_line":"        PRIMARY KEY (id),"},{"line_number":75,"context_line":"        UNIQUE INDEX (name)"},{"line_number":76,"context_line":"    );"}],"source_content_type":"text/x-rst","patch_set":5,"id":"dada55a8_ff145ea0","line":73,"updated":"2016-07-21 19:02:08.000000000","message":"Jay, I thought you planned on making this VARCHAR(80)?","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e55b1e8aedaf488c0ae021bb27082bec3a5a6143","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    );"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"The `nova.objects.fields.ResourceClass` is an Enum field that lists the"},{"line_number":79,"context_line":"standard known resource classes like VCPU, MEMORY_MB, DISK_GB, etc. We will"},{"line_number":80,"context_line":"need to make some modifications to this class and the object models that have a"},{"line_number":81,"context_line":"`ResourceClass` field (`Allocation` and `Inventory` object models). We will"},{"line_number":82,"context_line":"create a new `ResourceClass` **object model** that is wire-compatible with the"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9ad45d7e_ed72cfaf","line":79,"updated":"2016-08-12 14:08:50.000000000","message":"@gryf: That is exactly what I am describing below...","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"27fc08bbeac71a9b4d9e422430b5a8a59f114618","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        UNIQUE INDEX (name)"},{"line_number":76,"context_line":"    );"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"The `nova.objects.fields.ResourceClass` is an Enum field that lists the"},{"line_number":79,"context_line":"standard known resource classes like VCPU, MEMORY_MB, DISK_GB, etc. We will"},{"line_number":80,"context_line":"need to make some modifications to this class and the object models that have a"},{"line_number":81,"context_line":"`ResourceClass` field (`Allocation` and `Inventory` object models). We will"},{"line_number":82,"context_line":"create a new `ResourceClass` **object model** that is wire-compatible with the"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_e740cea7","line":79,"range":{"start_line":78,"start_character":0,"end_line":79,"end_character":62},"updated":"2016-07-29 12:18:19.000000000","message":"Does it sounds reasonable, to transform this Enum field to ResourceClass object model with pre-filled values for VCPU, MEMORY_MB and so on? Although I understand, that reaching DB is costly, while we can have enum already in memory…","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e55b1e8aedaf488c0ae021bb27082bec3a5a6143","unresolved":false,"context_lines":[{"line_number":80,"context_line":"need to make some modifications to this class and the object models that have a"},{"line_number":81,"context_line":"`ResourceClass` field (`Allocation` and `Inventory` object models). We will"},{"line_number":82,"context_line":"create a new `ResourceClass` **object model** that is wire-compatible with the"},{"line_number":83,"context_line":"`ResourceClass` Enum field."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"This new `ResourceClass` object model would look up its integer index values in"},{"line_number":86,"context_line":"a new API database `resource_classes` table instead of the currently hard-coded"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9ad45d7e_cd770b9e","line":83,"updated":"2016-08-12 14:08:50.000000000","message":"@bauzas: In order to be fully backwards-compatible (do we care though since nothing is passing this over the wire now that the create_inventory() thing has been removed from the schedulerclient update_resources() call...) we would probably add a new resource_class_obj field to the Inventory and Allocation objects.","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c0a02ae48875a08243d42e0f225fdbb675600852","unresolved":false,"context_lines":[{"line_number":78,"context_line":"The `nova.objects.fields.ResourceClass` is an Enum field that lists the"},{"line_number":79,"context_line":"standard known resource classes like VCPU, MEMORY_MB, DISK_GB, etc. We will"},{"line_number":80,"context_line":"need to make some modifications to this class and the object models that have a"},{"line_number":81,"context_line":"`ResourceClass` field (`Allocation` and `Inventory` object models). We will"},{"line_number":82,"context_line":"create a new `ResourceClass` **object model** that is wire-compatible with the"},{"line_number":83,"context_line":"`ResourceClass` Enum field."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"This new `ResourceClass` object model would look up its integer index values in"},{"line_number":86,"context_line":"a new API database `resource_classes` table instead of the currently hard-coded"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_07c6f766","line":83,"range":{"start_line":81,"start_character":67,"end_line":83,"end_character":27},"updated":"2016-07-28 14:00:02.000000000","message":"I would love some other comments about whether we could be just updating the field type, or needing to add another field for the Allocation object and deprecate the existing Allocation.resource_class (and bump a version)","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c0a02ae48875a08243d42e0f225fdbb675600852","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            return cls._from_db("},{"line_number":144,"context_line":"                model_query(api_models.ResourceClass).filter(id\u003dindex)"},{"line_number":145,"context_line":"            )"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"REST API impact"},{"line_number":149,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_27c5fb3b","line":146,"updated":"2016-07-28 14:00:02.000000000","message":"Oh that\u0027s what I tried to propose above.... I thought you were saying to persist in DB also the static resource classes, didn\u0027t you ? \"(static and dynamic)\"","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e55b1e8aedaf488c0ae021bb27082bec3a5a6143","unresolved":false,"context_lines":[{"line_number":154,"context_line":"  well as dynamic)"},{"line_number":155,"context_line":"* `POST /resource_classes`: Creates a new dynamic resource class"},{"line_number":156,"context_line":"* `PUT /resource_classes/{id}`: Change the string name of an existing dynamic"},{"line_number":157,"context_line":"  resource class"},{"line_number":158,"context_line":"* `DELETE /resource_classes/{id}`: Removes a dynamic resource class"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"`GET /resource_classes`"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9ad45d7e_2d6d07cd","line":157,"updated":"2016-08-12 14:08:50.000000000","message":"@cdent: Yeah, I\u0027m going to redo this to have {name} as the identifier in the URI, not {id} and have the integer IDs be private to the placement API I think. After all, in the placement REST API we pass string constants like DISK_GB, not the integer equivalents.","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"e1d39461afd71dbb47374748cdbaee985d13a6e2","unresolved":false,"context_lines":[{"line_number":154,"context_line":"  well as dynamic)"},{"line_number":155,"context_line":"* `POST /resource_classes`: Creates a new dynamic resource class"},{"line_number":156,"context_line":"* `PUT /resource_classes/{id}`: Change the string name of an existing dynamic"},{"line_number":157,"context_line":"  resource class"},{"line_number":158,"context_line":"* `DELETE /resource_classes/{id}`: Removes a dynamic resource class"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"`GET /resource_classes`"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_73d33939","line":157,"updated":"2016-07-28 12:54:19.000000000","message":"I get that the use of {id} allows us to rename a resource class without breaking the references to existing inventories and allocations for this class.\n\nBeyond correcting an error in the creation of a resource class name are their other use cases where someone would want to rename a class?\n\nWhatever use cases it might be useful to be able to GET /resource_classes/{name} or GET /resource_classes?name\u003d{name} so as to retrieve an id without having to sift through all the resource classes.\n\nThe former would not be ideal as it mixes two conceptually different URIs on the same path and the latter is weird because it\u0027s getting a collection to retrieve one thing.\n\nI\u0027m not sure what the best solution is here.","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"e2c5dfe87fb23989b56f256e5f3e66757dbd3299","unresolved":false,"context_lines":[{"line_number":154,"context_line":"  well as dynamic)"},{"line_number":155,"context_line":"* `POST /resource_classes`: Creates a new dynamic resource class"},{"line_number":156,"context_line":"* `PUT /resource_classes/{id}`: Change the string name of an existing dynamic"},{"line_number":157,"context_line":"  resource class"},{"line_number":158,"context_line":"* `DELETE /resource_classes/{id}`: Removes a dynamic resource class"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"`GET /resource_classes`"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9ad45d7e_d712e857","line":157,"in_reply_to":"bacf61ea_73d33939","updated":"2016-08-12 18:12:55.000000000","message":"@cdent: Imagine that a provider follows Jay\u0027s naming for their baremetal offerings, and names something \"BAREMETAL_GOLD\". After a while, though, new hardware will exhaust the names of more precious metals, so they might want to rename it to \"BAREMETAL_GOLD_2016\" when the new 2017 hardware comes out.","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"27fc08bbeac71a9b4d9e422430b5a8a59f114618","unresolved":false,"context_lines":[{"line_number":154,"context_line":"  well as dynamic)"},{"line_number":155,"context_line":"* `POST /resource_classes`: Creates a new dynamic resource class"},{"line_number":156,"context_line":"* `PUT /resource_classes/{id}`: Change the string name of an existing dynamic"},{"line_number":157,"context_line":"  resource class"},{"line_number":158,"context_line":"* `DELETE /resource_classes/{id}`: Removes a dynamic resource class"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"`GET /resource_classes`"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_d20d863f","line":157,"in_reply_to":"bacf61ea_73d33939","updated":"2016-07-29 12:18:19.000000000","message":"Can we distinguish id from name using GET for /resource_classes/{name} ?\n\nAlso, unless we have uniq constraint on name field, we should return list for such call.","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"eea1f08aa590920333a535f75abd5abcf041620b","unresolved":false,"context_lines":[{"line_number":279,"context_line":"A `400 Bad Request` response code will be returned if id is for a standard"},{"line_number":280,"context_line":"resource class -- i.e. that id is less than"},{"line_number":281,"context_line":"`MIN_CUSTOM_RESOURCE_CLASS_INDEX` from `nova/objects/resource_class.py`."},{"line_number":282,"context_line":"A `409 Conflict` response code will be returned if there are existing"},{"line_number":283,"context_line":"inventories or allocations for the resource class."},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"`DELETE /resource_classes/{id}`"}],"source_content_type":"text/x-rst","patch_set":5,"id":"dada55a8_256009cf","line":282,"range":{"start_line":282,"start_character":3,"end_line":282,"end_character":15},"updated":"2016-07-26 07:34:17.000000000","message":"If another resource class exists with the new name, it will also raise 409.","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c0a02ae48875a08243d42e0f225fdbb675600852","unresolved":false,"context_lines":[{"line_number":300,"context_line":"resource class -- i.e. that id is less than"},{"line_number":301,"context_line":"`MIN_CUSTOM_RESOURCE_CLASS_INDEX` from `nova/objects/resource_class.py`."},{"line_number":302,"context_line":"A `409 Conflict` response code will be returned if there are existing"},{"line_number":303,"context_line":"inventories or allocations for the resource class."},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"Security impact"},{"line_number":306,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_a70c4b95","line":303,"updated":"2016-07-28 14:00:02.000000000","message":"Thanks for clarifying cdent\u0027s point above","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c0a02ae48875a08243d42e0f225fdbb675600852","unresolved":false,"context_lines":[{"line_number":339,"context_line":"-----------"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"Primary assignee:"},{"line_number":342,"context_line":"  jaypipes"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"Other contributors:"},{"line_number":345,"context_line":"  cdent"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_071ef7b9","line":342,"updated":"2016-07-28 14:00:02.000000000","message":"Count me in.","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"eea1f08aa590920333a535f75abd5abcf041620b","unresolved":false,"context_lines":[{"line_number":355,"context_line":"Dependencies"},{"line_number":356,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"* `generic-resource-pools` blueprint implemented"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"Testing"},{"line_number":361,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":5,"id":"dada55a8_0e1ec7ba","line":358,"range":{"start_line":358,"start_character":3,"end_line":358,"end_character":25},"updated":"2016-07-26 07:34:17.000000000","message":"Would be better if we had a href for it at the end of this spec.","commit_id":"2f24579c110196a4ba9af793924d296c6b35025a"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"e3cb87eceac67e64e26c4bb7fab548351f0cfe4f","unresolved":false,"context_lines":[{"line_number":8,"context_line":"Resource Providers - Custom Resource Classes"},{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://blueprints.launchpad.net/nova/+spec/custom-resource-classes"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"We propose to provide the ability for an administrator to create a set of"},{"line_number":14,"context_line":"special resource classes that indicate deployer-specific resources that can be"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9ad45d7e_cca25f9a","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":67},"updated":"2016-08-12 18:14:21.000000000","message":"This BP doesn\u0027t exist. You need to use the old name, or make a new BP.","commit_id":"48f19bfba30da9b0894f05a350f94e39edee9886"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"783e5c49f175faf2b48367ad6d785d3959c8e6ee","unresolved":false,"context_lines":[{"line_number":8,"context_line":"Resource Providers - Custom Resource Classes"},{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://blueprints.launchpad.net/nova/+spec/custom-resource-classes"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"We propose to provide the ability for an administrator to create a set of"},{"line_number":14,"context_line":"special resource classes that indicate deployer-specific resources that can be"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3ac371cc_8eb063df","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":67},"in_reply_to":"9ad45d7e_cca25f9a","updated":"2016-08-15 13:00:00.000000000","message":"Blueprint name was changed...","commit_id":"48f19bfba30da9b0894f05a350f94e39edee9886"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"e3cb87eceac67e64e26c4bb7fab548351f0cfe4f","unresolved":false,"context_lines":[{"line_number":331,"context_line":"  jaypipes"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"Other contributors:"},{"line_number":334,"context_line":"  cdent"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"Work Items"},{"line_number":337,"context_line":"----------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9ad45d7e_1762c0d8","line":334,"updated":"2016-08-12 18:14:21.000000000","message":"Add me in, too.","commit_id":"48f19bfba30da9b0894f05a350f94e39edee9886"}],"specs/ocata/approved/custom-resource-classes.rst":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"065f53fd1589178e1f0634f8a1390f0e2742b353","unresolved":false,"context_lines":[{"line_number":41,"context_line":"containing an algorithm or entire software program that is accelerated. Each of"},{"line_number":42,"context_line":"these algorithms has one or more contexts that can be consumed by a guest"},{"line_number":43,"context_line":"virtual machine. I wish to allow my users to specify to launch an instance and"},{"line_number":44,"context_line":"have the instance consume one or more the contexts for a particular algorithm"},{"line_number":45,"context_line":"that I have loaded onto the FPGAs on a compute node."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a77a97e_70d077f8","line":44,"range":{"start_line":44,"start_character":38,"end_line":44,"end_character":41},"updated":"2016-11-21 18:17:48.000000000","message":"of the","commit_id":"4f315c8a810837a6a6304e99995fb44762171b23"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"255066a5c77b0620725395ca9b28c0559321f3bc","unresolved":false,"context_lines":[{"line_number":41,"context_line":"containing an algorithm or entire software program that is accelerated. Each of"},{"line_number":42,"context_line":"these algorithms has one or more contexts that can be consumed by a guest"},{"line_number":43,"context_line":"virtual machine. I wish to allow my users to specify to launch an instance and"},{"line_number":44,"context_line":"have the instance consume one or more the contexts for a particular algorithm"},{"line_number":45,"context_line":"that I have loaded onto the FPGAs on a compute node."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a77a97e_5a03990d","line":44,"range":{"start_line":44,"start_character":38,"end_line":44,"end_character":41},"in_reply_to":"7a77a97e_70d077f8","updated":"2016-11-21 18:26:37.000000000","message":"Done","commit_id":"4f315c8a810837a6a6304e99995fb44762171b23"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"065f53fd1589178e1f0634f8a1390f0e2742b353","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"* Changes and additions to `nova.objects` objects to handle custom resource"},{"line_number":53,"context_line":"  classes. All custom resource classes will be prefixed with the string"},{"line_number":54,"context_line":"  \"CUSTOM\\_\"."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"* New `resource_classes` database table storing the string -\u003e integer mapping"},{"line_number":57,"context_line":"  for all resource classes (standard and dynamic)"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a77a97e_50029b70","line":54,"range":{"start_line":54,"start_character":9,"end_line":54,"end_character":10},"updated":"2016-11-21 18:17:48.000000000","message":"nit: You probably don\u0027t really need this in here as it\u0027s not json or regex.","commit_id":"4f315c8a810837a6a6304e99995fb44762171b23"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"255066a5c77b0620725395ca9b28c0559321f3bc","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"* Changes and additions to `nova.objects` objects to handle custom resource"},{"line_number":53,"context_line":"  classes. All custom resource classes will be prefixed with the string"},{"line_number":54,"context_line":"  \"CUSTOM\\_\"."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"* New `resource_classes` database table storing the string -\u003e integer mapping"},{"line_number":57,"context_line":"  for all resource classes (standard and dynamic)"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a77a97e_da36c9e6","line":54,"range":{"start_line":54,"start_character":9,"end_line":54,"end_character":10},"in_reply_to":"7a77a97e_50029b70","updated":"2016-11-21 18:26:37.000000000","message":"restructured text views _ as an indicator of a link.\n\nhttp://docutils.sourceforge.net/docs/user/rst/quickref.html#hyperlink-targets","commit_id":"4f315c8a810837a6a6304e99995fb44762171b23"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"065f53fd1589178e1f0634f8a1390f0e2742b353","unresolved":false,"context_lines":[{"line_number":54,"context_line":"  \"CUSTOM\\_\"."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"* New `resource_classes` database table storing the string -\u003e integer mapping"},{"line_number":57,"context_line":"  for all resource classes (standard and dynamic)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"* An additional placement REST API call for creating, modifying, deleting and"},{"line_number":60,"context_line":"  querying custom resource classes"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a77a97e_30343f49","line":57,"range":{"start_line":57,"start_character":28,"end_line":57,"end_character":36},"updated":"2016-11-21 18:17:48.000000000","message":"We don\u0027t store standard resource classes in the database, they are in the fields.ResourceClass field type.","commit_id":"4f315c8a810837a6a6304e99995fb44762171b23"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"255066a5c77b0620725395ca9b28c0559321f3bc","unresolved":false,"context_lines":[{"line_number":54,"context_line":"  \"CUSTOM\\_\"."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"* New `resource_classes` database table storing the string -\u003e integer mapping"},{"line_number":57,"context_line":"  for all resource classes (standard and dynamic)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"* An additional placement REST API call for creating, modifying, deleting and"},{"line_number":60,"context_line":"  querying custom resource classes"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a77a97e_1a3121ed","line":57,"range":{"start_line":57,"start_character":28,"end_line":57,"end_character":36},"in_reply_to":"7a77a97e_30343f49","updated":"2016-11-21 18:26:37.000000000","message":"Done","commit_id":"4f315c8a810837a6a6304e99995fb44762171b23"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"065f53fd1589178e1f0634f8a1390f0e2742b353","unresolved":false,"context_lines":[{"line_number":84,"context_line":"StringField field type that could allow us not touching the object version"},{"line_number":85,"context_line":"anytime a new class is added."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"This new `ResourceClass` object model would look up its integer index values in"},{"line_number":88,"context_line":"a new API database `resource_classes` table instead of the currently hard-coded"},{"line_number":89,"context_line":"Enum index values. We would want to create some constants on this"},{"line_number":90,"context_line":"`ResourceClass` object model for the existing integer and string constants from"},{"line_number":91,"context_line":"the Enum `ResourceClass` for the \"standardized\" resource classes so that when"},{"line_number":92,"context_line":"clouds refer to one of those resource classes, they always refer to the same"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a77a97e_706cf736","line":89,"range":{"start_line":87,"start_character":0,"end_line":89,"end_character":18},"updated":"2016-11-21 18:17:48.000000000","message":"Not really what we\u0027re doing here, we\u0027re using the cache which uses the field enums for standard RCs and the API DB for custom RCs.","commit_id":"4f315c8a810837a6a6304e99995fb44762171b23"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"255066a5c77b0620725395ca9b28c0559321f3bc","unresolved":false,"context_lines":[{"line_number":84,"context_line":"StringField field type that could allow us not touching the object version"},{"line_number":85,"context_line":"anytime a new class is added."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"This new `ResourceClass` object model would look up its integer index values in"},{"line_number":88,"context_line":"a new API database `resource_classes` table instead of the currently hard-coded"},{"line_number":89,"context_line":"Enum index values. We would want to create some constants on this"},{"line_number":90,"context_line":"`ResourceClass` object model for the existing integer and string constants from"},{"line_number":91,"context_line":"the Enum `ResourceClass` for the \"standardized\" resource classes so that when"},{"line_number":92,"context_line":"clouds refer to one of those resource classes, they always refer to the same"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a77a97e_1a5f610f","line":89,"range":{"start_line":87,"start_character":0,"end_line":89,"end_character":18},"in_reply_to":"7a77a97e_706cf736","updated":"2016-11-21 18:26:37.000000000","message":"Done","commit_id":"4f315c8a810837a6a6304e99995fb44762171b23"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"065f53fd1589178e1f0634f8a1390f0e2742b353","unresolved":false,"context_lines":[{"line_number":99,"context_line":"new microversion:"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"* `GET /resource_classes`: Returns list of all resource classes (standard as"},{"line_number":102,"context_line":"  well as dynamic)"},{"line_number":103,"context_line":"* `POST /resource_classes`: Creates a new custom resource class"},{"line_number":104,"context_line":"* `PUT /resource_classes/{name}`: Change the string name of an existing dynamic"},{"line_number":105,"context_line":"  resource class"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a77a97e_30599f8f","line":102,"range":{"start_line":102,"start_character":10,"end_line":102,"end_character":17},"updated":"2016-11-21 18:17:48.000000000","message":"custom? Use consistent language.","commit_id":"4f315c8a810837a6a6304e99995fb44762171b23"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"255066a5c77b0620725395ca9b28c0559321f3bc","unresolved":false,"context_lines":[{"line_number":99,"context_line":"new microversion:"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"* `GET /resource_classes`: Returns list of all resource classes (standard as"},{"line_number":102,"context_line":"  well as dynamic)"},{"line_number":103,"context_line":"* `POST /resource_classes`: Creates a new custom resource class"},{"line_number":104,"context_line":"* `PUT /resource_classes/{name}`: Change the string name of an existing dynamic"},{"line_number":105,"context_line":"  resource class"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a77a97e_3ae89d16","line":102,"range":{"start_line":102,"start_character":10,"end_line":102,"end_character":17},"in_reply_to":"7a77a97e_30599f8f","updated":"2016-11-21 18:26:37.000000000","message":"Done","commit_id":"4f315c8a810837a6a6304e99995fb44762171b23"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"39b9de85473f36c4a627fbed42e60af1c67b738e","unresolved":false,"context_lines":[{"line_number":101,"context_line":"* `GET /resource_classes`: Returns list of all resource classes (standard as"},{"line_number":102,"context_line":"  well as dynamic)"},{"line_number":103,"context_line":"* `POST /resource_classes`: Creates a new custom resource class"},{"line_number":104,"context_line":"* `PUT /resource_classes/{name}`: Change the string name of an existing dynamic"},{"line_number":105,"context_line":"  resource class"},{"line_number":106,"context_line":"* `DELETE /resource_classes/{name}`: Removes a custom resource class"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a77a97e_bf43106b","line":104,"range":{"start_line":104,"start_character":26,"end_line":104,"end_character":30},"updated":"2016-11-18 12:15:39.000000000","message":"Nit: I guess I was expect id here, but name is probably better.","commit_id":"4f315c8a810837a6a6304e99995fb44762171b23"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"39b9de85473f36c4a627fbed42e60af1c67b738e","unresolved":false,"context_lines":[{"line_number":102,"context_line":"  well as dynamic)"},{"line_number":103,"context_line":"* `POST /resource_classes`: Creates a new custom resource class"},{"line_number":104,"context_line":"* `PUT /resource_classes/{name}`: Change the string name of an existing dynamic"},{"line_number":105,"context_line":"  resource class"},{"line_number":106,"context_line":"* `DELETE /resource_classes/{name}`: Removes a custom resource class"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"`GET /resource_classes`"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a77a97e_1fafa42a","line":105,"updated":"2016-11-18 12:15:39.000000000","message":"Nit: its tempting to force people to delete these and create a new one. But I am not against the put.","commit_id":"4f315c8a810837a6a6304e99995fb44762171b23"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"89ec9f605df0d4526a2e262009d9a4427827a9a6","unresolved":false,"context_lines":[{"line_number":102,"context_line":"  well as dynamic)"},{"line_number":103,"context_line":"* `POST /resource_classes`: Creates a new custom resource class"},{"line_number":104,"context_line":"* `PUT /resource_classes/{name}`: Change the string name of an existing dynamic"},{"line_number":105,"context_line":"  resource class"},{"line_number":106,"context_line":"* `DELETE /resource_classes/{name}`: Removes a custom resource class"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"`GET /resource_classes`"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a77a97e_3040bf07","line":105,"in_reply_to":"7a77a97e_1fafa42a","updated":"2016-11-21 18:05:54.000000000","message":"You couldn\u0027t do that unless nothing was using the class. Changing the name of a custom RC that is being used is allowed.","commit_id":"4f315c8a810837a6a6304e99995fb44762171b23"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"89ec9f605df0d4526a2e262009d9a4427827a9a6","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    POST /resource_classes"},{"line_number":161,"context_line":"    {"},{"line_number":162,"context_line":"      \"name\": \"CUSTOM_CUSTOM_BAREMETAL_GOLD\""},{"line_number":163,"context_line":"    }"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"The body of the request must match the following JSONSchema document::"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a77a97e_906ef394","line":162,"range":{"start_line":162,"start_character":15,"end_line":162,"end_character":29},"updated":"2016-11-21 18:05:54.000000000","message":"That\u0027s a little *too* custom for my tastes.","commit_id":"4f315c8a810837a6a6304e99995fb44762171b23"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"255066a5c77b0620725395ca9b28c0559321f3bc","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    POST /resource_classes"},{"line_number":161,"context_line":"    {"},{"line_number":162,"context_line":"      \"name\": \"CUSTOM_CUSTOM_BAREMETAL_GOLD\""},{"line_number":163,"context_line":"    }"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"The body of the request must match the following JSONSchema document::"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a77a97e_badcad75","line":162,"range":{"start_line":162,"start_character":15,"end_line":162,"end_character":29},"in_reply_to":"7a77a97e_906ef394","updated":"2016-11-21 18:26:37.000000000","message":"Done","commit_id":"4f315c8a810837a6a6304e99995fb44762171b23"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"39b9de85473f36c4a627fbed42e60af1c67b738e","unresolved":false,"context_lines":[{"line_number":169,"context_line":"      \"properties\": {"},{"line_number":170,"context_line":"        \"name\": {"},{"line_number":171,"context_line":"          \"type\": \"string\","},{"line_number":172,"context_line":"          \"pattern\": \"^CUSTOM\\_[A-Z0-9_]*\""},{"line_number":173,"context_line":"        },"},{"line_number":174,"context_line":"    },"},{"line_number":175,"context_line":"      \"required\": ["}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a77a97e_ff0f4834","line":172,"updated":"2016-11-18 12:15:39.000000000","message":"Ah, cool.","commit_id":"4f315c8a810837a6a6304e99995fb44762171b23"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"065f53fd1589178e1f0634f8a1390f0e2742b353","unresolved":false,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"* A `404 Not Found` response code will be returned if no such resource class"},{"line_number":239,"context_line":"matching the name is found."},{"line_number":240,"context_line":"* A `400 Bad Request` response code will be returned if name is for a standard"},{"line_number":241,"context_line":"resource class -- i.e. VCPU or MEMORY_MB."},{"line_number":242,"context_line":"* A `409 Conflict` response code will be returned if there are existing"},{"line_number":243,"context_line":"inventories or allocations for the resource class."},{"line_number":244,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a77a97e_5071bbdf","line":241,"range":{"start_line":240,"start_character":0,"end_line":241,"end_character":41},"updated":"2016-11-21 18:17:48.000000000","message":"You could have this on the POST and PUT too.","commit_id":"4f315c8a810837a6a6304e99995fb44762171b23"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"255066a5c77b0620725395ca9b28c0559321f3bc","unresolved":false,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"* A `404 Not Found` response code will be returned if no such resource class"},{"line_number":239,"context_line":"matching the name is found."},{"line_number":240,"context_line":"* A `400 Bad Request` response code will be returned if name is for a standard"},{"line_number":241,"context_line":"resource class -- i.e. VCPU or MEMORY_MB."},{"line_number":242,"context_line":"* A `409 Conflict` response code will be returned if there are existing"},{"line_number":243,"context_line":"inventories or allocations for the resource class."},{"line_number":244,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a77a97e_3a36ddb4","line":241,"range":{"start_line":240,"start_character":0,"end_line":241,"end_character":41},"in_reply_to":"7a77a97e_5071bbdf","updated":"2016-11-21 18:26:37.000000000","message":"Done","commit_id":"4f315c8a810837a6a6304e99995fb44762171b23"}]}
