4 # Licence statement goes here
7 #from toscaparser.tosca_template import ToscaTemplate
10 #Parses policy rules, extracts targets, extracts policy properties
11 #Returns set of policy properties for each target in a dictionary object
12 #e.g., node_labels['VNF1'] = {label1, label2, ..., labeln}
13 def extract_labels(tpl):
14 node_labels = dict() #stores labels for each node
16 if tpl.has_key('topology_template'):
17 if tpl['topology_template'].has_key('policies'):
18 policies = tpl['topology_template']['policies']
24 #extract label sets for each policy target
27 targetlist = p[rule]['targets']
28 for props in p[rule]['properties']:
29 prop_list = p[rule]['properties'][props]
30 for values in prop_list:
31 labelkey = p[rule]['type']+ ':properties:' + props + ":" + values
32 for target in targetlist:
33 if node_labels.has_key(target):
34 node_labels[target].update(set([labelkey]))
36 node_labels[target] = set([labelkey])
39 # Returns a map from nodes to regions based on label matching
40 def map_nodes(site_labels,node_labels):
41 sitemap = dict() #stores mapping
43 #for each target find a map of sites
44 for node in node_labels:
46 for site in site_labels:
47 if node_labels[node].issubset(site_labels[site]):
48 sitemap[node].add(site)
52 # Selects sites for nodes if multiple candidates exist
53 # First iterate for nodes with single candidate site
54 # Rank sites with most nodes higher
55 def select_site( site_map ):
58 #SHALL I CHECK IF ANY KEY HAS AN EMPTY SET TO THROW EXCEPTION?
59 #For now, I assume input as safe
63 if len(site_map[node]) == 1:
64 for site in site_map[node]:
65 node_site[node] = site
66 if counter.has_key(site):
67 counter[site] = counter[site] + 1
72 if len(site_map[node]) > 1:
75 for site in site_map[node]:
76 if counter.has_key(site) and counter[site] >= maxval:
77 maxval = counter[site]
79 elif counter.has_key(site) == False:
84 node_site[node] = maxkey
85 counter[node_site[node]] = counter[node_site[node]] + 1