diff options
Diffstat (limited to 'lib/partitioner/partitioner.py')
-rw-r--r-- | lib/partitioner/partitioner.py | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/lib/partitioner/partitioner.py b/lib/partitioner/partitioner.py new file mode 100644 index 0000000..a098aca --- /dev/null +++ b/lib/partitioner/partitioner.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python + +# +# Licence statement goes here +# + +import constants +import copy + +def partition_tosca(filepath, nodesite, tpl): + file_paths = {} #holds the list of partitioned files + flag = {} #True when key exists + sitenodes = {} #holds nodes in each site + + #identify the number of partitions + for node in nodesite: + if nodesite[node] != []: + flag[nodesite[node]] = True + if sitenodes.has_key(nodesite[node]): + sitenodes[nodesite[node]].append(node) + else: + sitenodes[nodesite[node]] = [node] + + n_parts = len(flag) + + #prepare the nodes + tpl_local = {} + for site in sitenodes: + tpl_local[site] = copy.deepcopy(tpl) + #remove the nodes not assigned to a site + for node in nodesite: + for site in sitenodes: + if node not in sitenodes[site]: + del tpl_local[site]['topology_template']['node_templates'][node] + #remove from policy targets + if tpl_local[site]['topology_template'].has_key('policies'): + for rule in tpl_local[site]['topology_template']['policies']: + for key in rule: #there should be only one key + if node in rule[key]['targets']: + rule[key]['targets'].remove(node) + # remove the rule is there is no target left! + if len(rule[key]['targets']) is 0: + tpl_local[site]['topology_template']['policies'].remove(rule) + + for site in sitenodes: + tpl_l = tpl_local[site] + print tpl_l , '\n' + file_paths[site] = filepath + '_part' + str(site) + fout = open(filepath + '_part' + str(site),'w') + + if tpl_l.has_key('tosca_definitions_version'): + fout.write('tosca_definitions_version: ') + fout.write(tpl_l['tosca_definitions_version'] + '\n') + write_obj(fout, tpl_l['tosca_definitions_version'], None, ' ') + + fout.write('\n') + + if tpl_l.has_key('description'): + fout.write('description: ') + fout.write(tpl_l['description'] + '\n') + write_obj(fout, tpl_l['description'], None, ' ') + + fout.write('\n') + + if tpl_l.has_key('metadata'): + fout.write('metadata: ' + '\n') + write_obj(fout, tpl_l['metadata'], None, ' ') + + fout.write('\n') + + if tpl_l.has_key('policy_types'): + fout.write('policy_types: ' + '\n') + write_obj(fout, tpl_l['policy_types'], None, ' ') + + fout.write('\n') + + if tpl_l.has_key('topology_template'): + fout.write('topology_template: ' + '\n') + write_obj(fout, tpl_l['topology_template'], None, ' ') + + fout.close() + + return file_paths + + +def write_obj(f, curr, prev, prepad): + if type(curr) in (str,int,float,bool): + #should be a string, numerical, boolean, etc. + if type(prev) is dict: + #write on the same line, key should be written + f.write(' ' + str(curr) + '\n') + + elif type(curr) is dict: + if prev is not None and type(prev) is not list: + f.write('\n') + for key in curr: + if type(prev) is list: + f.write(prepad + '- ' + str(key) + ':') + write_obj(f, curr[key], curr, prepad + ' ') + else: + f.write(prepad + str(key) + ':') + write_obj(f, curr[key], curr, prepad + ' ') + + elif type(curr) is list: + #check if this list is a leaf node + if len(curr) is 0 or type(curr[0]) in (str,int,float,bool): + f.write(' ') + f.write(str(curr).replace("'","")) + #iterate over list of dictionaries + f.write('\n') + for item in curr: + write_obj(f, item, curr, prepad ) |