Exemple #1
0
    def from_spec(cls, spec):
        """Constructs and returns a set of arguments from a specification.

        :param spec: The specification for the argument set.
        :return: A dict of arguments built to the specification.
        """

        jsonschema.validate(spec, cls.SPEC_SCHEMA)
        arguments = {
            name: cls(name, arg.get('description'), arg.get('default'),
                      arg.get('required'), arg.get('choices'))
            for name, arg in six.iteritems(spec)
        }
        reserved_names = ['distro', 'reconcile']
        for name, arg in six.iteritems(arguments):
            if name in reserved_names:
                raise p_ex.ImageValidationSpecificationError(
                    _("The following argument names are reserved: "
                      "{names}").format(reserved_names))
            if not arg.default and not arg.required:
                raise p_ex.ImageValidationSpecificationError(
                    _("Argument {name} is not required and must specify a "
                      "default value.").format(name=arg.name))
            if arg.choices and arg.default and arg.default not in arg.choices:
                raise p_ex.ImageValidationSpecificationError(
                    _("Argument {name} specifies a default which is not one "
                      "of its choices.").format(name=arg.name))
        return arguments
Exemple #2
0
    def get_class_from_spec(cls, spec, validator_map):
        """Gets the class and specification from a validator dict.

        :param spec: A validator specification including its type: a dict of
            size 1, where the key represents the validator type and the value
            respresents its configuration.
        :param validator_map: A map of validator name to class.
        :return: A tuple of validator class and configuration.
        """
        key, value = list(six.iteritems(spec))[0]
        validator_class = validator_map.get(key, None)
        if not validator_class:
            raise p_ex.ImageValidationSpecificationError(
                _("Validator type %s not found.") % validator_class)
        return validator_class, value
Exemple #3
0
    def from_spec(cls, spec, validator_map, resource_roots):
        """Builds a copy script validator from a specification.

        :param spec: May be a string or a single-length dictionary of name to
            configuration values. Configuration values include:
            env_vars: A list of environment variable names to send to the
                script.
            output: A key into which to put the stdout of the script in the
                image_arguments of the validation run.
        :param validator_map: A map of validator name to class.
        :param resource_roots: The roots from which relative paths to
            resources (scripts and such) will be referenced. Any resource will
            be pulled from the first path in the list at which a file exists.
        :return: A validator that will copy a script to the image.
        """
        jsonschema.validate(spec, cls.SPEC_SCHEMA)

        script_contents = None
        if isinstance(spec, six.string_types):
            script_path = spec
            output_var = None
        else:
            script_path, properties = list(six.iteritems(spec))[0]
            output_var = properties.get('output', None)
            script_contents = properties.get('inline')

        if not script_contents:
            for root in resource_roots:
                file_path = path.join(root, script_path)
                script_contents = files.try_get_file_text(file_path)
                if script_contents:
                    break
        script_name = script_path.split('/')[2]

        if not script_contents:
            raise p_ex.ImageValidationSpecificationError(
                _("Script %s not found in any resource roots.") % script_path)

        return SaharaCopyScriptValidator(script_contents, script_name,
                                         output_var)