Example #1
0
def _set_plan_inputs(plan, inputs=None):
    inputs = inputs if inputs else {}
    # Verify inputs satisfied
    missing_inputs = []
    for input_name, input_def in plan['inputs'].iteritems():
        if input_name in inputs:
            try:
                str(json.dumps(inputs[input_name], ensure_ascii=False))
            except UnicodeEncodeError:
                raise exceptions.DSLParsingInputTypeException(
                    exceptions.ERROR_INVALID_CHARS,
                    'Illegal characters in input: {0}. '
                    'Only valid ascii chars are supported.'.format(input_name))
        else:
            if 'default' in input_def and input_def['default'] is not None:
                inputs[input_name] = input_def['default']
            else:
                missing_inputs.append(input_name)

    if missing_inputs:
        raise exceptions.MissingRequiredInputError(
            "Required inputs {0} were not specified - expected "
            "inputs: {1}".format(missing_inputs, plan['inputs'].keys()))
    # Verify all inputs appear in plan
    not_expected = [
        input_name for input_name in inputs.keys()
        if input_name not in plan['inputs']
    ]
    if not_expected:
        raise exceptions.UnknownInputError("Unknown inputs {0} specified - "
                                           "expected inputs: {1}".format(
                                               not_expected,
                                               plan['inputs'].keys()))

    plan['inputs'] = inputs
Example #2
0
 def get_input(self, input_name):
     try:
         return self._plan.inputs[input_name]
     except KeyError:
         raise exceptions.UnknownInputError(
             "get_input function references an "
             "unknown input '{0}'.".format(input_name))
Example #3
0
def _set_plan_inputs(plan, inputs=None):
    inputs = inputs if inputs else {}
    # Verify inputs satisfied
    missing_inputs = []
    for input_name, input_def in plan['inputs'].iteritems():
        if input_name not in inputs:
            if 'default' in input_def and input_def['default'] is not None:
                inputs[input_name] = input_def['default']
            else:
                missing_inputs.append(input_name)

    if missing_inputs:
        raise exceptions.MissingRequiredInputError(
            "Required inputs {0} were not specified - expected "
            "inputs: {1}".format(missing_inputs, plan['inputs'].keys()))
    # Verify all inputs appear in plan
    not_expected = [
        input_name for input_name in inputs.keys()
        if input_name not in plan['inputs']
    ]
    if not_expected:
        raise exceptions.UnknownInputError("Unknown inputs {0} specified - "
                                           "expected inputs: {1}".format(
                                               not_expected,
                                               plan['inputs'].keys()))

    plan['inputs'] = inputs
Example #4
0
 def evaluate(self, plan):
     if isinstance(self.input_value, list):
         return self._get_input_attribute(plan.inputs[self.input_value[0]])
     if self.input_value not in plan.inputs:
         raise exceptions.UnknownInputError(
             "get_input function references an "
             "unknown input '{0}'.".format(self.input_value))
     return plan.inputs[self.input_value]
Example #5
0
 def validate(self, plan):
     input_value = self.input_value[0] \
         if isinstance(self.input_value, list) else self.input_value
     if is_function(input_value):
         return
     if input_value not in plan.inputs:
         raise exceptions.UnknownInputError(
             "get_input function references an "
             "unknown input '{0}'.".format(input_value))
    def test_unknown_input_raises_unknown_input_error(self):
        deployment_id = 'dep'
        self._deploy_base(deployment_id, 'no_output.yaml')

        with patch('dsl_parser.tasks.prepare_deployment_plan') \
                as prepare_deployment_mock:

            prepare_deployment_mock.side_effect = \
                parser_exceptions.UnknownInputError()

            response = self._update(deployment_id, 'no_output.yaml')
            self.assertEquals(400, response.status_code)
            self.assertEquals('unknown_deployment_input_error',
                              response.json['error_code'])
Example #7
0
def _set_plan_inputs(plan, inputs=None):
    inputs = inputs if inputs else {}
    # Verify inputs satisfied
    for input_name, input_def in plan['inputs'].iteritems():
        if input_name not in inputs:
            if 'default' in input_def and input_def['default'] is not None:
                inputs[input_name] = input_def['default']
            else:
                raise exceptions.MissingRequiredInputError(
                    "Required input '{0}' was not specified - expected "
                    "inputs: {1}".format(input_name, plan['inputs'].keys()))
    # Verify all inputs appear in plan
    for input_name in inputs.keys():
        if input_name not in plan['inputs']:
            raise exceptions.UnknownInputError(
                "Unknown input '{0}' specified - "
                "expected inputs: {1}".format(input_name,
                                              plan['inputs'].keys()))
    plan['inputs'] = inputs
