Skip to content

Commit 8ffa708

Browse files
Add architecture and series to charm URL
The v2 charm URL scheme should support both architecture and series. Allowing us to deploy different architectures correctly.
1 parent 573a756 commit 8ffa708

2 files changed

Lines changed: 25 additions & 5 deletions

File tree

juju/url.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def __str__(self):
1616

1717

1818
class URL:
19-
def __init__(self, schema, user=None, name=None, revision=None, series=None):
19+
def __init__(self, schema, user=None, name=None, revision=None, series=None, architecture=None):
2020
self.schema = schema
2121
self.user = user
2222
self.name = name
@@ -26,6 +26,7 @@ def __init__(self, schema, user=None, name=None, revision=None, series=None):
2626
if revision is None:
2727
revision = -1
2828
self.revision = revision
29+
self.architecture = architecture
2930

3031
@staticmethod
3132
def parse(s):
@@ -57,6 +58,8 @@ def path(self):
5758
parts = []
5859
if self.user:
5960
parts.append("~{}".format(self.user))
61+
if self.architecture:
62+
parts.append(self.architecture)
6063
if self.series:
6164
parts.append(self.series)
6265
if self.revision is not None and self.revision >= 0:
@@ -114,10 +117,19 @@ def parse_v2_url(u, s):
114117
c = URL(Schema.CHARM_HUB)
115118

116119
parts = u.path.split("/")
117-
if len(parts) != 1:
118-
raise JujuError("charm or bundle URL {} malformed, expected <name>".format(s))
119-
120-
(c.name, c.revision) = extract_revision(parts[0])
120+
num = len(parts)
121+
if num == 0 or num > 3:
122+
raise JujuError("charm or bundle URL {} malformed".format(s))
123+
124+
name = ""
125+
if num == 3:
126+
c.architecture, c.series, name = parts[0], parts[1], parts[2]
127+
elif num == 2:
128+
c.architecture, name = parts[0], parts[1]
129+
else:
130+
name = parts[0]
131+
132+
(c.name, c.revision) = extract_revision(name)
121133
# TODO (stickupkid) - validate the name.
122134

123135
return c

tests/unit/test_url.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ def test_parse_v1_series(self):
3131

3232
class TestURLV2(unittest.TestCase):
3333
def test_parse_charmhub(self):
34+
u = URL.parse("ch:arm64/bionic/mysql-1")
35+
self.assertEqual(u, URL(Schema.CHARM_HUB, name="mysql", architecture="amd64", series="bionic", revision=1))
36+
37+
def test_parse_charmhub_with_no_series(self):
38+
u = URL.parse("ch:arm64/mysql")
39+
self.assertEqual(u, URL(Schema.CHARM_HUB, name="mysql", architecture="amd64"))
40+
41+
def test_parse_charmhub_with_no_series_arch(self):
3442
u = URL.parse("ch:mysql")
3543
self.assertEqual(u, URL(Schema.CHARM_HUB, name="mysql"))
3644

0 commit comments

Comments
 (0)