def test_merging_plain_descriptors(): desc1 = MockedDescriptor({'name': 'foo', 'a': 1, 'b': 2}) desc2 = MockedDescriptor({'name': 'foo', 'b': 5, 'c': 3}) expected = MockedDescriptor({'name': 'foo', 'a': 1, 'b': 2, 'c': 3}) assert expected == _merge_descriptors(desc1, desc2) assert expected.items() == _merge_descriptors(desc1, desc2).items()
def test_merging_description_override(): desc1 = Image({'name': 'foo', 'version': 1}, None) desc2 = Overrides({'name': 'mod1', 'description': 'mod_desc'}, None) merged = _merge_descriptors(desc2, desc1) assert 'description' in merged
def test_merging_description_modules(): desc1 = Module({'name': 'foo'}, None, None) desc2 = Module({'name': 'mod1', 'description': 'mod_desc'}, None, None) merged = _merge_descriptors(desc1, desc2) assert 'description' not in merged
def test_merging_description_image(): desc1 = Image({'name': 'foo', 'version': 1}, None) desc2 = Module({ 'name': 'mod1', 'version': 2, 'description': 'mod_desc' }, None, None) merged = _merge_descriptors(desc1, desc2) assert 'description' not in merged
def test_merging_emdedded_descriptors(): desc1 = TestDescriptor({'name': 'a', 'a': 1, 'b': {'name': 'b', 'b1': 10, 'b2': 20}}) desc2 = TestDescriptor({'b': {'name': 'b', 'b2': 50, 'b3': 30}, 'c': {'name': 'c'}}) expected = TestDescriptor({'name': 'a', 'a': 1, 'b': {'name': 'b', 'b1': 10, 'b2': 20, 'b3': 30}, 'c': {'name': 'c'}}) assert expected == _merge_descriptors(desc1, desc2)
def apply_image_overrides(self, overrides): """ Applies overrides to the image descriptor. """ if not overrides: return for override in overrides: if override.name: self.name = override.name if override.version: self.version = override.version if override.base: self.base = override.base if override.description: self.description = override.description labels = Image._to_dict(self.labels) for label in override.labels: name = label.name if name in labels: labels[name] = label.merge(labels[name]) else: labels[name] = label self._descriptor['labels'] = list(labels.values()) envs = Image._to_dict(self.envs) for env in override.envs: name = env.name if name in envs: envs[name] = env.merge(envs[name]) else: envs[name] = env self._descriptor['envs'] = list(envs.values()) ports = Image._to_dict(self.ports) for port in override.ports: name = port.value if name in ports: ports[name] = port.merge(ports[name]) else: ports[name] = port self._descriptor['ports'] = list(ports.values()) module_repositories = Image._to_dict(self.modules.repositories) for repository in override.modules.repositories: name = repository.name if name in module_repositories: module_repositories[name] = repository.merge( module_repositories[name]) else: module_repositories[name] = repository self.modules._descriptor['repositories'] = list( module_repositories.values()) package_repositories = Image._to_dict(self.packages.repositories) for repository in override.packages.repositories: name = repository.name if name in package_repositories: package_repositories[name] = repository.merge( package_repositories[name]) else: package_repositories[name] = repository self.packages._descriptor['repositories'] = list( package_repositories.values()) if override.packages.manager: self.packages._descriptor[ 'manager'] = override.packages.manager # If the key is set (value could be None!) if 'content_sets' in override.packages: # If value is different than None, merge it if override.packages.content_sets: self.packages.content_sets = _merge_descriptors( override.packages.content_sets, self.packages.content_sets) else: # If key exists and value is None - remove it from the main packages section self.packages._descriptor.pop('content_sets', None) # If the key is set (value could be None!) if 'content_sets_file' in override.packages: # If value is different than None, set it if override.packages.content_sets_file: self.packages.content_sets_file = override.packages.content_sets_file else: # If key exists and value is None - remove it from the main packages section # Remove 'content_sets' too, because this is where it should already be translated into self.packages._descriptor.pop('content_sets_file', None) self.packages._descriptor.pop('content_sets', None) if override.osbs != None: self.osbs = override.osbs.merge(self.osbs) for package in override.packages.install: if package not in self.packages.install: self.packages.install.append(package) artifact_overrides = self._image_overrides['artifacts'] image_artifacts = Image._to_dict(self.artifacts) for artifact in override.artifacts: name = artifact.name # collect override so we can apply it to modules artifact_overrides[name] = artifact # add it to the list of everything self._all_artifacts[name] = artifact # Apply override to image descriptor image_artifacts[name] = artifact self._descriptor['artifacts'] = list(image_artifacts.values()) module_overrides = self._image_overrides['modules'] image_modules = Image._to_dict(self.modules.install) for module in override.modules.install: name = module.name # collect override so we can apply it to modules. # this allows us to override module versions without affecting ordering. module_overrides[name] = module # Apply override to image descriptor # If the module does not exists in the original descriptor, add it there image_modules[name] = module self.modules._descriptor['install'] = list(image_modules.values()) if override.run != None: if self.run: self.run = override.run.merge(self.run) else: self.run = override.run