示例#1
0
    def validate(self, definition, version=None, strict=False):
        """validate checks a kubernetes resource definition

        Args:
            definition (dict): resource definition
            version (str): version of kubernetes to validate against
            strict (bool): whether unexpected additional properties should be considered errors

        Returns:
            warnings (list), errors (list): warnings are missing validations, errors are validation failures
        """
        if not HAS_KUBERNETES_VALIDATE:
            raise KubernetesValidateMissing()

        errors = list()
        warnings = list()
        try:
            if version is None:
                try:
                    version = self.version['kubernetes']['gitVersion']
                except KeyError:
                    version = kubernetes_validate.latest_version()
            kubernetes_validate.validate(definition, version, strict)
        except kubernetes_validate.utils.ValidationError as e:
            errors.append(
                "resource definition validation error at %s: %s" %
                ('.'.join([str(item)
                           for item in e.path]), e.message))  # noqa: B306
        except kubernetes_validate.utils.SchemaNotFoundError as e:
            warnings.append(
                "Could not find schema for object kind %s with API version %s in Kubernetes version %s (possibly Custom Resource?)"
                % (e.kind, e.api_version, e.version))
        return warnings, errors
    def translate(self, update=False, write_files=True):
        """ Translate sections of the ADT into a Kubernetes Manifest """
        logger.info("Translating into Kubernetes Manifests")
        self.status = "Translating..."
        self.manifests = []
        self.tcp_ports = []
        self.ingress_conf = []
        self.ingress_secrets = {}

        for node in self.tpl.nodetemplates:
            if node.type.startswith("tosca.nodes.MiCADO"):
                self._translate_node_templates(node)

        # Look for a monitoring policy and attach default
        # metric exporters to the application
        for policy in self.tpl.policies:
            if policy.type.startswith(Prefix.MONITOR_POLICY):
                self._translate_monitoring_policy(policy)

            if policy.type.startswith(Prefix.NETWORK_POLICY):
                self._translate_security_policy(policy)

        if self.ingress_conf:
            self._deploy_zorp()
            self._manifest_secrets()

        if not self.manifests:
            logger.info("No nodes to orchestrate with Kubernetes. Skipping")
            self.status = "Skipped Translation"
            return

        for manifest in self.manifests:
            try:
                kubernetes_validate.validate(manifest, "1.18.0", strict=True)
            except kubernetes_validate.ValidationError as err:
                logger.error(f"K8s Validation: {err.message}")
                raise AdaptorCritical(
                    f"K8s Validation: {err.message}") from None

        if not write_files:
            pass
        elif update:
            utils.dump_list_yaml(self.manifests, self.manifest_tmp_path)
        elif self.validate is False:
            utils.dump_list_yaml(self.manifests, self.manifest_path)

        logger.info("Translation complete")
        self.status = "Translated"
示例#3
0
from __future__ import print_function
import kubernetes_validate
import yaml

try:
    data = yaml.load(open('resource.yaml').read())
    kubernetes_validate.validate(data, '1.9.9', strict=True)
except kubernetes_validate.ValidationError as e:
    print(''.join(e.path), e.message)
    def translate(self, update=False, write_files=True):
        """ Translate sections of the ADT into a Kubernetes Manifest """
        logger.info("Translating into Kubernetes Manifests")
        self.status = "Translating..."
        self.manifests = []
        self.tcp_ports = []
        self.ingress_conf = []
        self.ingress_secrets = {}

        for node in self.tpl.nodetemplates:
            if node.type.startswith("tosca.nodes.MiCADO"):
                self._translate_node_templates(node)

        # Look for a monitoring policy and attach default
        # metric exporters to the application
        for policy in self.tpl.policies:
            if policy.type.startswith(Prefix.MONITOR_POLICY):
                self._translate_monitoring_policy(policy)

            if policy.type.startswith(Prefix.NETWORK_POLICY):
                self._translate_security_policy(policy)

        if self.ingress_conf:
            self._deploy_zorp()
            self._manifest_secrets()

        if not self.manifests:
            logger.info("No nodes to orchestrate with Kubernetes. Skipping")
            self.status = "Skipped Translation"
            return

        unvalidated_kinds = self.config.get("unvalidated_kinds", [])
        k8s_version = self.config.get("k8s_version", "1.18.0")
        for manifest in self.manifests:
            if manifest["kind"] in unvalidated_kinds:
                continue
            try:
                kubernetes_validate.validate(manifest,
                                             k8s_version,
                                             strict=True)
            except ValidationError as err:
                message = f"Invalid K8s Manifest: {err.message}"
                logger.error(message)
                raise AdaptorCritical(message) from None
            except (InvalidSchemaError, SchemaNotFoundError):
                message = (
                    f"Schema for {manifest['apiVersion']}/{manifest['kind']} "
                    f"not found in Kubernetes v{k8s_version}")
                logger.error(message)
                raise AdaptorCritical(message) from None
            except VersionNotSupportedError:
                pass

        if not write_files:
            pass
        elif update:
            utils.dump_list_yaml(self.manifests, self.manifest_tmp_path)
        elif self.validate is False:
            utils.dump_list_yaml(self.manifests, self.manifest_path)

        logger.info("Translation complete")
        self.status = "Translated"