1
# Copyright 2010 United States Government as represented by the
4
# Licensed under the Apache License, Version 2.0 (the "License"); you may
5
# not use this file except in compliance with the License. You may obtain
6
# a copy of the License at
8
# http://www.apache.org/licenses/LICENSE-2.0
10
# Unless required by applicable law or agreed to in writing, software
11
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
# License for the specific language governing permissions and limitations
23
from nova import context
25
from nova import flags
26
from nova import service
29
from nova import utils
30
from nova.auth import manager as auth_manager
31
from nova.scheduler import zone_manager
37
"""Represents a fake zone from the db"""
38
def __init__(self, *args, **kwargs):
39
for k, v in kwargs.iteritems():
43
def exploding_novaclient(zone):
44
"""Used when we want to simulate a novaclient call failing."""
45
raise Exception("kaboom")
48
class ZoneManagerTestCase(test.TestCase):
49
"""Test case for zone manager"""
51
zm = zone_manager.ZoneManager()
52
self.mox.StubOutWithMock(zm, '_refresh_from_db')
53
self.mox.StubOutWithMock(zm, '_poll_zones')
54
zm._refresh_from_db(mox.IgnoreArg())
55
zm._poll_zones(mox.IgnoreArg())
61
def test_refresh_from_db_new(self):
62
zm = zone_manager.ZoneManager()
64
self.mox.StubOutWithMock(db, 'zone_get_all')
65
db.zone_get_all(mox.IgnoreArg()).AndReturn([
66
FakeZone(id=1, api_url='http://foo.com', username='user1',
70
self.assertEquals(len(zm.zone_states), 0)
73
zm._refresh_from_db(None)
76
self.assertEquals(len(zm.zone_states), 1)
77
self.assertEquals(zm.zone_states[1].username, 'user1')
79
def test_refresh_from_db_replace_existing(self):
80
zm = zone_manager.ZoneManager()
81
zone_state = zone_manager.ZoneState()
82
zone_state.update_credentials(FakeZone(id=1, api_url='http://foo.com',
83
username='user1', password='pass1'))
84
zm.zone_states[1] = zone_state
86
self.mox.StubOutWithMock(db, 'zone_get_all')
87
db.zone_get_all(mox.IgnoreArg()).AndReturn([
88
FakeZone(id=1, api_url='http://foo.com', username='user2',
92
self.assertEquals(len(zm.zone_states), 1)
95
zm._refresh_from_db(None)
98
self.assertEquals(len(zm.zone_states), 1)
99
self.assertEquals(zm.zone_states[1].username, 'user2')
101
def test_refresh_from_db_missing(self):
102
zm = zone_manager.ZoneManager()
103
zone_state = zone_manager.ZoneState()
104
zone_state.update_credentials(FakeZone(id=1, api_url='http://foo.com',
105
username='user1', password='pass1'))
106
zm.zone_states[1] = zone_state
108
self.mox.StubOutWithMock(db, 'zone_get_all')
109
db.zone_get_all(mox.IgnoreArg()).AndReturn([])
111
self.assertEquals(len(zm.zone_states), 1)
114
zm._refresh_from_db(None)
117
self.assertEquals(len(zm.zone_states), 0)
119
def test_refresh_from_db_add_and_delete(self):
120
zm = zone_manager.ZoneManager()
121
zone_state = zone_manager.ZoneState()
122
zone_state.update_credentials(FakeZone(id=1, api_url='http://foo.com',
123
username='user1', password='pass1'))
124
zm.zone_states[1] = zone_state
126
self.mox.StubOutWithMock(db, 'zone_get_all')
128
db.zone_get_all(mox.IgnoreArg()).AndReturn([
129
FakeZone(id=2, api_url='http://foo.com', username='user2',
132
self.assertEquals(len(zm.zone_states), 1)
135
zm._refresh_from_db(None)
138
self.assertEquals(len(zm.zone_states), 1)
139
self.assertEquals(zm.zone_states[2].username, 'user2')
141
def test_poll_zone(self):
142
self.mox.StubOutWithMock(zone_manager, '_call_novaclient')
143
zone_manager._call_novaclient(mox.IgnoreArg()).AndReturn(
144
dict(name='zohan', capabilities='hairdresser'))
146
zone_state = zone_manager.ZoneState()
147
zone_state.update_credentials(FakeZone(id=2,
148
api_url='http://foo.com', username='user2',
150
zone_state.attempt = 1
153
zone_manager._poll_zone(zone_state)
155
self.assertEquals(zone_state.attempt, 0)
156
self.assertEquals(zone_state.name, 'zohan')
158
def test_poll_zone_fails(self):
159
self.stubs.Set(zone_manager, "_call_novaclient", exploding_novaclient)
161
zone_state = zone_manager.ZoneState()
162
zone_state.update_credentials(FakeZone(id=2,
163
api_url='http://foo.com', username='user2',
165
zone_state.attempt = FLAGS.zone_failures_to_offline - 1
168
zone_manager._poll_zone(zone_state)
170
self.assertEquals(zone_state.attempt, 3)
171
self.assertFalse(zone_state.is_active)
172
self.assertEquals(zone_state.name, None)