forked from ungleich-public/cdist
		
	finish rewrite of dependency resolver
Signed-off-by: Nico Schottelius <nico@brief.schottelius.org>
This commit is contained in:
		
					parent
					
						
							
								6a8778e595
							
						
					
				
			
			
				commit
				
					
						cd8b3cf68d
					
				
			
		
					 2 changed files with 20 additions and 41 deletions
				
			
		| 
						 | 
					@ -160,9 +160,6 @@ class ConfigInstall(object):
 | 
				
			||||||
                evil_objects = []
 | 
					                evil_objects = []
 | 
				
			||||||
                for cdist_object in objects:
 | 
					                for cdist_object in objects:
 | 
				
			||||||
                    if not cdist_object.state == cdist_object.STATE_DONE:
 | 
					                    if not cdist_object.state == cdist_object.STATE_DONE:
 | 
				
			||||||
#                        evil_objects.append({ name: cdist_object.name, 
 | 
					 | 
				
			||||||
#                            requirements: cdist_object.requirements,
 | 
					 | 
				
			||||||
#                            autorequire: cdist_object.autorequire })
 | 
					 | 
				
			||||||
                        evil_objects.append("%s (required: %s, autorequired: %s" %
 | 
					                        evil_objects.append("%s (required: %s, autorequired: %s" %
 | 
				
			||||||
                            (cdist_object.name, cdist_object.requirements, cdist_object.autorequire))
 | 
					                            (cdist_object.name, cdist_object.requirements, cdist_object.autorequire))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -211,25 +211,17 @@ class CdistObject(object):
 | 
				
			||||||
            raise cdist.Error('Error creating directories for cdist object: %s: %s' % (self, error))
 | 
					            raise cdist.Error('Error creating directories for cdist object: %s: %s' % (self, error))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def satisfied_requirements(self):
 | 
					    def satisfied_requirements(self):
 | 
				
			||||||
 | 
					        """Return state whether all of our dependencies have been resolved already"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        satisfied = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					        for requirement in self.all_requirements():
 | 
				
			||||||
    def dependencies(self):
 | 
					            if not requirement.state == self.STATE_DONE:
 | 
				
			||||||
        """Build the dependency graph.
 | 
					                satisfied = False
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return satisfied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Returns a dict where the keys are the object names and the values are
 | 
					 | 
				
			||||||
        lists of all dependencies including the key object itself.
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        if self._dependencies is None:
 | 
					 | 
				
			||||||
            log.info("Resolving dependencies...")
 | 
					 | 
				
			||||||
            self._dependencies = d = {}
 | 
					 | 
				
			||||||
            self._preprocess_requirements()
 | 
					 | 
				
			||||||
            for name,cdist_object in self.objects.items():
 | 
					 | 
				
			||||||
                resolved = []
 | 
					 | 
				
			||||||
                unresolved = []
 | 
					 | 
				
			||||||
                self._resolve_object_dependencies(cdist_object, resolved, unresolved)
 | 
					 | 
				
			||||||
                d[name] = resolved
 | 
					 | 
				
			||||||
        return self._dependencies
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def find_requirements_by_name(self, requirements):
 | 
					    def find_requirements_by_name(self, requirements):
 | 
				
			||||||
        """Takes a list of requirement patterns and returns a list of matching object instances.
 | 
					        """Takes a list of requirement patterns and returns a list of matching object instances.
 | 
				
			||||||
| 
						 | 
					@ -239,7 +231,8 @@ class CdistObject(object):
 | 
				
			||||||
        find_requirements_by_name(['__type/object_id', '__other_type/*']) -> 
 | 
					        find_requirements_by_name(['__type/object_id', '__other_type/*']) -> 
 | 
				
			||||||
            [<Object __type/object_id>, <Object __other_type/any>, <Object __other_type/match>]
 | 
					            [<Object __type/object_id>, <Object __other_type/any>, <Object __other_type/match>]
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        object_names = self.objects.keys()
 | 
					
 | 
				
			||||||
 | 
					        object_names = self.list_object_namess(self.base_path)
 | 
				
			||||||
        for pattern in requirements:
 | 
					        for pattern in requirements:
 | 
				
			||||||
            found = False
 | 
					            found = False
 | 
				
			||||||
            for requirement in fnmatch.filter(object_names, pattern):
 | 
					            for requirement in fnmatch.filter(object_names, pattern):
 | 
				
			||||||
| 
						 | 
					@ -253,28 +246,17 @@ class CdistObject(object):
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    raise RequirementNotFoundError(pattern)
 | 
					                    raise RequirementNotFoundError(pattern)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _preprocess_requirements(self):
 | 
					    def all_requirements(self):
 | 
				
			||||||
        """Find all autorequire dependencies and merge them to be just requirements
 | 
					 | 
				
			||||||
        for further processing.
 | 
					 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        for cdist_object in self.objects.values():
 | 
					        Return resolved autorequirements and requirements so that
 | 
				
			||||||
            if cdist_object.autorequire:
 | 
					        a complete list of requirements is returned
 | 
				
			||||||
                # The objects (children) that this cdist_object (parent) defined
 | 
					        """
 | 
				
			||||||
                # in it's type manifest shall inherit all explicit requirements 
 | 
					
 | 
				
			||||||
                # that the parent has so that user defined requirements are 
 | 
					        all_requirements = []
 | 
				
			||||||
                # fullfilled and processed in the expected order.
 | 
					        all_requirements.extend(self.find_requirements_by_name(self.requirements))
 | 
				
			||||||
                for auto_requirement in self.find_requirements_by_name(cdist_object.autorequire):
 | 
					        all_requirements.extend(self.find_requirements_by_name(self.autorequire))
 | 
				
			||||||
                    for requirement in cdist_object.requirements:
 | 
					
 | 
				
			||||||
                        if requirement not in auto_requirement.requirements:
 | 
					        return unique(all_requirements)
 | 
				
			||||||
                            auto_requirement.requirements.append(requirement)
 | 
					 | 
				
			||||||
                # On the other hand the parent shall depend on all the children
 | 
					 | 
				
			||||||
                # it created so that the user can setup dependencies on it as a 
 | 
					 | 
				
			||||||
                # whole without having to know anything about the parents 
 | 
					 | 
				
			||||||
                # internals.
 | 
					 | 
				
			||||||
                cdist_object.requirements.extend(cdist_object.autorequire)
 | 
					 | 
				
			||||||
                # As we changed the object on disc, we have to ensure it is not 
 | 
					 | 
				
			||||||
                # preprocessed again if someone would call us multiple times.
 | 
					 | 
				
			||||||
                cdist_object.autorequire = []
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class CircularReferenceError(cdist.Error):
 | 
					class CircularReferenceError(cdist.Error):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue