2 # ============LICENSE_START====================================================
3 # org.onap.vvp/validation-scripts
4 # ===================================================================
5 # Copyright © 2019 AT&T Intellectual Property. All rights reserved.
6 # ===================================================================
8 # Unless otherwise specified, all software contained herein is licensed
9 # under the Apache License, Version 2.0 (the "License");
10 # you may not use this software except in compliance with the License.
11 # You may obtain a copy of the License at
13 # http://www.apache.org/licenses/LICENSE-2.0
15 # Unless required by applicable law or agreed to in writing, software
16 # distributed under the License is distributed on an "AS IS" BASIS,
17 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 # See the License for the specific language governing permissions and
19 # limitations under the License.
23 # Unless otherwise specified, all documentation contained herein is licensed
24 # under the Creative Commons License, Attribution 4.0 Intl. (the "License");
25 # you may not use this documentation except in compliance with the License.
26 # You may obtain a copy of the License at
28 # https://creativecommons.org/licenses/by/4.0/
30 # Unless required by applicable law or agreed to in writing, documentation
31 # distributed under the License is distributed on an "AS IS" BASIS,
32 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
33 # See the License for the specific language governing permissions and
34 # limitations under the License.
36 # ============LICENSE_END============================================
43 from preload.generator import (
45 get_or_create_template,
46 AbstractPreloadGenerator,
49 THIS_DIR = os.path.dirname(os.path.abspath(__file__))
50 DATA_DIR = os.path.join(THIS_DIR, "vnfapi_data")
53 def get_or_create_network_template(network_role, vm_networks):
55 If the network role already exists in vm_networks, then
56 return that otherwise create a blank template and return that
58 return get_or_create_template(
59 DATA_DIR, "network-role", network_role, vm_networks, "vm-network"
63 class VnfApiPreloadGenerator(AbstractPreloadGenerator):
65 def supports_output_passing(cls):
73 def output_sub_dir(cls):
76 def generate_module(self, vnf_module, output_dir):
77 preload = get_json_template(DATA_DIR, "preload_template")
78 self._populate(preload, vnf_module)
79 outfile = "{}/{}.json".format(output_dir, vnf_module.vnf_name)
80 with open(outfile, "w") as f:
81 json.dump(preload, f, indent=4)
83 def add_floating_ips(self, network_template, network):
84 # only one floating IP is really supported, in the preload model
85 # so for now we'll just use the last one. We might revisit this
86 # and if multiple floating params exist, then come up with an
87 # approach to pick just one
88 for ip in network.floating_ips:
89 key = "floating-ip" if ip.ip_version == 4 else "floating-ip-v6"
90 network_template[key] = self.replace(ip.param, single=True)
92 def add_fixed_ips(self, network_template, port):
93 for ip in port.fixed_ips:
94 if ip.ip_version == 4:
95 network_template["network-ips"].append(
96 {"ip-address": self.replace(ip.param, single=True)}
98 network_template["ip-count"] += 1
100 network_template["network-ips-v6"].append(
101 {"ip-address": self.replace(ip.param, single=True)}
103 network_template["ip-count-ipv6"] += 1
105 def _populate(self, preload, vnf_module):
106 self._add_availability_zones(preload, vnf_module)
107 self._add_vnf_networks(preload, vnf_module)
108 self._add_vms(preload, vnf_module)
109 self._add_parameters(preload, vnf_module)
111 def _add_availability_zones(self, preload, vnf_module):
112 zones = preload["input"]["vnf-topology-information"]["vnf-assignments"][
115 for zone in vnf_module.availability_zones:
116 zones.append({"availability-zone": self.replace(zone, single=True)})
118 def _add_vnf_networks(self, preload, vnf_module):
119 networks = preload["input"]["vnf-topology-information"]["vnf-assignments"][
122 for network in vnf_module.networks:
124 "network-role": network.network_role,
125 "network-name": self.replace(
127 "VALUE FOR: network name for {}".format(network.name_param),
130 for subnet in network.subnet_params:
131 key = "ipv6-subnet-id" if "_v6_" in subnet else "subnet-id"
132 network_data[key] = subnet
133 networks.append(network_data)
135 def _add_vms(self, preload, vnf_module):
136 vm_list = preload["input"]["vnf-topology-information"]["vnf-assignments"][
139 for vm in vnf_module.virtual_machine_types:
140 vm_template = get_json_template(DATA_DIR, "vm")
141 vm_template["vm-type"] = vm.vm_type
142 vm_template["vm-count"] = vm.vm_count
143 for name in vm.names:
144 value = self.replace(name, single=True)
145 vm_template["vm-names"]["vm-name"].append(value)
146 vm_list.append(vm_template)
147 vm_networks = vm_template["vm-networks"]
148 for port in vm.ports:
149 role = port.network.network_role
150 network_template = get_or_create_network_template(role, vm_networks)
151 network_template["network-role"] = role
152 network_template["network-role-tag"] = role
153 network_template["use-dhcp"] = "Y" if port.uses_dhcp else "N"
154 self.add_fixed_ips(network_template, port)
155 self.add_floating_ips(network_template, port)
157 def _add_parameters(self, preload, vnf_module):
158 params = preload["input"]["vnf-topology-information"]["vnf-parameters"]
159 for key, value in vnf_module.preload_parameters.items():
162 "vnf-parameter-name": key,
163 "vnf-parameter-value": self.replace(key, value),