pass controllerPort to VTN app

Change-Id: Idc85737b9788072ae8a9438151b276a8fad7f00a
diff --git a/xos/admin.py b/xos/admin.py
index 45c1083..ff3400e 100644
--- a/xos/admin.py
+++ b/xos/admin.py
@@ -31,6 +31,7 @@
     xosUser = forms.CharField(required=False)
     xosPassword = forms.CharField(required=False)
     vtnAPIVersion = forms.IntegerField(required=False)
+    controllerPort = forms.CharField(required=False)
 
     def __init__(self,*args,**kwargs):
         super (VTNServiceForm,self ).__init__(*args,**kwargs)
@@ -46,6 +47,7 @@
             self.fields['xosUser'].initial = self.instance.xosUser
             self.fields['xosPassword'].initial = self.instance.xosPassword
             self.fields['vtnAPIVersion'].initial = self.instance.vtnAPIVersion
+            self.fields['controllerPort'].initial = self.instance.controllerPort
 
     def save(self, commit=True):
         self.instance.privateGatewayMac = self.cleaned_data.get("privateGatewayMac")
@@ -59,6 +61,7 @@
         self.instance.xosUser = self.cleaned_data.get("xosUser")
         self.instance.xosPassword = self.cleaned_data.get("xosPassword")
         self.instance.vtnAPIVersion = self.cleaned_data.get("vtnAPIVersion")
+        self.instance.controllerPort = self.cleaned_data.get("controllerPort")
         return super(VTNServiceForm, self).save(commit=commit)
 
     class Meta:
@@ -73,7 +76,7 @@
     list_display = ("backend_status_icon", "name", "enabled")
     list_display_links = ('backend_status_icon', 'name', )
     fieldsets = [(None, {'fields': ['backend_status_text', 'name','enabled','versionNumber','description',"view_url","icon_url",
-                                    'privateGatewayMac', 'localManagementIp', 'ovsdbPort', 'sshPort', 'sshUser', 'sshKeyFile', 'mgmtSubnetBits', 'xosEndpoint', 'xosUser', 'xosPassword', 'vtnAPIVersion' ], 'classes':['suit-tab suit-tab-general']})]
+                                    'privateGatewayMac', 'localManagementIp', 'ovsdbPort', 'sshPort', 'sshUser', 'sshKeyFile', 'mgmtSubnetBits', 'xosEndpoint', 'xosUser', 'xosPassword', 'vtnAPIVersion', 'controllerPort' ], 'classes':['suit-tab suit-tab-general']})]
     readonly_fields = ('backend_status_text', )
     inlines = [SliceInline,ServiceAttrAsTabInline,ServicePrivilegeInline]
 
diff --git a/xos/models.py b/xos/models.py
index 9833628..1c6f7bf 100644
--- a/xos/models.py
+++ b/xos/models.py
@@ -40,6 +40,7 @@
                           ("xosUser", "padmin@vicci.org"),
                           ("xosPassword", "letmein"),
                           ("vtnAPIVersion", 1),
+                          ("controllerPort", "onos-cord:6653"),
 
                          )
 
diff --git a/xos/synchronizer/steps/sync_onos_netcfg.py b/xos/synchronizer/steps/sync_onos_netcfg.py
index 7e76cc9..509c7a0 100644
--- a/xos/synchronizer/steps/sync_onos_netcfg.py
+++ b/xos/synchronizer/steps/sync_onos_netcfg.py
@@ -59,6 +59,13 @@
         xosUser = vtn.xosUser
         xosPassword = vtn.xosPassword
 
+        controllerPort = vtn.controllerPort
+        if ":" in controllerPort:
+            (c_hostname, c_port) = controllerPort.split(":",1)
+            controllerPort = socket.gethostbyname(c_hostname) + ":" + c_port
+        else:
+            controllerPort = ":" + controllerPort
+
         data = {
             "apps" : {
                 "org.opencord.vtn" : {
@@ -77,7 +84,8 @@
                             "password": xosPassword
                         },
                         "publicGateways": [],
-                        "nodes" : []
+                        "nodes" : [],
+                        "controllers": [controllerPort]
                     }
                 }
             }
diff --git a/xos/synchronizer/steps/sync_vtn_service.py b/xos/synchronizer/steps/sync_vtn_service.py
index 97f0db6..6ec5610 100644
--- a/xos/synchronizer/steps/sync_vtn_service.py
+++ b/xos/synchronizer/steps/sync_vtn_service.py
@@ -50,6 +50,9 @@
         if vtn_service.rest_hostname:
             return vtn_service.rest_hostname
 
+        # code below this point is for ONOS running in a slice, and is
+        # probably outdated
+
         if not vtn_service.slices.exists():
             raise "VTN Service has no slices"
 
@@ -62,6 +65,17 @@
 
         return vtn_instance.node.name
 
