Commit effc1b86 authored by Jose A. Lopes's avatar Jose A. Lopes

Move 'BuildVersion' to 'lib/utils/version.py'

Functions 'BuildVersion' and 'SplitVersion' are no longer needed by
the constants and, given that they are not constants, they should be
moved elsewhere.  Since they are only used by 'cfgupgrade' and tests,
these functions are moved to 'lib/utils/version.py' and references to
them updated.  Note that in 'lib/server/masterd.py', local variable
'version' is renamed 'ver' to avoid redefining the import
'ganeti.utils.version'.
Signed-off-by: default avatarJose A. Lopes <jabolopes@google.com>
Reviewed-by: default avatarThomas Thrainer <thomasth@google.com>
parent 285d04a1
......@@ -483,6 +483,7 @@ utils_PYTHON = \
lib/utils/retry.py \
lib/utils/storage.py \
lib/utils/text.py \
lib/utils/version.py \
lib/utils/wrapper.py \
lib/utils/x509.py
......
......@@ -44,49 +44,6 @@ VCS_VERSION = _vcsversion.VCS_VERSION
EXPORT_VERSION = 0
RAPI_VERSION = 2
# Format for CONFIG_VERSION:
# 01 03 0123 = 01030123
# ^^ ^^ ^^^^
# | | + Configuration version/revision
# | + Minor version
# + Major version
#
# It is stored as an integer. Make sure not to write an octal number.
# BuildVersion and SplitVersion must be in here because we can't import other
# modules. The cfgupgrade tool must be able to read and write version numbers
# and thus requires these functions. To avoid code duplication, they're kept in
# here.
def BuildVersion(major, minor, revision):
"""Calculates int version number from major, minor and revision numbers.
Returns: int representing version number
"""
assert isinstance(major, int)
assert isinstance(minor, int)
assert isinstance(revision, int)
return (1000000 * major +
10000 * minor +
1 * revision)
def SplitVersion(version):
"""Splits version number stored in an int.
Returns: tuple; (major, minor, revision)
"""
assert isinstance(version, int)
(major, remainder) = divmod(version, 1000000)
(minor, revision) = divmod(remainder, 10000)
return (major, minor, revision)
CONFIG_MAJOR = _constants.CONFIG_MAJOR
CONFIG_MINOR = _constants.CONFIG_MINOR
CONFIG_REVISION = _constants.CONFIG_REVISION
......
......@@ -61,6 +61,8 @@ from ganeti import runtime
from ganeti import pathutils
from ganeti import ht
from ganeti.utils import version
CLIENT_REQUEST_WORKERS = 16
......@@ -90,7 +92,7 @@ class ClientRequestWorker(workerpool.BaseWorker):
client_ops = ClientOps(server)
try:
(method, args, version) = luxi.ParseRequest(message)
(method, args, ver) = luxi.ParseRequest(message)
except luxi.ProtocolError, err:
logging.error("Protocol Error: %s", err)
client.close_log()
......@@ -99,9 +101,9 @@ class ClientRequestWorker(workerpool.BaseWorker):
success = False
try:
# Verify client's version if there was one in the request
if version is not None and version != constants.LUXI_VERSION:
if ver is not None and ver != constants.LUXI_VERSION:
raise errors.LuxiError("LUXI version mismatch, server %s, request %s" %
(constants.LUXI_VERSION, version))
(constants.LUXI_VERSION, ver))
result = client_ops.handle_request(method, args)
success = True
......@@ -685,8 +687,8 @@ def CheckMasterd(options, args):
try:
config.ConfigWriter()
except errors.ConfigVersionMismatch, err:
v1 = "%s.%s.%s" % constants.SplitVersion(err.args[0])
v2 = "%s.%s.%s" % constants.SplitVersion(err.args[1])
v1 = "%s.%s.%s" % version.SplitVersion(err.args[0])
v2 = "%s.%s.%s" % version.SplitVersion(err.args[1])
print >> sys.stderr, \
("Configuration version mismatch. The current Ganeti software"
" expects version %s, but the on-disk configuration file has"
......
#!/usr/bin/python
#
# Copyright (C) 2013 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
# 02110-1301, USA.
"""Version utilities."""
# Format for CONFIG_VERSION:
# 01 03 0123 = 01030123
# ^^ ^^ ^^^^
# | | + Configuration version/revision
# | + Minor version
# + Major version
#
# It is stored as an integer. Make sure not to write an octal number.
# BuildVersion and SplitVersion must be in here because we can't import other
# modules. The cfgupgrade tool must be able to read and write version numbers
# and thus requires these functions. To avoid code duplication, they're kept in
# here.
def BuildVersion(major, minor, revision):
"""Calculates int version number from major, minor and revision numbers.
Returns: int representing version number
"""
assert isinstance(major, int)
assert isinstance(minor, int)
assert isinstance(revision, int)
return (1000000 * major +
10000 * minor +
1 * revision)
def SplitVersion(version):
"""Splits version number stored in an int.
Returns: tuple; (major, minor, revision)
"""
assert isinstance(version, int)
(major, remainder) = divmod(version, 1000000)
(minor, revision) = divmod(remainder, 10000)
return (major, minor, revision)
......@@ -34,6 +34,8 @@ from ganeti import errors
from ganeti import serializer
from ganeti import netutils
from ganeti.utils import version
import testutils
......@@ -199,7 +201,7 @@ class TestCfgupgrade(unittest.TestCase):
self.assertFalse(os.path.exists(os.path.dirname(self.rapi_users_path)))
utils.WriteFile(self.rapi_users_path_pre24, data="some user\n")
self._TestSimpleUpgrade(constants.BuildVersion(2, 3, 0), False)
self._TestSimpleUpgrade(version.BuildVersion(2, 3, 0), False)
self.assertTrue(os.path.isdir(os.path.dirname(self.rapi_users_path)))
self.assert_(os.path.islink(self.rapi_users_path_pre24))
......@@ -215,7 +217,7 @@ class TestCfgupgrade(unittest.TestCase):
os.mkdir(os.path.dirname(self.rapi_users_path))
utils.WriteFile(self.rapi_users_path, data="other user\n")
self._TestSimpleUpgrade(constants.BuildVersion(2, 3, 0), False)
self._TestSimpleUpgrade(version.BuildVersion(2, 3, 0), False)
self.assert_(os.path.islink(self.rapi_users_path_pre24))
self.assert_(os.path.isfile(self.rapi_users_path))
......@@ -232,7 +234,7 @@ class TestCfgupgrade(unittest.TestCase):
os.symlink(self.rapi_users_path, self.rapi_users_path_pre24)
utils.WriteFile(self.rapi_users_path, data="hello world\n")
self._TestSimpleUpgrade(constants.BuildVersion(2, 2, 0), False)
self._TestSimpleUpgrade(version.BuildVersion(2, 2, 0), False)
self.assert_(os.path.isfile(self.rapi_users_path) and
not os.path.islink(self.rapi_users_path))
......@@ -251,7 +253,7 @@ class TestCfgupgrade(unittest.TestCase):
utils.WriteFile(self.rapi_users_path_pre24, data="hello world\n")
self.assertRaises(Exception, self._TestSimpleUpgrade,
constants.BuildVersion(2, 2, 0), False)
version.BuildVersion(2, 2, 0), False)
for path in [self.rapi_users_path, self.rapi_users_path_pre24]:
self.assert_(os.path.isfile(path) and not os.path.islink(path))
......@@ -264,7 +266,7 @@ class TestCfgupgrade(unittest.TestCase):
self.assertFalse(os.path.exists(self.rapi_users_path_pre24))
utils.WriteFile(self.rapi_users_path_pre24, data="some user\n")
self._TestSimpleUpgrade(constants.BuildVersion(2, 3, 0), True)
self._TestSimpleUpgrade(version.BuildVersion(2, 3, 0), True)
self.assertFalse(os.path.isdir(os.path.dirname(self.rapi_users_path)))
self.assertTrue(os.path.isfile(self.rapi_users_path_pre24) and
......@@ -277,7 +279,7 @@ class TestCfgupgrade(unittest.TestCase):
os.mkdir(os.path.dirname(self.rapi_users_path))
utils.WriteFile(self.rapi_users_path, data="other user\n")
self._TestSimpleUpgrade(constants.BuildVersion(2, 3, 0), True)
self._TestSimpleUpgrade(version.BuildVersion(2, 3, 0), True)
self.assertTrue(os.path.isfile(self.rapi_users_path) and
not os.path.islink(self.rapi_users_path))
......@@ -292,7 +294,7 @@ class TestCfgupgrade(unittest.TestCase):
os.symlink(self.rapi_users_path, self.rapi_users_path_pre24)
utils.WriteFile(self.rapi_users_path, data="hello world\n")
self._TestSimpleUpgrade(constants.BuildVersion(2, 2, 0), True)
self._TestSimpleUpgrade(version.BuildVersion(2, 2, 0), True)
self.assertTrue(os.path.islink(self.rapi_users_path_pre24))
self.assertTrue(os.path.isfile(self.rapi_users_path) and
......@@ -305,7 +307,7 @@ class TestCfgupgrade(unittest.TestCase):
def testFileStoragePathsDryRun(self):
self.assertFalse(os.path.exists(self.file_storage_paths))
self._TestSimpleUpgrade(constants.BuildVersion(2, 6, 0), True,
self._TestSimpleUpgrade(version.BuildVersion(2, 6, 0), True,
file_storage_dir=self.tmpdir,
shared_file_storage_dir="/tmp")
......@@ -314,7 +316,7 @@ class TestCfgupgrade(unittest.TestCase):
def testFileStoragePathsBoth(self):
self.assertFalse(os.path.exists(self.file_storage_paths))
self._TestSimpleUpgrade(constants.BuildVersion(2, 6, 0), False,
self._TestSimpleUpgrade(version.BuildVersion(2, 6, 0), False,
file_storage_dir=self.tmpdir,
shared_file_storage_dir="/tmp")
......@@ -330,7 +332,7 @@ class TestCfgupgrade(unittest.TestCase):
def testFileStoragePathsSharedOnly(self):
self.assertFalse(os.path.exists(self.file_storage_paths))
self._TestSimpleUpgrade(constants.BuildVersion(2, 5, 0), False,
self._TestSimpleUpgrade(version.BuildVersion(2, 5, 0), False,
file_storage_dir=None,
shared_file_storage_dir=self.tmpdir)
......@@ -341,28 +343,28 @@ class TestCfgupgrade(unittest.TestCase):
self.assertFalse(lines)
def testUpgradeFrom_2_0(self):
self._TestSimpleUpgrade(constants.BuildVersion(2, 0, 0), False)
self._TestSimpleUpgrade(version.BuildVersion(2, 0, 0), False)
def testUpgradeFrom_2_1(self):
self._TestSimpleUpgrade(constants.BuildVersion(2, 1, 0), False)
self._TestSimpleUpgrade(version.BuildVersion(2, 1, 0), False)
def testUpgradeFrom_2_2(self):
self._TestSimpleUpgrade(constants.BuildVersion(2, 2, 0), False)
self._TestSimpleUpgrade(version.BuildVersion(2, 2, 0), False)
def testUpgradeFrom_2_3(self):
self._TestSimpleUpgrade(constants.BuildVersion(2, 3, 0), False)
self._TestSimpleUpgrade(version.BuildVersion(2, 3, 0), False)
def testUpgradeFrom_2_4(self):
self._TestSimpleUpgrade(constants.BuildVersion(2, 4, 0), False)
self._TestSimpleUpgrade(version.BuildVersion(2, 4, 0), False)
def testUpgradeFrom_2_5(self):
self._TestSimpleUpgrade(constants.BuildVersion(2, 5, 0), False)
self._TestSimpleUpgrade(version.BuildVersion(2, 5, 0), False)
def testUpgradeFrom_2_6(self):
self._TestSimpleUpgrade(constants.BuildVersion(2, 6, 0), False)
self._TestSimpleUpgrade(version.BuildVersion(2, 6, 0), False)
def testUpgradeFrom_2_7(self):
self._TestSimpleUpgrade(constants.BuildVersion(2, 7, 0), False)
self._TestSimpleUpgrade(version.BuildVersion(2, 7, 0), False)
def testUpgradeFullConfigFrom_2_7(self):
self._TestUpgradeFromFile("cluster_config_2.7.json", False)
......@@ -431,25 +433,25 @@ class TestCfgupgrade(unittest.TestCase):
self._RunDowngradeTwice()
def testUpgradeDryRunFrom_2_0(self):
self._TestSimpleUpgrade(constants.BuildVersion(2, 0, 0), True)
self._TestSimpleUpgrade(version.BuildVersion(2, 0, 0), True)
def testUpgradeDryRunFrom_2_1(self):
self._TestSimpleUpgrade(constants.BuildVersion(2, 1, 0), True)
self._TestSimpleUpgrade(version.BuildVersion(2, 1, 0), True)
def testUpgradeDryRunFrom_2_2(self):
self._TestSimpleUpgrade(constants.BuildVersion(2, 2, 0), True)
self._TestSimpleUpgrade(version.BuildVersion(2, 2, 0), True)
def testUpgradeDryRunFrom_2_3(self):
self._TestSimpleUpgrade(constants.BuildVersion(2, 3, 0), True)
self._TestSimpleUpgrade(version.BuildVersion(2, 3, 0), True)
def testUpgradeDryRunFrom_2_4(self):
self._TestSimpleUpgrade(constants.BuildVersion(2, 4, 0), True)
self._TestSimpleUpgrade(version.BuildVersion(2, 4, 0), True)
def testUpgradeDryRunFrom_2_5(self):
self._TestSimpleUpgrade(constants.BuildVersion(2, 5, 0), True)
self._TestSimpleUpgrade(version.BuildVersion(2, 5, 0), True)
def testUpgradeDryRunFrom_2_6(self):
self._TestSimpleUpgrade(constants.BuildVersion(2, 6, 0), True)
self._TestSimpleUpgrade(version.BuildVersion(2, 6, 0), True)
def testUpgradeCurrentDryRun(self):
self._TestSimpleUpgrade(constants.CONFIG_VERSION, True)
......
......@@ -30,6 +30,8 @@ from ganeti import constants
from ganeti import locking
from ganeti import utils
from ganeti.utils import version
import testutils
......@@ -46,16 +48,16 @@ class TestConstants(unittest.TestCase):
self.failUnless(constants.CONFIG_VERSION >= 0 and
constants.CONFIG_VERSION <= 99999999)
self.failUnless(constants.BuildVersion(0, 0, 0) == 0)
self.failUnless(constants.BuildVersion(10, 10, 1010) == 10101010)
self.failUnless(constants.BuildVersion(12, 34, 5678) == 12345678)
self.failUnless(constants.BuildVersion(99, 99, 9999) == 99999999)
self.failUnless(version.BuildVersion(0, 0, 0) == 0)
self.failUnless(version.BuildVersion(10, 10, 1010) == 10101010)
self.failUnless(version.BuildVersion(12, 34, 5678) == 12345678)
self.failUnless(version.BuildVersion(99, 99, 9999) == 99999999)
self.failUnless(constants.SplitVersion(00000000) == (0, 0, 0))
self.failUnless(constants.SplitVersion(10101010) == (10, 10, 1010))
self.failUnless(constants.SplitVersion(12345678) == (12, 34, 5678))
self.failUnless(constants.SplitVersion(99999999) == (99, 99, 9999))
self.failUnless(constants.SplitVersion(constants.CONFIG_VERSION) ==
self.failUnless(version.SplitVersion(00000000) == (0, 0, 0))
self.failUnless(version.SplitVersion(10101010) == (10, 10, 1010))
self.failUnless(version.SplitVersion(12345678) == (12, 34, 5678))
self.failUnless(version.SplitVersion(99999999) == (99, 99, 9999))
self.failUnless(version.SplitVersion(constants.CONFIG_VERSION) ==
(constants.CONFIG_MAJOR, constants.CONFIG_MINOR,
constants.CONFIG_REVISION))
......
......@@ -44,6 +44,8 @@ from ganeti import config
from ganeti import netutils
from ganeti import pathutils
from ganeti.utils import version
options = None
args = None
......@@ -347,8 +349,7 @@ def UpgradeInstanceIndices(config_data):
def UpgradeAll(config_data):
config_data["version"] = constants.BuildVersion(TARGET_MAJOR,
TARGET_MINOR, 0)
config_data["version"] = version.BuildVersion(TARGET_MAJOR, TARGET_MINOR, 0)
UpgradeRapiUsers()
UpgradeWatcher()
UpgradeFileStoragePaths(config_data)
......@@ -379,8 +380,8 @@ def DowngradeNicParamsVLAN(nics, owner):
def DowngradeAll(config_data):
# Any code specific to a particular version should be labeled that way, so
# it can be removed when updating to the next version.
config_data["version"] = constants.BuildVersion(DOWNGRADE_MAJOR,
DOWNGRADE_MINOR, 0)
config_data["version"] = version.BuildVersion(DOWNGRADE_MAJOR,
DOWNGRADE_MINOR, 0)
DowngradeInstances(config_data)
......@@ -482,7 +483,7 @@ def main():
raise Error("Unable to determine configuration version")
(config_major, config_minor, config_revision) = \
constants.SplitVersion(config_version)
version.SplitVersion(config_version)
logging.info("Found configuration version %s (%d.%d.%d)",
config_version, config_major, config_minor, config_revision)
......
......@@ -49,6 +49,8 @@ from ganeti import utils
from ganeti import cli
from ganeti import pathutils
from ganeti.utils import version
options = None
args = None
......@@ -345,7 +347,7 @@ def main():
raise Error("Unsupported configuration version: %s" %
old_config_version)
if "version" not in config_data:
config_data["version"] = constants.BuildVersion(2, 0, 0)
config_data["version"] = version.BuildVersion(2, 0, 0)
if F_SERIAL not in config_data:
config_data[F_SERIAL] = 1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment