def make_filter_from_image(self, image_spec=None):
        """Create a filter dict that matches the given `ImageSpec`.

        If `image_spec` is not given, creates a random value.
        """
        if image_spec is None:
            image_spec = make_image_spec()
        return {
            "os": image_spec.os,
            "arches": [image_spec.arch],
            "subarches": [image_spec.subarch],
            "release": image_spec.release,
            "labels": [image_spec.label],
        }
Example #2
0
 def test_filter_checks_labels(self):
     image = make_image_spec()
     self.assertFalse(
         download_descriptions.image_passes_filter(
             [
                 self.make_filter_from_image(
                     image._replace(label=factory.make_name("other-label")))
             ],
             image.os,
             image.arch,
             image.subarch,
             image.release,
             image.label,
         ))
Example #3
0
 def test_maps_boot_resource_by_content_id_product_name_and_version(self):
     image = make_image_spec()
     resource = make_boot_resource()
     boot_dict = set_resource(resource=resource.copy(), image_spec=image)
     self.assertEqual(
         {
             (
                 resource["content_id"],
                 resource["product_name"],
                 resource["version_name"],
             ): [image.subarch]
         },
         map_products(boot_dict).mapping,
     )
 def test_image_passes_if_one_filter_matches(self):
     image = make_image_spec()
     self.assertTrue(
         download_descriptions.image_passes_filter(
             [
                 self.make_filter_from_image(),
                 self.make_filter_from_image(image),
                 self.make_filter_from_image(),
             ],
             image.os,
             image.arch,
             image.subarch,
             image.release,
             image.label,
         ))
Example #5
0
 def setUp(self):
     super(TestMain, self).setUp()
     self.useFixture(ClusterConfigurationFixture())
     self.storage = self.make_dir()
     current_dir = os.path.join(self.storage, 'current') + os.sep
     os.makedirs(current_dir)
     with ClusterConfiguration.open_for_update() as config:
         config.tftp_root = current_dir
     os.rmdir(current_dir)
     # Forcing arch to amd64 causes pxelinux.0 to be installed, giving more
     # test coverage.
     self.image = make_image_spec(arch='amd64')
     self.os, self.arch, self.subarch, self.kflavor, \
         self.release, self.label = self.image
     self.repo = self.make_simplestreams_repo(self.image)
 def test_insert_item_sets_generic_to_release_item_for_hwe_version(self):
     boot_images_dict = BootImageMapping()
     dumper = RepoDumper(boot_images_dict)
     os = "ubuntu"
     release = "xenial"
     arch = "amd64"
     label = "release"
     hwep_subarch = "hwe-16.04"
     hwep_subarches = ["generic", "hwe-16.04", "hwe-16.10"]
     hwes_subarch = "hwe-16.10"
     hwes_subarches = ["generic", "hwe-16.04", "hwe-16.10"]
     hwep_item, compat_item = self.make_item(
         os=os,
         release=release,
         arch=arch,
         subarch=hwep_subarch,
         subarches=hwep_subarches,
         label=label,
     )
     hwes_item, _ = self.make_item(
         os=os,
         release=release,
         arch=arch,
         subarch=hwes_subarch,
         subarches=hwes_subarches,
         label=label,
     )
     self.patch(download_descriptions, "products_exdata").side_effect = [
         hwep_item,
         hwes_item,
     ]
     for _ in range(2):
         dumper.insert_item(
             {"os": "ubuntu"},
             sentinel.src,
             sentinel.target,
             (
                 "com.ubuntu.maas.daily:v3:boot:12.04:amd64:hwe-p",
                 factory.make_name("product_version"),
             ),
             sentinel.contentsource,
         )
     image_spec = make_image_spec(os=os,
                                  release=release,
                                  arch=arch,
                                  subarch="generic",
                                  label=label)
     self.assertEqual(compat_item, boot_images_dict.mapping[image_spec])
Example #7
0
 def test_dump_json_represents_entry(self):
     image = make_image_spec()
     resource = factory.make_name('resource')
     image_dict = set_resource(image_spec=image, resource=resource)
     self.assertEqual(
         {
             image.os: {
                 image.arch: {
                     image.subarch: {
                         image.kflavor: {
                             image.release: {image.label: resource},
                         },
                     },
                 },
             },
         },
         json.loads(image_dict.dump_json()))
Example #8
0
    def test_extract_metadata_handles_missing_subarch(self):
        resource = dict(other_item=factory.make_name("other"), )
        image = make_image_spec()
        mapping = set_resource(image_spec=image, resource=resource)
        metadata = mapping.dump_json()

        # Lack of consistency across maas in naming arch vs architecture
        # and subarch vs subarchitecture means I can't just do a simple
        # dict parameter expansion here.
        params = {
            "osystem": image.os,
            "architecture": image.arch,
            "subarchitecture": image.subarch,
            "release": image.release,
            "label": image.label,
        }
        self.assertEqual({}, extract_metadata(metadata, params))
Example #9
0
 def test_insert_item_adds_item_per_subarch(self):
     boot_images_dict = BootImageMapping()
     dumper = RepoDumper(boot_images_dict)
     subarches = [factory.make_name('subarch') for _ in range(3)]
     item, _ = self.make_item(subarch=subarches.pop(), subarches=subarches)
     self.patch(download_descriptions,
                'products_exdata').return_value = item
     dumper.insert_item(sentinel.data, sentinel.src, sentinel.target,
                        (factory.make_name('product_name'),
                         factory.make_name('product_version')),
                        sentinel.contentsource)
     image_specs = [
         make_image_spec(os=item['os'],
                         release=item['release'],
                         arch=item['arch'],
                         subarch=subarch,
                         label=item['label']) for subarch in subarches
     ]
     self.assertItemsEqual(image_specs, list(boot_images_dict.mapping))
Example #10
0
 def test_insert_item_doesnt_validate_when_instructed(self):
     boot_images_dict = BootImageMapping()
     dumper = RepoDumper(boot_images_dict, validate_products=False)
     item, _ = self.make_item(os='ubuntu')
     self.patch(download_descriptions,
                'products_exdata').return_value = item
     dumper.insert_item({'os': 'ubuntu'}, sentinel.src, sentinel.target, (
         factory.make_name('product_name'),
         factory.make_name('product_version'),
     ), sentinel.contentsource)
     image_specs = [
         make_image_spec(os=item['os'],
                         release=item['release'],
                         arch=item['arch'],
                         subarch=subarch,
                         label=item['label'])
         for subarch in item['subarches'].split(',')
     ]
     self.assertItemsEqual(image_specs, list(boot_images_dict.mapping))
Example #11
0
 def test_dump_json_combines_similar_entries(self):
     image = make_image_spec()
     other_release = factory.make_name('other-release')
     resource1 = factory.make_name('resource')
     resource2 = factory.make_name('other-resource')
     image_dict = BootImageMapping()
     set_resource(image_dict, image, resource1)
     set_resource(
         image_dict, image._replace(release=other_release), resource2)
     self.assertEqual(
         {
             image.os: {
                 image.arch: {
                     image.subarch: {
                         image.kflavor: {
                             image.release: {image.label: resource1},
                             other_release: {image.label: resource2},
                         },
                     },
                 },
             },
         },
         json.loads(image_dict.dump_json()))
 def test_insert_item_sets_compat_item_specific_to_subarch(self):
     boot_images_dict = BootImageMapping()
     dumper = RepoDumper(boot_images_dict)
     subarches = [factory.make_name("subarch") for _ in range(5)]
     compat_subarch = subarches.pop()
     item, _ = self.make_item(subarch=subarches.pop(), subarches=subarches)
     second_item, compat_item = self.make_item(
         os=item["os"],
         release=item["release"],
         arch=item["arch"],
         subarch=compat_subarch,
         subarches=[compat_subarch],
         label=item["label"],
     )
     self.patch(download_descriptions, "products_exdata").side_effect = [
         item,
         second_item,
     ]
     for _ in range(2):
         dumper.insert_item(
             sentinel.data,
             sentinel.src,
             sentinel.target,
             (
                 factory.make_name("product_name"),
                 factory.make_name("product_version"),
             ),
             sentinel.contentsource,
         )
     image_spec = make_image_spec(
         os=item["os"],
         release=item["release"],
         arch=item["arch"],
         subarch=compat_subarch,
         label=item["label"],
     )
     self.assertEqual(compat_item, boot_images_dict.mapping[image_spec])
