BGP flow spec configuration system test issue fix.

Change-Id: Ia912fdb15f584b477ead748aed87e3c4fa003d29
diff --git a/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpCfg.java b/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpCfg.java
index dac1ee8..8bb05df 100755
--- a/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpCfg.java
+++ b/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpCfg.java
@@ -44,6 +44,29 @@
         IP_AS_CONFIGURED
     }
 
+    enum FlowSpec {
+
+        /**
+         * Signifies that peer support IPV4 flow specification.
+         */
+        IPV4,
+
+        /**
+         *  Signifies that peer support VPNV4 flow specification.
+         */
+        VPNV4,
+
+        /**
+         *  Signifies that peer support IPV4 and VPNV4 flow specification.
+         */
+        IPV4_VPNV4,
+
+        /**
+         * Signifies that peer flow specification capability disabled.
+         */
+        NONE
+    }
+
     /**
      * Returns the status of the configuration based on this state certain operations like connection is handled.
      *
@@ -294,4 +317,18 @@
      * @return state information
      */
     BgpPeerCfg.State getPeerConnState(String routerid);
+
+    /**
+     * Gets the flow specification capability.
+     *
+     * @return flow specification capability
+     */
+    FlowSpec flowSpecCapability();
+
+    /**
+     * Sets the flow specification capability.
+     *
+     * @param flowSpec flow specification capability
+     */
+    void setFlowSpecCapability(FlowSpec flowSpec);
 }
diff --git a/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPeerCfg.java b/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPeerCfg.java
index e519404..2fb970f 100755
--- a/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPeerCfg.java
+++ b/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPeerCfg.java
@@ -58,24 +58,6 @@
         INVALID
     }
 
-    enum FlowSpec {
-
-        /**
-         * Signifies that peer support IPV4 flow specification.
-         */
-        IPV4,
-
-        /**
-         *  Signifies that peer support VPNV4 flow specification.
-         */
-        VPNV4,
-
-        /**
-         * Signifies that peer flow specification support disabled.
-         */
-        NONE
-    }
-
     /**
      * Returns the connection State information of the peer.
      *
@@ -195,18 +177,4 @@
      * @return peer connect instance
      */
     BgpConnectPeer connectPeer();
-
-    /**
-     * Gets the flow specification capability.
-     *
-     * @return flow specification status
-     */
-    public FlowSpec flowSpecStatus();
-
-    /**
-     * sets the flow specification capability.
-     *
-     * @param flowSpecStatus flow specification status
-     */
-    public void setFlowSpecStatus(FlowSpec flowSpecStatus);
 }
diff --git a/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpChannelHandler.java b/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpChannelHandler.java
index d2c8098..af229a5 100755
--- a/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpChannelHandler.java
+++ b/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpChannelHandler.java
@@ -665,14 +665,18 @@
      */
     private void sendHandshakeOpenMessage() throws IOException, BgpParseException {
         int bgpId;
+        BgpCfg.FlowSpec flowSpec = bgpconfig.flowSpecCapability();
         boolean flowSpecStatus = false;
         boolean vpnFlowSpecStatus = false;
 
         bgpId = Ip4Address.valueOf(bgpconfig.getRouterId()).toInt();
-        BgpPeerConfig peerConfig = (BgpPeerConfig) bgpconfig.displayPeers(peerAddr);
-        if (peerConfig.flowSpecStatus() == BgpPeerCfg.FlowSpec.IPV4) {
+
+        if (flowSpec == BgpCfg.FlowSpec.IPV4) {
             flowSpecStatus = true;
-        } else if (peerConfig.flowSpecStatus() == BgpPeerCfg.FlowSpec.VPNV4) {
+        } else if (flowSpec == BgpCfg.FlowSpec.VPNV4) {
+            vpnFlowSpecStatus = true;
+        } else if (flowSpec == BgpCfg.FlowSpec.IPV4_VPNV4) {
+            flowSpecStatus = true;
             vpnFlowSpecStatus = true;
         }
 
@@ -792,9 +796,9 @@
         boolean isMultiProtocolLsCapability = false;
         boolean isMultiProtocolFlowSpecCapability = false;
         boolean isMultiProtocolVpnFlowSpecCapability = false;
+        BgpCfg.FlowSpec flowSpec = h.bgpconfig.flowSpecCapability();
 
-        BgpPeerConfig peerConfig = (BgpPeerConfig) h.bgpconfig.displayPeers(peerAddr);
-        if (peerConfig.flowSpecStatus() != BgpPeerCfg.FlowSpec.NONE) {
+        if (flowSpec != BgpCfg.FlowSpec.NONE) {
             isFlowSpecCapabilityCfg = true;
         }
 
diff --git a/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpConfig.java b/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpConfig.java
index 1c846eb..5b367a7 100755
--- a/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpConfig.java
+++ b/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpConfig.java
@@ -51,7 +51,7 @@
     private boolean largeAs = false;
     private int maxConnRetryTime;
     private int maxConnRetryCount;
-
+    private FlowSpec flowSpec = FlowSpec.NONE;
     private Ip4Address routerId = null;
     private TreeMap<String, BgpPeerCfg> bgpPeerTree = new TreeMap<>();
     private BgpConnectPeer connectPeer;
@@ -119,6 +119,16 @@
     }
 
     @Override
+    public FlowSpec flowSpecCapability() {
+        return this.flowSpec;
+    }
+
+    @Override
+    public void setFlowSpecCapability(FlowSpec flowSpec) {
+        this.flowSpec = flowSpec;
+    }
+
+    @Override
     public String getRouterId() {
         if (this.routerId != null) {
             return this.routerId.toString();
@@ -222,7 +232,7 @@
             if (disconnPeer != null) {
                 // TODO: send notification peer deconfigured
                 disconnPeer.disconnectPeer();
-            } else {
+            } else if (lspeer.connectPeer() != null) {
                 lspeer.connectPeer().disconnectPeer();
             }
             lspeer.setState(BgpPeerCfg.State.IDLE);
diff --git a/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerConfig.java b/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerConfig.java
index 65cd485..a8eaee3 100755
--- a/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerConfig.java
+++ b/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerConfig.java
@@ -30,7 +30,6 @@
     private State state;
     private boolean selfInitiated;
     private BgpConnectPeer connectPeer;
-    private FlowSpec flowSpecStatus = FlowSpec.NONE;
 
     /**
      * Constructor to initialize the values.
@@ -119,14 +118,4 @@
     public void setConnectPeer(BgpConnectPeer connectPeer) {
         this.connectPeer = connectPeer;
     }
-
-    @Override
-    public FlowSpec flowSpecStatus() {
-        return flowSpecStatus;
-    }
-
-    @Override
-    public void setFlowSpecStatus(FlowSpec flowSpecStatus) {
-        this.flowSpecStatus = flowSpecStatus;
-    }
 }
diff --git a/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpAppConfig.java b/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpAppConfig.java
index ba205bc..8853e04 100644
--- a/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpAppConfig.java
+++ b/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpAppConfig.java
@@ -47,6 +47,7 @@
     public static final String LS_CAPABILITY = "lsCapability";
     public static final String HOLD_TIME = "holdTime";
     public static final String LARGE_AS_CAPABILITY = "largeAsCapability";
+    public static final String FLOW_SPEC_CAPABILITY = "flowSpecCapability";
 
     public static final String BGP_PEER = "bgpPeer";
     public static final String PEER_IP = "peerIp";
@@ -67,10 +68,11 @@
         bgpConfig = bgpController.getConfig();
 
         fields = hasOnlyFields(ROUTER_ID, LOCAL_AS, MAX_SESSION, LS_CAPABILITY,
-                HOLD_TIME, LARGE_AS_CAPABILITY, BGP_PEER) &&
+                HOLD_TIME, LARGE_AS_CAPABILITY, FLOW_SPEC_CAPABILITY, BGP_PEER) &&
                 isIpAddress(ROUTER_ID, MANDATORY) && isNumber(LOCAL_AS, MANDATORY) &&
                 isNumber(MAX_SESSION, OPTIONAL, 20) && isNumber(HOLD_TIME, OPTIONAL, 180) &&
-                isBoolean(LS_CAPABILITY, OPTIONAL) && isBoolean(LARGE_AS_CAPABILITY, OPTIONAL);
+                isBoolean(LS_CAPABILITY, OPTIONAL) && isBoolean(LARGE_AS_CAPABILITY, OPTIONAL) &&
+                isString(FLOW_SPEC_CAPABILITY, OPTIONAL);
 
         if (!fields) {
             return fields;
@@ -125,6 +127,15 @@
     }
 
     /**
+     * Returns flow specification capability support from the configuration.
+     *
+     * @return flow specification capability
+     */
+    public String flowSpecCapability() {
+        return get(FLOW_SPEC_CAPABILITY, null);
+    }
+
+    /**
      * Returns holdTime of the local node from the configuration.
      *
      * @return holdTime
@@ -134,6 +145,22 @@
     }
 
     /**
+     * Validates the flow specification capability.
+     *
+     * @return true if valid else false
+     */
+    public boolean validateFlowSpec() {
+        if (flowSpecCapability() != null) {
+            String flowSpec = flowSpecCapability();
+            if ((flowSpec.equals("IPV4")) || (flowSpec.equals("VPNV4")) || (flowSpec.equals("IPV4_VPNV4"))) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
      * Validates the Bgp local and peer configuration.
      *
      * @return true if valid else false
@@ -152,6 +179,9 @@
             return false;
         }
 
+        if (!validateFlowSpec()) {
+            return false;
+        }
         return true;
     }
 
diff --git a/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpCfgProvider.java b/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpCfgProvider.java
index 2ceb4c7..7629da7 100755
--- a/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpCfgProvider.java
+++ b/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpCfgProvider.java
@@ -128,6 +128,16 @@
         bgpConfig.setMaxSession(config.maxSession());
         bgpConfig.setLargeASCapability(config.largeAsCapability());
 
+        if (config.flowSpecCapability().equals("IPV4")) {
+            bgpConfig.setFlowSpecCapability(BgpCfg.FlowSpec.IPV4);
+        } else if (config.flowSpecCapability().equals("VPNV4")) {
+            bgpConfig.setFlowSpecCapability(BgpCfg.FlowSpec.VPNV4);
+        } else if (config.flowSpecCapability().equals("IPV4_VPNV4")) {
+            bgpConfig.setFlowSpecCapability(BgpCfg.FlowSpec.IPV4_VPNV4);
+        } else {
+            bgpConfig.setFlowSpecCapability(BgpCfg.FlowSpec.NONE);
+        }
+
         nodes = config.bgpPeer();
         for (int i = 0; i < nodes.size(); i++) {
             String connectMode = nodes.get(i).connectMode();
@@ -163,6 +173,16 @@
             bgpConfig.setHoldTime(config.holdTime());
             bgpConfig.setMaxSession(config.maxSession());
             bgpConfig.setLargeASCapability(config.largeAsCapability());
+
+            if (config.flowSpecCapability().equals("IPV4")) {
+                bgpConfig.setFlowSpecCapability(BgpCfg.FlowSpec.IPV4);
+            } else if (config.flowSpecCapability().equals("VPNV4")) {
+                bgpConfig.setFlowSpecCapability(BgpCfg.FlowSpec.VPNV4);
+            } else if (config.flowSpecCapability().equals("IPV4_VPNV4")) {
+                bgpConfig.setFlowSpecCapability(BgpCfg.FlowSpec.IPV4_VPNV4);
+            } else {
+                bgpConfig.setFlowSpecCapability(BgpCfg.FlowSpec.NONE);
+            }
         } else {
             log.info(" Self configuration cannot be modified as there is existing connections ");
         }