vBNG: Make the compute node to connect point map configurable

Change-Id: Icf3a695bfda63b53095d04a7bcdd8fb9b92481c8
diff --git a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/ConnectPointConfiguration.java b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/ConnectPointConfiguration.java
new file mode 100644
index 0000000..ff516d7
--- /dev/null
+++ b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/ConnectPointConfiguration.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.
+ */
+
+package org.onosproject.virtualbng;
+
+import org.onosproject.net.ConnectPoint;
+
+/**
+ * Configuration for a connect point.
+ */
+public class ConnectPointConfiguration {
+
+    private ConnectPoint connectPoint;
+
+    /**
+     * Creats a new connect point from a string representation.
+     *
+     * @param string connect point string
+     */
+    public ConnectPointConfiguration(String string) {
+        connectPoint = ConnectPoint.deviceConnectPoint(string);
+    }
+
+    /**
+     * Creates a new connect point from a string representation.
+     *
+     * @param string connect point string
+     * @return new connect point configuration
+     */
+    public static ConnectPointConfiguration of(String string) {
+        return new ConnectPointConfiguration(string);
+    }
+
+    /**
+     * Gets the connect point.
+     *
+     * @return connect point
+     */
+    public ConnectPoint connectPoint() {
+        return connectPoint;
+    }
+}
diff --git a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfiguration.java b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfiguration.java
index ee2cbea..948f4e5 100644
--- a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfiguration.java
+++ b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfiguration.java
@@ -17,13 +17,15 @@
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
-
-import java.util.Collections;
-import java.util.List;
-
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
+import org.onosproject.net.ConnectPoint;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * Contains the configuration data for virtual BNG that has been read from a
@@ -36,6 +38,7 @@
     private final MacAddress publicFacingMac;
     private final IpAddress xosIpAddress;
     private final int xosRestPort;
+    private final Map<String, ConnectPointConfiguration> hosts;
 
     /**
      * Default constructor.
@@ -46,6 +49,7 @@
         publicFacingMac = null;
         xosIpAddress = null;
         xosRestPort = 0;
+        hosts = null;
     }
 
     /**
@@ -68,12 +72,15 @@
                              @JsonProperty("xosIpAddress")
                              IpAddress xosIpAddress,
                              @JsonProperty("xosRestPort")
-                             int xosRestPort) {
+                             int xosRestPort,
+                             @JsonProperty("hosts")
+                             Map<String, ConnectPointConfiguration> hosts) {
         localPublicIpPrefixes = prefixes;
         this.nextHopIpAddress = nextHopIpAddress;
         this.publicFacingMac = publicFacingMac;
         this.xosIpAddress = xosIpAddress;
         this.xosRestPort = xosRestPort;
+        this.hosts = hosts;
     }
 
     /**
@@ -120,4 +127,13 @@
     public int getXosRestPort() {
         return xosRestPort;
     }
+
+    public Map<String, ConnectPoint> getHosts() {
+        return hosts.entrySet()
+                .stream()
+                .collect(Collectors.toMap(
+                        e -> e.getKey(),
+                        e -> e.getValue().connectPoint()
+                ));
+    }
 }
diff --git a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationManager.java b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationManager.java
index d27d690..eb83e06 100644
--- a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationManager.java
+++ b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationManager.java
@@ -16,6 +16,16 @@
 package org.onosproject.virtualbng;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Service;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onosproject.net.ConnectPoint;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -26,16 +36,6 @@
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Service;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.IpPrefix;
-import org.onlab.packet.MacAddress;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 /**
  * Implementation of ConfigurationService which reads virtual BNG
  * configuration from a file.
@@ -63,6 +63,7 @@
     private MacAddress macOfPublicIpAddresses;
     private IpAddress xosIpAddress;
     private int xosRestPort;
+    private Map<String, ConnectPoint> nodeToPort;
 
     @Activate
     public void activate() {
@@ -104,6 +105,8 @@
             macOfPublicIpAddresses = config.getPublicFacingMac();
             xosIpAddress = config.getXosIpAddress();
             xosRestPort = config.getXosRestPort();
+            nodeToPort = config.getHosts();
+
 
         } catch (FileNotFoundException e) {
             log.warn("Configuration file not found: {}", configFileName);
@@ -132,6 +135,11 @@
         return xosRestPort;
     }
 
+    @Override
+    public Map<String, ConnectPoint> getNodeToPort() {
+        return nodeToPort;
+    }
+
     // TODO handle the case: the number of public IP addresses is not enough
     // for 1:1 mapping from public IP to private IP.
     @Override
diff --git a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationService.java b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationService.java
index ef8698a..68c048f 100644
--- a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationService.java
+++ b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationService.java
@@ -15,10 +15,11 @@
  */
 package org.onosproject.virtualbng;
 
-import java.util.Map;
-
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
+import org.onosproject.net.ConnectPoint;
+
+import java.util.Map;
 
 /**
  * Provides information about the virtual BNG configuration.
@@ -54,6 +55,13 @@
     int getXosRestPort();
 
     /**
+     * Gets the host to port map.
+     *
+     * @return host to port map
+     */
+    Map<String, ConnectPoint> getNodeToPort();
+
+    /**
      * Evaluates whether an IP address is an assigned public IP address.
      *
      * @param ipAddress the IP address to evaluate
diff --git a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngManager.java b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngManager.java
index 5e82b7e..e03b25e 100644
--- a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngManager.java
+++ b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngManager.java
@@ -15,18 +15,9 @@
  */
 package org.onosproject.virtualbng;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.collect.Maps;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.concurrent.ConcurrentHashMap;
-
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -42,7 +33,6 @@
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Host;
-import org.onosproject.net.PortNumber;
 import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.TrafficSelector;
@@ -56,6 +46,13 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
 /**
  * This is a virtual Broadband Network Gateway (BNG) application. It mainly
  * has 3 functions:
@@ -111,9 +108,8 @@
         p2pIntentsToHost = new ConcurrentHashMap<>();
         privateIpAddressMap = new ConcurrentHashMap<>();
 
-        setupMap();
-
         nextHopIpAddress = vbngConfigurationService.getNextHopIpAddress();
+        nodeToPort = vbngConfigurationService.getNodeToPort();
         hostListener = new InternalHostListener();
         hostService.addListener(hostListener);
 
@@ -136,10 +132,16 @@
      */
     private void statusRecovery() {
         log.info("vBNG starts to recover from XOS record......");
-        RestClient restClient =
-                new RestClient(vbngConfigurationService.getXosIpAddress(),
-                               vbngConfigurationService.getXosRestPort());
-        ObjectNode map = restClient.getRest();
+        ObjectNode map;
+        try {
+            RestClient restClient =
+                    new RestClient(vbngConfigurationService.getXosIpAddress(),
+                            vbngConfigurationService.getXosRestPort());
+            map = restClient.getRest();
+        } catch (Exception e) {
+            log.error("Could not contact XOS", e);
+            return;
+        }
         if (map == null) {
             log.info("Stop to recover vBNG status due to the vBNG map "
                     + "is null!");
@@ -168,21 +170,6 @@
     }
 
     /**
-     * Sets up mapping from hostname to connect point.
-     */
-    private void setupMap() {
-        nodeToPort = Maps.newHashMap();
-
-        nodeToPort.put("cordcompute01.onlab.us",
-                       new ConnectPoint(FABRIC_DEVICE_ID,
-                                        PortNumber.portNumber(48)));
-
-        nodeToPort.put("cordcompute02.onlab.us",
-                       new ConnectPoint(FABRIC_DEVICE_ID,
-                                        PortNumber.portNumber(47)));
-    }
-
-    /**
      * Creates a new vBNG.
      *
      * @param privateIpAddress a private IP address