CORD-2329: Node constraints for EPC services

Change-Id: I06de13885184e4d38ad7f9eb0275ad64eb00dd6b
diff --git a/xos/synchronizer/model_policies/model_policy_vepcserviceinstance.py b/xos/synchronizer/model_policies/model_policy_vepcserviceinstance.py
index ff7c836..fa047a4 100644
--- a/xos/synchronizer/model_policies/model_policy_vepcserviceinstance.py
+++ b/xos/synchronizer/model_policies/model_policy_vepcserviceinstance.py
@@ -80,7 +80,7 @@
         service_obj = service_class.objects.first()  # There's only one service object
         return service_obj
 
-    def create_service_instance(self, si):
+    def create_service_instance(self, si, node_label = None):
         service = self.get_service_for_service_instance(si)
         if not service:
             raise Exception('No service object for %s' % service)
@@ -89,6 +89,10 @@
         s = si_class(owner=service, name='epc-%s-%d' %
                      (si.lower(), self.obj.id))
         s.master_serviceinstance = self.obj
+
+        if node_label:
+            s.node_label = '%s-%d'%(node_label, self.obj.id)
+
         s.no_sync = True
         s.save()
 
@@ -120,13 +124,14 @@
                     network=net, slice=one_and_only_slice_hopefully)
                 ns_object.save()
 
-    def create_service_instance_with_networks(self, si_name, networks):
+    def create_service_instance_with_networks(self, si_name, networks, node_label = None):
         service = self.get_service_for_service_instance(si_name)
         self.add_networks_to_service(service, networks)
 
         instance = self.child_service_instance_from_name(si_name)
+
         if not instance:
-            instance = self.create_service_instance(si_name)
+            instance = self.create_service_instance(si_name, node_label = node_label)
 
         return instance
 
@@ -154,20 +159,27 @@
         for node in blueprint:
             k = node['name']
             networks = node.get('networks', [])
-            instance = self.create_service_instance_with_networks(k, networks)
+            links = node.get('links', [])
 
+            try:
+                node_label = node['node_label']
+            except KeyError:
+                try:
+                    node_label = next(l['node_label'] for l in links if l.get('node_label', None))
+                except StopIteration:
+                    node_label = None
+
+            instance = self.create_service_instance_with_networks(k, networks, node_label = node_label)
             service_instances.append(instance)
 
             if src:
                 self.add_networks_to_service_instance(src, networks)
                 self.create_link(src, instance)
 
-            links = node.get('links', [])
             service_instances = self.recursive_create_instances_and_links(links, instance, service_instances)
 
         return service_instances
 
-
     def create_epc_network(self, n):
         network_name = n['name']
         site_name = self.obj.site.login_base
diff --git a/xos/synchronizer/vepc_config.yaml b/xos/synchronizer/vepc_config.yaml
index f11ffb2..43f8424 100644
--- a/xos/synchronizer/vepc_config.yaml
+++ b/xos/synchronizer/vepc_config.yaml
@@ -30,6 +30,18 @@
         permit_all_slices: True
         template: spgw_template
     graph:
+      - name: VSPGWUTenant
+        networks: 
+          - management
+          - s1u_network
+          - sgi_network
+          - spgw_network
+        links:
+          - name: VENBServiceInstance
+            node_label: gwu-enb
+            networks:
+              - s1u_network
+              - sgi_network
       - name: VENBServiceInstance
         networks: 
           - management
@@ -48,18 +60,7 @@
           - name: VSPGWUTenant
             networks: 
               - spgw_network
-      - name: VSPGWUTenant
-        networks: 
-          - management
-          - s1u_network
-          - sgi_network
-          - spgw_network
-        links:
-          - name: VENBServiceInstance
-            networks:
-              - s1u_network
-              - sgi_network
-
+      
 dependency_graph: "/opt/xos/synchronizers/epc-service/model-deps"
 #steps_dir: "/opt/xos/synchronizers/epc-service/steps"
 sys_dir: "/opt/xos/synchronizers/epc-service/sys"