Fix: resolve the service not found exception caused by openstack4j

Change-Id: I33a5c7e6b91758a61662a77a1b347fd0239219eb
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/StatsFlowRuleManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/StatsFlowRuleManager.java
index 5453a27..9025224 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/StatsFlowRuleManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/StatsFlowRuleManager.java
@@ -29,12 +29,12 @@
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
+import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.mastership.MastershipService;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Host;
-import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.flow.DefaultFlowRule;
 import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
@@ -51,16 +51,12 @@
 import org.onosproject.net.flow.criteria.TcpPortCriterion;
 import org.onosproject.net.flow.criteria.UdpPortCriterion;
 import org.onosproject.net.host.HostService;
-import org.onosproject.openstacknetworking.api.InstancePort;
-import org.onosproject.openstacknetworking.api.InstancePortService;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
 import org.onosproject.openstacktelemetry.api.FlowInfo;
 import org.onosproject.openstacktelemetry.api.OpenstackTelemetryService;
 import org.onosproject.openstacktelemetry.api.StatsFlowRule;
 import org.onosproject.openstacktelemetry.api.StatsFlowRuleAdminService;
 import org.onosproject.openstacktelemetry.api.StatsInfo;
-import org.openstack4j.model.network.Network;
-import org.openstack4j.model.network.NetworkType;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -71,7 +67,6 @@
 import java.util.Timer;
 import java.util.TimerTask;
 
-import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onlab.packet.Ethernet.TYPE_IPV4;
 import static org.onlab.packet.IPv4.PROTOCOL_TCP;
 import static org.onlab.packet.IPv4.PROTOCOL_UDP;
@@ -88,11 +83,11 @@
 import static org.onosproject.openstacknetworking.api.Constants.VTAP_FLAT_OUTBOUND_TABLE;
 import static org.onosproject.openstacknetworking.api.Constants.VTAP_INBOUND_TABLE;
 import static org.onosproject.openstacknetworking.api.Constants.VTAP_OUTBOUND_TABLE;
+import static org.onosproject.openstacktelemetry.api.Constants.FLAT;
 import static org.onosproject.openstacktelemetry.api.Constants.OPENSTACK_TELEMETRY_APP_ID;
+import static org.onosproject.openstacktelemetry.api.Constants.VLAN;
+import static org.onosproject.openstacktelemetry.api.Constants.VXLAN;
 import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getBooleanProperty;
