Adapt object_parameters before checking conflicting parameters.
This commit is contained in:
		
					parent
					
						
							
								151edc6398
							
						
					
				
			
			
				commit
				
					
						5480c22020
					
				
			
		
					 9 changed files with 99 additions and 3 deletions
				
			
		|  | @ -182,6 +182,29 @@ class Emulator(object): | ||||||
|         lockfname = lockfname.replace(os.sep, '_') |         lockfname = lockfname.replace(os.sep, '_') | ||||||
|         self.flock_path = os.path.join(self.object_base_path, lockfname) |         self.flock_path = os.path.join(self.object_base_path, lockfname) | ||||||
| 
 | 
 | ||||||
|  |     def _object_params_in_context(self): | ||||||
|  |         ''' Get cdist_object parameters dict adopted by context. | ||||||
|  |         Context consists of cdist_type boolean, optional, required, | ||||||
|  |         optional_multiple and required_multiple parameters. If parameter | ||||||
|  |         is multiple parameter then its value is a list. | ||||||
|  |         This adaptation works on cdist_object.parameters which are read from | ||||||
|  |         directory based dict where it is unknown what kind of data is in | ||||||
|  |         file. If there is only one line in the file it is unknown if this | ||||||
|  |         is a value of required/optional parameter or if it is one value of | ||||||
|  |         multiple values parameter. | ||||||
|  |         ''' | ||||||
|  |         params = {} | ||||||
|  |         if self.cdist_object.exists: | ||||||
|  |             for param in self.cdist_object.parameters: | ||||||
|  |                 value = ('' if param in self.cdist_type.boolean_parameters | ||||||
|  |                          else self.cdist_object.parameters[param]) | ||||||
|  |                 if ((param in self.cdist_type.required_multiple_parameters or | ||||||
|  |                      param in self.cdist_type.optional_multiple_parameters) and | ||||||
|  |                         not isinstance(value, list)): | ||||||
|  |                     value = [value] | ||||||
|  |                 params[param] = value | ||||||
|  |         return params | ||||||
|  | 
 | ||||||
