Added heat translation support
[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   flag = {} #True when key exists
13   sitenodes = {} #holds nodes in each site
14   
15   #identify the number of partitions
16   for node in nodesite:
17     if nodesite[node] != []:
18      flag[nodesite[node]] = True
19      if sitenodes.has_key(nodesite[node]):
20        sitenodes[nodesite[node]].append(node)
21      else:
22        sitenodes[nodesite[node]] = [node]
23
24   n_parts = len(flag)
25
26   #prepare the nodes
27   tpl_local = {}
28   for site in sitenodes:
29     tpl_local[site] = copy.deepcopy(tpl)  
30   #remove the nodes not assigned to a site
31   for node in nodesite:
32    for site in sitenodes:
33      if node not in sitenodes[site]:
34        del tpl_local[site]['topology_template']['node_templates'][node] 
35        #remove from policy targets 
36        if tpl_local[site]['topology_template'].has_key('policies'):
37          for rule in tpl_local[site]['topology_template']['policies']:
38            for key in rule: #there should be only one key
39              if node in rule[key]['targets']:
40                rule[key]['targets'].remove(node)
41              # remove the rule is there is no target left!
42              if len(rule[key]['targets']) is 0:
43                tpl_local[site]['topology_template']['policies'].remove(rule)
44
45   for site in sitenodes:
46     tpl_l = tpl_local[site]
47     print tpl_l , '\n'
48     file_paths[site] = filepath + '_part' + str(site) + '.yaml'
49     fout = open(file_paths[site],'w')
50  
51     if tpl_l.has_key('tosca_definitions_version'):
52       fout.write('tosca_definitions_version: ')
53       fout.write(tpl_l['tosca_definitions_version'] + '\n')    
54       write_obj(fout, tpl_l['tosca_definitions_version'], None, '  ') 
55    
56     fout.write('\n')
57
58     if tpl_l.has_key('description'):
59        fout.write('description: ')
60        fout.write(tpl_l['description'] + '\n')
61        write_obj(fout, tpl_l['description'], None, '  ')
62
63     fout.write('\n')
64
65     if tpl_l.has_key('metadata'):
66        fout.write('metadata: ' + '\n')
67        write_obj(fout, tpl_l['metadata'], None, '  ')
68
69     fout.write('\n')
70
71     if tpl_l.has_key('policy_types'):
72        fout.write('policy_types: ' + '\n')
73        write_obj(fout, tpl_l['policy_types'], None, '  ')
74
75     fout.write('\n')
76
77     if tpl_l.has_key('topology_template'):
78        fout.write('topology_template: ' + '\n')
79        write_obj(fout, tpl_l['topology_template'], None, '  ')
80    
81     fout.close() 
82   
83   return file_paths
84
85
86 def write_obj(f, curr, prev, prepad):
87   if type(curr) in (str,int,float,bool): 
88     #should be a string, numerical, boolean, etc.
89     if type(prev) is dict:
90       #write on the same line, key should be written
91       f.write(' ' + str(curr) + '\n')
92
93   elif type(curr) is dict:
94     if prev is not None and type(prev) is not list:
95       f.write('\n')
96     for key in curr:
97         if type(prev) is list:
98           f.write(prepad + '- ' + str(key) + ':')
99           write_obj(f, curr[key], curr, prepad + '    ')
100         else:
101           f.write(prepad + str(key) + ':')
102           write_obj(f, curr[key], curr, prepad + '  ')
103   
104   elif type(curr) is list:
105     #check if this list is a leaf node
106     if len(curr) is 0 or  type(curr[0]) in (str,int,float,bool):
107       f.write(' ')
108       f.write(str(curr).replace("'",""))
109     #iterate over list of dictionaries
110     f.write('\n') 
111     for item in curr:
112       write_obj(f, item, curr, prepad )