forked from ungleich-public/cdist
		
	try new object orientated (hrrr) code instead of stage based
Signed-off-by: Nico Schottelius <nico@bento.schottelius.org>
This commit is contained in:
		
					parent
					
						
							
								d8630dc6d4
							
						
					
				
			
			
				commit
				
					
						a064cc19b3
					
				
			
		
					 3 changed files with 122 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
#!/usr/bin/env python3
 | 
			
		||||
# -*- coding: utf-8 -*-
 | 
			
		||||
#
 | 
			
		||||
# 2010-2012 Nico Schottelius (nico-cdist at schottelius.org)
 | 
			
		||||
# 2010-2013 Nico Schottelius (nico-cdist at schottelius.org)
 | 
			
		||||
#
 | 
			
		||||
# This file is part of cdist.
 | 
			
		||||
#
 | 
			
		||||
| 
						 | 
				
			
			@ -65,8 +65,13 @@ class ConfigInstall(object):
 | 
			
		|||
 | 
			
		||||
    def deploy_to(self):
 | 
			
		||||
        """Mimic the old deploy to: Deploy to one host"""
 | 
			
		||||
        self.stage_prepare()
 | 
			
		||||
        self.stage_run()
 | 
			
		||||
 | 
			
		||||
        # Old Code
 | 
			
		||||
        # self.stage_prepare()
 | 
			
		||||
        # self.stage_run()
 | 
			
		||||
 | 
			
		||||
        # New Code
 | 
			
		||||
        self.run()
 | 
			
		||||
 | 
			
		||||
    def deploy_and_cleanup(self):
 | 
			
		||||
        """Do what is most often done: deploy & cleanup"""
 | 
			
		||||
