blob: 947be4fb231144215a0b745974c43cdfe98500bd [file] [log] [blame]
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +02001# 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
Zack Williams9a42f872019-02-15 17:56:04 -070015from __future__ import absolute_import
Matteo Scandolo68ab5432017-12-06 15:38:13 -080016from xosgenx.jinja2_extensions import xproto_field_graph_components
17
Zack Williams045b63d2019-01-22 16:30:57 -070018
Scott Baker1d44c812019-03-07 16:14:13 -080019def xproto_tosca_required(null, blank, default=None, modifier=None):
20 # `null` is not currently considered. `blank` is deprecated.
21 if (modifier == "optional") or (blank == "True") or (default is not None):
Scott Bakerc80304a2019-03-07 11:07:29 -080022 return "false"
23
Matteo Scandolo727e19c2017-12-05 12:53:16 -080024 return "true"
25
Zack Williams045b63d2019-01-22 16:30:57 -070026
Matteo Scandolo727e19c2017-12-05 12:53:16 -080027def xproto_tosca_field_type(type):
28 """
29 TOSCA requires fields of type 'bool' to be 'boolean'
30 TOSCA requires fields of type 'int32' to be 'integer'
31 """
32
33 if type == "bool":
34 return "boolean"
35 elif type == "int32":
36 return "integer"
37 else:
38 return type
39
Zack Williams045b63d2019-01-22 16:30:57 -070040
Matteo Scandoloa17e6e42018-05-25 10:28:25 -070041def xproto_fields_to_tosca_keys(fields, m):
Matteo Scandolo68ab5432017-12-06 15:38:13 -080042 keys = []
43
44 # look for one_of keys
Zack Williams045b63d2019-01-22 16:30:57 -070045 _one_of = xproto_field_graph_components(fields, m, "tosca_key_one_of")
Matteo Scandolo68ab5432017-12-06 15:38:13 -080046 one_of = [list(i) for i in _one_of]
47
48 # look for explicit keys
49 for f in fields:
Zack Williams045b63d2019-01-22 16:30:57 -070050 if (
51 "tosca_key" in f["options"]
52 and f["options"]["tosca_key"]
53 and "link" not in f
54 ):
55 keys.append(f["name"])
56 if (
57 "tosca_key" in f["options"]
58 and f["options"]["tosca_key"]
59 and ("link" in f and f["link"])
60 ):
61 keys.append("%s_id" % f["name"])
Matteo Scandolo68ab5432017-12-06 15:38:13 -080062 # if not keys are specified and there is a name field, use that as key.
Zack Williams9a42f872019-02-15 17:56:04 -070063 if len(keys) == 0 and "name" in [f["name"] for f in fields]:
Zack Williams045b63d2019-01-22 16:30:57 -070064 keys.append("name")
Matteo Scandolo68ab5432017-12-06 15:38:13 -080065
Zack Williams9a42f872019-02-15 17:56:04 -070066 for of in sorted(one_of):
Matteo Scandolo68ab5432017-12-06 15:38:13 -080067 # check if the field is a link, and in case add _id
68 for index, f in enumerate(of):
69 try:
Zack Williams9a42f872019-02-15 17:56:04 -070070 # FIXME: the 'field' var appears to be dead code, but exists to cause the IndexError?
71 field = [ # noqa: F841
Zack Williams045b63d2019-01-22 16:30:57 -070072 x for x in fields if x["name"] == f and ("link" in x and x["link"])
73 ][0]
Matteo Scandolo68ab5432017-12-06 15:38:13 -080074 of[index] = "%s_id" % f
Zack Williams9a42f872019-02-15 17:56:04 -070075 except IndexError:
Matteo Scandolo68ab5432017-12-06 15:38:13 -080076 # the field is not a link
77 pass
78
79 keys.append(of)
80
Sapan Bhatiabfb233a2018-02-09 14:53:09 -080081 return keys