alshabib

Merge branch 'master' of ssh://gerrit.onlab.us:29418/onos-next

Showing 141 changed files with 360 additions and 80 deletions
......@@ -6,7 +6,7 @@
<parent>
<groupId>org.onlab.onos</groupId>
<artifactId>onos-net</artifactId>
<artifactId>onos-core</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
......
package org.onlab.onos.net;
import org.onlab.packet.IPv4;
import org.onlab.packet.MACAddress;
import java.util.Set;
/**
* Abstraction of an end-station host on the network, essentially a NIC.
*/
public interface Host extends Element {
// MAC, IP(s), optional VLAN ID
/**
* Host identification.
*
* @return host id
*/
HostId id();
/**
* Returns the host MAC address.
*
* @return mac address
*/
MACAddress mac();
/**
* Returns set of IP addresses currently bound to the host MAC address.
*
* @return set of IP addresses; empty if no IP address is bound
*/
Set<IPv4> ipAddresses();
/**
* Returns the most recent host location where the host attaches to the
......@@ -16,6 +39,6 @@ public interface Host extends Element {
*/
HostLocation location();
// list of recent locations?
// TODO: explore capturing list of recent locations to aid in mobility
}
......
package org.onlab.onos.net;
import org.onlab.packet.MACAddress;
import java.net.URI;
/**
......@@ -16,6 +18,7 @@ public final class HostId extends ElementId {
* Creates a device id using the supplied URI.
*
* @param uri device URI
* @return host identifier
*/
public static HostId hostId(URI uri) {
return new HostId(uri);
......@@ -25,9 +28,23 @@ public final class HostId extends ElementId {
* Creates a device id using the supplied URI string.
*
* @param string device URI string
* @return host identifier
*/
public static HostId hostId(String string) {
return hostId(URI.create(string));
}
/**
* Creates a device id using the supplied MAC &amp; VLAN ID.
*
* @param mac mac address
* @param vlanId vlan identifier
* @return host identifier
*/
// FIXME: replace vlanId long with a rich data-type, e.g. VLanId or something like that
public static HostId hostId(MACAddress mac, long vlanId) {
// FIXME: use more efficient means of encoding
return hostId("nic" + ":" + mac + "/" + vlanId);
}
}
......
......@@ -105,7 +105,7 @@ public class DeviceEvent extends AbstractEvent<DeviceEvent.Type, Device> {
*
* @return port subject or null if the event is not port specific.
*/
Port port() {
public Port port() {
return port;
}
......
......@@ -23,6 +23,11 @@ public class HostEvent extends AbstractEvent<HostEvent.Type, Host> {
HOST_REMOVED,
/**
* Signifies that host data changed, e.g. IP address
*/
HOST_UPDATED,
/**
* Signifies that a host location has changed.
*/
HOST_MOVED
......
package org.onlab.onos.net.host;
import org.onlab.onos.net.HostId;
import org.onlab.onos.net.provider.ProviderService;
/**
......@@ -11,15 +12,16 @@ public interface HostProviderService extends ProviderService<HostProvider> {
* Notifies the core when a host has been detected on a network along with
* information that identifies the hoot location.
*
* @param hostId id of the host that been detected
* @param hostDescription description of host and its location
*/
void hostDetected(HostDescription hostDescription);
void hostDetected(HostId hostId, HostDescription hostDescription);
/**
* Notifies the core when a host is no longer detected on a network.
*
* @param hostDescription description of host
* @param hostId id of the host that vanished
*/
void hostVanished(HostDescription hostDescription);
void hostVanished(HostId hostId);
}
......
......@@ -2,8 +2,10 @@ package org.onlab.onos.net.host;
import org.onlab.onos.net.ConnectPoint;
import org.onlab.onos.net.DeviceId;
import org.onlab.onos.net.ElementId;
import org.onlab.onos.net.Host;
import org.onlab.onos.net.HostId;
import org.onlab.packet.IPv4;
import org.onlab.packet.MACAddress;
import java.util.Set;
......@@ -13,6 +15,13 @@ import java.util.Set;
public interface HostService {
/**
* Returns the number of end-station hosts known to the system.
*
* @return number of end-station hosts
*/
public int getHostCount();
/**
* Returns a collection of all end-station hosts.
*
* @return collection of hosts
......@@ -25,12 +34,32 @@ public interface HostService {
* @param hostId host identifier
* @return host or null if one with the given identifier is not known
*/
Host getHost(ElementId hostId); // TODO: change to HostId
Host getHost(HostId hostId);
/**
* Returns the set of hosts that belong to the specified VLAN.
*
* @param vlanId vlan identifier
* @return set of hosts in the given vlan id
*/
// FIXME: change long to VLanId
Set<Host> getHostsByVlan(long vlanId);
// TODO: determine which ones make sense or which we care to support
// Set<Host> getHostsByVlan(VlanId vlan);
// Set<Host> getHostsByMac(MacAddress mac);
// Set<Host> getHostsByIp(IpAddress ip);
/**
* Returns the set of hosts that have the specified MAC address.
*
* @param mac mac address
* @return set of hosts with the given mac
*/
Set<Host> getHostsByMac(MACAddress mac);
/**
* Returns the set of hosts that have the specified IP address.
*
* @param ip ip address
* @return set of hosts with the given IP
*/
Set<Host> getHostsByIp(IPv4 ip);
/**
* Returns the set of hosts whose most recent location is the specified
......
......@@ -11,14 +11,14 @@
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>onos-net</artifactId>
<artifactId>onos-core</artifactId>
<packaging>pom</packaging>
<description>ONOS Core root project</description>
<modules>
<module>api</module>
<module>core</module>
<module>trivial</module>
</modules>
<dependencies>
......
......@@ -6,19 +6,15 @@
<parent>
<groupId>org.onlab.onos</groupId>
<artifactId>onos-net</artifactId>
<artifactId>onos-core</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>onos-core</artifactId>
<packaging>pom</packaging>
<description>ONOS network control core subsystems</description>
<artifactId>onos-core-trivial</artifactId>
<packaging>bundle</packaging>
<modules>
<module>trivial</module>
</modules>
<description>ONOS network control trivial implementations of core subsystems</description>
<dependencies>
<dependency>
......@@ -26,10 +22,6 @@
<artifactId>onos-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.scr.annotations</artifactId>
</dependency>
......
......@@ -110,21 +110,6 @@ public class SimpleDeviceManager
}
@Override
public void addListener(DeviceListener listener) {
listenerRegistry.addListener(listener);
}
@Override
public void removeListener(DeviceListener listener) {
listenerRegistry.removeListener(listener);
}
@Override
protected DeviceProviderService createProviderService(DeviceProvider provider) {
return new InternalDeviceProviderService(provider);
}
@Override
public void setRole(DeviceId deviceId, MastershipRole newRole) {
checkNotNull(deviceId, DEVICE_ID_NULL);
checkNotNull(newRole, ROLE_NULL);
......@@ -143,8 +128,26 @@ public class SimpleDeviceManager
public void removeDevice(DeviceId deviceId) {
checkNotNull(deviceId, DEVICE_ID_NULL);
DeviceEvent event = store.removeDevice(deviceId);
if (event != null) {
log.info("Device {} administratively removed", deviceId);
post(event);
}
}
@Override
public void addListener(DeviceListener listener) {
listenerRegistry.addListener(listener);
}
@Override
public void removeListener(DeviceListener listener) {
listenerRegistry.removeListener(listener);
}
@Override
protected DeviceProviderService createProviderService(DeviceProvider provider) {
return new InternalDeviceProviderService(provider);
}
// Personalized device provider service issued to the supplied provider.
private class InternalDeviceProviderService extends AbstractProviderService<DeviceProvider>
......@@ -159,12 +162,12 @@ public class SimpleDeviceManager
checkNotNull(deviceId, DEVICE_ID_NULL);
checkNotNull(deviceDescription, DEVICE_DESCRIPTION_NULL);
checkValidity();
log.info("Device {} connected", deviceId);
DeviceEvent event = store.createOrUpdateDevice(provider().id(),
deviceId, deviceDescription);
// If there was a change of any kind, trigger role selection process.
if (event != null) {
log.info("Device {} connected", deviceId);
Device device = event.subject();
provider().roleChanged(device, store.getRole(device.id()));
post(event);
......@@ -175,17 +178,18 @@ public class SimpleDeviceManager
public void deviceDisconnected(DeviceId deviceId) {
checkNotNull(deviceId, DEVICE_ID_NULL);
checkValidity();
log.info("Device {} disconnected", deviceId);
DeviceEvent event = store.markOffline(deviceId);
if (event != null) {
log.info("Device {} disconnected", deviceId);
post(event);
}
}
@Override
public void updatePorts(DeviceId deviceId, List<PortDescription> portDescriptions) {
checkNotNull(deviceId, DEVICE_ID_NULL);
checkNotNull(portDescriptions, "Port descriptions list cannot be null");
checkValidity();
log.info("Device {} ports updated", deviceId);
List<DeviceEvent> events = store.updatePorts(deviceId, portDescriptions);
for (DeviceEvent event : events) {
post(event);
......@@ -199,11 +203,12 @@ public class SimpleDeviceManager
checkValidity();
DeviceEvent event = store.updatePortStatus(deviceId, portDescription);
if (event != null) {
log.info("Device {} port status changed", deviceId);
}
log.info("Device {} port {} status changed", deviceId,
event.port().number());
post(event);
}
}
}
// Posts the specified event to the local event dispatcher.
private void post(DeviceEvent event) {
......
......@@ -28,8 +28,7 @@ import static com.google.common.base.Preconditions.checkArgument;
import static org.onlab.onos.net.device.DeviceEvent.Type.*;
/**
* Manages inventory of infrastructure devices using trivial in-memory
* implementation.
*/
class SimpleDeviceStore {
......
......@@ -8,16 +8,26 @@ import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.Service;
import org.onlab.onos.event.AbstractListenerRegistry;
import org.onlab.onos.event.EventDeliveryService;
import org.onlab.onos.net.ConnectPoint;
import org.onlab.onos.net.DeviceId;
import org.onlab.onos.net.Host;
import org.onlab.onos.net.HostId;
import org.onlab.onos.net.host.HostDescription;
import org.onlab.onos.net.host.HostEvent;
import org.onlab.onos.net.host.HostListener;
import org.onlab.onos.net.host.HostProvider;
import org.onlab.onos.net.host.HostProviderRegistry;
import org.onlab.onos.net.host.HostProviderService;
import org.onlab.onos.net.host.HostService;
import org.onlab.onos.net.provider.AbstractProviderRegistry;
import org.onlab.onos.net.provider.AbstractProviderService;
import org.onlab.packet.IPv4;
import org.onlab.packet.MACAddress;
import org.slf4j.Logger;
import java.util.Set;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.slf4j.LoggerFactory.getLogger;
/**
......@@ -27,13 +37,16 @@ import static org.slf4j.LoggerFactory.getLogger;
@Service
public class SimpleHostManager
extends AbstractProviderRegistry<HostProvider, HostProviderService>
implements HostProviderRegistry {
implements HostService, HostProviderRegistry {
public static final String HOST_ID_NULL = "Host ID cannot be null";
private final Logger log = getLogger(getClass());
private final AbstractListenerRegistry<HostEvent, HostListener>
listenerRegistry = new AbstractListenerRegistry<>();
private final SimpleHostStore store = new SimpleHostStore();
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
private EventDeliveryService eventDispatcher;
......@@ -55,8 +68,64 @@ public class SimpleHostManager
return new InternalHostProviderService(provider);
}
@Override
public int getHostCount() {
return store.getHostCount();
}
@Override
public Iterable<Host> getHosts() {
return store.getHosts();
}
@Override
public Host getHost(HostId hostId) {
checkNotNull(hostId, HOST_ID_NULL);
return store.getHost(hostId);
}
@Override
public Set<Host> getHostsByVlan(long vlanId) {
return store.getHosts(vlanId);
}
@Override
public Set<Host> getHostsByMac(MACAddress mac) {
checkNotNull(mac, "MAC address cannot be null");
return store.getHosts(mac);
}
@Override
public Set<Host> getHostsByIp(IPv4 ip) {
checkNotNull(ip, "IP address cannot be null");
return store.getHosts(ip);
}
@Override
public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
checkNotNull(connectPoint, "Connection point cannot be null");
return store.getConnectedHosts(connectPoint);
}
@Override
public Set<Host> getConnectedHosts(DeviceId deviceId) {
checkNotNull(deviceId, "Device ID cannot be null");
return store.getConnectedHosts(deviceId);
}
@Override
public void addListener(HostListener listener) {
listenerRegistry.addListener(listener);
}
@Override
public void removeListener(HostListener listener) {
listenerRegistry.removeListener(listener);
}
// Personalized host provider service issued to the supplied provider.
private class InternalHostProviderService extends AbstractProviderService<HostProvider>
private class InternalHostProviderService
extends AbstractProviderService<HostProvider>
implements HostProviderService {
InternalHostProviderService(HostProvider provider) {
......@@ -64,13 +133,34 @@ public class SimpleHostManager
}
@Override
public void hostDetected(HostDescription hostDescription) {
log.info("Host {} detected", hostDescription);
public void hostDetected(HostId hostId, HostDescription hostDescription) {
checkNotNull(hostId, HOST_ID_NULL);
checkValidity();
HostEvent event = store.createOrUpdateHost(provider().id(), hostId,
hostDescription);
if (event != null) {
log.info("Host {} detected", hostId);
post(event);
}
}
@Override
public void hostVanished(HostDescription hostDescription) {
log.info("Host {} vanished", hostDescription);
public void hostVanished(HostId hostId) {
checkNotNull(hostId, HOST_ID_NULL);
checkValidity();
HostEvent event = store.removeHost(hostId);
if (event != null) {
log.info("Host {} vanished", hostId);
post(event);
}
}
}
// Posts the specified event to the local event dispatcher.
private void post(HostEvent event) {
if (event != null && eventDispatcher != null) {
eventDispatcher.post(event);
}
}
}
......
package org.onlab.onos.net.trivial.impl;
import org.onlab.onos.net.ConnectPoint;
import org.onlab.onos.net.DeviceId;
import org.onlab.onos.net.Host;
import org.onlab.onos.net.HostId;
import org.onlab.onos.net.host.HostDescription;
import org.onlab.onos.net.host.HostEvent;
import org.onlab.onos.net.provider.ProviderId;
import org.onlab.packet.IPv4;
import org.onlab.packet.MACAddress;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
* Manages inventory of end-station hosts using trivial in-memory
* implementation.
*/
public class SimpleHostStore {
private final Map<HostId, Host> hosts = new ConcurrentHashMap<>();
/**
* Creates a new host or updates the existing one based on the specified
* description.
*
* @param providerId provider identification
* @param hostId host identification
* @param hostDescription host description data
* @return appropriate event or null if no change resulted
*/
HostEvent createOrUpdateHost(ProviderId providerId, HostId hostId,
HostDescription hostDescription) {
return null;
}
/**
* Removes the specified host from the inventory.
*
* @param hostId host identification
* @return remove even or null if host was not found
*/
HostEvent removeHost(HostId hostId) {
return null;
}
/**
* Returns the number of hosts in the store.
*
* @return host count
*/
int getHostCount() {
return hosts.size();
}
/**
* Returns a collection of all hosts in the store.
*
* @return iterable collection of all hosts
*/
Iterable<Host> getHosts() {
return null;
}
/**
* Returns the host with the specified identifer.
*
* @param hostId host identification
* @return host or null if not found
*/
Host getHost(HostId hostId) {
return null;
}
/**
* Returns the set of all hosts within the specified VLAN.
*
* @param vlanId vlan id
* @return set of hosts in the vlan
*/
Set<Host> getHosts(long vlanId) {
return null;
}
/**
* Returns the set of hosts with the specified MAC address.
*
* @param mac mac address
* @return set of hosts with the given mac
*/
Set<Host> getHosts(MACAddress mac) {
return null;
}
/**
* Returns the set of hosts with the specified IP address.
*
* @param ip ip address
* @return set of hosts with the given IP
*/
Set<Host> getHosts(IPv4 ip) {
return null;
}
/**
* Returns the set of hosts whose location falls on the given connection point.
*
* @param connectPoint connection point
* @return set of hosts
*/
Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
return null;
}
/**
* Returns the set of hosts whose location falls on the given device.
*
* @param deviceId infrastructure device identifier
* @return set of hosts
*/
public Set<Host> getConnectedHosts(DeviceId deviceId) {
return null;
}
}
......@@ -66,11 +66,6 @@ implements LinkService, LinkAdminService, LinkProviderRegistry {
}
@Override
protected LinkProviderService createProviderService(LinkProvider provider) {
return new InternalLinkProviderService(provider);
}
@Override
public int getLinkCount() {
return store.getLinkCount();
}
......@@ -145,6 +140,11 @@ implements LinkService, LinkAdminService, LinkProviderRegistry {
listenerRegistry.removeListener(listener);
}
@Override
protected LinkProviderService createProviderService(LinkProvider provider) {
return new InternalLinkProviderService(provider);
}
// Personalized link provider service issued to the supplied provider.
private class InternalLinkProviderService extends AbstractProviderService<LinkProvider>
implements LinkProviderService {
......
......@@ -53,6 +53,8 @@ public class SimpleTopologyManager
private final AbstractListenerRegistry<TopologyEvent, TopologyListener>
listenerRegistry = new AbstractListenerRegistry<>();
private final SimpleTopologyStore store = new SimpleTopologyStore();
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
private EventDeliveryService eventDispatcher;
......
package org.onlab.onos.net.trivial.impl;
/**
* Manages inventory of topology snapshots using trivial in-memory
* implementation.
*/
public class SimpleTopologyStore {
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.onlab.onos</groupId>
<artifactId>onos-core</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>onos-core-trivial</artifactId>
<packaging>bundle</packaging>
<description>ONOS network control trivial implementations of core subsystems</description>
</project>
......@@ -14,7 +14,7 @@
<modules>
<module>tools/build/conf</module>
<module>utils</module>
<module>net</module>
<module>core</module>
<module>web</module>
<module>cli</module>
<module>providers</module>
......