Example #8
0
def _set_plan_inputs(plan, inputs=None):
    inputs = inputs if inputs else {}
    # Verify inputs satisfied
    missing_inputs = []
    for input_name, input_def in plan[INPUTS].items():
        input_is_missing = False
        if input_name in inputs:
            try:
                str(json.dumps(inputs[input_name], ensure_ascii=False))
            except UnicodeEncodeError:
                raise exceptions.DSLParsingInputTypeException(
                    exceptions.ERROR_INVALID_CHARS,
                    'Illegal characters in input: {0}. '
                    'Only valid ascii chars are supported.'.format(input_name))
        else:
            if DEFAULT in input_def and input_def[DEFAULT] is not None:
                inputs[input_name] = input_def[DEFAULT]
            else:
                missing_inputs.append(input_name)
                input_is_missing = True

        # Verify inputs comply with the given constraints and also the
        # data_type, if mentioned
        input_constraints = constraints.extract_constraints(input_def)
        if not input_is_missing:
            constraints.validate_input_value(
                input_name, input_constraints, inputs[input_name])
            try:
                utils.parse_value(
                    value=inputs[input_name],
                    type_name=input_def.get(TYPE, None),
                    data_types=plan.get(DATA_TYPES, {}),
                    undefined_property_error_message="Undefined property "
                                                     "{1} in value of "
                                                     "input {0}.",
                    missing_property_error_message="Value of input {0} "
                                                   "is missing property "
                                                   "{1}.",
                    node_name=input_name,
                    path=[],
                    raise_on_missing_property=True)
            except exceptions.DSLParsingLogicException as e:
                raise exceptions.DSLParsingException(
                    exceptions.ERROR_INPUT_VIOLATES_DATA_TYPE_SCHEMA,
                    str(e))

    if missing_inputs:
        raise exceptions.MissingRequiredInputError(
            "Required inputs {0} were not specified - expected "
            "inputs: {1}".format(missing_inputs, list(plan[INPUTS]))
        )
    # Verify all inputs appear in plan
    not_expected = [input_name for input_name in inputs
                    if input_name not in plan[INPUTS]]
    if not_expected:
        raise exceptions.UnknownInputError(
            "Unknown inputs {0} specified - "
            "expected inputs: {1}".format(not_expected,
                                          list(plan[INPUTS])))

    plan[INPUTS] = inputs
Example #9
0
 def validate(self, plan):
     if self.input_name not in plan.inputs:
         raise exceptions.UnknownInputError(
             "get_input function references an "
             "unknown input '{0}'.".format(self.input_name))
Example #10
0
def _set_plan_inputs(plan, inputs, auto_correct_types, values_getter):
    inputs = inputs if inputs else {}
    # Verify inputs satisfied
    missing_inputs = []
    for input_name, input_def in plan[INPUTS].items():
        input_is_missing = skip_input_validation = False
        if input_name in inputs:
            try:
                str(json.dumps(inputs[input_name], ensure_ascii=False))
            except UnicodeEncodeError:
                raise exceptions.DSLParsingInputTypeException(
                    exceptions.ERROR_INVALID_CHARS,
                    'Illegal characters in input: {0}. '
                    'Only valid ascii chars are supported.'.format(input_name))
        elif DEFAULT in input_def and input_def[DEFAULT] is not None:
            inputs[input_name] = input_def[DEFAULT]
        else:
            # Try to get some defaults from the data_type maybe or in other
            # words just try to parse the value before validating it.
            try:
                parsed_value = utils.parse_value(
                    {},
                    type_name=input_def.get(TYPE, None),
                    data_types=plan.get(DATA_TYPES, {}),
                    undefined_property_error_message="Undefined property "
                    "{1} in value of "
                    "input {0}.",
                    missing_property_error_message="Value of input {0} "
                    "is missing property "
                    "{1}.",
                    node_name=input_name,
                    path=[],
                    raise_on_missing_property=True)
            except exceptions.DSLParsingException:
                parsed_value = None
            finally:
                if parsed_value:
                    inputs[input_name] = parsed_value
                elif input_def.get('required', True):
                    missing_inputs.append(input_name)
                    input_is_missing = True
                else:
                    skip_input_validation = True
                    inputs[input_name] = None
        if skip_input_validation:
            continue

        # Verify inputs comply with the given constraints and also the
        # data_type, if mentioned
        input_constraints = constraints.extract_constraints(input_def)
        if not input_is_missing:
            if auto_correct_types:
                inputs[input_name] = utils.cast_to_type(
                    inputs[input_name], input_def.get(TYPE, None))

            constraints.validate_input_value(input_name, input_constraints,
                                             inputs[input_name],
                                             input_def.get(TYPE),
                                             input_def.get(ITEM_TYPE),
                                             values_getter)
            inputs_complete = inputs[input_name]
            try:
                inputs_complete = utils.parse_value(
                    value=inputs[input_name],
                    type_name=input_def.get(TYPE, None),
                    data_types=plan.get(DATA_TYPES, {}),
                    undefined_property_error_message="Undefined property "
                    "{1} in value of "
                    "input {0}.",
                    missing_property_error_message="Value of input {0} "
                    "is missing property "
                    "{1}.",
                    node_name=input_name,
                    path=[],
                    raise_on_missing_property=True)
            except exceptions.DSLParsingLogicException as e:
                raise exceptions.DSLParsingException(
                    exceptions.ERROR_INPUT_VIOLATES_DATA_TYPE_SCHEMA, str(e))
            inputs[input_name] = inputs_complete

    if missing_inputs:
        raise exceptions.MissingRequiredInputError(
            "Required inputs {0} were not specified - expected "
            "inputs: {1}".format(missing_inputs, list(plan[INPUTS])))
    # Verify all inputs appear in plan
    not_expected = [
        input_name for input_name in inputs if input_name not in plan[INPUTS]
    ]
    if not_expected:
        raise exceptions.UnknownInputError("Unknown inputs {0} specified - "
                                           "expected inputs: {1}".format(
                                               not_expected,
                                               list(plan[INPUTS])))

    plan[INPUTS] = inputs