add dry_run option to object_run
Signed-off-by: Nico Schottelius <nico@brief.schottelius.org>
This commit is contained in:
		
					parent
					
						
							
								eb93d1bebd
							
						
					
				
			
			
				commit
				
					
						c270538072
					
				
			
		
					 1 changed files with 56 additions and 34 deletions
				
			
		| 
						 | 
					@ -104,11 +104,10 @@ class ConfigInstall(object):
 | 
				
			||||||
        self.manifest.run_type_manifest(cdist_object)
 | 
					        self.manifest.run_type_manifest(cdist_object)
 | 
				
			||||||
        cdist_object.state = core.CdistObject.STATE_PREPARED
 | 
					        cdist_object.state = core.CdistObject.STATE_PREPARED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def object_run(self, cdist_object):
 | 
					    def object_run(self, cdist_object, dry_run=False):
 | 
				
			||||||
        """Run gencode and code for an object"""
 | 
					        """Run gencode and code for an object"""
 | 
				
			||||||
        self.log.debug("Trying to run object " + cdist_object.name)
 | 
					        self.log.debug("Trying to run object " + cdist_object.name)
 | 
				
			||||||
        if cdist_object.state == core.CdistObject.STATE_DONE:
 | 
					        if cdist_object.state == core.CdistObject.STATE_DONE:
 | 
				
			||||||
            # TODO: remove once we are sure that this really never happens.
 | 
					 | 
				
			||||||
            raise cdist.Error("Attempting to run an already finished object: %s", cdist_object)
 | 
					            raise cdist.Error("Attempting to run an already finished object: %s", cdist_object)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        cdist_type = cdist_object.cdist_type
 | 
					        cdist_type = cdist_object.cdist_type
 | 
				
			||||||
