blob: 245bbdab4a0e55ba761e22c05869e352edc9e6ab [file] [log] [blame]
Matteo Scandolod2044a42017-08-07 16:08:28 -07001# Copyright 2017-present Open Networking Foundation
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070016from base import xproto_string_type, unquote
17
Zack Williams045b63d2019-01-22 16:30:57 -070018
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070019def xproto_type_to_ui_type(f):
20 try:
Zack Williams045b63d2019-01-22 16:30:57 -070021 content_type = f["options"]["content_type"]
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070022 content_type = eval(content_type)
Zack Williams045b63d2019-01-22 16:30:57 -070023 except BaseException:
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070024 content_type = None
25 pass
26
Zack Williams045b63d2019-01-22 16:30:57 -070027 if "choices" in f["options"]:
28 return "select"
29 elif content_type == "date":
30 return "date"
31 elif f["type"] == "bool":
32 return "boolean"
33 elif f["type"] == "string":
34 return xproto_string_type(f["options"])
35 elif f["type"] in ["int", "uint32", "int32"] or "link" in f:
36 return "number"
37 elif f["type"] in ["double", "float"]:
38 return "string"
39
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070040
41def xproto_options_choices_to_dict(choices):
42 list = []
43
44 for c in eval(choices):
Zack Williams045b63d2019-01-22 16:30:57 -070045 list.append({"id": c[0], "label": c[1]})
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070046 if len(list) > 0:
47 return list
48 else:
49 return None
50
Zack Williams045b63d2019-01-22 16:30:57 -070051
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070052def xproto_validators(f):
53 # To be cleaned up when we formalize validation in xproto
54 validators = []
55
56 # bound-based validators
Zack Williams045b63d2019-01-22 16:30:57 -070057 bound_validators = [("max_length", "maxlength"), ("min", "min"), ("max", "max")]
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070058
59 for v0, v1 in bound_validators:
60 try:
Zack Williams045b63d2019-01-22 16:30:57 -070061 validators.append({"name": v1, "int_value": int(f["options"][v0])})
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070062 except KeyError:
63 pass
64
65 # validators based on content_type
Zack Williams045b63d2019-01-22 16:30:57 -070066 content_type_validators = ["ip", "url", "email"]
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070067
68 for v in content_type_validators:
Zack Williams045b63d2019-01-22 16:30:57 -070069 # if f['name']=='ip': pdb.set_trace()
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070070 try:
Zack Williams045b63d2019-01-22 16:30:57 -070071 val = unquote(f["options"]["content_type"]) == v
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070072 if not val:
73 raise KeyError
74
Zack Williams045b63d2019-01-22 16:30:57 -070075 validators.append({"name": v, "bool_value": True})
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070076 except KeyError:
77 pass
78
79 # required validator
80 try:
Zack Williams045b63d2019-01-22 16:30:57 -070081 required = f["options"]["blank"] == "False" and f["options"]["null"] == "False"
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070082 if required:
Zack Williams045b63d2019-01-22 16:30:57 -070083 validators.append({"name": "required", "bool_value": required})
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070084 except KeyError:
85 pass
86
87 return validators
88
Zack Williams045b63d2019-01-22 16:30:57 -070089
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070090def is_number(s):
91 try:
92 float(s)
93 return True
94 except ValueError:
95 return False
96
Zack Williams045b63d2019-01-22 16:30:57 -070097
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070098def xproto_default_to_gui(default):
99 val = "null"
100 if is_number(default):
101 val = str(default)
Zack Williams045b63d2019-01-22 16:30:57 -0700102 elif eval(default) is True:
103 val = "true"
104 elif eval(default) is False:
105 val = "false"
106 elif eval(default) is None:
107 val = "null"
Matteo Scandolo292cc2a2017-07-31 19:02:12 -0700108 else:
109 val = str(default)
Matteo Scandolo1f826a42017-08-02 12:02:02 -0700110 return val
111
112
113def xproto_links_to_modeldef_relations(llst):
114 outlist = []
115 seen = []
116 for l in llst:
117 try:
Zack Williams045b63d2019-01-22 16:30:57 -0700118 t = l["link_type"]
119 except KeyError as e:
Matteo Scandolo1f826a42017-08-02 12:02:02 -0700120 raise e
121
Zack Williams045b63d2019-01-22 16:30:57 -0700122 if l["peer"]["fqn"] not in seen and t != "manytomany":
123 on_field = "null"
124 if l["link_type"] == "manytoone":
125 on_field = l["src_port"]
126 elif l["link_type"] == "onetomany":
127 on_field = l["dst_port"]
128 outlist.append(
129 "- {model: %s, type: %s, on_field: %s}\n"
130 % (l["peer"]["name"], l["link_type"], on_field)
131 )
132 seen.append(l["peer"])
Matteo Scandolo1f826a42017-08-02 12:02:02 -0700133
Sapan Bhatiabfb233a2018-02-09 14:53:09 -0800134 return outlist