[openstack-dev] RFC: Classnames in config parameters harmful to users / upgrades

andi abes andi.abes at gmail.com
Wed Feb 6 19:31:46 UTC 2013


Just to throw a deployment perspective into the hat...
One of the things we're working on is starting to validate deployment
recipes early in the OS development process, by using direct pull of
openstack source from github (rather than wait for packages to be fully
backed).

The idea is that we'd seed the deployment of release N+1 with the know to
be working deployment of release N. Once deployed, run tempest tests, and
see what breaks. This is not meant to replace reviewer's insisting on
backcomapt configs, just to catch the cases reviews missed a breaking
change, or one was intentionally admitted (see below).

Right now we're going through this exercise against grizzly, based on
folsom recipes. One early find is the keystone PKI/UUID default change,
which required some handling.
Right now this capability (which we call pull-from-source) is not quite
fully stable, but we hope that for Havana we can consider including this as
a non-voting gate comment into gerrit.


On Wed, Feb 6, 2013 at 1:26 PM, Anne Gentle <anne at openstack.org> wrote:

>
>
>
> On Wed, Feb 6, 2013 at 9:22 AM, Daniel P. Berrange <berrange at redhat.com>wrote:
>
>> Nova (and most other OpenStack components) have an ever increasing
>> number of configuration parameters which accept classnames.
>> Obviously, we're doing this to make it possible to plug in custom
>> implementations of various interfaces, which is great.
>>
>> There are two downsides to this
>>
>>  - The user has to know about obscure, often undocumented, python
>>    module names.
>>
>>
> Thanks for shining a light on this particular difficulty. While we now
> have a sample nova.conf with descriptions, any use of and changes to class
> names in both nova and quantum have caused headaches for users. And doc
> bugs too.
>
>
>>  - Any time we rename a class, or refactor code possibly deleting
>>    or merging classes, we break the end config file upon upgrade.
>>
>> The first point is a mere usability matter, but the second point
>> is a serious deployment issue IMHO, which can only get worse as
>> usage of OpenStack increases & people expect more stability and
>> consistency across upgrades.
>>
>> Historically code changes have been pretty fast & loose config
>> parameters, arbitrarily changing them at any time for any reason.
>> AFAIK there are no formal rules defined about changing config
>> paramaters, but in some of the recent changes I've submitted
>> which involved config changes, reviewers wanted backwards compat
>> to be maintained. The result that when renaming, or obsoleting
>> existing classses we're having to keep around stubs for the old
>> classes to avoid breaking user config files. This is not a good
>> approach for long term maintainability of the codebase.
>>
>> IMHO the core issue here is that by using classnames in config
>> parameters we are exposing what we (developers) generally consider
>> to be internal/private implementation details to the end user. End
>> user expectations wrt upgrades are thus restricting what we can do
>> with our internal implementations.
>>
>> I don't think it is acceptable to have a situation where configuration
>> file parameters restrict what we can do in terms of re-arranging /
>> refactoring our codebase. Provided we maintain the same featureset
>> compatibility, we should be free todo any code refactoring we desire.
>>
>> The only way we can do this is if we do *NOT* require the use of
>> classnames in config parameters. Instead we should treat all these
>> config parameters as being more like enumerations, and map those to
>> classnames internally
>>
>
> I would completely support this and wish I had dev resources to put behind
> the effort. Is there a group who wants to work on this?
>
> 44 isn't bad out of over 600 I might add.
>
> Let me help any way I can.
>
> Anne
>
>
>>
>> eg for the compute_driver instead of having the user set
>>
>>   compute_driver=nova.virt.libvirt.LibvirtDriver
>>
>> they would do
>>
>>   compute_driver=libvirt
>>
>> and internally nova would resolve this to the classname. Obviously the
>> key issue is how we deal with the mapping of enum values to classnames.
>> If we just had a table of mappings in the codebase, then it ceases to
>> be possible for people to drop in custom out-of-tree implementations
>> from 3rd parties.
>>
>> One option to this would be to allow the config parameters to take a
>> enum value, or a classname. We would declare the enum values as
>> "stable, guaranteed upgrade compatibility", and the use of classnames
>> as "liable to break on upgrade". The intent would be that all our
>> documentation / tools like devstack, etc would use the short enum
>> names by default. The only people who would ever use classnames for the
>> config parameters, would be those who need to plug in a 3rd party impl
>> that is not part of the main openstack codebase.
>>
>> A different option would be to only ever allow for enum values in the
>> config parameter, but define a way for 3rd parties to register their
>> new impls. For example, you could have them do something like
>>
>>   # cd /usr/share/openstack/nova/configmap/compute_driver
>>   # echo "nova.virt.libvirt.LibvirtDriver" > libvirt
>>
>> as a way to register that the 'compute_driver' parameter gets a new
>> valid option of 'libvirt' mapping to the classname
>> "nova.virt.libvirt.LibvirtDriver"
>>
>> Regards,
>> Daniel
>>
>> [1] In fact Nova currently has at least 44 classname based options
>>
>> $ grep 'nova\.' etc/nova/nova.conf.sample  | grep -v "# " | sort | sed -e
>> 's/#//'
>>
>> allowed_rpc_exception_modules=nova.openstack.common.exception,nova.exception,cinder.exception,exceptions
>> cert_manager=nova.cert.manager.CertManager
>> compute_api_class=nova.compute.api.API
>> compute_manager=nova.compute.manager.ComputeManager
>> compute_scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler
>> compute_stats_class=nova.compute.stats.Stats
>> consoleauth_manager=nova.consoleauth.manager.ConsoleAuthManager
>> console_driver=nova.console.xvp.XVPConsoleProxy
>> console_manager=nova.console.manager.ConsoleProxyManager
>> db_driver=nova.db
>> default_scheduler_driver=nova.scheduler.chance.ChanceScheduler
>> driver=nova.cells.rpc_driver.CellsRPCDriver
>> driver=nova.virt.baremetal.pxe.PXE
>> floating_ip_dns_manager=nova.network.noop_dns_driver.NoopDNSDriver
>> instance_dns_manager=nova.network.noop_dns_driver.NoopDNSDriver
>> l3_lib=nova.network.l3.LinuxNetL3
>> libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtBridgeDriver
>>
>> libvirt_volume_drivers=iscsi=nova.virt.libvirt.volume.LibvirtISCSIVolumeDriver,local=nova.virt.libvirt.volume.LibvirtVolumeDriver,fake=nova.virt.libvirt.volume.LibvirtFakeVolumeDriver,rbd=nova.virt.libvirt.volume.LibvirtNetVolumeDriver,sheepdog=nova.virt.libvirt.volume.LibvirtNetVolumeDriver,nfs=nova.virt.libvirt.volume_nfs.NfsVolumeDriver
>>
>> linuxnet_interface_driver=nova.network.linux_net.LinuxBridgeInterfaceDriver
>> manager=nova.cells.manager.CellsManager
>> manager=nova.conductor.manager.ConductorManager
>> metadata_manager=nova.api.manager.MetadataManager
>>
>> monkey_patch_modules=nova.api.ec2.cloud:nova.notifier.api.notify_decorator,nova.compute.api:nova.notifier.api.notify_decorator
>> network_api_class=nova.network.api.API
>> network_driver=nova.network.linux_net
>> network_manager=nova.network.manager.VlanManager
>>
>> osapi_compute_extension=nova.api.openstack.compute.contrib.standard_extensions
>> power_manager=nova.virt.baremetal.ipmi.IPMI
>> quota_driver=nova.quota.DbQuotaDriver
>> rpc_backend=nova.openstack.common.rpc.impl_kombu
>>
>> rpc_zmq_matchmaker=nova.openstack.common.rpc.matchmaker.MatchMakerLocalhost
>> scheduler_available_filters=nova.scheduler.filters.all_filters
>> scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler
>> scheduler_host_manager=nova.scheduler.host_manager.HostManager
>> scheduler_manager=nova.scheduler.manager.SchedulerManager
>> scheduler=nova.cells.scheduler.CellsScheduler
>> scheduler_weight_classes=nova.scheduler.weights.all_weighers
>> security_group_api=nova.compute.api.SecurityGroupAPI
>> security_group_handler=nova.network.sg.NullSecurityGroupHandler
>> sqlite_db=nova.sqlite
>> vif_driver=nova.virt.baremetal.vif_driver.BareMetalVIFDriver
>> volume_api_class=nova.volume.cinder.API
>> volume_driver=nova.virt.baremetal.volume_driver.LibvirtVolumeDriver
>> xenapi_vif_driver=nova.virt.xenapi.vif.XenAPIBridgeDriver
>>
>> --
>> |: http://berrange.com      -o-
>> http://www.flickr.com/photos/dberrange/ :|
>> |: http://libvirt.org              -o-
>> http://virt-manager.org :|
>> |: http://autobuild.org       -o-
>> http://search.cpan.org/~danberr/ :|
>> |: http://entangle-photo.org       -o-
>> http://live.gnome.org/gtk-vnc :|
>>
>> _______________________________________________
>> OpenStack-dev mailing list
>> OpenStack-dev at lists.openstack.org
>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>>
>
>
> _______________________________________________
> OpenStack-dev mailing list
> OpenStack-dev at lists.openstack.org
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstack.org/pipermail/openstack-dev/attachments/20130206/27581705/attachment.html>


More information about the OpenStack-dev mailing list