Example #13
0
 def test_insert_item_sets_generic_to_release_item_for_hwe_version(self):
     boot_images_dict = BootImageMapping()
     dumper = RepoDumper(boot_images_dict)
     os = 'ubuntu'
     release = 'xenial'
     arch = 'amd64'
     label = 'release'
     hwep_subarch = 'hwe-16.04'
     hwep_subarches = ['generic', 'hwe-16.04', 'hwe-16.10']
     hwes_subarch = 'hwe-16.10'
     hwes_subarches = ['generic', 'hwe-16.04', 'hwe-16.10']
     hwep_item, compat_item = self.make_item(os=os,
                                             release=release,
                                             arch=arch,
                                             subarch=hwep_subarch,
                                             subarches=hwep_subarches,
                                             label=label)
     hwes_item, _ = self.make_item(os=os,
                                   release=release,
                                   arch=arch,
                                   subarch=hwes_subarch,
                                   subarches=hwes_subarches,
                                   label=label)
     self.patch(download_descriptions,
                'products_exdata').side_effect = [hwep_item, hwes_item]
     for _ in range(2):
         dumper.insert_item(
             {'os': 'ubuntu'}, sentinel.src, sentinel.target, (
                 'com.ubuntu.maas.daily:v3:boot:12.04:amd64:hwe-p',
                 factory.make_name('product_version'),
             ), sentinel.contentsource)
     image_spec = make_image_spec(os=os,
                                  release=release,
                                  arch=arch,
                                  subarch='generic',
                                  label=label)
     self.assertEqual(compat_item, boot_images_dict.mapping[image_spec])
Example #14
0
    def test_extract_metadata(self):
        resource = dict(
            subarches=factory.make_name("subarch"),
            other_item=factory.make_name("other"),
        )
        image = make_image_spec(kflavor='generic')
        mapping = set_resource(image_spec=image, resource=resource)
        metadata = mapping.dump_json()

        # Lack of consistency across maas in naming arch vs architecture
        # and subarch vs subarchitecture means I can't just do a simple
        # dict parameter expansion here.
        params = {
            "osystem": image.os,
            "architecture": image.arch,
            "subarchitecture": image.subarch,
            "release": image.release,
            "label": image.label,
        }
        extracted_data = extract_metadata(metadata, params)

        # We only expect the supported_subarches key from the resource data.
        expected = dict(supported_subarches=resource["subarches"])
        self.assertEqual(expected, extracted_data)
Example #15
0
 def test_setdefault_sets_unset_item(self):
     image_dict = BootImageMapping()
     image = make_image_spec()
     resource = factory.make_name("resource")
     image_dict.setdefault(image, resource)
     self.assertItemsEqual([(image, resource)], image_dict.items())
Example #16
0
 def test_image_does_not_pass_nonmatching_filter(self):
     image = make_image_spec()
     self.assertFalse(
         download_descriptions.image_passes_filter(
             [self.make_filter_from_image()], image.os, image.arch,
             image.subarch, image.release, image.label))
 def test_any_image_passes_empty_filter(self):
     os, arch, subarch, kflavor, release, label = make_image_spec()
     self.assertTrue(
         download_descriptions.image_passes_filter([], os, arch, subarch,
                                                   release, label))
 def test_any_image_passes_none_filter(self):
     os, arch, subarch, _, release, label = make_image_spec()
     self.assertTrue(
         download_descriptions.image_passes_filter(None, os, arch, subarch,
                                                   release, label))
Example #19
0
 def test_dump_json_is_consistent(self):
     image = make_image_spec()
     resource = factory.make_name("resource")
     image_dict_1 = set_resource(image_spec=image, resource=resource)
     image_dict_2 = set_resource(image_spec=image, resource=resource)
     self.assertEqual(image_dict_1.dump_json(), image_dict_2.dump_json())
Example #20
0
 def test_setdefault_leaves_set_item_unchanged(self):
     image = make_image_spec()
     old_resource = factory.make_name("resource")
     image_dict = set_resource(image_spec=image, resource=old_resource)
     image_dict.setdefault(image, factory.make_name("newresource"))
     self.assertItemsEqual([(image, old_resource)], image_dict.items())
Example #21
0
 def test_is_empty_returns_False_if_not_empty(self):
     mapping = BootImageMapping()
     mapping.setdefault(make_image_spec(), factory.make_name("resource"))
     self.assertFalse(mapping.is_empty())
Example #22
0
 def test_items_returns_items(self):
     image = make_image_spec()
     resource = factory.make_name("resource")
     image_dict = set_resource(image_spec=image, resource=resource)
     self.assertItemsEqual([(image, resource)], image_dict.items())