[openstack-dev] [Openstack-operators] [ironic] [nova] [tripleo] Deprecation of Nova's integration with Ironic Capabilities and ComputeCapabilitiesFilter

Dmitry Tantsur dtantsur at redhat.com
Tue Oct 2 08:18:42 UTC 2018

On 10/2/18 12:36 AM, Jay Pipes wrote:
> On 10/01/2018 06:04 PM, Julia Kreger wrote:
>> On Mon, Oct 1, 2018 at 2:41 PM Eric Fried <openstack at fried.cc> wrote:
>>      > So say the user requests a node that supports UEFI because their
>>     image
>>      > needs UEFI. Which workflow would you want here?
>>      >
>>      > 1) The operator (or ironic?) has already configured the node to
>>     boot in
>>      > UEFI mode. Only pre-configured nodes advertise the "supports
>>     UEFI" trait.
>>      >
>>      > 2) Any node that supports UEFI mode advertises the trait. Ironic
>>     ensures
>>      > that UEFI mode is enabled before provisioning the machine.
>>      >
>>      > I imagine doing #2 by passing the traits which were specifically
>>      > requested by the user, from Nova to Ironic, so that Ironic can do the
>>      > right thing for the user.
>>      >
>>      > Your proposal suggests that the user request the "supports UEFI"
>>     trait,
>>      > and *also* pass some glance UUID which the user understands will make
>>      > sure the node actually boots in UEFI mode. Something like:
>>      >
>>      > openstack server create --flavor METAL_12CPU_128G --trait
>>      > --config-data $TURN_ON_UEFI_UUID
>>      >
>>      > Note that I pass --trait because I hope that will one day be
>>     supported
>>      > and we can slow down the flavor explosion.
>>     IMO --trait would be making things worse (but see below). I think UEFI
>>     with Jay's model would be more like:
>>        openstack server create --flavor METAL_12CPU_128G --config-data $UEFI
>>     where the UEFI profile would be pretty trivial, consisting of
>>     placement.traits.required = ["BOOT_MODE_UEFI"] and object.boot_mode =
>>     "uefi".
>>     I agree that this seems kind of heavy, and that it would be nice to be
>>     able to say "boot mode is UEFI" just once. OTOH I get Jay's point that
>>     we need to separate the placement decision from the instance
>>     configuration.
>>     That said, what if it was:
>>       openstack config-profile create --name BOOT_MODE_UEFI --json -
>>       {
>>        "type": "boot_mode_scheme",
>>        "version": 123,
>>        "object": {
>>            "boot_mode": "uefi"
>>        },
>>        "placement": {
>>         "traits": {
>>          "required": [
>>           "BOOT_MODE_UEFI"
>>          ]
>>         }
>>        }
>>       }
>>       ^D
>>     And now you could in fact say
>>       openstack server create --flavor foo --config-profile BOOT_MODE_UEFI
>>     using the profile name, which happens to be the same as the trait name
>>     because you made it so. Does that satisfy the yen for saying it once? (I
>>     mean, despite the fact that you first had to say it three times to get
>>     it set up.)
>>     ========
>>     I do want to zoom out a bit and point out that we're talking about
>>     implementing a new framework of substantial size and impact when the
>>     original proposal - using the trait for both - would just work out of
>>     the box today with no changes in either API. Is it really worth it?
>> +1000. Reading both of these threads, it feels like we're basically trying to 
>> make something perfect. I think that is a fine goal, except it is unrealistic 
>> because the enemy of good is perfection.
>>     ========
>>     By the way, with Jim's --trait suggestion, this:
>>      > ...dozens of flavors that look like this:
>>      > - 12CPU_128G_RAID10_DRIVE_LAYOUT_X
>>      > - 12CPU_128G_RAID5_DRIVE_LAYOUT_X
>>      > - 12CPU_128G_RAID01_DRIVE_LAYOUT_X
>>      > - 12CPU_128G_RAID10_DRIVE_LAYOUT_Y
>>      > - 12CPU_128G_RAID5_DRIVE_LAYOUT_Y
>>      > - 12CPU_128G_RAID01_DRIVE_LAYOUT_Y
>>     ...could actually become:
>>       openstack server create --flavor 12CPU_128G --trait $WHICH_RAID
>>     --trait
>>     No flavor explosion.
>> ++ I believe this was where this discussion kind of ended up in.. ?Dublin?
>> The desire and discussion that led us into complex configuration templates and 
>> profiles being submitted were for highly complex scenarios where users wanted 
>> to assert detailed raid configurations to disk. Naturally, there are many 
>> issues there. The ability to provide such detail would be awesome for those 
>> 10% of operators that need such functionality. Of course, if that is the only 
>> path forward, then we delay the 90% from getting the minimum viable feature 
>> they need.
>>     (Maybe if we called it something other than --trait, like maybe
>>     --config-option, it would let us pretend we're not really overloading a
>>     trait to do config - it's just a coincidence that the config option has
>>     the same name as the trait it causes to be required.)
>> I feel like it might be confusing, but totally +1 to matching required trait 
>> name being a thing. That way scheduling is completely decoupled and if 
>> everything was correct then the request should already be scheduled properly.
> I guess I'll just drop the idea of doing this properly then. It's true that the 
> placement traits concept can be hacked up and the virt driver can just pass a 
> list of trait strings to the Ironic API and that's the most expedient way to get 
> what the 90% of people apparently want. It's also true that it will add a bunch 
> of unmaintainable tribal knowledge into the interface between Nova and Ironic, 
> but that has been the case for multiple years.

Mostly a side note: this has been always the case and probably will be :( For 
example, this is just some black magic for everyone outside of our teams I've 
ever talked to:

$ openstack flavor set --property resources:VCPU=0 my-baremetal-flavor
$ openstack flavor set --property resources:MEMORY_MB=0 my-baremetal-flavor
$ openstack flavor set --property resources:DISK_GB=0 my-baremetal-flavor

People got used to doing it, but for them it's just "magical commands to make 
Ironic work starting with Rocky".

> The flavor explosion problem will continue to get worse for those of us who deal 
> with its pain (Oath in particular feels this) because the interface between nova 
> flavors and Ironic instance capabilities will continue to be super-tightly-coupled.
> For the record, I would have been happier if someone had proposed separating the 
> instance configuration data in the flavor extra-specs from the notion of 
> required placement constraints (i.e. traits). You could call the extra_spec 
> "deploy_template_id" if you wanted and that extra spec value could have been 
> passed to Ironic during node provisioning instead of the list of placement 
> constraints (traits).

I like it, but I guess it has two downsides:
1. Adding something to Nova API just for Ironic.
2. Ability for operators to shoot their legs by requesting some RAID 
configuration via deploy_template_id but not requesting the ability to use RAID 
in traits.

Also will it really help with flavor explosion, unless we allow to pass this 
deploy_template_id via user-facing API?


> So, you'd have a list of actual placement traits for an instance that looked 
> like this:
> and you'd have a flavor extra spec called "deploy_template_id" with a value of 
> the deploy template configuration data you wanted to communicate to Ironic. The 
> Ironic virt driver could then just look for the "deploy_template_id" extra spec 
> and pass the value of that to the Ironic API instead of passing a list of traits.
> That would have at least satisfied my desire to separate configuration data from 
> placement constraints.
> Anyway, I'm done trying to please my own desires for a clean solution to this.
> Best,
> -jay
> __________________________________________________________________________
> OpenStack Development Mailing List (not for usage questions)
> Unsubscribe: OpenStack-dev-request at lists.openstack.org?subject:unsubscribe
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev

More information about the OpenStack-dev mailing list