116 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# Copyright 2011 OpenStack LLC.
 | 
						|
# 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
 | 
						|
#    under the License.
 | 
						|
"""
 | 
						|
Tests For Zone Aware Scheduler.
 | 
						|
"""
 | 
						|
 | 
						|
from nova import test
 | 
						|
from nova.scheduler import driver
 | 
						|
from nova.scheduler import zone_aware_scheduler
 | 
						|
from nova.scheduler import zone_manager
 | 
						|
 | 
						|
 | 
						|
class FakeZoneAwareScheduler(zone_aware_scheduler.ZoneAwareScheduler):
 | 
						|
    def filter_hosts(self, num, specs):
 | 
						|
        # NOTE(sirp): this is returning [(hostname, services)]
 | 
						|
        return self.zone_manager.service_states.items()
 | 
						|
 | 
						|
    def weigh_hosts(self, num, specs, hosts):
 | 
						|
        fake_weight = 99
 | 
						|
        weighted = []
 | 
						|
        for hostname, caps in hosts:
 | 
						|
            weighted.append(dict(weight=fake_weight, name=hostname))
 | 
						|
        return weighted
 | 
						|
 | 
						|
 | 
						|
class FakeZoneManager(zone_manager.ZoneManager):
 | 
						|
    def __init__(self):
 | 
						|
        self.service_states = {
 | 
						|
                        'host1': {
 | 
						|
                            'compute': {'ram': 1000}},
 | 
						|
                         'host2': {
 | 
						|
                            'compute': {'ram': 2000}},
 | 
						|
                         'host3': {
 | 
						|
                            'compute': {'ram': 3000}}}
 | 
						|
 | 
						|
 | 
						|
class FakeEmptyZoneManager(zone_manager.ZoneManager):
 | 
						|
    def __init__(self):
 | 
						|
        self.service_states = {}
 | 
						|
 | 
						|
 | 
						|
def fake_empty_call_zone_method(context, method, specs):
 | 
						|
    return []
 | 
						|
 | 
						|
 | 
						|
def fake_call_zone_method(context, method, specs):
 | 
						|
    return [
 | 
						|
        ('zone1', [
 | 
						|
            dict(weight=1, blob='AAAAAAA'),
 | 
						|
            dict(weight=111, blob='BBBBBBB'),
 | 
						|
            dict(weight=112, blob='CCCCCCC'),
 | 
						|
            dict(weight=113, blob='DDDDDDD'),
 | 
						|
        ]),
 | 
						|
        ('zone2', [
 | 
						|
            dict(weight=120, blob='EEEEEEE'),
 | 
						|
            dict(weight=2, blob='FFFFFFF'),
 | 
						|
            dict(weight=122, blob='GGGGGGG'),
 | 
						|
            dict(weight=123, blob='HHHHHHH'),
 | 
						|
        ]),
 | 
						|
        ('zone3', [
 | 
						|
            dict(weight=130, blob='IIIIIII'),
 | 
						|
            dict(weight=131, blob='JJJJJJJ'),
 | 
						|
            dict(weight=132, blob='KKKKKKK'),
 | 
						|
            dict(weight=3, blob='LLLLLLL'),
 | 
						|
        ]),
 | 
						|
    ]
 | 
						|
 | 
						|
 | 
						|
class ZoneAwareSchedulerTestCase(test.TestCase):
 | 
						|
    """Test case for Zone Aware Scheduler."""
 | 
						|
 | 
						|
    def test_zone_aware_scheduler(self):
 | 
						|
        """
 | 
						|
        Create a nested set of FakeZones, ensure that a select call returns the
 | 
						|
        appropriate build plan.
 | 
						|
        """
 | 
						|
        sched = FakeZoneAwareScheduler()
 | 
						|
        self.stubs.Set(sched, '_call_zone_method', fake_call_zone_method)
 | 
						|
 | 
						|
        zm = FakeZoneManager()
 | 
						|
        sched.set_zone_manager(zm)
 | 
						|
 | 
						|
        fake_context = {}
 | 
						|
        build_plan = sched.select(fake_context, {})
 | 
						|
 | 
						|
        self.assertEqual(15, len(build_plan))
 | 
						|
 | 
						|
        hostnames = [plan_item['name']
 | 
						|
                     for plan_item in build_plan if 'name' in plan_item]
 | 
						|
        self.assertEqual(3, len(hostnames))
 | 
						|
 | 
						|
    def test_empty_zone_aware_scheduler(self):
 | 
						|
        """
 | 
						|
        Ensure empty hosts & child_zones result in NoValidHosts exception.
 | 
						|
        """
 | 
						|
        sched = FakeZoneAwareScheduler()
 | 
						|
        self.stubs.Set(sched, '_call_zone_method', fake_empty_call_zone_method)
 | 
						|
 | 
						|
        zm = FakeEmptyZoneManager()
 | 
						|
        sched.set_zone_manager(zm)
 | 
						|
 | 
						|
        fake_context = {}
 | 
						|
        self.assertRaises(driver.NoValidHost, sched.schedule, fake_context, {})
 |