Improve Promenade validatedesign message

Improves validatedesign return message by including count and list
of validation errors.

Change-Id: I7771eafedaa56c748f43fe1212926154933f247f
This commit is contained in:
Samantha Blanco 2018-03-28 15:44:12 -04:00
parent 3faccce445
commit 0604b0404f
3 changed files with 42 additions and 29 deletions

View File

@ -11,8 +11,9 @@ GET /v1.0/health
Returns the health status.
Responses
- 204 No Content
Responses:
+ 204 No Content
/v1.0/join-scripts
@ -37,9 +38,10 @@ dynamic.labels
static.labels
Used to set configuration options in the generated script
Responses
- 200 OK: Script returned as response body
- 400 Bad Request: One or more query parameters is missing or misspelled
Responses:
+ 200 OK: Script returned as response body
+ 400 Bad Request: One or more query parameters is missing or misspelled
/v1.0/validatedesign
@ -55,10 +57,8 @@ Message Body
href
Location of the document to be validated
type
Type of document to be validated
Responses:
- 200 OK: Documents were successfully validated
- 400 Bad Request: Documents were not successfully validated
- 404 Not Found: The document (of that type) was not found at the specified location
+ 200 OK: Documents were successfully validated
+ 400 Bad Request: Documents were not successfully validated

View File

@ -26,13 +26,15 @@ LOG = logging.getLogger(__name__)
class ValidateDesignResource(base.BaseResource):
def _return_msg(self, resp, status_code, status="Valid", message=""):
if status_code is falcon.HTTP_200:
count = 0
msg_list = []
def _return_msg(self, resp, result):
if result['err_count'] == 0:
message = "Promenade validations succeeded."
status_code = falcon.HTTP_200
status = "Valid"
else:
count = 1
msg_list = [message]
message = "Promenade validations failed."
status_code = falcon.HTTP_400
status = "Invalid"
resp.body = json.dumps({
"kind": "Status",
"apiVersion": "v1",
@ -41,8 +43,8 @@ class ValidateDesignResource(base.BaseResource):
"message": message,
"reason": "Validation",
"details": {
"errorCount": count,
"messageList": msg_list,
"errorCount": result['err_count'],
"messageList": result['msg'],
},
"code": status_code,
})
@ -55,12 +57,10 @@ class ValidateDesignResource(base.BaseResource):
href = json_data.get('href', None)
config = Configuration.from_design_ref(
href, allow_missing_substitutions=False)
validation.check_design(config)
msg = "Promenade validations succeeded"
return self._return_msg(resp, falcon.HTTP_200, message=msg)
result = validation.check_design(config)
except exceptions.InvalidFormatError as e:
msg = "Invalid JSON Format: %s" % str(e)
except exceptions.ValidationException as e:
msg = "Promenade validations failed: %s" % str(e)
return self._return_msg(
resp, falcon.HTTP_400, status="Invalid", message=msg)
result = {'msg': [msg], 'err_count': 1}
except exceptions.DeckhandException as e:
result = {'msg': [str(e)], 'err_count': 1}
return self._return_msg(resp, result)

View File

@ -14,30 +14,42 @@
from promenade import exceptions
from promenade import logging
import copy
import jsonschema
import os
import pkg_resources
import yaml
__all__ = ['check_schema', 'check_schemas']
result_template = {'msg': [], 'err_count': 0}
LOG = logging.getLogger(__name__)
def check_design(config):
kinds = ['Docker', 'HostSystem', 'Kubelet', 'KubernetesNetwork']
result = copy.deepcopy(result_template)
for kind in kinds:
count = 0
for doc in config.documents:
schema = doc.get('schema', None)
if not schema:
raise exceptions.ValidationException(
'"schema" is a required document key.')
result['msg'].append(
str(
exceptions.ValidationException(
'"schema" is a required document key.')))
result['err_count'] += 1
return result
name = schema.split('/')[1]
if name == kind:
count += 1
if count != 1:
raise exceptions.ValidationException()
msg = ('There are {0} {1} documents. However, there should be one.'
).format(count, kind)
result['msg'].append(
str(exceptions.ValidationException(description=msg)))
result['err_count'] += 1
return result
def check_schemas(documents, schemas=None):
@ -49,7 +61,8 @@ def check_schemas(documents, schemas=None):
def check_schema(document, schemas=None):
if not isinstance(document, dict):
LOG.error('Non-dictionary document passed to schema validation.')
msg = 'Non-dictionary document passed to schema validation.'
LOG.error(msg)
return
schema_name = document.get('schema', '<missing>')