-import static org.openstack4j.model.network.NetworkType.FLAT;
-import static org.openstack4j.model.network.NetworkType.VLAN;
-import static org.openstack4j.model.network.NetworkType.VXLAN;
 
 /**
  * Flow rule manager for network statistics of a VM.
@@ -126,7 +121,7 @@
     protected HostService hostService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DeviceService deviceService;
+    protected ComponentConfigService componentConfigService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected MastershipService mastershipService;
@@ -135,9 +130,6 @@
     protected OpenstackNetworkService osNetworkService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected InstancePortService instancePortService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected OpenstackTelemetryService telemetryService;
 
     @Property(name = REVERSE_PATH_STATS, boolValue = DEFAULT_REVERSE_PATH_STATS,
@@ -173,6 +165,8 @@
     protected void activate() {
         appId = coreService.registerApplication(OPENSTACK_TELEMETRY_APP_ID);
 
+        componentConfigService.registerProperties(getClass());
+
         this.start();
 
         log.info("Started");
@@ -180,6 +174,9 @@
 
     @Deactivate
     protected void deactivate() {
+
+        componentConfigService.unregisterProperties(getClass(), false);
+
         log.info("Stopped");
     }
 
@@ -209,10 +206,6 @@
     public void createStatFlowRule(StatsFlowRule statsFlowRule) {
 
         setStatFlowRule(statsFlowRule, true);
-
-        log.info("Install stat flow rule for SrcIp:{} DstIp:{}",
-                statsFlowRule.srcIpPrefix().toString(),
-                statsFlowRule.dstIpPrefix().toString());
     }
 
     @Override
@@ -221,10 +214,6 @@
         flowRuleService.removeFlowRulesById(appId);
 
         setStatFlowRule(statsFlowRule, false);
-
-        log.info("Remove stat flow rule for SrcIp:{} DstIp:{}",
-                statsFlowRule.srcIpPrefix().toString(),
-                statsFlowRule.dstIpPrefix().toString());
     }
 
     private void connectTables(DeviceId deviceId, int fromTable, int toTable,
@@ -459,8 +448,11 @@
      * @param install flow rule installation flag
      */
     private void setStatFlowRuleBase(StatsFlowRule statsFlowRule, boolean install) {
-        DeviceId srcDeviceId = getDeviceId(statsFlowRule.srcIpPrefix().address());
-        DeviceId dstDeviceId = getDeviceId(statsFlowRule.dstIpPrefix().address());
+
+        IpPrefix srcIp = statsFlowRule.srcIpPrefix();
+        IpPrefix dstIp = statsFlowRule.dstIpPrefix();
+        DeviceId srcDeviceId = getDeviceId(srcIp.address());
+        DeviceId dstDeviceId = getDeviceId(dstIp.address());
 
         if (srcDeviceId == null && dstDeviceId == null) {
             return;
@@ -469,42 +461,47 @@
         if (srcDeviceId != null) {
             connectTables(srcDeviceId, STAT_INBOUND_TABLE, VTAP_INBOUND_TABLE,
                     statsFlowRule, METRIC_PRIORITY_SOURCE, install);
-        }
 
-        if (dstDeviceId != null && egressStats) {
-            NetworkType type = getNetworkType(statsFlowRule.dstIpPrefix());
-            if (type == VXLAN || type == VLAN) {
-                connectTables(dstDeviceId, STAT_OUTBOUND_TABLE, VTAP_OUTBOUND_TABLE,
-                        statsFlowRule, METRIC_PRIORITY_TARGET, install);
-            } else if (type == FLAT) {
-                connectTables(dstDeviceId, STAT_FLAT_OUTBOUND_TABLE, VTAP_FLAT_OUTBOUND_TABLE,
-                        statsFlowRule, METRIC_PRIORITY_TARGET, install);
+            if (install) {
+                log.info("Install ingress stat flow rule for SrcIp:{} DstIp:{}",
+                                            srcIp.toString(), dstIp.toString());
+            } else {
+                log.info("Remove ingress stat flow rule for SrcIp:{} DstIp:{}",
+                                            srcIp.toString(), dstIp.toString());
             }
         }
-    }
 
-    /**
-     * Obtains the network type that is used by the VM which has the given IP.
-     *
-     * @param ipPrefix IP prefix
-     * @return network type
-     */
-    private NetworkType getNetworkType(IpPrefix ipPrefix) {
+        Set<IpPrefix> vxlanIps = osNetworkService.getFixedIpsByNetworkType(VXLAN);
+        Set<IpPrefix> vlanIps = osNetworkService.getFixedIpsByNetworkType(VLAN);
+        Set<IpPrefix> flatIps = osNetworkService.getFixedIpsByNetworkType(FLAT);
 
-        MacAddress mac = checkNotNull(getMacAddress(ipPrefix.address()), MAC_NOT_NULL);
-        InstancePort instPort = instancePortService.instancePort(mac);
+        int fromTable, toTable;
 
-        if (instPort == null) {
-            return null;
+        if (dstDeviceId != null && egressStats) {
+
+            IpPrefix dstIpPrefix = statsFlowRule.dstIpPrefix();
+
+            if (vxlanIps.contains(dstIpPrefix) || vlanIps.contains(dstIpPrefix)) {
+                fromTable = STAT_OUTBOUND_TABLE;
+                toTable = VTAP_OUTBOUND_TABLE;
+            } else if (flatIps.contains(dstIpPrefix)) {
+                fromTable = STAT_FLAT_OUTBOUND_TABLE;
+                toTable = VTAP_FLAT_OUTBOUND_TABLE;
+            } else {
+                return;
+            }
+
+            connectTables(dstDeviceId, fromTable, toTable,
+                    statsFlowRule, METRIC_PRIORITY_TARGET, install);
+
+            if (install) {
+                log.info("Install egress stat flow rule for SrcIp:{} DstIp:{}",
+                                            srcIp.toString(), dstIp.toString());
+            } else {
+                log.info("Remove egress stat flow rule for SrcIp:{} DstIp:{}",
+                                            srcIp.toString(), dstIp.toString());
+            }
         }
-
-        Network network = osNetworkService.network(instPort.networkId());
-
-        if (network != null) {
-            return network.getNetworkType();
-        }
-
-        return null;
     }
 
     /**