+    def get_vtn_port(self):
+        vtn_service = self.get_vtn_onos_service()
+
+        if vtn_service.rest_port:
+            return vtn_service.rest_port
+
+        # code below this point is for ONOS running in a slice, and is
+        # probably outdated
+
+        raise Exception("Must set rest_port")
+
     def sync_legacy_vtn_api(self):
         global glo_saved_vtn_maps
 
@@ -78,7 +92,7 @@
         for vtn_map in vtn_maps:
             if not (vtn_map in glo_saved_vtn_maps):
                 # call vtn rest api to add map
-                url = "http://" + self.get_vtn_addr() + ":8181/onos/cordvtn/service-dependency/%s/%s" % (vtn_map[0], vtn_map[1])
+                url = "http://" + self.get_vtn_addr() + ":" + self.get_vtn_port() + "/onos/cordvtn/service-dependency/%s/%s" % (vtn_map[0], vtn_map[1])
 
                 print "POST %s" % url
                 r = requests.post(url, auth=self.get_vtn_auth() )
@@ -88,7 +102,7 @@
         for vtn_map in glo_saved_vtn_maps:
             if not vtn_map in vtn_maps:
                 # call vtn rest api to delete map
-                url = "http://" + self.get_vtn_addr() + ":8181/onos/cordvtn/service-dependency/%s/%s" % (vtn_map[0],vtn_map[1])
+                url = "http://" + self.get_vtn_addr() +  ":" + self.get_vtn_port() + "/onos/cordvtn/service-dependency/%s/%s" % (vtn_map[0],vtn_map[1])
 
                 print "DELETE %s" % url
                 r = requests.delete(url, auth=self.get_vtn_auth() )
@@ -123,7 +137,7 @@
             valid_ids.append(network.id)
 
             if (glo_saved_networks.get(network.id, None) != network.to_dict()):
-                (exists, url, method, req_func) = self.get_method("http://" + self.get_vtn_addr() + ":8181/onos/cordvtn/serviceNetworks", network.id)
+                (exists, url, method, req_func) = self.get_method("http://" + self.get_vtn_addr() +  ":" + self.get_vtn_port() + "/onos/cordvtn/serviceNetworks", network.id)
 
                 if (network.type=="PRIVATE") and (not network.providerNetworks):
                     logger.info("Skipping network %s because it has no relevant state" % network.id)
@@ -152,7 +166,7 @@
             if network_id not in valid_ids:
                 logger.info("DELETEing VTN API for network %s" % network_id)
 
-                url = "http://" + self.get_vtn_addr() + ":8181/onos/cordvtn/serviceNetworks/%s" % network_id
+                url = "http://" + self.get_vtn_addr() +  ":" + self.get_vtn_port() + "/onos/cordvtn/serviceNetworks/%s" % network_id
                 logger.info("URL: %s" % url)
 
                 r = requests.delete(url, auth=self.get_vtn_auth() )
@@ -176,7 +190,7 @@
             valid_ids.append(port.id)
 
             if (glo_saved_ports.get(port.id, None) != port.to_dict()):
-                (exists, url, method, req_func) = self.get_method("http://" + self.get_vtn_addr() + ":8181/onos/cordvtn/servicePorts", port.id)
+                (exists, url, method, req_func) = self.get_method("http://" + self.get_vtn_addr() +  ":" + self.get_vtn_port() + "/onos/cordvtn/servicePorts", port.id)
 
                 logger.info("%sing VTN API for port %s" % (method, port.id))
 
@@ -197,7 +211,7 @@
             if port_id not in valid_ids:
                 logger.info("DELETEing VTN API for port %s" % port_id)
 
-                url = "http://" + self.get_vtn_addr() + ":8181/onos/cordvtn/servicePorts/%s" % port_id
+                url = "http://" + self.get_vtn_addr() +  ":" + self.get_vtn_port() + "/onos/cordvtn/servicePorts/%s" % port_id
                 logger.info("URL: %s" % url)
 
                 r = requests.delete(url, auth=self.get_vtn_auth() )
diff --git a/xos/tosca/resources/vtnservice.py b/xos/tosca/resources/vtnservice.py
index 4a525e1..1bbbaaa 100644
--- a/xos/tosca/resources/vtnservice.py
+++ b/xos/tosca/resources/vtnservice.py
@@ -4,4 +4,4 @@
 class XOSVTNService(XOSService):
     provides = "tosca.nodes.VTNService"
     xos_model = VTNService
-    copyin_props = ["view_url", "icon_url", "enabled", "published", "public_key", "versionNumber", 'privateGatewayMac', 'localManagementIp', 'ovsdbPort', 'sshPort', 'sshUser', 'sshKeyFile', 'mgmtSubnetBits', 'xosEndpoint', 'xosUser', 'xosPassword', 'vtnAPIVersion']
+    copyin_props = ["view_url", "icon_url", "enabled", "published", "public_key", "versionNumber", 'privateGatewayMac', 'localManagementIp', 'ovsdbPort', 'sshPort', 'sshUser', 'sshKeyFile', 'mgmtSubnetBits', 'xosEndpoint', 'xosUser', 'xosPassword', 'vtnAPIVersion', 'controllerPort']