Skip to content

Commit ba7d3c0

Browse files
author
Robert Breker
committed
CA-161767: Choose the latest xs-tools.iso if there is multiple choices
The earlier version of the sorting mechanism was not able to de-prioritize release-less xs-tools.iso. This led to exceptions during config drive creation, when the chosen tools did not include support for CoreOS. Signed-off-by: Robert Breker <[email protected]>
1 parent 93bde8a commit ba7d3c0

File tree

2 files changed

+42
-5
lines changed

2 files changed

+42
-5
lines changed

src/xscontainer/coreos.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from xscontainer.util import log
44
from xscontainer.docker_monitor import api as docker_monitor_api
55

6-
import distutils.version
76
import glob
87
import os
98
import random
@@ -141,12 +140,23 @@ def get_config_drive_default(session):
141140

142141
def find_latest_tools_iso_path():
143142
tools_iso_paths = glob.glob(XS_TOOLS_ISO_PATH)
144-
if len(tools_iso_paths) < 1:
143+
if len(tools_iso_paths) == 0:
145144
raise util.XSContainerException("Can't locate XS tools in %s."
146145
% (XS_TOOLS_ISO_PATH))
147-
tools_iso_paths.sort(key=distutils.version.LooseVersion)
148-
tools_iso_path = tools_iso_paths[-1]
149-
return tools_iso_path
146+
elif len(tools_iso_paths) == 1:
147+
return tools_iso_paths[0]
148+
else:
149+
# Let's first loose the xs-tools.iso without a release
150+
tools_iso_path_wo_releaseless = []
151+
for path in tools_iso_paths:
152+
basename = os.path.basename(path)
153+
if basename.count("-") != 2:
154+
tools_iso_path_wo_releaseless.append(path)
155+
# Then sort the remaining
156+
tools_iso_path_wo_releaseless.sort(
157+
key=lambda s: map(str, re.split('[.-]', s)))
158+
# And return the last number out of the sorted list
159+
return tools_iso_path_wo_releaseless[-1]
150160

151161

152162
def create_config_drive_iso(session, userdata, vmuuid):
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from mock import MagicMock, patch, call
2+
import pprint
3+
import unittest
4+
5+
from xscontainer import coreos
6+
from xscontainer import util
7+
8+
9+
class TestFindLatestToolsIsoPath(unittest.TestCase):
10+
11+
@patch("glob.glob")
12+
def test_cannot_find_tools(self, m_glob):
13+
m_glob.return_value = []
14+
15+
self.assertRaises(util.XSContainerException,
16+
coreos.find_latest_tools_iso_path)
17+
18+
@patch("glob.glob")
19+
def test_can_find_right_tools(self, m_glob):
20+
m_glob.return_value = [
21+
'/opt/xensource/packages/iso/xs-tools-6.5.0.iso',
22+
'/opt/xensource/packages/iso/xs-tools-6.5.0-2001.iso',
23+
'/opt/xensource/packages/iso/xs-tools-6.5.0-1001.iso']
24+
25+
tools_path = coreos.find_latest_tools_iso_path()
26+
27+
self.assertEquals(tools_path, m_glob.return_value[1])

0 commit comments

Comments
 (0)