Merge lp:~ltrager/maas/lp1683440 into lp:~maas-committers/maas/trunk

Proposed by Lee Trager
Status: Merged
Approved by: Lee Trager
Approved revision: no longer in the source branch.
Merged at revision: 5993
Proposed branch: lp:~ltrager/maas/lp1683440
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 110 lines (+50/-25)
2 files modified
src/maasserver/utils/osystems.py (+13/-1)
src/maasserver/utils/tests/test_osystems.py (+37/-24)
To merge this branch: bzr merge lp:~ltrager/maas/lp1683440
Reviewer Review Type Date Requested Status
Mike Pontillo (community) Approve
Review via email: mp+322646@code.launchpad.net

Commit message

Properly handle grabbing the title for custom images.

To post a comment you must log in.
Revision history for this message
Mike Pontillo (mpontillo) wrote :

Can you please add an additional test case for the failure condition, so that we can ensure this regression doesn't occur in the future?

review: Needs Fixing
Revision history for this message
Mike Pontillo (mpontillo) wrote :

To be clear, from reading the diff it's not clear if the test case is checking for the branch where the split('/') is being used, or the custom special case.

I think it should be two test cases.

Revision history for this message
Mike Pontillo (mpontillo) wrote :

My bad, I misread the test case; I thought you replaced the assert.

This would have been clearer with either a couple of comments, or two separate test cases. I'll let you address that as you see fit.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/maasserver/utils/osystems.py'
2--- src/maasserver/utils/osystems.py 2017-04-14 19:02:17 +0000
3+++ src/maasserver/utils/osystems.py 2017-04-17 23:46:47 +0000
4@@ -25,6 +25,7 @@
5 from django.core.exceptions import ValidationError
6 from django.db.models import Q
7 from maasserver.clusterrpc.osystems import gen_all_known_operating_systems
8+from maasserver.enum import BOOT_RESOURCE_TYPE
9 from maasserver.models import (
10 BootResource,
11 BootSourceCache,
12@@ -67,7 +68,18 @@
13 # the rack gives us.
14 for resource in BootResource.objects.exclude(extra={}):
15 if 'title' in resource.extra and resource.extra['title'] != '':
16- osystem, release = resource.name.split('/')
17+ # All BootResources which originate from a SimpleStream have
18+ # their name set to osystem/series
19+ # (see BootResourceStore.get_or_create_boot_resource). User
20+ # uploaded images set the name to whatever the user specifed.
21+ # When custom images are returned by list_all_usable_osystems
22+ # the osystem name is 'custom' and the release name to whatever
23+ # the user specified.
24+ if resource.rtype == BOOT_RESOURCE_TYPE.UPLOADED:
25+ osystem = 'custom'
26+ release = resource.name
27+ else:
28+ osystem, release = resource.name.split('/')
29 if osystem not in titles:
30 titles[osystem] = {}
31 titles[osystem][release] = resource.extra['title']
32
33=== modified file 'src/maasserver/utils/tests/test_osystems.py'
34--- src/maasserver/utils/tests/test_osystems.py 2017-04-14 19:02:17 +0000
35+++ src/maasserver/utils/tests/test_osystems.py 2017-04-17 23:46:47 +0000
36@@ -120,30 +120,7 @@
37 self.assertEqual(
38 releases, list_all_usable_releases([osystem])[osystem['name']])
39
40- def test_list_all_releases_requiring_keys(self):
41- releases = [
42- make_rpc_release(requires_license_key=True) for _ in range(3)]
43- release_without_license_key = make_rpc_release(
44- requires_license_key=False)
45- osystem = make_rpc_osystem(
46- releases=releases + [release_without_license_key])
47- self.assertItemsEqual(
48- releases,
49- list_all_releases_requiring_keys([osystem])[osystem['name']])
50-
51- def test_list_all_releases_requiring_keys_sorts(self):
52- releases = [
53- make_rpc_release(requires_license_key=True) for _ in range(3)]
54- release_without_license_key = make_rpc_release(
55- requires_license_key=False)
56- osystem = make_rpc_osystem(
57- releases=releases + [release_without_license_key])
58- releases = sorted(releases, key=itemgetter('title'))
59- self.assertEqual(
60- releases,
61- list_all_releases_requiring_keys([osystem])[osystem['name']])
62-
63- def test_list_all_releases_looks_up_title_in_boot_resource_table(self):
64+ def test_list_all_usable_releases_finds_title_in_boot_resource_table(self):
65 release = make_rpc_release()
66 osystem = make_rpc_osystem(releases=[release])
67 title = factory.make_name('title')
68@@ -155,6 +132,42 @@
69 title,
70 list_all_usable_releases([osystem])[osystem['name']][0]['title'])
71
72+ def test_list_all_usable_releases_finds_title_for_custom(self):
73+ # Regression test for LP:1683440
74+ release = make_rpc_release()
75+ osystem = make_rpc_osystem(
76+ name='custom', releases=[release])
77+ title = factory.make_name('title')
78+ factory.make_BootResource(
79+ rtype=BOOT_RESOURCE_TYPE.UPLOADED, name=release['name'],
80+ extra={'title': title})
81+ self.assertEquals(
82+ title,
83+ list_all_usable_releases([osystem])[osystem['name']][0]['title'])
84+
85+ def test_list_all_releases_requiring_keys(self):
86+ releases = [
87+ make_rpc_release(requires_license_key=True) for _ in range(3)]
88+ release_without_license_key = make_rpc_release(
89+ requires_license_key=False)
90+ osystem = make_rpc_osystem(
91+ releases=releases + [release_without_license_key])
92+ self.assertItemsEqual(
93+ releases,
94+ list_all_releases_requiring_keys([osystem])[osystem['name']])
95+
96+ def test_list_all_releases_requiring_keys_sorts(self):
97+ releases = [
98+ make_rpc_release(requires_license_key=True) for _ in range(3)]
99+ release_without_license_key = make_rpc_release(
100+ requires_license_key=False)
101+ osystem = make_rpc_osystem(
102+ releases=releases + [release_without_license_key])
103+ releases = sorted(releases, key=itemgetter('title'))
104+ self.assertEqual(
105+ releases,
106+ list_all_releases_requiring_keys([osystem])[osystem['name']])
107+
108 def test_get_release_requires_key_returns_asterisk_when_required(self):
109 release = make_rpc_release(requires_license_key=True)
110 self.assertEqual('*', get_release_requires_key(release))