diff options
-rw-r--r-- | lib/partitioner/partitioner.py | 25 | ||||
-rwxr-xr-x | tests/run.sh | 4 | ||||
-rwxr-xr-x | tests/test_partitioner.py | 49 |
3 files changed, 73 insertions, 5 deletions
diff --git a/lib/partitioner/partitioner.py b/lib/partitioner/partitioner.py index f5b1546..5177b1b 100644 --- a/lib/partitioner/partitioner.py +++ b/lib/partitioner/partitioner.py @@ -9,20 +9,16 @@ 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: @@ -32,13 +28,14 @@ def partition_tosca(filepath, nodesite, tpl): for site in sitenodes: if node not in sitenodes[site]: del tpl_local[site]['topology_template']['node_templates'][node] + rm_dependents(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! + # remove the rule if there is no target left! if len(rule[key]['targets']) is 0: tpl_local[site]['topology_template']['policies'].remove(rule) @@ -110,3 +107,21 @@ def write_obj(f, curr, prev, prepad): f.write('\n') for item in curr: write_obj(f, item, curr, prepad ) + +def rm_dependents(node_template , node): + del_list = [] + #find the dependents + for nd in node_template: + if node_template[nd].has_key('requirements'): + for i in range(len(node_template[nd]['requirements'])): + if node_template[nd]['requirements'][i].has_key('virtualLink') and \ + node_template[nd]['requirements'][i]['virtualLink'].has_key('node') and \ + node_template[nd]['requirements'][i]['virtualLink']['node'] == node: + del_list.append(nd) + if node_template[nd]['requirements'][i].has_key('virtualBinding') and \ + node_template[nd]['requirements'][i]['virtualBinding'].has_key('node') and \ + node_template[nd]['requirements'][i]['virtualBinding']['node'] == node: + del_list.append(nd) + #remove the dependents + for i in range(len(del_list)): + del node_template[del_list[i]] diff --git a/tests/run.sh b/tests/run.sh index 695f0da..33c2749 100755 --- a/tests/run.sh +++ b/tests/run.sh @@ -64,6 +64,10 @@ cleanup() { echo "Stopping Domino Server..." stop_server + + if [ -f file1 ]; then + rm file1 + fi } echo "domino/tests/run.sh has been executed." diff --git a/tests/test_partitioner.py b/tests/test_partitioner.py new file mode 100755 index 0000000..246f6ba --- /dev/null +++ b/tests/test_partitioner.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python + +#Copyright 2016 Open Platform for NFV Project, Inc. and its contributors +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys, os, glob + +sys.path.insert(0, glob.glob('./lib')[0]) + +from toscaparser.tosca_template import ToscaTemplate + +from mapper import * +from partitioner import * + +def main(argv): + try: + tosca = ToscaTemplate(argv[0]) + # Extract Labels + node_labels = label.extract_labels( tosca ) + print node_labels + site_id = 0 + subscribed_labels = {} + for key in node_labels: + subscribed_labels[site_id] = node_labels[key] + site_id = site_id + 1 + + # Map nodes in the template to resource domains + site_map = label.map_nodes( subscribed_labels , node_labels ) + print site_map + + # Select a site for each VNF + node_site = label.select_site( site_map ) + print node_site + + file_paths = partitioner.partition_tosca("./tests/tmp/tosca",node_site,tosca.tpl) + print file_paths + except: + print('Unexpected error: %s', sys.exc_info()[0]) + +if __name__ == "__main__": + main(sys.argv[1:]) |