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;
}
/**