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"
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"