|     def setup_object(self): |     def setup_object(self): | ||||||
|         # Create object with given parameters |         # Create object with given parameters | ||||||
|         self.parameters = {} |         self.parameters = {} | ||||||
|  | @ -193,12 +216,13 @@ class Emulator(object): | ||||||
|             # Make existing requirements a set so that we can compare it |             # Make existing requirements a set so that we can compare it | ||||||
|             # later with new requirements. |             # later with new requirements. | ||||||
|             self._existing_reqs = set(self.cdist_object.requirements) |             self._existing_reqs = set(self.cdist_object.requirements) | ||||||
|             if self.cdist_object.parameters != self.parameters: |             obj_params = self._object_params_in_context() | ||||||
|  |             if obj_params != self.parameters: | ||||||
|                 errmsg = ("Object %s already exists with conflicting " |                 errmsg = ("Object %s already exists with conflicting " | ||||||
|                           "parameters:\n%s: %s\n%s: %s" % ( |                           "parameters:\n%s: %s\n%s: %s" % ( | ||||||
|                               self.cdist_object.name, |                               self.cdist_object.name, | ||||||
|                               " ".join(self.cdist_object.source), |                               " ".join(self.cdist_object.source), | ||||||
|                               self.cdist_object.parameters, |                               obj_params, | ||||||
|                               self.object_source, |                               self.object_source, | ||||||
|                               self.parameters)) |                               self.parameters)) | ||||||
|                 raise cdist.Error(errmsg) |                 raise cdist.Error(errmsg) | ||||||
|  | @ -252,7 +276,7 @@ class Emulator(object): | ||||||
|                                 self.cdist_object.name, |                                 self.cdist_object.name, | ||||||
|                                 requirement, e.name, self.object_source))) |                                 requirement, e.name, self.object_source))) | ||||||
|             raise |             raise | ||||||
|         except core.cdist_object.MissingObjectIdError as e: |         except core.cdist_object.MissingObjectIdError: | ||||||
|             self.log.error(("%s requires object %s without object id." |             self.log.error(("%s requires object %s without object id." | ||||||
|                             " Defined at %s" % (self.cdist_object.name, |                             " Defined at %s" % (self.cdist_object.name, | ||||||
|                                                 requirement, |                                                 requirement, | ||||||
|  |  | ||||||
|  | @ -420,6 +420,27 @@ class ArgumentsTestCase(test.CdistTestCase): | ||||||
|         self.assertEqual(cdist_object.parameters['required1'], value) |         self.assertEqual(cdist_object.parameters['required1'], value) | ||||||
|         self.assertEqual(cdist_object.parameters['required2'], value) |         self.assertEqual(cdist_object.parameters['required2'], value) | ||||||
| 
 | 
 | ||||||
|  |     def test_required_multiple_arguments(self): | ||||||
|  |         """check whether assigning required multiple parameter works""" | ||||||
|  | 
 | ||||||
|  |         type_name = '__arguments_required_multiple' | ||||||
|  |         object_id = 'some-id' | ||||||
|  |         value1 = 'value1' | ||||||
|  |         value2 = 'value2' | ||||||
|  |         argv = [type_name, object_id, '--required1', value1, | ||||||
|  |                 '--required1', value2] | ||||||
|  |         os.environ.update(self.env) | ||||||
|  |         emu = emulator.Emulator(argv) | ||||||
|  |         emu.run() | ||||||
|  | 
 | ||||||
|  |         cdist_type = core.CdistType(self.local.type_path, type_name) | ||||||
|  |         cdist_object = core.CdistObject(cdist_type, self.local.object_path, | ||||||
|  |                                         self.local.object_marker_name, | ||||||
|  |                                         object_id) | ||||||
|  |         self.assertTrue('required1' in cdist_object.parameters) | ||||||
|  |         self.assertTrue(value1 in cdist_object.parameters['required1']) | ||||||
|  |         self.assertTrue(value2 in cdist_object.parameters['required1']) | ||||||
|  | 
 | ||||||
| #    def test_required_missing(self): | #    def test_required_missing(self): | ||||||
| #        type_name = '__arguments_required' | #        type_name = '__arguments_required' | ||||||
| #        object_id = 'some-id' | #        object_id = 'some-id' | ||||||
|  | @ -447,6 +468,25 @@ class ArgumentsTestCase(test.CdistTestCase): | ||||||
|         self.assertFalse('optional2' in cdist_object.parameters) |         self.assertFalse('optional2' in cdist_object.parameters) | ||||||
|         self.assertEqual(cdist_object.parameters['optional1'], value) |         self.assertEqual(cdist_object.parameters['optional1'], value) | ||||||
| 
 | 
 | ||||||
|  |     def test_optional_multiple(self): | ||||||
|  |         type_name = '__arguments_optional_multiple' | ||||||
|  |         object_id = 'some-id' | ||||||
|  |         value1 = 'value1' | ||||||
|  |         value2 = 'value2' | ||||||
|  |         argv = [type_name, object_id, '--optional1', value1, '--optional1', | ||||||
|  |                 value2] | ||||||
|  |         os.environ.update(self.env) | ||||||
|  |         emu = emulator.Emulator(argv) | ||||||
|  |         emu.run() | ||||||
|  | 
 | ||||||
|  |         cdist_type = core.CdistType(self.local.type_path, type_name) | ||||||
|  |         cdist_object = core.CdistObject(cdist_type, self.local.object_path, | ||||||
|  |                                         self.local.object_marker_name, | ||||||
|  |                                         object_id) | ||||||
|  |         self.assertTrue('optional1' in cdist_object.parameters) | ||||||
|  |         self.assertTrue(value1 in cdist_object.parameters['optional1']) | ||||||
|  |         self.assertTrue(value2 in cdist_object.parameters['optional1']) | ||||||
|  | 
 | ||||||
|     def test_argument_defaults(self): |     def test_argument_defaults(self): | ||||||
|         type_name = '__argument_defaults' |         type_name = '__argument_defaults' | ||||||
|         object_id = 'some-id' |         object_id = 'some-id' | ||||||
|  | @ -464,6 +504,29 @@ class ArgumentsTestCase(test.CdistTestCase): | ||||||
|         self.assertFalse('optional2' in cdist_object.parameters) |         self.assertFalse('optional2' in cdist_object.parameters) | ||||||
|         self.assertEqual(cdist_object.parameters['optional1'], value) |         self.assertEqual(cdist_object.parameters['optional1'], value) | ||||||
| 
 | 
 | ||||||
|  |     def test_object_params_in_context(self): | ||||||
|  |         type_name = '__arguments_all' | ||||||
|  |         object_id = 'some-id' | ||||||
|  |         argv = [type_name, object_id, '--opt', 'opt', '--req', 'req', | ||||||
|  |                 '--bool', '--optmul', 'val1', '--optmul', 'val2', | ||||||
|  |                 '--reqmul', 'val3', '--reqmul', 'val4', | ||||||
|  |                 '--optmul1', 'val5', '--reqmul1', 'val6'] | ||||||
|  |         os.environ.update(self.env) | ||||||
|  |         emu = emulator.Emulator(argv) | ||||||
|  |         emu.run() | ||||||
|  | 
 | ||||||
|  |         obj_params = emu._object_params_in_context() | ||||||
|  |         obj_params_expected = { | ||||||
|  |             'bool': '', | ||||||
|  |             'opt': 'opt', | ||||||
|  |             'optmul1': ['val5', ], | ||||||
|  |             'optmul': ['val1', 'val2', ], | ||||||
|  |             'req': 'req', | ||||||
|  |             'reqmul1': ['val6', ], | ||||||
|  |             'reqmul': ['val3', 'val4', ], | ||||||
|  |         } | ||||||
|  |         self.assertEqual(obj_params, obj_params_expected) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| class StdinTestCase(test.CdistTestCase): | class StdinTestCase(test.CdistTestCase): | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | bool | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | opt | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | optmul | ||||||
|  | optmul1 | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | req | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | reqmul | ||||||
|  | reqmul1 | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | optional1 | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | required1 | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue