JIRA Issue DOMINO-20
[domino.git] / lib / partitioner / partitioner.py
1 #!/usr/bin/env python
2
3 #
4 # Licence statement goes here
5 #
6
7 import constants 
8 import copy
9
10 def partition_tosca(filepath, nodesite, tpl):
11   file_paths = {} #holds the list of partitioned files
12   sitenodes = {} #holds nodes in each site
13   
14   #identify the number of partitions
15   for node in nodesite:
16     if nodesite[node] != []:
17      if sitenodes.has_key(nodesite[node]):
18        sitenodes[nodesite[node]].append(node)
19      else:
20        sitenodes[nodesite[node]] = [node]
21
22   #prepare the nodes
23   tpl_local = {}
24   for site in sitenodes:
25     tpl_local[site] = copy.deepcopy(tpl)  
26   #remove the nodes not assigned to a site
27   for node in nodesite:
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)
41  
42   for site in sitenodes:
43     tpl_l = tpl_local[site]
44     rm_orphans(tpl_l)
45     file_paths[site] = filepath + '_part' + str(site) + '.yaml'
46     fout = open(file_paths[site],'w')
47  
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, '  ') 
52    
53     fout.write('\n')
54
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, '  ')
59
60     fout.write('\n')
61
62     if tpl_l.has_key('metadata'):
63        fout.write('metadata: ' + '\n')
64        write_obj(fout, tpl_l['metadata'], None, '  ')
65
66     fout.write('\n')
67
68     if tpl_l.has_key('policy_types'):
69        fout.write('policy_types: ' + '\n')
70        write_obj(fout, tpl_l['policy_types'], None, '  ')
71
72     fout.write('\n')
73
74     if tpl_l.has_key('topology_template'):
75        fout.write('topology_template: ' + '\n')
76        write_obj(fout, tpl_l['topology_template'], None, '  ')
77    
78     fout.close() 
79   
80   return file_paths
81
82
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')
89
90   elif type(curr) is dict:
91     if prev is not None and type(prev) is not list:
92       f.write('\n')
93     for key in curr:
94         if type(prev) is list:
95           f.write(prepad + '- ' + str(key) + ':')
96           write_obj(f, curr[key], curr, prepad + '    ')
97         else:
98           f.write(prepad + str(key) + ':')
99           write_obj(f, curr[key], curr, prepad + '  ')
100   
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):
104       f.write(' ')
105       f.write(str(curr).replace("'",""))
106     #iterate over list of dictionaries
107     f.write('\n') 
108     for item in curr:
109       write_obj(f, item, curr, prepad )
110
111 def rm_dependents(node_template , node):
112   del_list = []
113   #find the dependents
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:
120           del_list.append(nd)
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:
124           del_list.append(nd)
125   #remove the dependents
126   for i in range(len(del_list)):
127      del node_template[del_list[i]]
128
129 def rm_orphans(tpl):
130   nodes = tpl['topology_template']['node_templates']
131   keep_list = []
132   for node in nodes:
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):
139       del nodes[node]