Newer
Older
#!/usr/bin/python
#
# Copyright (C) 2010 Google Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 0.0510-1301, USA.
"""Script for unittesting the uidpool module"""
import os
import tempfile
import unittest
from ganeti import constants
from ganeti import uidpool
from ganeti import errors
import testutils
class TestUidPool(testutils.GanetiTestCase):
"""Uid-pool tests"""
def setUp(self):
self.old_uid_min = constants.UIDPOOL_UID_MIN
self.old_uid_max = constants.UIDPOOL_UID_MAX
constants.UIDPOOL_UID_MIN = 1
constants.UIDPOOL_UID_MAX = 10
constants.UIDPOOL_LOCKDIR = tempfile.mkdtemp()
def tearDown(self):
constants.UIDPOOL_UID_MIN = self.old_uid_min
constants.UIDPOOL_UID_MAX = self.old_uid_max
for name in os.listdir(constants.UIDPOOL_LOCKDIR):
os.unlink(os.path.join(constants.UIDPOOL_LOCKDIR, name))
os.rmdir(constants.UIDPOOL_LOCKDIR)
def testParseUidPool(self):
self.assertEqualValues(
uidpool.ParseUidPool("1-100,200,"),
self.assertEqualValues(
uidpool.ParseUidPool("1000:2000-2500", separator=":"),
[(1000, 1000), (2000, 2500)])
self.assertEqualValues(
uidpool.ParseUidPool("1000\n2000-2500", separator="\n"),
[(1000, 1000), (2000, 2500)])
def testCheckUidPool(self):
# UID < UIDPOOL_UID_MIN
self.assertRaises(errors.OpPrereqError,
uidpool.CheckUidPool,
[(0, 0)])
# UID > UIDPOOL_UID_MAX
self.assertRaises(errors.OpPrereqError,
uidpool.CheckUidPool,
[(11, 11)])
# lower boundary > higher boundary
self.assertRaises(errors.OpPrereqError,
uidpool.CheckUidPool,
[(2, 1)])
def testFormatUidPool(self):
self.assertEqualValues(
uidpool.FormatUidPool([(1, 100), (200, 200)]),
"1-100, 200")
self.assertEqualValues(
uidpool.FormatUidPool([(1, 100), (200, 200)], separator=":"),
"1-100:200")
self.assertEqualValues(
uidpool.FormatUidPool([(1, 100), (200, 200)], separator="\n"),
"1-100\n200")
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
def testRequestUnusedUid(self):
# Check with known used user-ids
#
# Test with user-id "0" and with our own user-id, both
# of which are guaranteed to be used user-ids
for uid in 0, os.getuid():
self.assertRaises(errors.LockError,
uidpool.RequestUnusedUid,
set([uid]))
# Check with a single, known unused user-id
#
# We use "-1" here, which is not a valid user-id, so it's
# guaranteed that it's unused.
uid = uidpool.RequestUnusedUid(set([-1]))
self.assertEqualValues(uid.GetUid(), -1)
# Check uid-pool exhaustion
#
# uid "-1" is locked now, so RequestUnusedUid is expected to fail
self.assertRaises(errors.LockError,
uidpool.RequestUnusedUid,
set([-1]))
# Check unlocking
uid.Unlock()
# After unlocking, "-1" should be available again
uid = uidpool.RequestUnusedUid(set([-1]))
self.assertEqualValues(uid.GetUid(), -1)
if __name__ == '__main__':
testutils.GanetiTestProgram()