blob: d72150319d522170379cf29c5e0d7c8b7ad6fb86 [file] [log] [blame]
Kang Xi11d278c2018-04-06 16:56:04 -04001#! /usr/bin/python
2
3import requests
4import json
5import sys
6from datetime import datetime
7from vcpecommon import *
8import csar_parser
9import logging
10import base64
11
12
13class Preload:
14 def __init__(self, vcpecommon):
15 self.logger = logging.getLogger(__name__)
16 self.vcpecommon = vcpecommon
17
18 def replace(self, sz, replace_dict):
19 for old_string, new_string in replace_dict.items():
20 sz = sz.replace(old_string, new_string)
21 if self.vcpecommon.template_variable_symbol in sz:
22 self.logger.error('Error! Cannot find a value to replace ' + sz)
23 return sz
24
25 def generate_json(self, template_file, replace_dict):
26 with open(template_file) as json_input:
27 json_data = json.load(json_input)
28 stk = [json_data]
29 while len(stk) > 0:
30 data = stk.pop()
31 for k, v in data.items():
32 if type(v) is dict:
33 stk.append(v)
34 elif type(v) is list:
35 stk.extend(v)
36 elif type(v) is str or type(v) is unicode:
37 if self.vcpecommon.template_variable_symbol in v:
38 data[k] = self.replace(v, replace_dict)
39 else:
40 self.logger.warning('Unexpected line in template: %s. Look for value %s', template_file, v)
41 return json_data
42
43 def reset_sniro(self):
44 self.logger.debug('Clearing SNIRO data')
45 r = requests.post(self.vcpecommon.sniro_url + '/reset', headers=self.vcpecommon.sniro_headers)
46 if 2 != r.status_code / 100:
47 self.logger.debug(r.content)
48 self.logger.error('Clearing SNIRO date failed.')
49 sys.exit()
50
51 def preload_sniro(self, template_sniro_data, template_sniro_request, tunnelxconn_ar_name, vgw_name, vbrg_ar_name,
52 vgmux_svc_instance_uuid, vbrg_svc_instance_uuid):
53 self.reset_sniro()
54 self.logger.info('Preloading SNIRO for homing service')
55 replace_dict = {'${tunnelxconn_ar_name}': tunnelxconn_ar_name,
56 '${vgw_name}': vgw_name,
57 '${brg_ar_name}': vbrg_ar_name,
58 '${vgmux_svc_instance_uuid}': vgmux_svc_instance_uuid,
59 '${vbrg_svc_instance_uuid}': vbrg_svc_instance_uuid
60 }
61 sniro_data = self.generate_json(template_sniro_data, replace_dict)
62 self.logger.debug('SNIRO data:')
63 self.logger.debug(json.dumps(sniro_data, indent=4, sort_keys=True))
64
65 base64_sniro_data = base64.b64encode(json.dumps(sniro_data))
66 self.logger.debug('SNIRO data: 64')
67 self.logger.debug(base64_sniro_data)
68 replace_dict = {'${base64_sniro_data}': base64_sniro_data, '${sniro_ip}': self.vcpecommon.hosts['robot']}
69 sniro_request = self.generate_json(template_sniro_request, replace_dict)
70 self.logger.debug('SNIRO request:')
71 self.logger.debug(json.dumps(sniro_request, indent=4, sort_keys=True))
72
73 r = requests.post(self.vcpecommon.sniro_url, headers=self.vcpecommon.sniro_headers, json=sniro_request)
74 if 2 != r.status_code / 100:
75 response = r.json()
76 self.logger.debug(json.dumps(response, indent=4, sort_keys=True))
77 self.logger.error('SNIRO preloading failed.')
78 sys.exit()
79
80 return True
81
82 def preload_network(self, template_file, network_role, subnet_start_ip, subnet_gateway, common_dict, name_suffix):
83 """
84 :param template_file:
85 :param network_role: cpe_signal, cpe_public, brg_bng, bng_mux, mux_gw
86 :param subnet_start_ip:
87 :param subnet_gateway:
88 :param name_suffix: e.g. '201711201311'
89 :return:
90 """
91 network_name = '_'.join([self.vcpecommon.instance_name_prefix['network'], network_role.lower(), name_suffix])
92 subnet_name = self.vcpecommon.network_name_to_subnet_name(network_name)
93 common_dict['${' + network_role+'_net}'] = network_name
94 common_dict['${' + network_role+'_subnet}'] = subnet_name
95 replace_dict = {'${network_role}': network_role,
96 '${service_type}': 'vCPE',
97 '${network_type}': 'Generic NeutronNet',
98 '${network_name}': network_name,
99 '${subnet_start_ip}': subnet_start_ip,
100 '${subnet_gateway}': subnet_gateway
101 }
102 self.logger.info('Preloading network ' + network_role)
103 return self.preload(template_file, replace_dict, self.vcpecommon.sdnc_preload_network_url)
104
105 def preload(self, template_file, replace_dict, url):
106 json_data = self.generate_json(template_file, replace_dict)
107 self.logger.debug(json.dumps(json_data, indent=4, sort_keys=True))
108 r = requests.post(url, headers=self.vcpecommon.sdnc_headers, auth=self.vcpecommon.sdnc_userpass, json=json_data)
109 response = r.json()
110 if int(response.get('output', {}).get('response-code', 0)) != 200:
111 self.logger.debug(json.dumps(response, indent=4, sort_keys=True))
112 self.logger.error('Preloading failed.')
113 return False
114 return True
115
116 def preload_vgw(self, template_file, brg_mac, commont_dict, name_suffix):
117 replace_dict = {'${brg_mac}': brg_mac,
118 '${suffix}': name_suffix
119 }
120 replace_dict.update(commont_dict)
121 self.logger.info('Preloading vGW')
122 return self.preload(template_file, replace_dict, self.vcpecommon.sdnc_preload_vnf_url)
123
Brian Freeman81f6e9e2018-11-11 22:36:20 -0500124 def preload_vgw_gra(self, template_file, brg_mac, commont_dict, name_suffix, vgw_vfmod_name_index):
125 replace_dict = {'${brg_mac}': brg_mac,
Brian Freemana605bc72018-11-12 10:50:30 -0500126 '${suffix}': name_suffix,
Brian Freeman81f6e9e2018-11-11 22:36:20 -0500127 '${vgw_vfmod_name_index}': vgw_vfmod_name_index
128 }
129 replace_dict.update(commont_dict)
130 self.logger.info('Preloading vGW-GRA')
131 return self.preload(template_file, replace_dict, self.vcpecommon.sdnc_preload_vnf_url)
132
Kang Xi11d278c2018-04-06 16:56:04 -0400133 def preload_vfmodule(self, template_file, service_instance_id, vnf_model, vfmodule_model, common_dict, name_suffix):
134 """
135 :param template_file:
136 :param service_instance_id:
137 :param vnf_model: parsing results from csar_parser
138 :param vfmodule_model: parsing results from csar_parser
139 :param common_dict:
140 :param name_suffix:
141 :return:
142 """
143
144 # examples:
145 # vfmodule_model['modelCustomizationName']: "Vspinfra111601..base_vcpe_infra..module-0",
146 # vnf_model['modelCustomizationName']: "vspinfra111601 0",
147
148 vfmodule_name = '_'.join([self.vcpecommon.instance_name_prefix['vfmodule'],
149 vfmodule_model['modelCustomizationName'].split('..')[0].lower(), name_suffix])
150
151 # vnf_type and generic_vnf_type are identical
152 replace_dict = {'${vnf_type}': vfmodule_model['modelCustomizationName'],
153 '${generic_vnf_type}': vfmodule_model['modelCustomizationName'],
154 '${service_type}': service_instance_id,
155 '${generic_vnf_name}': vnf_model['modelCustomizationName'],
156 '${vnf_name}': vfmodule_name,
157 '${suffix}': name_suffix}
158 replace_dict.update(common_dict)
159 self.logger.info('Preloading VF Module ' + vfmodule_name)
160 return self.preload(template_file, replace_dict, self.vcpecommon.sdnc_preload_vnf_url)
161
162 def preload_all_networks(self, template_file, name_suffix):
163 common_dict = {'${' + k + '}': v for k, v in self.vcpecommon.common_preload_config.items()}
164 for network, v in self.vcpecommon.preload_network_config.items():
165 subnet_start_ip, subnet_gateway_ip = v
166 if not self.preload_network(template_file, network, subnet_start_ip, subnet_gateway_ip,
167 common_dict, name_suffix):
168 return None
169 return common_dict
170
171 def test(self):
172 # this is for testing purpose
173 name_suffix = datetime.now().strftime('%Y%m%d%H%M')
174 vcpecommon = VcpeCommon()
175 preloader = Preload(vcpecommon)
176
177 network_dict = {'${' + k + '}': v for k, v in self.vcpecommon.common_preload_config.items()}
178 template_file = 'preload_templates/template.network.json'
179 for k, v in self.vcpecommon.preload_network_config.items():
180 if not preloader.preload_network(template_file, k, v[0], v[1], network_dict, name_suffix):
181 break
182
183 print('---------------------------------------------------------------')
184 print('Network related replacement dictionary:')
185 print(json.dumps(network_dict, indent=4, sort_keys=True))
186 print('---------------------------------------------------------------')
187
188 keys = ['infra', 'bng', 'gmux', 'brg']
189 for key in keys:
190 csar_file = self.vcpecommon.find_file(key, 'csar', 'csar')
191 template_file = self.vcpecommon.find_file(key, 'json', 'preload_templates')
192 if csar_file and template_file:
193 parser = csar_parser.CsarParser()
194 parser.parse_csar(csar_file)
195 service_instance_id = 'test112233'
196 preloader.preload_vfmodule(template_file, service_instance_id, parser.vnf_models[0],
197 parser.vfmodule_models[0], network_dict, name_suffix)
198
199 def test_sniro(self):
200 template_sniro_data = self.vcpecommon.find_file('sniro_data', 'json', 'preload_templates')
201 template_sniro_request = self.vcpecommon.find_file('sniro_request', 'json', 'preload_templates')
202
203 vcperescust_csar = self.vcpecommon.find_file('rescust', 'csar', 'csar')
204 parser = csar_parser.CsarParser()
205 parser.parse_csar(vcperescust_csar)
206 tunnelxconn_ar_name = None
207 brg_ar_name = None
208 vgw_name = None
209 for model in parser.vnf_models:
210 if 'tunnel' in model['modelCustomizationName']:
211 tunnelxconn_ar_name = model['modelCustomizationName']
212 elif 'brg' in model['modelCustomizationName']:
213 brg_ar_name = model['modelCustomizationName']
214 elif 'vgw' in model['modelCustomizationName']:
215 vgw_name = model['modelCustomizationName']
216
217 if not (tunnelxconn_ar_name and brg_ar_name and vgw_name):
218 self.logger.error('Cannot find all names from %s.', vcperescust_csar)
219 sys.exit()
220
221 vgmux_svc_instance_uuid = '88888888888888'
222 vbrg_svc_instance_uuid = '999999999999999'
223
224 self.preload_sniro(template_sniro_data, template_sniro_request, tunnelxconn_ar_name, vgw_name, brg_ar_name,
225 vgmux_svc_instance_uuid, vbrg_svc_instance_uuid)