Implement host probing retry with major refactoring
- Implement probe retry
- Switch to typical core/provider design pattern for HostProbingService
and as a result decoupling the dependency between SR and HostLocationProvider
Change-Id: I33a15af580677ea376b421ac3e26f9821dcca844
diff --git a/core/api/src/main/java/org/onosproject/net/host/HostLocationProbingService.java b/core/api/src/main/java/org/onosproject/net/host/HostLocationProbingService.java
index 56d056c..66f1266 100644
--- a/core/api/src/main/java/org/onosproject/net/host/HostLocationProbingService.java
+++ b/core/api/src/main/java/org/onosproject/net/host/HostLocationProbingService.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2017-present Open Networking Foundation
+ * Copyright 2018-present Open Networking Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,31 +18,21 @@
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.Host;
+/**
+ * Service for interacting with the host probing entities.
+ *
+ * @deprecated in ONOS 1.12, replaced by {@link HostProbingService}
+ */
+@Deprecated
public interface HostLocationProbingService {
/**
- * Mode of host location probing.
- */
- enum ProbeMode {
- /**
- * Append probed host location if reply is received before timeout. Otherwise, do nothing.
- * Typically used to discover secondary locations.
- */
- DISCOVER,
-
- /**
- * Remove probed host location if reply is received after timeout. Otherwise, do nothing.
- * Typically used to verify previous locations.
- */
- VERIFY
- }
-
- /**
* Probes given host on given location.
*
* @param host the host to be probed
* @param connectPoint the location of host to be probed
* @param probeMode probe mode
+ * @deprecated in ONOS 1.12, replaced by {@link HostProbingService#probeHost(Host, ConnectPoint, ProbeMode)}
*/
- void probeHostLocation(Host host, ConnectPoint connectPoint, ProbeMode probeMode);
-
+ @Deprecated
+ void probeHost(Host host, ConnectPoint connectPoint, ProbeMode probeMode);
}
diff --git a/core/api/src/main/java/org/onosproject/net/host/HostProbe.java b/core/api/src/main/java/org/onosproject/net/host/HostProbe.java
new file mode 100644
index 0000000..7303a3d
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/host/HostProbe.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.net.host;
+
+import org.onlab.packet.MacAddress;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.Host;
+
+/**
+ * Information related to the host being probed.
+ */
+public interface HostProbe extends Host {
+ /**
+ * Gets connect point of this entry.
+ *
+ * @return connect point
+ */
+ ConnectPoint connectPoint();
+
+ /**
+ * Gets retry counter of this entry.
+ *
+ * @return retry
+ */
+ int retry();
+
+ /**
+ * Decrease retry counter of this entry by one.
+ */
+ void decreaseRetry();
+
+ /**
+ * Gets mode of this entry.
+ *
+ * @return mode
+ */
+ ProbeMode mode();
+
+ /**
+ * Gets probe MAC of this entry.
+ *
+ * @return probe mac
+ */
+ MacAddress probeMac();
+}
diff --git a/core/api/src/main/java/org/onosproject/net/host/HostProbeStore.java b/core/api/src/main/java/org/onosproject/net/host/HostProbeStore.java
new file mode 100644
index 0000000..ba1217d
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/host/HostProbeStore.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.net.host;
+
+import org.onlab.packet.MacAddress;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.Host;
+import org.onosproject.store.Store;
+
+/**
+ * Manages inventory of pending host probes.
+ */
+public interface HostProbeStore extends Store<HostProbingEvent, HostProbingStoreDelegate> {
+
+ /**
+ * Notifies HostProbeStore the beginning of pending host location verification and
+ * retrieves the unique MAC address for the probe.
+ *
+ * @param host host to be probed
+ * @param connectPoint the connect point that is under verification
+ * @param probeMode probe mode
+ * @param probeMac probeMac if this is a retry.
+ * Null if this is the very first probe and the probeMac is to-be-generated
+ * @param retry max retry times
+ * @return probeMac, the source MAC address ONOS uses to probe the host
+ */
+ MacAddress addProbingHost(Host host, ConnectPoint connectPoint, ProbeMode probeMode,
+ MacAddress probeMac, int retry);
+
+ /**
+ * Notifies HostProbeStore the end of pending host location verification.
+ *
+ * @param probeMac the source MAC address ONOS uses to probe the host
+ */
+ void removeProbingHost(MacAddress probeMac);
+}
diff --git a/core/api/src/main/java/org/onosproject/net/host/HostProbingEvent.java b/core/api/src/main/java/org/onosproject/net/host/HostProbingEvent.java
new file mode 100644
index 0000000..b77334a
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/host/HostProbingEvent.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2014-present Open Networking Foundation
+ *
+ * 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.net.host;
+
+import org.onlab.util.Tools;
+import org.onosproject.event.AbstractEvent;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+/**
+ * Describes host probing event.
+ */
+public class HostProbingEvent extends AbstractEvent<HostProbingEvent.Type, HostProbe> {
+
+ /**
+ * Type of host probing events.
+ */
+ public enum Type {
+ /**
+ * Probe has been requested.
+ */
+ PROBE_REQUESTED,
+
+ /**
+ * Probe timed out but still have not reach max retry.
+ */
+ PROBE_TIMEOUT,
+
+ /**
+ * Probe timed out and reach max retry.
+ */
+ PROBE_FAIL,
+
+ /**
+ * Probe has been complete normally.
+ */
+ PROBE_COMPLETED
+ }
+
+ private HostProbe prevSubject;
+
+ /**
+ * Creates an event of a given type and for the specified host probe and the
+ * current time.
+ *
+ * @param type probing host event type
+ * @param subject event subject
+ */
+ public HostProbingEvent(Type type, HostProbe subject) {
+ super(type, subject);
+ }
+
+ /**
+ * Creates an event of a given type and for the specified host probe and time.
+ *
+ * @param type probing host event type
+ * @param subject event subject
+ * @param time occurrence time
+ */
+ public HostProbingEvent(Type type, HostProbe subject, long time) {
+ super(type, subject, time);
+ }
+
+ /**
+ * Creates an event with previous subject.
+ * The previous subject is ignored if the type is not PROBE_TIMEOUT
+ *
+ * @param type host event type
+ * @param subject event subject
+ * @param prevSubject previous host subject
+ */
+ public HostProbingEvent(Type type, HostProbe subject, HostProbe prevSubject) {
+ super(type, subject);
+ this.prevSubject = prevSubject;
+ }
+
+ /**
+ * Creates an event with previous subject and specified time.
+ * The previous subject is ignored if the type is not PROBE_TIMEOUT
+ *
+ * @param type host event type
+ * @param subject event subject
+ * @param prevSubject previous host subject
+ * @param time occurrence time
+ */
+ public HostProbingEvent(Type type, HostProbe subject, HostProbe prevSubject, long time) {
+ super(type, subject, time);
+ this.prevSubject = prevSubject;
+ }
+
+ /**
+ * Gets the previous subject in this host probe event.
+ *
+ * @return the previous subject, or null if previous subject is not
+ * specified.
+ */
+ public HostProbe prevSubject() {
+ return this.prevSubject;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(this)
+ .add("time", Tools.defaultOffsetDataTime(time()))
+ .add("type", type())
+ .add("subject", subject())
+ .add("prevSubject", prevSubject())
+ .toString();
+ }
+}
diff --git a/core/api/src/main/java/org/onosproject/net/host/HostProbingListener.java b/core/api/src/main/java/org/onosproject/net/host/HostProbingListener.java
new file mode 100644
index 0000000..25fd1ea
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/host/HostProbingListener.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.net.host;
+
+import org.onosproject.event.EventListener;
+
+/**
+ * Entity capable of receiving host probing related events.
+ */
+public interface HostProbingListener extends EventListener<HostProbingEvent> {
+}
diff --git a/core/api/src/main/java/org/onosproject/net/host/HostProbingProvider.java b/core/api/src/main/java/org/onosproject/net/host/HostProbingProvider.java
new file mode 100644
index 0000000..f126013
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/host/HostProbingProvider.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.net.host;
+
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.Host;
+import org.onosproject.net.provider.Provider;
+
+/**
+ * Provider of host probing.
+ */
+public interface HostProbingProvider extends Provider {
+
+ /**
+ * Probe given host on the given connectPoint with given probeMode.
+ *
+ * @param host host to be probed
+ * @param connectPoint connect point on which the probe is sent
+ * @param probeMode probe mode
+ */
+ void probeHost(Host host, ConnectPoint connectPoint, ProbeMode probeMode);
+
+ /**
+ * Process host probing events.
+ *
+ * @param event host probing event
+ */
+ void processEvent(HostProbingEvent event);
+}
diff --git a/core/api/src/main/java/org/onosproject/net/host/HostProbingProviderRegistry.java b/core/api/src/main/java/org/onosproject/net/host/HostProbingProviderRegistry.java
new file mode 100644
index 0000000..915df6c
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/host/HostProbingProviderRegistry.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2014-present Open Networking Foundation
+ *
+ * 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.net.host;
+
+import org.onosproject.net.provider.ProviderRegistry;
+
+/**
+ * Abstraction of a host probing provider registry.
+ */
+public interface HostProbingProviderRegistry
+ extends ProviderRegistry<HostProbingProvider, HostProbingProviderService> {
+}
diff --git a/core/api/src/main/java/org/onosproject/net/host/HostProbingProviderService.java b/core/api/src/main/java/org/onosproject/net/host/HostProbingProviderService.java
new file mode 100644
index 0000000..d9c7c16
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/host/HostProbingProviderService.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2014-present Open Networking Foundation
+ *
+ * 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.net.host;
+
+import org.onlab.packet.MacAddress;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.Host;
+import org.onosproject.net.provider.ProviderService;
+
+/**
+ * Means of conveying host probing information to the core.
+ */
+public interface HostProbingProviderService extends ProviderService<HostProbingProvider> {
+
+ /**
+ * Notifies HostProbeStore the beginning of pending host location verification and
+ * retrieves the unique MAC address for the probe.
+ *
+ * @param host host to be probed
+ * @param connectPoint the connect point that is under verification
+ * @param probeMode probe mode
+ * @param probeMac probeMac if this is a retry.
+ * Null if this is the very first probe and the probeMac is to-be-generated
+ * @param retry max retry times
+ * @return probeMac, the source MAC address ONOS uses to probe the host
+ */
+ MacAddress addProbingHost(Host host, ConnectPoint connectPoint, ProbeMode probeMode,
+ MacAddress probeMac, int retry);
+
+ /**
+ * Notifies HostProbeStore the end of pending host location verification.
+ *
+ * @param probeMac the source MAC address ONOS uses to probe the host
+ */
+ void removeProbingHost(MacAddress probeMac);
+}
diff --git a/core/api/src/main/java/org/onosproject/net/host/HostProbingService.java b/core/api/src/main/java/org/onosproject/net/host/HostProbingService.java
new file mode 100644
index 0000000..6113dd4
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/host/HostProbingService.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.net.host;
+
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.Host;
+
+/**
+ * Service for interacting with the host probing entities.
+ */
+public interface HostProbingService {
+ /**
+ * Probes given host on given location.
+ *
+ * @param host the host to be probed
+ * @param connectPoint the location of host to be probed
+ * @param probeMode probe mode
+ */
+ void probeHost(Host host, ConnectPoint connectPoint, ProbeMode probeMode);
+}
diff --git a/core/api/src/main/java/org/onosproject/net/host/HostProbingStoreDelegate.java b/core/api/src/main/java/org/onosproject/net/host/HostProbingStoreDelegate.java
new file mode 100644
index 0000000..5221951
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/host/HostProbingStoreDelegate.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.net.host;
+
+import org.onosproject.store.StoreDelegate;
+
+/**
+ * Host probing store delegate abstraction.
+ */
+public interface HostProbingStoreDelegate extends StoreDelegate<HostProbingEvent> {
+}
diff --git a/core/api/src/main/java/org/onosproject/net/host/HostProviderService.java b/core/api/src/main/java/org/onosproject/net/host/HostProviderService.java
index d9aeff5..f3dc7ab 100644
--- a/core/api/src/main/java/org/onosproject/net/host/HostProviderService.java
+++ b/core/api/src/main/java/org/onosproject/net/host/HostProviderService.java
@@ -15,12 +15,12 @@
*/
package org.onosproject.net.host;
+import org.apache.commons.lang3.NotImplementedException;
import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.HostId;
import org.onosproject.net.HostLocation;
-import org.onosproject.net.host.HostLocationProbingService.ProbeMode;
import org.onosproject.net.provider.ProviderService;
/**
@@ -54,6 +54,16 @@
void removeIpFromHost(HostId hostId, IpAddress ipAddress);
/**
+ * Notifies the core when a location is associated with a host.
+ *
+ * @param hostId id of the host
+ * @param location location of host that gets discovered
+ */
+ default void addLocationToHost(HostId hostId, HostLocation location) {
+ throw new NotImplementedException("addLocationToHost is not implemented");
+ }
+
+ /**
* Notifies the core when a location is no longer associated with a host.
*
* @param hostId id of the host
@@ -69,7 +79,9 @@
* @param connectPoint the connect point that is under verification
* @param probeMode probe mode
* @return probeMac, the source MAC address ONOS uses to probe the host
+ * @deprecated in ONOS 1.12, replaced by {@link HostProbingProviderService}
*/
+ @Deprecated
default MacAddress addPendingHostLocation(HostId hostId, ConnectPoint connectPoint, ProbeMode probeMode) {
return MacAddress.NONE;
}
@@ -78,6 +90,8 @@
* Notifies HostProviderService the end of pending host location verification.
*
* @param probeMac the source MAC address ONOS uses to probe the host
+ * @deprecated in ONOS 1.12, replaced by {@link HostProbingProviderService}
*/
+ @Deprecated
default void removePendingHostLocation(MacAddress probeMac) {}
}
diff --git a/core/api/src/main/java/org/onosproject/net/host/HostStore.java b/core/api/src/main/java/org/onosproject/net/host/HostStore.java
index 96d3c31..0b6238b 100644
--- a/core/api/src/main/java/org/onosproject/net/host/HostStore.java
+++ b/core/api/src/main/java/org/onosproject/net/host/HostStore.java
@@ -23,7 +23,6 @@
import org.onosproject.net.Host;
import org.onosproject.net.HostId;
import org.onosproject.net.HostLocation;
-import org.onosproject.net.host.HostLocationProbingService.ProbeMode;
import org.onosproject.net.provider.ProviderId;
import org.onosproject.store.Store;
diff --git a/core/api/src/main/java/org/onosproject/net/host/ProbeMode.java b/core/api/src/main/java/org/onosproject/net/host/ProbeMode.java
new file mode 100644
index 0000000..bc3efbf
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/host/ProbeMode.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.net.host;
+
+/**
+ * Mode of host location probing.
+ */
+public enum ProbeMode {
+ /**
+ * Append probed host location if reply is received before timeout. Otherwise, do nothing.
+ * Typically used to discover secondary locations.
+ */
+ DISCOVER,
+
+ /**
+ * Remove probed host location if reply is received after timeout. Otherwise, do nothing.
+ * Typically used to verify previous locations.
+ */
+ VERIFY
+}
diff --git a/core/net/src/main/java/org/onosproject/net/host/impl/HostManager.java b/core/net/src/main/java/org/onosproject/net/host/impl/HostManager.java
index 998f7df..31e8904 100644
--- a/core/net/src/main/java/org/onosproject/net/host/impl/HostManager.java
+++ b/core/net/src/main/java/org/onosproject/net/host/impl/HostManager.java
@@ -29,7 +29,6 @@
import org.onlab.packet.VlanId;
import org.onlab.util.Tools;
import org.onosproject.cfg.ComponentConfigService;
-import org.onosproject.net.host.HostLocationProbingService.ProbeMode;
import org.onosproject.net.intf.Interface;
import org.onosproject.net.intf.InterfaceService;
import org.onosproject.net.HostLocation;
@@ -442,6 +441,20 @@
}
@Override
+ public void addLocationToHost(HostId hostId, HostLocation location) {
+ checkNotNull(hostId, HOST_ID_NULL);
+ checkValidity();
+
+ if (!allowedToChange(hostId)) {
+ log.info("Request to remove {} from {} is ignored due to provider mismatch",
+ location, hostId);
+ return;
+ }
+
+ store.appendLocation(hostId, location);
+ }
+
+ @Override
public void removeLocationFromHost(HostId hostId, HostLocation location) {
checkNotNull(hostId, HOST_ID_NULL);
checkValidity();
@@ -455,16 +468,6 @@
store.removeLocation(hostId, location);
}
- @Override
- public MacAddress addPendingHostLocation(HostId hostId, ConnectPoint connectPoint, ProbeMode probeMode) {
- return store.addPendingHostLocation(hostId, connectPoint, probeMode);
- }
-
- @Override
- public void removePendingHostLocation(MacAddress probeMac) {
- store.removePendingHostLocation(probeMac);
- }
-
/**
* Providers should only be able to remove a host that is provided by itself,
* or a host that is not configured.
diff --git a/core/net/src/main/java/org/onosproject/net/host/impl/HostProbingManager.java b/core/net/src/main/java/org/onosproject/net/host/impl/HostProbingManager.java
new file mode 100644
index 0000000..648e200
--- /dev/null
+++ b/core/net/src/main/java/org/onosproject/net/host/impl/HostProbingManager.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.net.host.impl;
+
+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.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onlab.packet.MacAddress;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.Host;
+import org.onosproject.net.host.HostLocationProbingService;
+import org.onosproject.net.host.HostProbingEvent;
+import org.onosproject.net.host.ProbeMode;
+import org.onosproject.net.host.HostProbingListener;
+import org.onosproject.net.host.HostProbingProvider;
+import org.onosproject.net.host.HostProbingProviderService;
+import org.onosproject.net.host.HostProbingService;
+import org.onosproject.net.host.HostProbeStore;
+import org.onosproject.net.host.HostProbingProviderRegistry;
+import org.onosproject.net.host.HostProbingStoreDelegate;
+import org.onosproject.net.provider.AbstractListenerProviderRegistry;
+import org.onosproject.net.provider.AbstractProviderService;
+import org.slf4j.Logger;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+@Component(immediate = true)
+@Service
+public class HostProbingManager extends
+ AbstractListenerProviderRegistry<HostProbingEvent, HostProbingListener, HostProbingProvider,
+ HostProbingProviderService>
+ implements HostProbingService, HostProbingProviderRegistry, HostLocationProbingService {
+ private final Logger log = getLogger(getClass());
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ private HostProbeStore hostProbeStore;
+
+ private static final String SCHEME = "hostprobing";
+
+ private HostProbingStoreDelegate delegate = event -> {
+ getProvider(SCHEME).processEvent(event);
+ };
+
+ @Activate
+ public void activate() {
+ hostProbeStore.setDelegate(delegate);
+ }
+
+ @Deactivate
+ public void deactivate() {
+ hostProbeStore.unsetDelegate(delegate);
+ }
+
+ @Override
+ public void probeHost(Host host, ConnectPoint connectPoint, ProbeMode probeMode) {
+ HostProbingProvider provider = getProvider(SCHEME);
+ if (provider == null) {
+ log.warn("Unable to find host probing provider. Cannot {} {} at {}",
+ probeMode, host, connectPoint);
+ return;
+ }
+ provider.probeHost(host, connectPoint, probeMode);
+ }
+
+ @Override
+ protected HostProbingProviderService createProviderService(HostProbingProvider provider) {
+ return new InternalHostProbingProviderService(provider);
+ }
+
+ private class InternalHostProbingProviderService
+ extends AbstractProviderService<HostProbingProvider>
+ implements HostProbingProviderService {
+ InternalHostProbingProviderService(HostProbingProvider provider) {
+ super(provider);
+ }
+
+ @Override
+ public MacAddress addProbingHost(Host host, ConnectPoint connectPoint, ProbeMode mode,
+ MacAddress probeMac, int retry) {
+ return hostProbeStore.addProbingHost(host, connectPoint, mode, probeMac, retry);
+ }
+
+ @Override
+ public void removeProbingHost(MacAddress probeMac) {
+ hostProbeStore.removeProbingHost(probeMac);
+ }
+ }
+}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/host/impl/DefaultHostProbe.java b/core/store/dist/src/main/java/org/onosproject/store/host/impl/DefaultHostProbe.java
new file mode 100644
index 0000000..5ab72fc
--- /dev/null
+++ b/core/store/dist/src/main/java/org/onosproject/store/host/impl/DefaultHostProbe.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.store.host.impl;
+
+import org.onlab.packet.MacAddress;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DefaultHost;
+import org.onosproject.net.Host;
+import org.onosproject.net.host.ProbeMode;
+import org.onosproject.net.host.HostProbe;
+
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+/**
+ * Internal data structure to record the info of a host with location that is under verification.
+ */
+class DefaultHostProbe extends DefaultHost implements HostProbe {
+ private ConnectPoint connectPoint;
+ private int retry;
+ private ProbeMode mode;
+ private MacAddress probeMac;
+
+ /**
+ * Constructs DefaultHostProbe with given retry.
+ *
+ * @param host host to be probed
+ * @param connectPoint location to be verified
+ * @param probeMac source MAC address of the probe
+ * @param mode probe mode
+ * @param retry number of retry
+ */
+ DefaultHostProbe(Host host, ConnectPoint connectPoint, ProbeMode mode, MacAddress probeMac, int retry) {
+ super(host.providerId(), host.id(), host.mac(), host.vlan(), host.locations(), host.ipAddresses(),
+ host.configured());
+
+ this.connectPoint = connectPoint;
+ this.mode = mode;
+ this.probeMac = probeMac;
+ this.retry = retry;
+ }
+
+ @Override
+ public ConnectPoint connectPoint() {
+ return connectPoint;
+ }
+
+ @Override
+ public int retry() {
+ return retry;
+ }
+
+ @Override
+ public void decreaseRetry() {
+ this.retry -= 1;
+ }
+
+ @Override
+ public ProbeMode mode() {
+ return mode;
+ }
+
+ @Override
+ public MacAddress probeMac() {
+ return probeMac;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof DefaultHostProbe)) {
+ return false;
+ }
+ DefaultHostProbe that = (DefaultHostProbe) o;
+ return (super.equals(o) &&
+ Objects.equals(this.connectPoint, that.connectPoint) &&
+ Objects.equals(this.retry, that.retry) &&
+ Objects.equals(this.mode, that.mode)) &&
+ Objects.equals(this.probeMac, that.probeMac);
+ }
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), connectPoint, retry, mode, probeMac);
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(getClass())
+ .add("host", super.toString())
+ .add("location", connectPoint)
+ .add("retry", retry)
+ .add("mode", mode)
+ .add("probeMac", probeMac)
+ .toString();
+ }
+}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/host/impl/DefaultHostProbeStore.java b/core/store/dist/src/main/java/org/onosproject/store/host/impl/DefaultHostProbeStore.java
new file mode 100644
index 0000000..33cb7ad
--- /dev/null
+++ b/core/store/dist/src/main/java/org/onosproject/store/host/impl/DefaultHostProbeStore.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.store.host.impl;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.RemovalNotification;
+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.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onlab.packet.MacAddress;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.Host;
+import org.onosproject.net.host.HostProbe;
+import org.onosproject.net.host.HostProbeStore;
+import org.onosproject.net.host.HostProbingEvent;
+import org.onosproject.net.host.ProbeMode;
+import org.onosproject.net.host.HostProbingStoreDelegate;
+import org.onosproject.store.AbstractStore;
+import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.AtomicCounter;
+import org.onosproject.store.service.ConsistentMap;
+import org.onosproject.store.service.MapEvent;
+import org.onosproject.store.service.MapEventListener;
+import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.StorageService;
+import org.onosproject.store.service.Versioned;
+import org.slf4j.Logger;
+
+import java.util.Map;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
+import static org.onlab.util.Tools.groupedThreads;
+import static org.slf4j.LoggerFactory.getLogger;
+
+@Component(immediate = true)
+@Service
+public class DefaultHostProbeStore extends AbstractStore<HostProbingEvent, HostProbingStoreDelegate>
+ implements HostProbeStore {
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected StorageService storageService;
+
+ private final Logger log = getLogger(getClass());
+
+ // TODO make this configurable
+ private static final int PROBE_TIMEOUT_MS = 3000;
+
+ private AtomicCounter hostProbeIndex;
+ private Cache<MacAddress, HostProbe> probingHostsCache;
+ private ConsistentMap<MacAddress, HostProbe> probingHostsConsistentMap;
+ private Map<MacAddress, HostProbe> probingHosts;
+ private MapEventListener<MacAddress, HostProbe> probingHostListener = new ProbingHostListener();
+ private ScheduledExecutorService cacheCleaner;
+ private ScheduledExecutorService locationRemover;
+
+ @Activate
+ public void activate() {
+ KryoNamespace.Builder pendingHostSerializer = KryoNamespace.newBuilder()
+ .register(KryoNamespaces.API)
+ .register(DefaultHostProbe.class)
+ .register(ProbeMode.class);
+ probingHostsConsistentMap = storageService.<MacAddress, HostProbe>consistentMapBuilder()
+ .withName("onos-hosts-pending")
+ .withRelaxedReadConsistency()
+ .withSerializer(Serializer.using(pendingHostSerializer.build()))
+ .build();
+ probingHostsConsistentMap.addListener(probingHostListener);
+ probingHosts = probingHostsConsistentMap.asJavaMap();
+
+ hostProbeIndex = storageService.atomicCounterBuilder()
+ .withName("onos-hosts-probe-index")
+ .build()
+ .asAtomicCounter();
+
+ probingHostsCache = CacheBuilder.newBuilder()
+ .expireAfterWrite(PROBE_TIMEOUT_MS, TimeUnit.MILLISECONDS)
+ .removalListener((RemovalNotification<MacAddress, HostProbe> notification) -> {
+ MacAddress probeMac = notification.getKey();
+ switch (notification.getCause()) {
+ case EXPIRED:
+ case REPLACED:
+ probingHosts.computeIfPresent(probeMac, (k, v) -> {
+ v.decreaseRetry();
+ return v;
+ });
+ break;
+ case EXPLICIT:
+ break;
+ default:
+ log.warn("Remove {} from pendingHostLocations for unexpected reason {}",
+ notification.getKey(), notification.getCause());
+ }
+ }).build();
+
+ cacheCleaner = newSingleThreadScheduledExecutor(
+ groupedThreads("onos/host/hostprobestore", "cache-cleaner", log));
+ cacheCleaner.scheduleAtFixedRate(probingHostsCache::cleanUp, 0, PROBE_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ locationRemover = newSingleThreadScheduledExecutor(
+ groupedThreads("onos/host/hostprobestore", "loc-remover", log));
+
+ log.info("Started");
+ }
+
+ @Deactivate
+ public void deactivate() {
+ cacheCleaner.shutdown();
+ locationRemover.shutdown();
+ probingHostsCache.cleanUp();
+
+ log.info("Stopped");
+ }
+
+ @Override
+ public MacAddress addProbingHost(Host host, ConnectPoint connectPoint, ProbeMode probeMode,
+ MacAddress probeMac, int retry) {
+ if (probeMac == null) {
+ probeMac = generateProbeMac();
+ }
+ DefaultHostProbe probingHost = new DefaultHostProbe(host, connectPoint, probeMode, probeMac, retry);
+ probingHostsCache.put(probeMac, probingHost);
+ probingHosts.put(probeMac, probingHost);
+ return probeMac;
+ }
+
+ @Override
+ public void removeProbingHost(MacAddress probeMac) {
+ probingHostsCache.invalidate(probeMac);
+ probingHosts.remove(probeMac);
+ }
+
+ private MacAddress generateProbeMac() {
+ // Use ONLab OUI (3 bytes) + atomic counter (3 bytes) as the source MAC of the probe
+ long nextIndex = hostProbeIndex.incrementAndGet();
+ return MacAddress.valueOf(MacAddress.NONE.toLong() + nextIndex);
+ }
+
+ private class ProbingHostListener implements MapEventListener<MacAddress, HostProbe> {
+ @Override
+ public void event(MapEvent<MacAddress, HostProbe> event) {
+ HostProbe newValue = Versioned.valueOrNull(event.newValue());
+ HostProbe oldValue = Versioned.valueOrNull(event.oldValue());
+
+ HostProbingEvent hostProbingEvent;
+ switch (event.type()) {
+ case INSERT:
+ hostProbingEvent = new HostProbingEvent(HostProbingEvent.Type.PROBE_REQUESTED, newValue);
+ notifyDelegate(hostProbingEvent);
+ break;
+ case UPDATE:
+ // Fail VERIFY probe immediately. Only allow DISCOVER probe to retry.
+ if (newValue.retry() > 0) {
+ if (newValue.mode() == ProbeMode.DISCOVER) {
+ hostProbingEvent = new HostProbingEvent(HostProbingEvent.Type.PROBE_TIMEOUT,
+ newValue, oldValue);
+ notifyDelegate(hostProbingEvent);
+ } else {
+ hostProbingEvent = new HostProbingEvent(HostProbingEvent.Type.PROBE_FAIL,
+ newValue, oldValue);
+ notifyDelegate(hostProbingEvent);
+ }
+ } else {
+ // Remove from pendingHost and let the remove listener generates the event
+ locationRemover.execute(() -> probingHosts.remove(event.key()));
+ }
+ break;
+ case REMOVE:
+ if (oldValue.retry() > 0) {
+ hostProbingEvent = new HostProbingEvent(HostProbingEvent.Type.PROBE_COMPLETED, oldValue);
+ notifyDelegate(hostProbingEvent);
+ } else {
+ hostProbingEvent = new HostProbingEvent(HostProbingEvent.Type.PROBE_FAIL, oldValue);
+ notifyDelegate(hostProbingEvent);
+ }
+ break;
+ default:
+ log.warn("Unknown map event type: {}", event.type());
+ }
+ }
+ }
+}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/host/impl/DistributedHostStore.java b/core/store/dist/src/main/java/org/onosproject/store/host/impl/DistributedHostStore.java
index aa811ba..d179288 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/host/impl/DistributedHostStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/host/impl/DistributedHostStore.java
@@ -15,9 +15,6 @@
*/
package org.onosproject.store.host.impl;
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.RemovalNotification;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
@@ -43,18 +40,15 @@
import org.onosproject.net.host.HostEvent;
import org.onosproject.net.host.HostStore;
import org.onosproject.net.host.HostStoreDelegate;
-import org.onosproject.net.host.HostLocationProbingService.ProbeMode;
import org.onosproject.net.provider.ProviderId;
import org.onosproject.store.AbstractStore;
import org.onosproject.store.serializers.KryoNamespaces;
-import org.onosproject.store.service.AtomicCounter;
import org.onosproject.store.service.ConsistentMap;
import org.onosproject.store.service.MapEvent;
import org.onosproject.store.service.MapEventListener;
import org.onosproject.store.service.Serializer;
import org.onosproject.store.service.StorageService;
import org.onosproject.store.service.DistributedPrimitive.Status;
-import org.onosproject.store.service.Versioned;
import org.slf4j.Logger;
import java.util.Collection;
@@ -62,11 +56,9 @@
import java.util.Iterator;
import java.util.Map;
import java.util.Objects;
-import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@@ -93,47 +85,16 @@
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected StorageService storageService;
- private AtomicCounter hostProbeIndex;
private ConsistentMap<HostId, DefaultHost> hostsConsistentMap;
private Map<HostId, DefaultHost> hosts;
private Map<IpAddress, Set<Host>> hostsByIp;
private MapEventListener<HostId, DefaultHost> hostLocationTracker =
new HostLocationTracker();
- private ConsistentMap<MacAddress, PendingHostLocation> pendingHostsConsistentMap;
- private Map<MacAddress, PendingHostLocation> pendingHosts;
- private MapEventListener<MacAddress, PendingHostLocation> pendingHostListener =
- new PendingHostListener();
-
private ScheduledExecutorService executor;
- private ScheduledExecutorService cacheCleaner;
- private ScheduledExecutorService locationRemover;
private Consumer<Status> statusChangeListener;
- // TODO make this configurable
- private static final int PROBE_TIMEOUT_MS = 3000;
-
- private Cache<MacAddress, PendingHostLocation> pendingHostsCache = CacheBuilder.newBuilder()
- .expireAfterWrite(PROBE_TIMEOUT_MS, TimeUnit.MILLISECONDS)
- .removalListener((RemovalNotification<MacAddress, PendingHostLocation> notification) -> {
- switch (notification.getCause()) {
- case EXPIRED:
- PendingHostLocation expired = notification.getValue();
- if (expired != null) {
- if (timeoutPendingHostLocation(notification.getKey())) {
- log.info("Evict {} from pendingHosts due to probe timeout", notification.getValue());
- }
- }
- break;
- case EXPLICIT:
- break;
- default:
- log.warn("Remove {} from pendingHostLocations for unexpected reason {}",
- notification.getKey(), notification.getCause());
- }
- }).build();
-
@Activate
public void activate() {
KryoNamespace.Builder hostSerializer = KryoNamespace.newBuilder()
@@ -146,28 +107,6 @@
hostsConsistentMap.addListener(hostLocationTracker);
hosts = hostsConsistentMap.asJavaMap();
- KryoNamespace.Builder pendingHostSerializer = KryoNamespace.newBuilder()
- .register(KryoNamespaces.API)
- .register(PendingHostLocation.class)
- .register(ProbeMode.class);
- pendingHostsConsistentMap = storageService.<MacAddress, PendingHostLocation>consistentMapBuilder()
- .withName("onos-hosts-pending")
- .withRelaxedReadConsistency()
- .withSerializer(Serializer.using(pendingHostSerializer.build()))
- .build();
- pendingHostsConsistentMap.addListener(pendingHostListener);
- pendingHosts = pendingHostsConsistentMap.asJavaMap();
-
- hostProbeIndex = storageService.atomicCounterBuilder()
- .withName("onos-hosts-probe-index")
- .build()
- .asAtomicCounter();
-
- cacheCleaner = newSingleThreadScheduledExecutor(groupedThreads("onos/hosts", "cache-cleaner", log));
- cacheCleaner.scheduleAtFixedRate(pendingHostsCache::cleanUp, 0, PROBE_TIMEOUT_MS, TimeUnit.MILLISECONDS);
-
- locationRemover = newSingleThreadScheduledExecutor(groupedThreads("onos/hosts", "loc-remover", log));
-
executor = newSingleThreadScheduledExecutor(groupedThreads("onos/hosts", "status-listener", log));
statusChangeListener = status -> {
if (status == Status.ACTIVE) {
@@ -182,9 +121,6 @@
@Deactivate
public void deactivate() {
hostsConsistentMap.removeListener(hostLocationTracker);
-
- cacheCleaner.shutdown();
- locationRemover.shutdown();
executor.shutdown();
log.info("Stopped");
@@ -425,41 +361,6 @@
return ImmutableSet.copyOf(filtered);
}
- @Override
- public MacAddress addPendingHostLocation(HostId hostId, ConnectPoint connectPoint, ProbeMode probeMode) {
- // Use ONLab OUI (3 bytes) + atomic counter (3 bytes) as the source MAC of the probe
- long nextIndex = hostProbeIndex.getAndIncrement();
- MacAddress probeMac = MacAddress.valueOf(MacAddress.NONE.toLong() + nextIndex);
- PendingHostLocation phl = new PendingHostLocation(hostId, connectPoint, probeMode);
-
- pendingHostsCache.put(probeMac, phl);
- pendingHosts.put(probeMac, phl);
-
- return probeMac;
- }
-
- @Override
- public void removePendingHostLocation(MacAddress probeMac) {
- // Add the host location if probe replied in-time in DISCOVER mode
- Optional.ofNullable(pendingHosts.get(probeMac)).ifPresent(phl -> {
- if (phl.probeMode() == ProbeMode.DISCOVER) {
- HostLocation newLocation = new HostLocation(phl.connectPoint(), System.currentTimeMillis());
- appendLocation(phl.hostId(), newLocation);
- }
- });
-
- pendingHostsCache.invalidate(probeMac);
- pendingHosts.remove(probeMac);
- }
-
- private boolean timeoutPendingHostLocation(MacAddress probeMac) {
- PendingHostLocation phl = pendingHosts.computeIfPresent(probeMac, (k, v) -> {
- v.setExpired(true);
- return v;
- });
- return phl != null;
- }
-
private Set<Host> filter(Collection<DefaultHost> collection, Predicate<DefaultHost> predicate) {
return collection.stream().filter(predicate).collect(Collectors.toSet());
}
@@ -543,29 +444,4 @@
}
}
}
-
- private class PendingHostListener implements MapEventListener<MacAddress, PendingHostLocation> {
- @Override
- public void event(MapEvent<MacAddress, PendingHostLocation> event) {
- Versioned<PendingHostLocation> newValue = event.newValue();
- switch (event.type()) {
- case INSERT:
- break;
- case UPDATE:
- // Remove the host location if probe timeout in VERIFY mode
- if (newValue.value().expired() && newValue.value().probeMode() == ProbeMode.VERIFY) {
- locationRemover.execute(() -> {
- pendingHosts.remove(event.key());
- removeLocation(newValue.value().hostId(),
- new HostLocation(newValue.value().connectPoint(), 0L));
- });
- }
- break;
- case REMOVE:
- break;
- default:
- log.warn("Unknown map event type: {}", event.type());
- }
- }
- }
}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/host/impl/PendingHostLocation.java b/core/store/dist/src/main/java/org/onosproject/store/host/impl/PendingHostLocation.java
deleted file mode 100644
index dc10507..0000000
--- a/core/store/dist/src/main/java/org/onosproject/store/host/impl/PendingHostLocation.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * 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.store.host.impl;
-
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.HostId;
-import org.onosproject.net.host.HostLocationProbingService.ProbeMode;
-
-import java.util.Objects;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-
-/**
- * Internal data structure to record the info of a host with location that is under verification.
- */
-class PendingHostLocation {
- private HostId hostId;
- private ConnectPoint connectPoint;
- private boolean expired;
- private ProbeMode probeMode;
-
- /**
- * Constructs PendingHostLocation.
- *
- * @param hostId Host ID
- * @param connectPoint location to be verified
- * @param probeMode probe mode
- */
- PendingHostLocation(HostId hostId, ConnectPoint connectPoint, ProbeMode probeMode) {
- this.hostId = hostId;
- this.connectPoint = connectPoint;
- this.expired = false;
- this.probeMode = probeMode;
- }
-
- /**
- * Gets HostId of this entry.
- *
- * @return host id
- */
- HostId hostId() {
- return hostId;
- }
-
- /**
- * Gets connect point of this entry.
- *
- * @return connect point
- */
- ConnectPoint connectPoint() {
- return connectPoint;
- }
-
- /**
- * Determine whether this probe is expired or not.
- *
- * @return true if this entry is expired and waiting to be removed from the cache
- */
- boolean expired() {
- return expired;
- }
-
- /**
- * Sets whether this probe is expired or not.
- *
- * @param expired true if this entry is expired and waiting to be removed from the cache
- */
- void setExpired(boolean expired) {
- this.expired = expired;
- }
-
- /**
- * Gets probe mode of this entry.
- *
- * @return probe mode
- */
- ProbeMode probeMode() {
- return probeMode;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (!(o instanceof PendingHostLocation)) {
- return false;
- }
- PendingHostLocation that = (PendingHostLocation) o;
- return (Objects.equals(this.hostId, that.hostId) &&
- Objects.equals(this.connectPoint, that.connectPoint) &&
- Objects.equals(this.expired, that.expired) &&
- Objects.equals(this.probeMode, that.probeMode));
- }
- @Override
- public int hashCode() {
- return Objects.hash(hostId, connectPoint, expired, probeMode);
- }
-
- @Override
- public String toString() {
- return toStringHelper(getClass())
- .add("hostId", hostId)
- .add("location", connectPoint)
- .add("expired", expired)
- .add("probeMode", probeMode)
- .toString();
- }
-}