forked from ungleich-public/cdist
		
	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, '_')
 | 
			
		||||
        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):
 | 
			
		||||
        # Create object with given parameters
 | 
			
		||||
        self.parameters = {}
 | 
			
		||||
| 
						 | 
				
			
			@ -193,12 +216,13 @@ class Emulator(object):
 | 
			
		|||
            # Make existing requirements a set so that we can compare it
 | 
			
		||||
            # later with new 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 "
 | 
			
		||||
                          "parameters:\n%s: %s\n%s: %s" % (
 | 
			
		||||
                              self.cdist_object.name,
 | 
			
		||||
                              " ".join(self.cdist_object.source),
 | 
			
		||||
                              self.cdist_object.parameters,
 | 
			
		||||
                              obj_params,
 | 
			
		||||
                              self.object_source,
 | 
			
		||||
                              self.parameters))
 | 
			
		||||
                raise cdist.Error(errmsg)
 | 
			
		||||
| 
						 | 
				
			
			@ -252,7 +276,7 @@ class Emulator(object):
 | 
			
		|||
                                self.cdist_object.name,
 | 
			
		||||
                                requirement, e.name, self.object_source)))
 | 
			
		||||
            raise
 | 
			
		||||
        except core.cdist_object.MissingObjectIdError as e:
 | 
			
		||||
        except core.cdist_object.MissingObjectIdError:
 | 
			
		||||
            self.log.error(("%s requires object %s without object id."
 | 
			
		||||
                            " Defined at %s" % (self.cdist_object.name,
 | 
			
		||||
                                                requirement,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -420,6 +420,27 @@ class ArgumentsTestCase(test.CdistTestCase):
 | 
			
		|||
        self.assertEqual(cdist_object.parameters['required1'], 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):
 | 
			
		||||
#        type_name = '__arguments_required'
 | 
			
		||||
#        object_id = 'some-id'
 | 
			
		||||
| 
						 | 
				
			
			@ -447,6 +468,25 @@ class ArgumentsTestCase(test.CdistTestCase):
 | 
			
		|||
        self.assertFalse('optional2' in cdist_object.parameters)
 | 
			
		||||
        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):
 | 
			
		||||
        type_name = '__argument_defaults'
 | 
			
		||||
        object_id = 'some-id'
 | 
			
		||||
| 
						 | 
				
			
			@ -464,6 +504,29 @@ class ArgumentsTestCase(test.CdistTestCase):
 | 
			
		|||
        self.assertFalse('optional2' in cdist_object.parameters)
 | 
			
		||||
        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):
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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