Le 01/08/2014 18:46, Danny Beutler a écrit :
I am in the process of implementing a custom weigher class. I have
created a weigher that prefers hosts which do not have other instances
in the same group (think GroupAntiAffinityFilter but for weight).
Here is the code for the class:
# Copyright (c) 2011 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
you may
# not use this file except in compliance with the License. You may
obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the
# License for the specific language governing permissions and
limitations
"""
AntiAffinityWeigher. Weigh hosts by whether or not they have another
host in the same group.
"""
from oslo.config import cfg
from nova import db
from nova.openstack.common.gettextutils import _
from nova.scheduler import weights
from nova.scheduler import filters
from nova.openstack.common import log as logging
LOG = logging.getLogger(__name__)
anti_affinity_weight_opts = [
cfg.FloatOpt('antiAffinityWeigher_Multiplier',
default=1000.0,
help='Multiplier used for weighing hosts. Negative '
'numbers mean to stack vs spread.'),
]
CONF = cfg.CONF
CONF.register_opts(anti_affinity_weight_opts)
class AntiAffinityWeigher(weights.BaseHostWeigher):
def _weight_multiplier(self):
"""Override the weight multiplier."""
return CONF.antiAffinityWeigher_Multiplier
def _weigh_object(self, host_state, weight_properties):
group_hosts = weight_properties.get('group_hosts') or []
LOG.debug(_("Group anti affinity Weigher: check if %(host)s not "
"in %(configured)s"), {'host': host_state.host,
'configured': group_hosts})
if group_hosts:
return group_hosts.amount() * 100000
# No groups configured
return 0
I know the python is at least close to correct because the scheduler
service wouldn't even restart until it was. After I got the bugs
worked out of the module, I added modified the /etc/nova/nova.conf
file to have the custom weigher like so:
scheduler_weight_classes=nova.scheduler.weights.all_weighers,nova.scheduler.AntiAffinityWeigher
After restarting the scheduler service I get the following error in
the nova logs:
<178>Aug 1 16:46:11 node-25 nova-nova CRITICAL: Class
AntiAffinityWeigher cannot be found (['Traceback (most recent call
last):\n', ' File
"/usr/lib/python2.6/site-packages/nova/openstack/common/importutils.py",
line 31, in import_class\n return getattr(sys.modules[mod_str],
class_str)\n', "AttributeError: 'module' object has no attribute
'AntiAffinityWeigher'\n"])
Traceback (most recent call last):
File "/usr/bin/nova-scheduler", line 10, in <module>
sys.exit(main())
File "/usr/lib/python2.6/site-packages/nova/cmd/scheduler.py", line
39, in main
topic=CONF.scheduler_topic)
File "/usr/lib/python2.6/site-packages/nova/service.py", line 257,
in create
db_allowed=db_allowed)
File "/usr/lib/python2.6/site-packages/nova/service.py", line 139,
in __init__
self.manager = manager_class(host=self.host, *args, **kwargs)
File "/usr/lib/python2.6/site-packages/nova/scheduler/manager.py",
line 65, in __init__
self.driver = importutils.import_object(scheduler_driver)
File
"/usr/lib/python2.6/site-packages/nova/openstack/common/importutils.py",
line 40, in import_object
return import_class(import_str)(*args, **kwargs)
File
"/usr/lib/python2.6/site-packages/nova/scheduler/filter_scheduler.py",
line 59, in __init__
super(FilterScheduler, self).__init__(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/nova/scheduler/driver.py",
line 103, in __init__
CONF.scheduler_host_manager)
File
"/usr/lib/python2.6/site-packages/nova/openstack/common/importutils.py",
line 40, in import_object
return import_class(import_str)(*args, **kwargs)
File
"/usr/lib/python2.6/site-packages/nova/scheduler/host_manager.py",
line 297, in __init__
CONF.scheduler_weight_classes)
File "/usr/lib/python2.6/site-packages/nova/loadables.py", line 105,
in get_matching_classes
obj = importutils.import_class(cls_name)
File
"/usr/lib/python2.6/site-packages/nova/openstack/common/importutils.py",
line 35, in import_class
traceback.format_exception(*sys.exc_info())))
ImportError: Class AntiAffinityWeigher cannot be found (['Traceback
(most recent call last):\n', ' File
"/usr/lib/python2.6/site-packages/nova/openstack/common/importutils.py",
line 31, in import_class\n return getattr(sys.modules[mod_str],
class_str)\n', "AttributeError: 'module' object has no attribute
'AntiAffinityWeigher'\n"])
I have also tried a few different naming conventions such as
"AntiAffinityWeigher.AntiAffinityWeigher" and
"myWeigher.AntiAffinityWeigher" to no avail.
Any help would be greatly appreciated.
Sure, just look at the traceback, the exception is really explicite.
When giving in the config the name of the new weighter, you just missed
a submodule in nova.scheduler.
Correct it, it's not nova.scheduler.AntiAffinityWeigher :-)
Don't hesitate to provide this change upstream, please so we could
review it.
-Sylvain
Thanks,
Danny
_______________________________________________
Mailing list: http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack
Post to : [email protected]
Unsubscribe : http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack
_______________________________________________
Mailing list: http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack
Post to : [email protected]
Unsubscribe : http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack