aboutsummaryrefslogtreecommitdiffstats
path: root/lib/mapper/label.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mapper/label.py')
-rw-r--r--lib/mapper/label.py85
1 files changed, 85 insertions, 0 deletions
diff --git a/lib/mapper/label.py b/lib/mapper/label.py
new file mode 100644
index 0000000..8591d7c
--- /dev/null
+++ b/lib/mapper/label.py
@@ -0,0 +1,85 @@
+#!/usr/bin/env python
+
+#
+# Licence statement goes here
+#
+
+#from toscaparser.tosca_template import ToscaTemplate
+
+#Current version:
+#Parses policy rules, extracts targets, extracts policy properties
+#Returns set of policy properties for each target in a dictionary object
+#e.g., node_labels['VNF1'] = {label1, label2, ..., labeln}
+def extract_labels(tosca):
+ node_labels = dict() #stores labels for each node
+
+ if tosca.tpl.has_key('topology_template'):
+ if tosca.tpl['topology_template'].has_key('policies'):
+ policies = tosca.tpl['topology_template']['policies']
+ else:
+ return node_labels
+ else:
+ return node_labels
+
+ #extract label sets for each policy target
+ for p in policies:
+ for rule in p:
+ targetlist = p[rule]['targets']
+ for props in p[rule]['properties']:
+ prop_list = p[rule]['properties'][props]
+ for values in prop_list:
+ labelkey = p[rule]['type']+ ':properties:' + props + ":" + values
+ for target in targetlist:
+ if node_labels.has_key(target):
+ node_labels[target].update(set([labelkey]))
+ else:
+ node_labels[target] = set([labelkey])
+ return node_labels
+
+# Returns a map from nodes to regions based on label matching
+def map_nodes(site_labels,node_labels):
+ sitemap = dict() #stores mapping
+
+ #for each target find a map of sites
+ for node in node_labels:
+ sitemap[node] = set()
+ for site in site_labels:
+ if node_labels[node].issubset(site_labels[site]):
+ sitemap[node].add(site)
+
+ return sitemap
+
+# Selects sites for nodes if multiple candidates exist
+# First iterate for nodes with single candidate site
+# Rank sites with most nodes higher
+def select_site( site_map ):
+ node_site = dict()
+ counter = dict()
+ #SHALL I CHECK IF ANY KEY HAS AN EMPTY SET TO THROW EXCEPTION?
+ #For now, I assume input as safe
+
+ for node in site_map:
+ node_site[node] = []
+ if len(site_map[node]) == 1:
+ for site in site_map[node]:
+ node_site[node] = site
+ if counter.has_key(site):
+ counter[site] = counter[site] + 1
+ else:
+ counter[site] = 1
+
+ for node in site_map:
+ if len(site_map[node]) > 1:
+ maxval = 0
+ maxkey = '-1'
+ for site in site_map[node]:
+ if counter.has_key(site) and counter[site] >= maxval:
+ maxval = counter[site]
+ maxkey = site
+ elif counter.has_key(site) == False:
+ counter[site] = 1
+ if maxval == 0:
+ maxval = 1
+ maxkey = site
+ node_site[node] = maxkey
+ return node_site