| 
						 | 
					@ -121,51 +120,74 @@ class ConfigInstall(object):
 | 
				
			||||||
            cdist_object.changed = True
 | 
					            cdist_object.changed = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Execute
 | 
					        # Execute
 | 
				
			||||||
        if cdist_object.code_local:
 | 
					        if not dry_run:
 | 
				
			||||||
            self.code.run_code_local(cdist_object)
 | 
					            if cdist_object.code_local:
 | 
				
			||||||
        if cdist_object.code_remote:
 | 
					                self.code.run_code_local(cdist_object)
 | 
				
			||||||
            self.code.transfer_code_remote(cdist_object)
 | 
					            if cdist_object.code_remote:
 | 
				
			||||||
            self.code.run_code_remote(cdist_object)
 | 
					                self.code.transfer_code_remote(cdist_object)
 | 
				
			||||||
 | 
					                self.code.run_code_remote(cdist_object)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Mark this object as done
 | 
					        # Mark this object as done
 | 
				
			||||||
        self.log.debug("Finishing run of " + cdist_object.name)
 | 
					        self.log.debug("Finishing run of " + cdist_object.name)
 | 
				
			||||||
        cdist_object.state = core.CdistObject.STATE_DONE
 | 
					        cdist_object.state = core.CdistObject.STATE_DONE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def stage_run_prepare(self):
 | 
				
			||||||
 | 
					        """Prepare the run stage"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.objects = core.CdistObject.list_objects(
 | 
				
			||||||
 | 
					            self.local.object_path,
 | 
				
			||||||
 | 
					            self.local.type_path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.all_resolved = False
 | 
				
			||||||
 | 
					        self.objects_changed = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        print("srp: %s - %s objects: %s" % (self.local.object_path, self.local.type_path, list(self.objects)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def stage_run(self):
 | 
					    def stage_run(self):
 | 
				
			||||||
        """The final (and real) step of deployment"""
 | 
					        """The final (and real) step of deployment"""
 | 
				
			||||||
        self.log.info("Generating and executing code")
 | 
					        self.log.info("Generating and executing code")
 | 
				
			||||||
 | 
					        self.stage_run_prepare()
 | 
				
			||||||
        objects = core.CdistObject.list_objects(
 | 
					 | 
				
			||||||
            self.local.object_path,
 | 
					 | 
				
			||||||
            self.local.type_path)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # FIXME:
 | 
					        # FIXME:
 | 
				
			||||||
        # - think about parallel execution (same for stage_prepare)
 | 
					        # - think about parallel execution (same for stage_prepare)
 | 
				
			||||||
        # - catch unresolvable trees
 | 
					        # - catch unresolvable trees
 | 
				
			||||||
        all_resolved = False
 | 
					        while not self.all_resolved:
 | 
				
			||||||
        objects_changed = False
 | 
					            self.stage_run_iterate()
 | 
				
			||||||
        while not all_resolved:
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            object_state_list=' '.join('%s:%s:%s' % (o, o.state, o.all_requirements()) for o in objects)
 | 
					    def stage_run_iterate(self):
 | 
				
			||||||
            self.log.debug("Object state (name:state:requirements): %s" % object_state_list)
 | 
					        logging.root.setLevel(logging.DEBUG)
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        Run one iteration of the run
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            all_resolved = True
 | 
					        To be repeated until all objects are done
 | 
				
			||||||
            for cdist_object in objects:
 | 
					        """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        object_state_list=' '.join('%s:%s:%s' % (o, o.state, o.all_requirements()) for o in self.objects)
 | 
				
			||||||
 | 
					        self.log.debug("Object state (name:state:requirements): %s" % object_state_list)
 | 
				
			||||||
 | 
					        print("Object state (name:state:requirements): %s" % object_state_list)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.all_resolved = True
 | 
				
			||||||
 | 
					        for cdist_object in self.objects:
 | 
				
			||||||
 | 
					            if not cdist_object.state == cdist_object.STATE_DONE:
 | 
				
			||||||
 | 
					                self.all_resolved = False
 | 
				
			||||||
 | 
					                if cdist_object.satisfied_requirements:
 | 
				
			||||||
 | 
					                    self.object_run(cdist_object)
 | 
				
			||||||
 | 
					                    self.objects_changed = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Not all are resolved, but nothing has been changed => bad dependencies!
 | 
				
			||||||
 | 
					        if not self.objects_changed and not self.all_resolved:
 | 
				
			||||||
 | 
					            # Create list of unfinished objects + their requirements for print
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            evil_objects = []
 | 
				
			||||||
 | 
					            good_objects = []
 | 
				
			||||||
 | 
					            for cdist_object in self.objects:
 | 
				
			||||||
                if not cdist_object.state == cdist_object.STATE_DONE:
 | 
					                if not cdist_object.state == cdist_object.STATE_DONE:
 | 
				
			||||||
                    all_resolved = False
 | 
					                    evil_objects.append("%s: required: %s, autorequired: %s" %
 | 
				
			||||||
                    if cdist_object.satisfied_requirements:
 | 
					                        (cdist_object.name, cdist_object.requirements, cdist_object.autorequire))
 | 
				
			||||||
                        self.object_run(cdist_object)
 | 
					                else:
 | 
				
			||||||
                        objects_changed = True
 | 
					                    evil_objects.append("%s (%s): required: %s, autorequired: %s" %
 | 
				
			||||||
 | 
					                        (cdist_object.state, cdist_object.name, 
 | 
				
			||||||
 | 
					                        cdist_object.requirements, cdist_object.autorequire))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # Reran, but no object was solved
 | 
					            errormessage = "Cannot solve requirements for the following objects: %s - solved: %s" % (",".join(evil_objects), ",".join(good_objects))
 | 
				
			||||||
            if not objects_changed:
 | 
					            raise cdist.Error(errormessage)
 | 
				
			||||||
                # Create list of unfinished objects + their requirements for print
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                evil_objects = []
 | 
					 | 
				
			||||||
                for cdist_object in objects:
 | 
					 | 
				
			||||||
                    if not cdist_object.state == cdist_object.STATE_DONE:
 | 
					 | 
				
			||||||
                        evil_objects.append("%s (required: %s, autorequired: %s" %
 | 
					 | 
				
			||||||
                            (cdist_object.name, cdist_object.requirements, cdist_object.autorequire))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                raise cdist.Error("Cannot solve requirements for the following objects: %s" %
 | 
					 | 
				
			||||||
                    (",".join(evil_objects)))
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue