1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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 )
|