4 # Licence statement goes here
10 def partition_tosca(filepath, nodesite, tpl, tpl_local={}):
11 file_paths = {} #holds the list of partitioned files
12 sitenodes = {} #holds nodes in each site
14 #identify the number of partitions
16 if nodesite[node] != []:
17 if sitenodes.has_key(nodesite[node]):
18 sitenodes[nodesite[node]].append(node)
20 sitenodes[nodesite[node]] = [node]
24 for site in sitenodes:
25 tpl_local[site] = copy.deepcopy(tpl)
26 #remove the nodes not assigned to a site
28 for site in sitenodes:
29 if node not in sitenodes[site]:
30 tpl_local[site]['topology_template']['node_templates'].pop(node,None)
31 rm_dependents(tpl_local[site]['topology_template']['node_templates'] , node)
32 #remove from policy targets
33 if tpl_local[site]['topology_template'].has_key('policies'):
34 for rule in tpl_local[site]['topology_template']['policies']:
35 for key in rule: #there should be only one key
36 if node in rule[key]['targets']:
37 rule[key]['targets'].remove(node)
38 # remove the rule if there is no target left!
39 if len(rule[key]['targets']) is 0:
40 tpl_local[site]['topology_template']['policies'].remove(rule)
42 for site in sitenodes:
43 tpl_l = tpl_local[site]
45 file_paths[site] = filepath + '_part' + str(site) + '.yaml'
46 fout = open(file_paths[site],'w')
48 if tpl_l.has_key('tosca_definitions_version'):
49 fout.write('tosca_definitions_version: ')
50 fout.write(tpl_l['tosca_definitions_version'] + '\n')
51 write_obj(fout, tpl_l['tosca_definitions_version'], None, ' ')
55 if tpl_l.has_key('description'):
56 fout.write('description: ')
57 fout.write(tpl_l['description'] + '\n')
58 write_obj(fout, tpl_l['description'], None, ' ')
62 if tpl_l.has_key('metadata'):
63 fout.write('metadata: ' + '\n')
64 write_obj(fout, tpl_l['metadata'], None, ' ')
68 if tpl_l.has_key('policy_types'):
69 fout.write('policy_types: ' + '\n')
70 write_obj(fout, tpl_l['policy_types'], None, ' ')
74 if tpl_l.has_key('topology_template'):
75 fout.write('topology_template: ' + '\n')
76 write_obj(fout, tpl_l['topology_template'], None, ' ')
83 def write_obj(f, curr, prev, prepad):
84 if type(curr) in (str,int,float,bool):
85 #should be a string, numerical, boolean, etc.
86 if type(prev) is dict:
87 #write on the same line, key should be written
88 f.write(' ' + str(curr) + '\n')
90 elif type(curr) is dict:
91 if prev is not None and type(prev) is not list:
94 if type(prev) is list:
95 f.write(prepad + '- ' + str(key) + ':')
96 write_obj(f, curr[key], curr, prepad + ' ')
98 f.write(prepad + str(key) + ':')
99 write_obj(f, curr[key], curr, prepad + ' ')
101 elif type(curr) is list:
102 #check if this list is a leaf node
103 if len(curr) is 0 or type(curr[0]) in (str,int,float,bool):
105 f.write(str(curr).replace("'",""))
106 #iterate over list of dictionaries
109 write_obj(f, item, curr, prepad )
111 def rm_dependents(node_template , node):
114 for nd in node_template:
115 if node_template[nd].has_key('requirements'):
116 for i in range(len(node_template[nd]['requirements'])):
117 if node_template[nd]['requirements'][i].has_key('virtualLink') and \
118 node_template[nd]['requirements'][i]['virtualLink'].has_key('node') and \
119 node_template[nd]['requirements'][i]['virtualLink']['node'] == node:
121 if node_template[nd]['requirements'][i].has_key('virtualBinding') and \
122 node_template[nd]['requirements'][i]['virtualBinding'].has_key('node') and \
123 node_template[nd]['requirements'][i]['virtualBinding']['node'] == node:
125 #remove the dependents
126 for i in range(len(del_list)):
127 del node_template[del_list[i]]
130 nodes = tpl['topology_template']['node_templates']
133 if nodes[node].has_key('requirements'):
134 for i in range(len(nodes[node]['requirements'])):
135 if nodes[node]['requirements'][i].has_key('virtualLink'):
136 keep_list.append(nodes[node]['requirements'][i]['virtualLink']['node'])
137 for node in list(nodes):
138 if (nodes[node]['type'] == 'tosca.nodes.nfv.VL') and (node not in keep_list):
141 def return_boundarylinks(tpl_site):
144 # First find all the VLs copied to each site
145 for site in tpl_site.keys():
146 nodes = tpl_site[site]['topology_template']['node_templates']
148 if (nodes[node]['type'] == 'tosca.nodes.nfv.VL'):
149 if sites_of_VL.has_key(node): #if true, then this VL maps to more than 1 site
150 sites_of_VL[node].add(site)
151 VL[node] = nodes[node]
153 sites_of_VL[node] = set([site])
155 return VL, sites_of_VL