forked from ungleich-public/cdist
		
	Try2 to make cdist honor the manifest order,
this implementation has some more lines of code, but no collision with the require variable.
This commit is contained in:
		
					parent
					
						
							
								824381e6ca
							
						
					
				
			
			
				commit
				
					
						61aec12ba1
					
				
			
		
					 2 changed files with 38 additions and 20 deletions
				
			
		|  | @ -154,8 +154,8 @@ class Emulator(object): | ||||||
|             self.cdist_object.create() |             self.cdist_object.create() | ||||||
|             self.cdist_object.parameters = self.parameters |             self.cdist_object.parameters = self.parameters | ||||||
|             # record the created object in typeorder file |             # record the created object in typeorder file | ||||||
|             with open(self.typeorder_path, 'a') as tofd: |             with open(self.typeorder_path, 'a') as typeorderfile: | ||||||
|                 tofd.write(self.cdist_object.name + os.linesep) |                 print(self.cdist_object.name, file=typeorderfile) | ||||||
| 
 | 
 | ||||||
|         # Record / Append source |         # Record / Append source | ||||||
|         self.cdist_object.source.append(self.object_source) |         self.cdist_object.source.append(self.object_source) | ||||||
|  | @ -184,6 +184,24 @@ class Emulator(object): | ||||||
| 
 | 
 | ||||||
|     def record_requirements(self): |     def record_requirements(self): | ||||||
|         """record requirements""" |         """record requirements""" | ||||||
|  |         #from pudb import set_trace; set_trace(); | ||||||
|  | 
 | ||||||
|  |         if "EXECUTE_TYPES_IN_CREATION_ORDER" in self.env and self.env['EXECUTE_TYPES_IN_CREATION_ORDER'] == 'true': | ||||||
|  |             # load object name created bevor this one from typeorder file ... | ||||||
|  |             with open(self.typeorder_path, 'r') as typecreationfile: | ||||||
|  |                 typecreationorder = typecreationfile.readlines() | ||||||
|  |                 # get the type created bevore this one ... | ||||||
|  |                 try: | ||||||
|  |                     lastcreatedtype = typecreationorder[-2].strip() | ||||||
|  |                     if 'require' in self.env: | ||||||
|  |                         self.env['require'] += " " + lastcreatedtype | ||||||
|  |                     else: | ||||||
|  |                         self.env['require'] = lastcreatedtype | ||||||
|  |                     self.log.debug("Injecting require for EXECUTE_TYPES_IN_CREATION_ORDER: %s for %s", lastcreatedtype, self.cdist_object.name) | ||||||
|  |                 except IndexError: | ||||||
|  |                     # if no second last line, we are on the first type, so do not set a requirement | ||||||
|  |                     pass | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|         if "require" in self.env: |         if "require" in self.env: | ||||||
|             requirements = self.env['require'] |             requirements = self.env['require'] | ||||||
|  | @ -192,18 +210,6 @@ class Emulator(object): | ||||||
|                 # Ignore empty fields - probably the only field anyway |                 # Ignore empty fields - probably the only field anyway | ||||||
|                 if len(requirement) == 0: continue |                 if len(requirement) == 0: continue | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|                 if requirement == "CDIST_HONOR_MANIFEST_ORDER": |  | ||||||
|                     # load object name created bevor this one from typeorder file ... |  | ||||||
|                     with open(self.typeorder_path, 'r') as tofd: |  | ||||||
|                         lines = tofd.readlines() |  | ||||||
|                         # replace the placeholder with the last created object |  | ||||||
|                         try: |  | ||||||
|                             requirement = lines[-2].strip() |  | ||||||
|                         except IndexError: |  | ||||||
|                             # if no second last line, we are on the first object, so do not set a requirement |  | ||||||
|                             continue |  | ||||||
| 
 |  | ||||||
|                 # Raises an error, if object cannot be created |                 # Raises an error, if object cannot be created | ||||||
|                 try: |                 try: | ||||||
|                     cdist_object = self.cdist_object.object_from_name(requirement) |                     cdist_object = self.cdist_object.object_from_name(requirement) | ||||||
|  | @ -212,7 +218,7 @@ class Emulator(object): | ||||||
|                     raise |                     raise | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|                 self.log.debug("Recording requirement: " + requirement) |                 self.log.debug("Recording requirement: %s", requirement) | ||||||
| 
 | 
 | ||||||
|                 # Save the sanitised version, not the user supplied one |                 # Save the sanitised version, not the user supplied one | ||||||
|                 # (__file//bar => __file/bar) |                 # (__file//bar => __file/bar) | ||||||
|  |  | ||||||
|  | @ -128,18 +128,30 @@ All objects that are created in a type manifest are automatically required | ||||||
| from the type that is calling them. This is called "autorequirement" in | from the type that is calling them. This is called "autorequirement" in | ||||||
| cdist jargon. | cdist jargon. | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | EXECUTE_TYPES_IN_CREATION_ORDER is a EXPERIMENTAL FEATURE ! | ||||||
| You can tell cdist to execute all types in the order in which they are created  | You can tell cdist to execute all types in the order in which they are created  | ||||||
| in the manifest by setting require to the special value of  | in the manifest by exporting EXECUTE_TYPES_IN_CREATION_ORDER with the value true. | ||||||
| "CDIST_HONOR_MANIFEST_ORDER". |  | ||||||
| 
 | 
 | ||||||
| -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| # Tells cdist to execute all types in the order in which they are created ... | # Tells cdist to execute all types in the order in which they are created ... | ||||||
| export require="CDIST_HONOR_MANIFEST_ORDER" | export EXECUTE_TYPES_IN_CREATION_ORDER=true | ||||||
| __sample_type 1 | __sample_type 1 | ||||||
| __sample_type 2 | require="__some_type_somewhere/id" __sample_type 2 | ||||||
| __example_type 23 | __example_type 23 | ||||||
| # Now this types are executed in the creation order | # Now this types are executed in the creation order until the variable is unset | ||||||
|  | unset EXECUTE_TYPES_IN_CREATION_ORDER | ||||||
|  | # all now following types cdist makes the order .. | ||||||
|  | __not_in_order_type 42 | ||||||
|  | 
 | ||||||
|  | # how it works : | ||||||
|  | # this lines above are translated to: | ||||||
|  | __sample_type 1 | ||||||
|  | require="__some_type_somewhere/id __sample_type/1" __sample_type 2 | ||||||
|  | require="__sample_type/2" __example_type 23 | ||||||
|  | __not_in_order_type 42 | ||||||
|  | 
 | ||||||
| -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue