Skip to content

Commit 23380f5

Browse files
authored
[JUJU-3954] Fix incorrect base channel computation (#875)
This was incorrect because the compute_base_channel was outputting 'latest/stable' (as a base channel) when no series was given and the track/risk is latest/stable. While 'latest/stable' is a correct "charm channel", it's not a correct "base channel".
1 parent 96411a3 commit 23380f5

4 files changed

Lines changed: 52 additions & 19 deletions

File tree

juju/model.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,7 @@ async def resolve(self, url, architecture,
517517
if series:
518518
base.channel = ch.normalize().compute_base_channel(series=series)
519519
base.name = 'ubuntu'
520+
520521
origin = client.CharmOrigin(source=Source.CHARM_HUB.value,
521522
architecture=architecture,
522523
risk=ch.risk,
@@ -1865,7 +1866,7 @@ async def _resolve_charm(self, url, origin, force=False, series=None, model_conf
18651866

18661867
result = resp.results[0]
18671868
if result.error:
1868-
raise JujuError(result.error.message)
1869+
raise JujuError(f'resolving {url} : {result.error.message}')
18691870

18701871
supported_series = result.supported_series
18711872
resolved_origin = result.charm_origin
@@ -1876,7 +1877,7 @@ async def _resolve_charm(self, url, origin, force=False, series=None, model_conf
18761877
result.charm_origin.base = utils.get_base_from_origin_or_channel(resolved_origin, selected_series)
18771878
charm_url.series = selected_series
18781879

1879-
return result.url, result.charm_origin
1880+
return str(charm_url), resolved_origin
18801881

18811882
async def _resolve_architecture(self, url):
18821883
if url.architecture:

juju/origin.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,15 +113,13 @@ def __str__(self):
113113
path = "{}/{}".format(self.track, path)
114114
return path
115115

116-
def compute_base_channel(self, series=None):
116+
def compute_base_channel(self, series):
117117
"""Determines the channel for a client.Base
118118
A base channel is a track/risk/branch
119119
120120
"""
121121
_ch = [self.risk]
122-
tr = self.track
123-
if series:
124-
tr = utils.get_series_version(series)
122+
tr = utils.get_series_version(series)
125123
if tr:
126124
_ch = [tr] + _ch
127125
return "/".join(_ch)

juju/utils.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -331,12 +331,24 @@ def get_local_charm_charmcraft_yaml(path):
331331

332332

333333
def get_series_version(series_name):
334+
"""get_series_version outputs the version of the OS based on the given series
335+
e.g. jammy -> 22.04, kubernetes -> kubernetes
336+
337+
:param str series_name: name of the series
338+
:return str: os version
339+
"""
334340
if series_name not in ALL_SERIES_VERSIONS:
335341
raise errors.JujuError("Unknown series : %s", series_name)
336342
return ALL_SERIES_VERSIONS[series_name]
337343

338344

339345
def get_version_series(version):
346+
"""get_version_series is the opposite of the get_series_version. It outputs the series based
347+
on given OS version
348+
349+
:param str version: version of the OS
350+
return str: name of the series corresponding to the given version
351+
"""
340352
if version not in UBUNTU_SERIES.values():
341353
raise errors.JujuError("Unknown version : %s", version)
342354
return list(UBUNTU_SERIES.keys())[list(UBUNTU_SERIES.values()).index(version)]
@@ -418,19 +430,21 @@ def parse_base_arg(base):
418430
DEFAULT_SUPPORTED_LTS_BASE = client.Base(channel='22.04', name='ubuntu')
419431

420432

421-
def base_channel_from_series(track, risk, series=None):
433+
def base_channel_from_series(track, risk, series):
422434
return origin.Channel(track=track, risk=risk).normalize().compute_base_channel(series=series)
423435

424436

425-
def get_os_from_series(series=None):
426-
if not series or series in UBUNTU_SERIES:
437+
def get_os_from_series(series):
438+
if series in UBUNTU_SERIES:
427439
return 'ubuntu'
428440
raise JujuError(f'os for the series {series} needs to be added')
429441

430442

431443
def get_base_from_origin_or_channel(origin_or_channel, series=None):
432-
channel = base_channel_from_series(origin_or_channel.track, origin_or_channel.risk, series)
433-
os_name = get_os_from_series(series)
444+
channel, os_name = None, None
445+
if series:
446+
channel = base_channel_from_series(origin_or_channel.track, origin_or_channel.risk, series)
447+
os_name = get_os_from_series(series)
434448
return client.Base(channel=channel, name=os_name)
435449

436450

tests/unit/test_utils.py

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import unittest
22
import pytest
33

4-
from juju.utils import series_selector, get_base_from_origin_or_channel, parse_base_arg, juju_config_dir, juju_ssh_key_paths, DEFAULT_SUPPORTED_LTS
4+
from juju.utils import series_selector, get_base_from_origin_or_channel, \
5+
parse_base_arg, juju_config_dir, juju_ssh_key_paths, \
6+
DEFAULT_SUPPORTED_LTS, get_series_version, get_version_series, \
7+
base_channel_to_series, base_channel_from_series, \
8+
get_os_from_series
59
from juju.client import client
610
from juju.errors import JujuError
711
from juju.url import URL
@@ -26,13 +30,6 @@ def test_parse_base_arg(self):
2630
assert base.channel == '22.04'
2731

2832

29-
class TestBaseFromSeries(unittest.TestCase):
30-
def test_get_base_from_series(self):
31-
b = get_base_from_origin_or_channel(client.CharmOrigin(track='latest', risk='edge'), series='jammy')
32-
assert b.name == 'ubuntu'
33-
assert b.channel == '22.04/edge'
34-
35-
3633
class TestSeriesSelector(unittest.TestCase):
3734
def test_series_arg(self):
3835
assert series_selector('jammy', []) == 'jammy'
@@ -53,3 +50,26 @@ def test_charm_list_series(self):
5350

5451
def test_return_lts(self):
5552
assert series_selector() == DEFAULT_SUPPORTED_LTS
53+
54+
55+
class TestBaseChannelOriginUtils(unittest.TestCase):
56+
def test_get_series_version(self):
57+
assert get_series_version(series_name='kubernetes') == 'kubernetes'
58+
assert get_series_version(series_name='jammy') == '22.04'
59+
60+
def test_get_version_series(self):
61+
assert get_version_series(version='22.04') == 'jammy'
62+
63+
def test_base_channel_to_series(self):
64+
assert base_channel_to_series(channel='22.04/stable') == 'jammy'
65+
66+
def test_base_channel_from_series(self):
67+
assert base_channel_from_series(track='latest', risk='stable', series='jammy') == \
68+
'22.04/stable'
69+
70+
def test_get_os_from_series(self):
71+
assert get_os_from_series('jammy') == 'ubuntu'
72+
73+
def test_get_base_from_series(self):
74+
orgn = client.CharmOrigin(track='latest', risk='edge')
75+
assert get_base_from_origin_or_channel(orgn, series='jammy') == client.Base('22.04/edge', 'ubuntu')

0 commit comments

Comments
 (0)