Replace toscaparser with native yaml to load published Tosca file into memory
[domino.git] / lib / mapper / label.py
1 #!/usr/bin/env python
2
3 #
4 # Licence statement goes here
5 #
6
7 #from toscaparser.tosca_template import ToscaTemplate
8
9 #Current version:
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
15   
16   if tpl.has_key('topology_template'):
17     if tpl['topology_template'].has_key('policies'):
18       policies = tpl['topology_template']['policies']
19     else:
20       return node_labels
21   else:
22     return node_labels
23
24   #extract label sets for each policy target
25   for p in policies:
26     for rule in p:
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]))
35             else:
36               node_labels[target] = set([labelkey])
37   return node_labels
38
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
42
43   #for each target find a map of sites
44   for node in node_labels:
45     sitemap[node] = set()
46     for site in site_labels:
47       if node_labels[node].issubset(site_labels[site]):
48         sitemap[node].add(site)
49
50   return sitemap
51
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 ): 
56   node_site = dict()
57   counter = dict()
58   #SHALL I CHECK IF ANY KEY HAS AN EMPTY SET TO THROW EXCEPTION?
59   #For now, I assume input as safe
60
61   for node in site_map:
62     node_site[node] = [] 
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
68         else:
69           counter[site] = 1
70
71   for node in site_map:
72     if len(site_map[node]) > 1:
73       maxval = 0
74       maxkey = '-1'
75       for site in site_map[node]:
76         if counter.has_key(site) and counter[site] >= maxval:
77           maxval = counter[site]
78           maxkey = site
79         elif counter.has_key(site) == False:
80           counter[site] = 1
81           if maxval == 0:
82             maxval = 1
83             maxkey = site
84       node_site[node] = maxkey        
85   return node_site