Revision 0890e0d1

b/lib/utils/version.py
23 23

  
24 24
import re
25 25

  
26
from ganeti import constants
27

  
26 28
_FULL_VERSION_RE = re.compile(r"(\d+)\.(\d+)\.(\d+)")
27 29
_SHORT_VERSION_RE = re.compile(r"(\d+)\.(\d+)")
28 30

  
31
# The first Ganeti version that supports automatic upgrades
32
FIRST_UPGRADE_VERSION = (2, 10, 0)
33

  
34
CURRENT_VERSION = (constants.VERSION_MAJOR, constants.VERSION_MINOR,
35
                   constants.VERSION_REVISION)
36

  
29 37
# Format for CONFIG_VERSION:
30 38
#   01 03 0123 = 01030123
31 39
#   ^^ ^^ ^^^^
......
87 95
    return (int(m.group(1)), int(m.group(2)), 0)
88 96

  
89 97
  return None
98

  
99

  
100
def UpgradeRange(target, current=CURRENT_VERSION):
101
  """Verify whether a version is within the range of automatic upgrades.
102

  
103
  @param target: The version to upgrade to as (major, minor, revision)
104
  @type target: tuple
105
  @param current: The version to upgrade from as (major, minor, revision)
106
  @type current: tuple
107
  @rtype: string or None
108
  @return: None, if within the range, and a human-readable error message
109
      otherwise
110

  
111
  """
112
  if target < FIRST_UPGRADE_VERSION or current < FIRST_UPGRADE_VERSION:
113
    return "automatic upgrades only supported from 2.10 onwards"
114

  
115
  if target[0] != current[0]:
116
    return "different major versions"
117

  
118
  if target[1] < current[1] - 1:
119
    return "can only downgrade one minor version at a time"
120

  
121
  return None
b/test/py/ganeti.utils.version_unittest.py
35 35
        self.assertEquals(version.ParseVersion("2"), None)
36 36
        self.assertEquals(version.ParseVersion("pink bunny"), None)
37 37

  
38
class UpgradeRangeTest(unittest.TestCase):
39
    def testUpgradeRange(self):
40
        self.assertEquals(version.UpgradeRange((2,11,0), current=(2,10,0)),
41
                          None)
42
        self.assertEquals(version.UpgradeRange((2,10,0), current=(2,10,0)),
43
                          None)
44
        self.assertEquals(version.UpgradeRange((2,11,3), current=(2,12,0)),
45
                          None)
46
        self.assertEquals(version.UpgradeRange((2,11,3), current=(2,12,99)),
47
                          None)
48
        self.assertEquals(version.UpgradeRange((3,0,0), current=(2,12,0)),
49
                          "different major versions")
50
        self.assertEquals(version.UpgradeRange((2,12,0), current=(3,0,0)),
51
                          "different major versions")
52
        self.assertEquals(version.UpgradeRange((2,10,0), current=(2,12,0)),
53
                          "can only downgrade one minor version at a time")
54
        self.assertEquals(version.UpgradeRange((2,9,0), current=(2,10,0)),
55
                          "automatic upgrades only supported from 2.10 onwards")
56
        self.assertEquals(version.UpgradeRange((2,10,0), current=(2,9,0)),
57
                          "automatic upgrades only supported from 2.10 onwards")
58

  
38 59

  
39 60
if __name__ == "__main__":
40 61
  testutils.GanetiTestProgram()

Also available in: Unified diff