Include j2 files in MANIFEST.in.
[osm/PLA.git] / osm_pla / placement / mznplacement.py
index cf6236a..3dcf0bc 100755 (executable)
@@ -18,7 +18,7 @@ import itertools
 
 import pymzn
 from jinja2 import Environment
-from jinja2.loaders import FileSystemLoader
+from jinja2.loaders import FileSystemLoader, PackageLoader, ChoiceLoader
 
 
 class MznPlacementConductor(object):
@@ -88,7 +88,8 @@ class MznModelGenerator(object):
     NsPlacementData objects. Uses jinja2 as templating language for the model
     '''
     default_j2_template = "osm_pla_dynamic_template.j2"
-    template_search_path = ['osm_pla/placement', '../placement', '/pla/osm_pla/placement']
+    template_search_path = ['osm_pla/placement', '../placement', '/pla/osm_pla/placement',
+                            './', '/usr/lib/python3/dist-packages/osm_pla/placement']
 
     def __init__(self, log):
         '''
@@ -111,7 +112,9 @@ class MznModelGenerator(object):
 
     def _load_jinja_template(self, template_name=default_j2_template):
         """loads the jinja template used for model generation"""
-        env = Environment(loader=FileSystemLoader(MznModelGenerator.template_search_path))
+        loader1 = FileSystemLoader(MznModelGenerator.template_search_path)
+        loader2 = PackageLoader('osm_pla', '.')
+        env = Environment(loader=ChoiceLoader([loader1, loader2]))
         return env.get_template(template_name)
 
 
@@ -151,12 +154,12 @@ class NsPlacementDataFactory(object):
         trp_link_characteristics = [[0 if col == row else 0x7fff for col in range(num_vims)] for row in range(num_vims)]
         for pil in self._pil_info['pil']:
             if characteristics in pil.keys():
-                url1 = pil['pil_endpoints'][0]
-                url2 = pil['pil_endpoints'][1]
+                ep1 = pil['pil_endpoints'][0]
+                ep2 = pil['pil_endpoints'][1]
                 # only consider links between applicable vims
-                if url1 in self._vim_accounts_info and url2 in self._vim_accounts_info:
-                    idx1 = self._vim_accounts_info[url1]['idx']
-                    idx2 = self._vim_accounts_info[url2]['idx']
+                if ep1 in self._vim_accounts_info and ep2 in self._vim_accounts_info:
+                    idx1 = self._vim_accounts_info[ep1]['idx']
+                    idx2 = self._vim_accounts_info[ep2]['idx']
                     trp_link_characteristics[idx1][idx2] = pil[characteristics]
                     trp_link_characteristics[idx2][idx1] = pil[characteristics]
 
@@ -170,17 +173,18 @@ class NsPlacementDataFactory(object):
         """
         vld_desc = []
         for vld in self._nsd['vld']:
-            if vld['mgmt-network'] is False:
+            if vld.get('mgmt-network', False) is False:
                 vld_desc_entry = {}
                 cp_refs = [ep_ref['member-vnf-index-ref'] for ep_ref in vld['vnfd-connection-point-ref']]
-                vld_desc_entry['cp_refs'] = cp_refs
-                if 'link-constraint' in vld.keys():
-                    for constraint in vld['link-constraint']:
-                        if constraint['constraint-type'] == 'LATENCY':
-                            vld_desc_entry['latency'] = constraint['value']
-                        elif constraint['constraint-type'] == 'JITTER':
-                            vld_desc_entry['jitter'] = constraint['value']
-                vld_desc.append(vld_desc_entry)
+                if len(cp_refs) == 2:
+                    vld_desc_entry['cp_refs'] = cp_refs
+                    if 'link-constraint' in vld.keys():
+                        for constraint in vld['link-constraint']:
+                            if constraint['constraint-type'] == 'LATENCY':
+                                vld_desc_entry['latency'] = constraint['value']
+                            elif constraint['constraint-type'] == 'JITTER':
+                                vld_desc_entry['jitter'] = constraint['value']
+                    vld_desc.append(vld_desc_entry)
 
         # create candidates from instantiate params
         if self._order_constraints is not None:
@@ -242,8 +246,9 @@ class NsPlacementDataFactory(object):
     def create_ns_placement_data(self):
         """populate NsPlacmentData object
         """
-        ns_placement_data = {'vim_accounts': [vim_data['id'] for
-                                              vim_data in self._vim_accounts_info.values()],
+        ns_placement_data = {'vim_accounts': [vim_data['id'] for _, vim_data in sorted(self._vim_accounts_info.items(),
+                                                                                       key=lambda item: item[1][
+                                                                                           'idx'])],
                              'trp_link_latency': self._produce_trp_link_characteristics_data('pil_latency'),
                              'trp_link_jitter': self._produce_trp_link_characteristics_data('pil_jitter'),
                              'trp_link_price_list': self._produce_trp_link_characteristics_data('pil_price'),