|
11 | 11 | from kubernetes.client.api_client import ApiClient |
12 | 12 | from kubernetes.client.rest import ApiException |
13 | 13 |
|
14 | | -from openshift.dynamic.exceptions import ResourceNotFoundError, ResourceNotUniqueError, api_exception |
| 14 | +from openshift.dynamic.exceptions import ResourceNotFoundError, ResourceNotUniqueError, api_exception, KubernetesValidateMissing |
| 15 | + |
| 16 | +try: |
| 17 | + import kubernetes_validate |
| 18 | + HAS_KUBERNETES_VALIDATE = True |
| 19 | +except ImportError: |
| 20 | + HAS_KUBERNETES_VALIDATE = False |
| 21 | + |
15 | 22 |
|
16 | 23 | __all__ = [ |
17 | 24 | 'DynamicClient', |
@@ -256,6 +263,37 @@ def request(self, method, path, body=None, **params): |
256 | 263 | ) |
257 | 264 |
|
258 | 265 |
|
| 266 | + def validate(self, definition, version=None, strict=False): |
| 267 | + """validate checks a kubernetes resource definition |
| 268 | +
|
| 269 | + Args: |
| 270 | + definition (dict): resource definition |
| 271 | + version (str): version of kubernetes to validate against |
| 272 | + strict (bool): whether unexpected additional properties should be considered errors |
| 273 | +
|
| 274 | + Returns: |
| 275 | + warnings (list), errors (list): warnings are missing validations, errors are validation failures |
| 276 | + """ |
| 277 | + if not HAS_KUBERNETES_VALIDATE: |
| 278 | + raise KubernetesValidateMissing() |
| 279 | + |
| 280 | + errors = list() |
| 281 | + warnings = list() |
| 282 | + try: |
| 283 | + if version is None: |
| 284 | + try: |
| 285 | + version = self.version['kubernetes']['gitVersion'] |
| 286 | + except KeyError: |
| 287 | + version = kubernetes_validate.latest_version() |
| 288 | + kubernetes_validate.validate(definition, version, strict) |
| 289 | + except kubernetes_validate.utils.ValidationError as e: |
| 290 | + errors.append("resource definition validation error at %s: %s" % ('.'.join([str(item) for item in e.path]), e.message)) # noqa: B306 |
| 291 | + except kubernetes_validate.utils.SchemaNotFoundError as e: |
| 292 | + warnings.append("Could not find schema for object kind %s with API version %s in Kubernetes version %s (possibly Custom Resource?)" % |
| 293 | + (e.kind, e.api_version, e.version)) |
| 294 | + return warnings, errors |
| 295 | + |
| 296 | + |
259 | 297 | class Resource(object): |
260 | 298 | """ Represents an API resource type, containing the information required to build urls for requests """ |
261 | 299 |
|
|
0 commit comments