| 
						 | 
				
			
			@ -76,6 +81,62 @@ class ConfigInstall(object):
 | 
			
		|||
        self.log.info("Finished successful run in %s seconds",
 | 
			
		||||
            time.time() - start_time)
 | 
			
		||||
 | 
			
		||||
    ###################################################################### 
 | 
			
		||||
    # New code for running on object priority (not stage priority)
 | 
			
		||||
    #
 | 
			
		||||
 | 
			
		||||
    def run(self):
 | 
			
		||||
        """The main runner"""
 | 
			
		||||
        self.explorer.run_global_explorers(self.context.local.global_explorer_out_path)
 | 
			
		||||
        self.manifest.run_initial_manifest(self.context.initial_manifest)
 | 
			
		||||
        self.iterate_until_finished()
 | 
			
		||||
 | 
			
		||||
    def object_list(self):
 | 
			
		||||
        """Short name for object list retrieval"""
 | 
			
		||||
        for cdist_object in core.CdistObject.list_objects(self.context.local.object_path,
 | 
			
		||||
                                                         self.context.local.type_path):
 | 
			
		||||
            yield cdist_object
 | 
			
		||||
 | 
			
		||||
    def iterate_until_finished(self):
 | 
			
		||||
        # Continue process until no new objects are created anymore
 | 
			
		||||
 | 
			
		||||
        objects_changed = True
 | 
			
		||||
 | 
			
		||||
        while objects_changed:
 | 
			
		||||
            objects_changed  = False
 | 
			
		||||
 | 
			
		||||
            for cdist_object in self.object_list():
 | 
			
		||||
                if not cdist_object.requirements_satisfied(cdist_object.requirements):
 | 
			
		||||
                    """We cannot do anything for this poor object"""
 | 
			
		||||
                    continue
 | 
			
		||||
 | 
			
		||||
                if cdist_object.state == core.CdistObject.STATE_UNDEF:
 | 
			
		||||
                    """Prepare the virgin object"""
 | 
			
		||||
 | 
			
		||||
                    self.object_prepare(cdist_object)
 | 
			
		||||
                    objects_changed = True
 | 
			
		||||
 | 
			
		||||
                if not cdist_object.requirements_satisfied(cdist_object.autorequire):
 | 
			
		||||
                    """The previous step created objects we depend on - wait for them"""
 | 
			
		||||
                    continue
 | 
			
		||||
 | 
			
		||||
                if cdist_object.state == core.CdistObject.STATE_PREPARED:
 | 
			
		||||
                    self.object_run(cdist_object)
 | 
			
		||||
 | 
			
		||||
        # Check whether all objects have been finished
 | 
			
		||||
        unfinished_object_names = []
 | 
			
		||||
        for cdist_object in self.object_list():
 | 
			
		||||
            if not cdist_object.state == cdist_object.STATE_DONE:
 | 
			
		||||
            unfinished_object_names.append(cdist_object.name)
 | 
			
		||||
 | 
			
		||||
        if unfinished_object_names:
 | 
			
		||||
            raise cdist.Error("The following objects could not be resolved: %s" %
 | 
			
		||||
                (" ".join(unfinished_object_names))
 | 
			
		||||
 | 
			
		||||
    ###################################################################### 
 | 
			
		||||
    # Stages based code
 | 
			
		||||
    #
 | 
			
		||||
 | 
			
		||||
    def stage_prepare(self):
 | 
			
		||||
        """Do everything for a deploy, minus the actual code stage"""
 | 
			
		||||
        self.explorer.run_global_explorers(self.context.local.global_explorer_out_path)
 | 
			
		||||
| 
						 | 
				
			
			@ -89,6 +150,7 @@ class ConfigInstall(object):
 | 
			
		|||
            new_objects_created = False
 | 
			
		||||
            for cdist_object in core.CdistObject.list_objects(self.context.local.object_path,
 | 
			
		||||
                                                         self.context.local.type_path):
 | 
			
		||||
 | 
			
		||||
                if cdist_object.state == core.CdistObject.STATE_PREPARED:
 | 
			
		||||
                    self.log.debug("Skipping re-prepare of object %s", cdist_object)
 | 
			
		||||
                    continue
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,6 +61,7 @@ class CdistObject(object):
 | 
			
		|||
    """
 | 
			
		||||
 | 
			
		||||
    # Constants for use with Object.state
 | 
			
		||||
    STATE_UNDEF = ""
 | 
			
		||||
    STATE_PREPARED = "prepared"
 | 
			
		||||
    STATE_RUNNING = "running"
 | 
			
		||||
    STATE_DONE = "done"
 | 
			
		||||
| 
						 | 
				
			
			@ -223,6 +224,23 @@ class CdistObject(object):
 | 
			
		|||
        except EnvironmentError as error:
 | 
			
		||||
            raise cdist.Error('Error creating directories for cdist object: %s: %s' % (self, error))
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def requirements_satisfied(self):
 | 
			
		||||
        """Return state whether normal depedencies are satisfied"""
 | 
			
		||||
 | 
			
		||||
        satisfied = True
 | 
			
		||||
 | 
			
		||||
        for requirement in self.requirements:
 | 
			
		||||
            cdist_object = self.object_from_name(requirement)
 | 
			
		||||
 | 
			
		||||
            if not cdist_object.state == self.STATE_DONE:
 | 
			
		||||
                satisfied = False
 | 
			
		||||
                break
 | 
			
		||||
 | 
			
		||||
        log.debug("%s is satisfied: %s" % (self.name, satisfied))
 | 
			
		||||
 | 
			
		||||
        return satisfied
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def satisfied_requirements(self):
 | 
			
		||||
        """Return state whether all of our dependencies have been resolved already"""
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										39
									
								
								docs/dev/logs/2013-04-12.execution-order
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								docs/dev/logs/2013-04-12.execution-order
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,39 @@
 | 
			
		|||
Old:
 | 
			
		||||
 | 
			
		||||
- global explores (all)
 | 
			
		||||
- initial manifest
 | 
			
		||||
- for each object
 | 
			
		||||
    execute type explorers
 | 
			
		||||
    execute manifest
 | 
			
		||||
 | 
			
		||||
    continue until all objects (including newly created)
 | 
			
		||||
    have their type explorers/manifests run
 | 
			
		||||
- build dependency tree
 | 
			
		||||
- for each object
 | 
			
		||||
    execute gencode-*
 | 
			
		||||
    execute code-*
 | 
			
		||||
 | 
			
		||||
New:
 | 
			
		||||
- run all global explorers
 | 
			
		||||
- run initial manifest
 | 
			
		||||
    creates zero or more cdist_objects
 | 
			
		||||
- for each cdist_object
 | 
			
		||||
    if not cdist_object.has_unfullfilled_requirements:
 | 
			
		||||
        execute type explorers
 | 
			
		||||
        execute manifest
 | 
			
		||||
            may create new objects, resulting in autorequirements
 | 
			
		||||
 | 
			
		||||
            # Gained requirements during manifest run
 | 
			
		||||
            if object.has_auto_requirements():
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
    cdist_object.execute gencode-*
 | 
			
		||||
    cdist_object.execute code-*
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Requirements / Test cases for requirments / resolver:
 | 
			
		||||
 | 
			
		||||
    - omnipotence
 | 
			
		||||
    - 
 | 
			
		||||
 | 
			
		||||
Test
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue