Proper device state management in server driver

This patch complements Change 19229 to fix the issues
caused by multi-server deployments. Previously, only one
server device could be detected by ONOS due to the proxy field.
Also, when that device went offline, the driver did not notify the
RestController.
With this patch, the server device driver cooperates with the
RestController to provide a consistent server activity state for
multiple servers.

Addressed comments made by ONOS reviewers

Change-Id: Ifc0c556a2a5322fd2ee8b02065a2a507cf6b92fc
Signed-off-by: Georgios Katsikas <katsikas.gp@gmail.com>
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/FlowRuleProgrammableServerImpl.java b/drivers/server/src/main/java/org/onosproject/drivers/server/FlowRuleProgrammableServerImpl.java
index efc7bd6..9c38fe8 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/FlowRuleProgrammableServerImpl.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/FlowRuleProgrammableServerImpl.java
@@ -62,7 +62,7 @@
     /**
      * Resource endpoints of the server agent (REST server-side).
      */
-    private static final String RULE_MANAGEMENT_URL = BASE_URL + "/rules";
+    private static final String RULE_MANAGEMENT_URL = BASE_URL + SLASH + "rules";
 
     /**
      * Parameters to be exchanged with the server's agent.
@@ -360,19 +360,23 @@
      * @return boolean removal status
      */
     private boolean removeNicFlowRule(DeviceId deviceId, long ruleId) {
-        // Remove rule with ID from this server
-        int response = getController().delete(deviceId,
-            RULE_MANAGEMENT_URL + "/" + Long.toString(ruleId), null, JSON);
+        int response = -1;
 
-        if (!checkStatusCode(response)) {
-            log.error("Failed to remove flow rule {} from device {}",
-                ruleId, deviceId);
+        // Try to remove the rule, although server might be unreachable
+        try {
+            response = getController().delete(deviceId,
+                RULE_MANAGEMENT_URL + SLASH + Long.toString(ruleId), null, JSON);
+        } catch (Exception ex) {
+            log.error("Failed to remove flow rule {} from device {}", ruleId, deviceId);
             return false;
         }
 
-        log.info("Successfully removed flow rule {} from device {}",
-            ruleId, deviceId);
+        if (!checkStatusCode(response)) {
+            log.error("Failed to remove flow rule {} from device {}", ruleId, deviceId);
+            return false;
+        }
 
+        log.info("Successfully removed flow rule {} from device {}", ruleId, deviceId);
         return true;
     }