Merge lp:~andreserl/maas/revert_rev5602_lp1686169_2.1 into lp:maas/2.1

Proposed by Andres Rodriguez
Status: Merged
Approved by: Andres Rodriguez
Approved revision: no longer in the source branch.
Merged at revision: 5603
Proposed branch: lp:~andreserl/maas/revert_rev5602_lp1686169_2.1
Merge into: lp:maas/2.1
Diff against target: 637 lines (+160/-251)
4 files modified
src/maasserver/bootresources.py (+63/-2)
src/maasserver/tests/test_bootresources.py (+86/-59)
src/provisioningserver/import_images/download_descriptions.py (+0/-72)
src/provisioningserver/import_images/tests/test_download_descriptions.py (+11/-118)
To merge this branch: bzr merge lp:~andreserl/maas/revert_rev5602_lp1686169_2.1
Reviewer Review Type Date Requested Status
Andres Rodriguez (community) Approve
Review via email: mp+323264@code.launchpad.net

This proposal supersedes a proposal from 2017-04-26.

Commit message

Revert rev5602, which fixed LP: #1686169. This causes rack controllers to fail importing images

To post a comment you must log in.
Revision history for this message
Andres Rodriguez (andreserl) wrote :

selfie!

Revision history for this message
Andres Rodriguez (andreserl) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/maasserver/bootresources.py'
--- src/maasserver/bootresources.py 2017-04-26 00:27:23 +0000
+++ src/maasserver/bootresources.py 2017-04-26 19:06:22 +0000
@@ -18,6 +18,7 @@
18from datetime import timedelta18from datetime import timedelta
19from operator import itemgetter19from operator import itemgetter
20import os20import os
21import re
21from subprocess import CalledProcessError22from subprocess import CalledProcessError
22from textwrap import dedent23from textwrap import dedent
23import threading24import threading
@@ -80,7 +81,6 @@
80from provisioningserver.import_images.download_descriptions import (81from provisioningserver.import_images.download_descriptions import (
81 download_all_image_descriptions,82 download_all_image_descriptions,
82 image_passes_filter,83 image_passes_filter,
83 validate_product,
84)84)
85from provisioningserver.import_images.helpers import (85from provisioningserver.import_images.helpers import (
86 get_os_from_product,86 get_os_from_product,
@@ -1019,6 +1019,12 @@
1019 # will be downloaded from simplestreams.1019 # will be downloaded from simplestreams.
1020 'max_items': 1,1020 'max_items': 1,
1021 })1021 })
1022 # Compile a regex to validate bootloader product names. This only
1023 # allows V1 bootloaders.
1024 self.bootloader_regex = re.compile('.*:1:.*', re.IGNORECASE)
1025 # Compile a regex to validate Ubuntu product names. This only allows
1026 # V2 and V3 Ubuntu products.
1027 self.ubuntu_regex = re.compile('.*:v[23]:.*', re.IGNORECASE)
10221028
1023 def load_products(self, path=None, content_id=None):1029 def load_products(self, path=None, content_id=None):
1024 """Overridable from `BasicMirrorWriter`."""1030 """Overridable from `BasicMirrorWriter`."""
@@ -1032,6 +1038,59 @@
1032 return self.product_mapping.contains(1038 return self.product_mapping.contains(
1033 sutil.products_exdata(src, pedigree))1039 sutil.products_exdata(src, pedigree))
10341040
1041 def _validate_ubuntu(self, data, product_name):
1042 osystem = data.get('os')
1043 if 'ubuntu' not in osystem.lower():
1044 # It's not an Ubuntu product, nothing to validate.
1045 return True
1046 elif self.ubuntu_regex.search(product_name) is None:
1047 # Only insert v2 or v3 Ubuntu products.
1048 return False
1049 else:
1050 return True
1051
1052 def _validate_bootloader(self, data, product_name):
1053 bootloader_type = data.get('bootloader-type')
1054 if bootloader_type is None:
1055 # It's not a bootloader, nothing to validate
1056 return True
1057 if self.bootloader_regex.search(product_name) is None:
1058 # Only insert V1 bootloaders from the stream
1059 return False
1060 # Validate MAAS supports the specific bootloader_type, os, arch
1061 # combination.
1062 SUPPORTED_BOOTLOADERS = {
1063 'pxe': [
1064 {
1065 'os': 'pxelinux',
1066 'arch': 'i386',
1067 }
1068 ],
1069 'uefi': [
1070 {
1071 'os': 'grub-efi-signed',
1072 'arch': 'amd64',
1073 },
1074 {
1075 'os': 'grub-efi',
1076 'arch': 'arm64',
1077 }
1078 ],
1079 'open-firmware': [
1080 {
1081 'os': 'grub-ieee1275',
1082 'arch': 'ppc64el',
1083 }
1084 ],
1085 }
1086 for bootloader in SUPPORTED_BOOTLOADERS.get(bootloader_type, []):
1087 if (
1088 data.get('os') == bootloader['os'] and
1089 data.get('arch') == bootloader['arch']):
1090 return True
1091 # Bootloader not supported, ignore
1092 return False
1093
1035 def insert_item(self, data, src, target, pedigree, contentsource):1094 def insert_item(self, data, src, target, pedigree, contentsource):
1036 """Overridable from `BasicMirrorWriter`."""1095 """Overridable from `BasicMirrorWriter`."""
1037 item = sutil.products_exdata(src, pedigree)1096 item = sutil.products_exdata(src, pedigree)
@@ -1048,7 +1107,9 @@
1048 elif item['ftype'] not in dict(BOOT_RESOURCE_FILE_TYPE_CHOICES).keys():1107 elif item['ftype'] not in dict(BOOT_RESOURCE_FILE_TYPE_CHOICES).keys():
1049 # Skip filetypes that we don't know about.1108 # Skip filetypes that we don't know about.
1050 return1109 return
1051 elif not validate_product(item, product_name):1110 elif not self._validate_ubuntu(item, product_name):
1111 return
1112 elif not self._validate_bootloader(item, product_name):
1052 return1113 return
1053 else:1114 else:
1054 self.store.insert(item, contentsource)1115 self.store.insert(item, contentsource)
10551116
=== modified file 'src/maasserver/tests/test_bootresources.py'
--- src/maasserver/tests/test_bootresources.py 2017-04-26 00:27:23 +0000
+++ src/maasserver/tests/test_bootresources.py 2017-04-26 19:06:22 +0000
@@ -2103,7 +2103,7 @@
2103class TestBootResourceRepoWriter(MAASServerTestCase):2103class TestBootResourceRepoWriter(MAASServerTestCase):
2104 """Tests for `BootResourceRepoWriter`."""2104 """Tests for `BootResourceRepoWriter`."""
21052105
2106 def create_ubuntu_simplestream(self, ftypes, stream_version=None):2106 def create_simplestream(self, ftypes, stream_version=None):
2107 version = '16.04'2107 version = '16.04'
2108 arch = 'amd64'2108 arch = 'amd64'
2109 subarch = 'hwe-x'2109 subarch = 'hwe-x'
@@ -2145,47 +2145,10 @@
2145 }2145 }
2146 return src, product, version2146 return src, product, version
21472147
2148 def create_bootloader_simplestream(self, stream_version=None):
2149 if stream_version is None:
2150 stream_version = '1'
2151 product = (
2152 'com.ubuntu.maas:daily:%s:bootloader-download' % stream_version)
2153 version = datetime.now().date().strftime('%Y%m%d.0')
2154 versions = {
2155 version: {
2156 'items': {
2157 BOOT_RESOURCE_FILE_TYPE.BOOTLOADER: {
2158 'sha256': factory.make_name('sha256'),
2159 'path': factory.make_name('path'),
2160 'ftype': BOOT_RESOURCE_FILE_TYPE.BOOTLOADER,
2161 'size': random.randint(0, 2**64),
2162 }
2163 }
2164 }
2165 }
2166 products = {
2167 product: {
2168 'label': 'daily',
2169 'os': 'grub-efi-signed',
2170 'arch': 'amd64',
2171 'bootloader-type': 'uefi',
2172 'version': version,
2173 'versions': versions,
2174 }
2175 }
2176 src = {
2177 'datatype': 'image-downloads',
2178 'format': 'products:1.0',
2179 'updated': format_datetime(datetime.now()),
2180 'products': products,
2181 'content_id': 'com.ubuntu.maas:daily:1:bootloader-download'
2182 }
2183 return src, product, version
2184
2185 def test_insert_prefers_squashfs_over_root_image(self):2148 def test_insert_prefers_squashfs_over_root_image(self):
2186 boot_resource_repo_writer = BootResourceRepoWriter(2149 boot_resource_repo_writer = BootResourceRepoWriter(
2187 BootResourceStore(), None)2150 BootResourceStore(), None)
2188 src, product, version = self.create_ubuntu_simplestream([2151 src, product, version = self.create_simplestream([
2189 BOOT_RESOURCE_FILE_TYPE.ROOT_IMAGE,2152 BOOT_RESOURCE_FILE_TYPE.ROOT_IMAGE,
2190 BOOT_RESOURCE_FILE_TYPE.SQUASHFS_IMAGE,2153 BOOT_RESOURCE_FILE_TYPE.SQUASHFS_IMAGE,
2191 ])2154 ])
@@ -2199,7 +2162,7 @@
2199 def test_insert_allows_squashfs(self):2162 def test_insert_allows_squashfs(self):
2200 boot_resource_repo_writer = BootResourceRepoWriter(2163 boot_resource_repo_writer = BootResourceRepoWriter(
2201 BootResourceStore(), None)2164 BootResourceStore(), None)
2202 src, product, version = self.create_ubuntu_simplestream([2165 src, product, version = self.create_simplestream([
2203 BOOT_RESOURCE_FILE_TYPE.SQUASHFS_IMAGE,2166 BOOT_RESOURCE_FILE_TYPE.SQUASHFS_IMAGE,
2204 ])2167 ])
2205 data = src['products'][product]['versions'][version]['items'][2168 data = src['products'][product]['versions'][version]['items'][
@@ -2212,7 +2175,7 @@
2212 def test_insert_allows_root_image(self):2175 def test_insert_allows_root_image(self):
2213 boot_resource_repo_writer = BootResourceRepoWriter(2176 boot_resource_repo_writer = BootResourceRepoWriter(
2214 BootResourceStore(), None)2177 BootResourceStore(), None)
2215 src, product, version = self.create_ubuntu_simplestream([2178 src, product, version = self.create_simplestream([
2216 BOOT_RESOURCE_FILE_TYPE.ROOT_IMAGE,2179 BOOT_RESOURCE_FILE_TYPE.ROOT_IMAGE,
2217 ])2180 ])
2218 data = src['products'][product]['versions'][version]['items'][2181 data = src['products'][product]['versions'][version]['items'][
@@ -2225,7 +2188,9 @@
2225 def test_insert_allows_bootloader(self):2188 def test_insert_allows_bootloader(self):
2226 boot_resource_repo_writer = BootResourceRepoWriter(2189 boot_resource_repo_writer = BootResourceRepoWriter(
2227 BootResourceStore(), None)2190 BootResourceStore(), None)
2228 src, product, version = self.create_bootloader_simplestream()2191 src, product, version = self.create_simplestream([
2192 BOOT_RESOURCE_FILE_TYPE.BOOTLOADER,
2193 ])
2229 data = src['products'][product]['versions'][version]['items'][2194 data = src['products'][product]['versions'][version]['items'][
2230 BOOT_RESOURCE_FILE_TYPE.BOOTLOADER]2195 BOOT_RESOURCE_FILE_TYPE.BOOTLOADER]
2231 pedigree = (product, version, BOOT_RESOURCE_FILE_TYPE.BOOTLOADER)2196 pedigree = (product, version, BOOT_RESOURCE_FILE_TYPE.BOOTLOADER)
@@ -2236,7 +2201,7 @@
2236 def test_insert_allows_archive_tar_xz(self):2201 def test_insert_allows_archive_tar_xz(self):
2237 boot_resource_repo_writer = BootResourceRepoWriter(2202 boot_resource_repo_writer = BootResourceRepoWriter(
2238 BootResourceStore(), None)2203 BootResourceStore(), None)
2239 src, product, version = self.create_ubuntu_simplestream([2204 src, product, version = self.create_simplestream([
2240 BOOT_RESOURCE_FILE_TYPE.ARCHIVE_TAR_XZ,2205 BOOT_RESOURCE_FILE_TYPE.ARCHIVE_TAR_XZ,
2241 ])2206 ])
2242 data = src['products'][product]['versions'][version]['items'][2207 data = src['products'][product]['versions'][version]['items'][
@@ -2250,7 +2215,7 @@
2250 boot_resource_repo_writer = BootResourceRepoWriter(2215 boot_resource_repo_writer = BootResourceRepoWriter(
2251 BootResourceStore(), None)2216 BootResourceStore(), None)
2252 unknown_ftype = factory.make_name('ftype')2217 unknown_ftype = factory.make_name('ftype')
2253 src, product, version = self.create_ubuntu_simplestream([2218 src, product, version = self.create_simplestream([
2254 unknown_ftype,2219 unknown_ftype,
2255 ])2220 ])
2256 data = src['products'][product]['versions'][version]['items'][2221 data = src['products'][product]['versions'][version]['items'][
@@ -2263,43 +2228,105 @@
2263 def test_insert_validates_bootloader(self):2228 def test_insert_validates_bootloader(self):
2264 boot_resource_repo_writer = BootResourceRepoWriter(2229 boot_resource_repo_writer = BootResourceRepoWriter(
2265 BootResourceStore(), None)2230 BootResourceStore(), None)
2266 src, product, version = self.create_bootloader_simplestream()2231 src, product, version = self.create_simplestream([
2232 BOOT_RESOURCE_FILE_TYPE.BOOTLOADER,
2233 ])
2267 data = src['products'][product]['versions'][version]['items'][2234 data = src['products'][product]['versions'][version]['items'][
2268 BOOT_RESOURCE_FILE_TYPE.BOOTLOADER]2235 BOOT_RESOURCE_FILE_TYPE.BOOTLOADER]
2269 pedigree = (product, version, BOOT_RESOURCE_FILE_TYPE.BOOTLOADER)2236 pedigree = (product, version, BOOT_RESOURCE_FILE_TYPE.BOOTLOADER)
2270 mock_insert = self.patch(boot_resource_repo_writer.store, 'insert')2237 mock_insert = self.patch(boot_resource_repo_writer.store, 'insert')
2238 mock_validate_bootloader = self.patch(
2239 boot_resource_repo_writer, '_validate_bootloader')
2271 boot_resource_repo_writer.insert_item(data, src, None, pedigree, None)2240 boot_resource_repo_writer.insert_item(data, src, None, pedigree, None)
2272 self.assertThat(mock_insert, MockCalledOnce())2241 self.assertThat(mock_insert, MockCalledOnce())
22732242 self.assertThat(mock_validate_bootloader, MockCalledOnce())
2274 def test_insert_validates_rejects_unknown_version(self):2243
2275 boot_resource_repo_writer = BootResourceRepoWriter(2244 def test_validate_bootloader_ignores_non_bootloaders(self):
2276 BootResourceStore(), None)2245 boot_resource_repo_writer = BootResourceRepoWriter(
2277 src, product, version = self.create_bootloader_simplestream(2246 BootResourceStore(), None)
2278 factory.make_name('stream_version'))2247 self.assertTrue(
2279 data = src['products'][product]['versions'][version]['items'][2248 boot_resource_repo_writer._validate_bootloader(
2280 BOOT_RESOURCE_FILE_TYPE.BOOTLOADER]2249 {}, 'com.ubuntu.maas.daily:v3:boot:16.04:amd64:hwe-16.04'))
2281 pedigree = (product, version, BOOT_RESOURCE_FILE_TYPE.BOOTLOADER)2250
2282 mock_insert = self.patch(boot_resource_repo_writer.store, 'insert')2251 def test_validate_bootloader_checks_version(self):
2283 boot_resource_repo_writer.insert_item(data, src, None, pedigree, None)2252 boot_resource_repo_writer = BootResourceRepoWriter(
2284 self.assertThat(mock_insert, MockNotCalled())2253 BootResourceStore(), None)
2254 version = random.randint(2, 100)
2255 product_name = "com.ubuntu.maas.daily:%d:pxelinux:pxe:i386" % version
2256 self.assertFalse(
2257 boot_resource_repo_writer._validate_bootloader(
2258 {'bootloader-type': factory.make_name('bootloader-type')},
2259 product_name))
2260
2261 def test_validate_bootloader_allows_acceptable_bootloaders(self):
2262 acceptable_bootloaders = [
2263 {
2264 'os': 'pxelinux',
2265 'arch': 'i386',
2266 'bootloader-type': 'pxe',
2267 },
2268 {
2269 'os': 'grub-efi-signed',
2270 'arch': 'amd64',
2271 'bootloader-type': 'uefi',
2272 },
2273 {
2274 'os': 'grub-efi',
2275 'arch': 'arm64',
2276 'bootloader-type': 'uefi',
2277 },
2278 {
2279 'os': 'grub-ieee1275',
2280 'arch': 'ppc64el',
2281 'bootloader-type': 'open-firmware',
2282 },
2283 ]
2284 boot_resource_repo_writer = BootResourceRepoWriter(
2285 BootResourceStore(), None)
2286 for bootloader in acceptable_bootloaders:
2287 product_name = "com.ubuntu.maas.daily:1:%s:%s:%s" % (
2288 bootloader['os'], bootloader['bootloader-type'],
2289 bootloader['arch'])
2290 self.assertTrue(
2291 boot_resource_repo_writer._validate_bootloader(
2292 bootloader, product_name),
2293 "Failed to validate %s" % product_name)
2294
2295 def test_validate_bootloader_denies_unacceptable_bootloader(self):
2296 bootloader = {
2297 'os': factory.make_name('os'),
2298 'arch': factory.make_name('arch'),
2299 'bootloader-type': factory.make_name('bootloader_type'),
2300 }
2301 product_name = "com.ubuntu.maas.daily:1:%s:%s:%s" % (
2302 bootloader['os'], bootloader['bootloader-type'],
2303 bootloader['arch'])
2304 boot_resource_repo_writer = BootResourceRepoWriter(
2305 BootResourceStore(), None)
2306 self.assertFalse(
2307 boot_resource_repo_writer._validate_bootloader(
2308 bootloader, product_name))
22852309
2286 def test_insert_validates_ubuntu(self):2310 def test_insert_validates_ubuntu(self):
2287 boot_resource_repo_writer = BootResourceRepoWriter(2311 boot_resource_repo_writer = BootResourceRepoWriter(
2288 BootResourceStore(), None)2312 BootResourceStore(), None)
2289 src, product, version = self.create_ubuntu_simplestream([2313 src, product, version = self.create_simplestream([
2290 BOOT_RESOURCE_FILE_TYPE.SQUASHFS_IMAGE,2314 BOOT_RESOURCE_FILE_TYPE.SQUASHFS_IMAGE,
2291 ])2315 ])
2292 data = src['products'][product]['versions'][version]['items'][2316 data = src['products'][product]['versions'][version]['items'][
2293 BOOT_RESOURCE_FILE_TYPE.SQUASHFS_IMAGE]2317 BOOT_RESOURCE_FILE_TYPE.SQUASHFS_IMAGE]
2294 pedigree = (product, version, BOOT_RESOURCE_FILE_TYPE.SQUASHFS_IMAGE)2318 pedigree = (product, version, BOOT_RESOURCE_FILE_TYPE.SQUASHFS_IMAGE)
2295 mock_insert = self.patch(boot_resource_repo_writer.store, 'insert')2319 mock_insert = self.patch(boot_resource_repo_writer.store, 'insert')
2320 mock_validate_bootloader = self.patch(
2321 boot_resource_repo_writer, '_validate_ubuntu')
2296 boot_resource_repo_writer.insert_item(data, src, None, pedigree, None)2322 boot_resource_repo_writer.insert_item(data, src, None, pedigree, None)
2297 self.assertThat(mock_insert, MockCalledOnce())2323 self.assertThat(mock_insert, MockCalledOnce())
2324 self.assertThat(mock_validate_bootloader, MockCalledOnce())
22982325
2299 def test_validate_ubuntu_rejects_unknown_version(self):2326 def test_validate_ubuntu_rejects_unknown_version(self):
2300 boot_resource_repo_writer = BootResourceRepoWriter(2327 boot_resource_repo_writer = BootResourceRepoWriter(
2301 BootResourceStore(), None)2328 BootResourceStore(), None)
2302 src, product, version = self.create_ubuntu_simplestream(2329 src, product, version = self.create_simplestream(
2303 [BOOT_RESOURCE_FILE_TYPE.SQUASHFS_IMAGE],2330 [BOOT_RESOURCE_FILE_TYPE.SQUASHFS_IMAGE],
2304 factory.make_name('stream_version'))2331 factory.make_name('stream_version'))
2305 data = src['products'][product]['versions'][version]['items'][2332 data = src['products'][product]['versions'][version]['items'][
23062333
=== modified file 'src/provisioningserver/import_images/download_descriptions.py'
--- src/provisioningserver/import_images/download_descriptions.py 2017-04-26 00:27:23 +0000
+++ src/provisioningserver/import_images/download_descriptions.py 2017-04-26 19:06:22 +0000
@@ -10,10 +10,8 @@
1010
11__all__ = [11__all__ = [
12 'download_all_image_descriptions',12 'download_all_image_descriptions',
13 'validate_product',
14 ]13 ]
1514
16import re
1715
18from provisioningserver.import_images.boot_image_mapping import (16from provisioningserver.import_images.boot_image_mapping import (
19 BootImageMapping,17 BootImageMapping,
@@ -33,13 +31,6 @@
33 products_exdata,31 products_exdata,
34)32)
3533
36# Compile a regex to validate Ubuntu product names. This only allows V2 and V3
37# Ubuntu images.
38UBUNTU_REGEX = re.compile('.*:v[23]:.*', re.IGNORECASE)
39# Compile a regex to validate bootloader product names. This only allows V1
40# bootloaders.
41BOOTLOADER_REGEX = re.compile('.*:1:.*', re.IGNORECASE)
42
4334
44def clean_up_repo_item(item):35def clean_up_repo_item(item):
45 """Return a subset of dict `item` for storing in a boot images dict."""36 """Return a subset of dict `item` for storing in a boot images dict."""
@@ -55,67 +46,6 @@
55 return compact_item46 return compact_item
5647
5748
58def validate_ubuntu(data, product_name):
59 osystem = data.get('os', '')
60 if 'ubuntu' not in osystem.lower():
61 # It's not an Ubuntu product, nothing to validate.
62 return True
63 elif UBUNTU_REGEX.search(product_name) is None:
64 # Only insert v2 or v3 Ubuntu products.
65 return False
66 else:
67 return True
68
69
70def validate_bootloader(data, product_name):
71 bootloader_type = data.get('bootloader-type')
72 if bootloader_type is None:
73 # It's not a bootloader, nothing to validate
74 return True
75 if BOOTLOADER_REGEX.search(product_name) is None:
76 # Only insert V1 bootloaders from the stream
77 return False
78 # Validate MAAS supports the specific bootloader_type, os, arch
79 # combination.
80 SUPPORTED_BOOTLOADERS = {
81 'pxe': [
82 {
83 'os': 'pxelinux',
84 'arch': 'i386',
85 }
86 ],
87 'uefi': [
88 {
89 'os': 'grub-efi-signed',
90 'arch': 'amd64',
91 },
92 {
93 'os': 'grub-efi',
94 'arch': 'arm64',
95 }
96 ],
97 'open-firmware': [
98 {
99 'os': 'grub-ieee1275',
100 'arch': 'ppc64el',
101 }
102 ],
103 }
104 for bootloader in SUPPORTED_BOOTLOADERS.get(bootloader_type, []):
105 if (
106 data.get('os') == bootloader['os'] and
107 data.get('arch') == bootloader['arch']):
108 return True
109
110 # Bootloader not supported, ignore
111 return False
112
113
114def validate_product(data, product_name):
115 return (validate_ubuntu(data, product_name) and
116 validate_bootloader(data, product_name))
117
118
119class RepoDumper(BasicMirrorWriter):49class RepoDumper(BasicMirrorWriter):
120 """Gather metadata about boot images available in a Simplestreams repo.50 """Gather metadata about boot images available in a Simplestreams repo.
12151
@@ -149,8 +79,6 @@
149 def insert_item(self, data, src, target, pedigree, contentsource):79 def insert_item(self, data, src, target, pedigree, contentsource):
150 """Overridable from `BasicMirrorWriter`."""80 """Overridable from `BasicMirrorWriter`."""
151 item = products_exdata(src, pedigree)81 item = products_exdata(src, pedigree)
152 if not validate_product(item, pedigree[0]):
153 return
154 os = get_os_from_product(item)82 os = get_os_from_product(item)
155 arch = item['arch']83 arch = item['arch']
156 subarches = item.get('subarches', 'generic')84 subarches = item.get('subarches', 'generic')
15785
=== modified file 'src/provisioningserver/import_images/tests/test_download_descriptions.py'
--- src/provisioningserver/import_images/tests/test_download_descriptions.py 2017-04-26 00:27:23 +0000
+++ src/provisioningserver/import_images/tests/test_download_descriptions.py 2017-04-26 19:06:22 +0000
@@ -6,7 +6,6 @@
6__all__ = []6__all__ = []
77
8import logging8import logging
9import random
10from unittest.mock import (9from unittest.mock import (
11 ANY,10 ANY,
12 call,11 call,
@@ -28,7 +27,6 @@
28from provisioningserver.import_images.download_descriptions import (27from provisioningserver.import_images.download_descriptions import (
29 clean_up_repo_item,28 clean_up_repo_item,
30 RepoDumper,29 RepoDumper,
31 validate_product,
32)30)
33from provisioningserver.import_images.testing.factory import (31from provisioningserver.import_images.testing.factory import (
34 make_image_spec,32 make_image_spec,
@@ -36,78 +34,6 @@
36)34)
3735
3836
39class TestValidateProduct(MAASTestCase):
40 """Tests for `validate_product`."""
41
42 def test__ignores_random(self):
43 self.assertTrue(
44 validate_product({}, factory.make_name('product_name')))
45
46 def test__validates_ubuntu(self):
47 self.assertTrue(validate_product(
48 {'os': 'ubuntu'},
49 'com.ubuntu.maas.daily:v%d:boot:%s:%s:%s' % (
50 random.choice([2, 3]), factory.make_name('version'),
51 factory.make_name('arch'), factory.make_name('sub_arch'))))
52
53 def test__rejects_unknown_ubuntu_version(self):
54 self.assertFalse(validate_product(
55 {'os': 'ubuntu'},
56 'com.ubuntu.maas.daily:v%d:boot:%s:%s:%s' % (
57 random.randint(4, 100), factory.make_name('version'),
58 factory.make_name('arch'), factory.make_name('sub_arch'))))
59
60 def test__validates_bootloaders(self):
61 acceptable_bootloaders = [
62 {
63 'os': 'pxelinux',
64 'arch': 'i386',
65 'bootloader-type': 'pxe',
66 },
67 {
68 'os': 'grub-efi-signed',
69 'arch': 'amd64',
70 'bootloader-type': 'uefi',
71 },
72 {
73 'os': 'grub-efi',
74 'arch': 'arm64',
75 'bootloader-type': 'uefi',
76 },
77 {
78 'os': 'grub-ieee1275',
79 'arch': 'ppc64el',
80 'bootloader-type': 'open-firmware',
81 },
82 ]
83 for bootloader in acceptable_bootloaders:
84 product_name = "com.ubuntu.maas.daily:1:%s:%s:%s" % (
85 bootloader['os'], bootloader['bootloader-type'],
86 bootloader['arch'])
87 self.assertTrue(
88 validate_product(bootloader, product_name),
89 "Failed to validate %s" % product_name)
90
91 def test__rejects_unknown_bootloader_version(self):
92 version = random.randint(2, 100)
93 product_name = "com.ubuntu.maas.daily:%d:pxelinux:pxe:i386" % version
94 self.assertFalse(
95 validate_product(
96 {'bootloader-type': factory.make_name('bootloader-type')},
97 product_name))
98
99 def test__rejects_unknown_bootloader(self):
100 bootloader = {
101 'os': factory.make_name('os'),
102 'arch': factory.make_name('arch'),
103 'bootloader-type': factory.make_name('bootloader_type'),
104 }
105 product_name = "com.ubuntu.maas.daily:1:%s:%s:%s" % (
106 bootloader['os'], bootloader['bootloader-type'],
107 bootloader['arch'])
108 self.assertFalse(validate_product(bootloader, product_name))
109
110
111class TestValuePassesFilterList(MAASTestCase):37class TestValuePassesFilterList(MAASTestCase):
112 """Tests for `value_passes_filter_list`."""38 """Tests for `value_passes_filter_list`."""
11339
@@ -354,10 +280,7 @@
354 download_descriptions, 'products_exdata').return_value = item280 download_descriptions, 'products_exdata').return_value = item
355 dumper.insert_item(281 dumper.insert_item(
356 sentinel.data, sentinel.src, sentinel.target,282 sentinel.data, sentinel.src, sentinel.target,
357 (283 sentinel.pedigree, sentinel.contentsource)
358 factory.make_name('product_name'),
359 factory.make_name('product_version')
360 ), sentinel.contentsource)
361 image_specs = [284 image_specs = [
362 make_image_spec(285 make_image_spec(
363 os=item['os'], release=item['release'],286 os=item['os'], release=item['release'],
@@ -383,10 +306,7 @@
383 for _ in range(2):306 for _ in range(2):
384 dumper.insert_item(307 dumper.insert_item(
385 sentinel.data, sentinel.src, sentinel.target,308 sentinel.data, sentinel.src, sentinel.target,
386 (309 sentinel.pedigree, sentinel.contentsource)
387 factory.make_name('product_name'),
388 factory.make_name('product_version')
389 ), sentinel.contentsource)
390 image_spec = make_image_spec(310 image_spec = make_image_spec(
391 os=item['os'], release=item['release'],311 os=item['os'], release=item['release'],
392 arch=item['arch'], subarch=compat_subarch,312 arch=item['arch'], subarch=compat_subarch,
@@ -417,11 +337,8 @@
417 'products_exdata').side_effect = [hwep_item, hwes_item]337 'products_exdata').side_effect = [hwep_item, hwes_item]
418 for _ in range(2):338 for _ in range(2):
419 dumper.insert_item(339 dumper.insert_item(
420 {'os': 'ubuntu'}, sentinel.src, sentinel.target,340 sentinel.data, sentinel.src, sentinel.target,
421 (341 sentinel.pedigree, sentinel.contentsource)
422 'com.ubuntu.maas.daily:v3:boot:12.04:amd64:hwe-p',
423 factory.make_name('product_version'),
424 ), sentinel.contentsource)
425 image_spec = make_image_spec(342 image_spec = make_image_spec(
426 os=os, release=release, arch=arch, subarch='generic',343 os=os, release=release, arch=arch, subarch='generic',
427 label=label)344 label=label)
@@ -451,11 +368,8 @@
451 'products_exdata').side_effect = [hwep_item, hwes_item]368 'products_exdata').side_effect = [hwep_item, hwes_item]
452 for _ in range(2):369 for _ in range(2):
453 dumper.insert_item(370 dumper.insert_item(
454 {'os': 'ubuntu'}, sentinel.src, sentinel.target,371 sentinel.data, sentinel.src, sentinel.target,
455 (372 sentinel.pedigree, sentinel.contentsource)
456 'com.ubuntu.maas.daily:v3:boot:12.04:amd64:hwe-p',
457 factory.make_name('product_version'),
458 ), sentinel.contentsource)
459 image_spec = make_image_spec(373 image_spec = make_image_spec(
460 os=os, release=release, arch=arch, subarch='generic',374 os=os, release=release, arch=arch, subarch='generic',
461 label=label)375 label=label)
@@ -464,42 +378,21 @@
464 def test_insert_item_sets_release_to_bootloader_type(self):378 def test_insert_item_sets_release_to_bootloader_type(self):
465 boot_images_dict = BootImageMapping()379 boot_images_dict = BootImageMapping()
466 dumper = RepoDumper(boot_images_dict)380 dumper = RepoDumper(boot_images_dict)
467 item, _ = self.make_item(381 bootloader_type = factory.make_name('bootloader-type')
468 arch='amd64', bootloader_type='uefi', os='grub-efi-signed')382 item, _ = self.make_item(bootloader_type=bootloader_type)
469 self.patch(383 self.patch(
470 download_descriptions, 'products_exdata').return_value = item384 download_descriptions, 'products_exdata').return_value = item
471 dumper.insert_item(385 dumper.insert_item(
472 {386 sentinel.data, sentinel.src, sentinel.target,
473 'bootloader_type': 'uefi',387 sentinel.pedigree, sentinel.contentsource)
474 'os': 'grub-efi-signed',
475 'arch': 'amd64',
476 }, sentinel.src, sentinel.target,
477 (
478 'com.ubuntu.maas.daily:1:grub-efi-signed:uefi:amd64',
479 factory.make_name('product_version'),
480 ), sentinel.contentsource)
481 image_specs = [388 image_specs = [
482 make_image_spec(389 make_image_spec(
483 os=item['os'], release='uefi', arch=item['arch'],390 os=item['os'], release=bootloader_type, arch=item['arch'],
484 subarch=subarch, kflavor='bootloader', label=item['label'])391 subarch=subarch, kflavor='bootloader', label=item['label'])
485 for subarch in item['subarches'].split(',')392 for subarch in item['subarches'].split(',')
486 ]393 ]
487 self.assertItemsEqual(image_specs, list(boot_images_dict.mapping))394 self.assertItemsEqual(image_specs, list(boot_images_dict.mapping))
488395
489 def test_insert_item_validates(self):
490 boot_images_dict = BootImageMapping()
491 dumper = RepoDumper(boot_images_dict)
492 item, _ = self.make_item(os='ubuntu')
493 self.patch(
494 download_descriptions, 'products_exdata').return_value = item
495 dumper.insert_item(
496 {'os': 'ubuntu'}, sentinel.src, sentinel.target,
497 (
498 factory.make_name('product_name'),
499 factory.make_name('product_version'),
500 ), sentinel.contentsource)
501 self.assertItemsEqual([], list(boot_images_dict.mapping))
502
503 def test_sync_does_propagate_ioerror(self):396 def test_sync_does_propagate_ioerror(self):
504 io_error = factory.make_exception_type(bases=(IOError,))397 io_error = factory.make_exception_type(bases=(IOError,))
505398

Subscribers

People subscribed via source and target branches