summaryrefslogtreecommitdiff
path: root/src/services/api/graphql/utils/schema_from_op_mode.py
diff options
context:
space:
mode:
authorJohn Estabrook <jestabro@vyos.io>2022-08-25 13:36:43 -0500
committerJohn Estabrook <jestabro@vyos.io>2022-08-25 14:32:14 -0500
commitb4646149b4993578707833df96e972f76a298ef7 (patch)
tree0746771e98420c6a87225e5bb10834936ef9cbb5 /src/services/api/graphql/utils/schema_from_op_mode.py
parente8dc2c731697c7c76c75fa7844edde52dc0ff76b (diff)
downloadvyos-1x-b4646149b4993578707833df96e972f76a298ef7.tar.gz
vyos-1x-b4646149b4993578707833df96e972f76a298ef7.zip
graphql: T4640: add schema defs and resolver support for op-mode errors
Diffstat (limited to 'src/services/api/graphql/utils/schema_from_op_mode.py')
-rwxr-xr-xsrc/services/api/graphql/utils/schema_from_op_mode.py43
1 files changed, 42 insertions, 1 deletions
diff --git a/src/services/api/graphql/utils/schema_from_op_mode.py b/src/services/api/graphql/utils/schema_from_op_mode.py
index f990aae52..379d15250 100755
--- a/src/services/api/graphql/utils/schema_from_op_mode.py
+++ b/src/services/api/graphql/utils/schema_from_op_mode.py
@@ -21,7 +21,7 @@
import os
import json
import typing
-from inspect import signature, getmembers, isfunction
+from inspect import signature, getmembers, isfunction, isclass, getmro
from jinja2 import Template
from vyos.defaults import directories
@@ -35,6 +35,7 @@ SCHEMA_PATH = directories['api_schema']
DATA_DIR = directories['data']
op_mode_include_file = os.path.join(DATA_DIR, 'op-mode-standardized.json')
+op_mode_error_schema = 'op_mode_error.graphql'
schema_data: dict = {'schema_name': '',
'schema_fields': []}
@@ -53,6 +54,7 @@ type {{ schema_name }} {
type {{ schema_name }}Result {
data: {{ schema_name }}
+ op_mode_error: OpModeError
success: Boolean!
errors: [String]
}
@@ -76,6 +78,7 @@ type {{ schema_name }} {
type {{ schema_name }}Result {
data: {{ schema_name }}
+ op_mode_error: OpModeError
success: Boolean!
errors: [String]
}
@@ -85,6 +88,21 @@ extend type Mutation {
}
"""
+error_template = """
+interface OpModeError {
+ name: String!
+ message: String!
+ vyos_code: Int!
+}
+{% for name in error_names %}
+type {{ name }} implements OpModeError {
+ name: String!
+ message: String!
+ vyos_code: Int!
+}
+{%- endfor %}
+"""
+
def _snake_to_pascal_case(name: str) -> str:
res = ''.join(map(str.title, name.split('_')))
return res
@@ -136,7 +154,30 @@ def create_schema(func_name: str, base_name: str, func: callable) -> str:
return res
+def create_error_schema():
+ from vyos import opmode
+
+ e = Exception
+ err_types = getmembers(opmode, isclass)
+ err_types = [k for k in err_types if issubclass(k[1], e)]
+ # drop base class, to be replaced by interface type. Find the class
+ # programmatically, in case the base class name changes.
+ for i in range(len(err_types)):
+ if err_types[i][1] in getmro(err_types[i-1][1]):
+ del err_types[i]
+ break
+ err_names = [k[0] for k in err_types]
+ error_data = {'error_names': err_names}
+ j2_template = Template(error_template)
+ res = j2_template.render(error_data)
+
+ return res
+
def generate_op_mode_definitions():
+ out = create_error_schema()
+ with open(f'{SCHEMA_PATH}/{op_mode_error_schema}', 'w') as f:
+ f.write(out)
+
with open(op_mode_include_file) as f:
op_mode_files = json.load(f)