Search in sources :

Example 31 with ProviderId

use of org.onosproject.net.provider.ProviderId in project onos by opennetworkinglab.

the class ECDeviceStore method mergeAnnotations.

private DefaultAnnotations mergeAnnotations(DeviceId deviceId) {
    ProviderId primaryProviderId = getPrimaryProviderId(deviceId);
    DeviceDescription primaryDeviceDescription = deviceDescriptions.get(new DeviceKey(primaryProviderId, deviceId));
    DefaultAnnotations annotations = DefaultAnnotations.builder().build();
    annotations = merge(annotations, primaryDeviceDescription.annotations());
    for (ProviderId providerId : getAllProviders(deviceId)) {
        if (!providerId.equals(primaryProviderId)) {
            annotations = merge(annotations, deviceDescriptions.get(new DeviceKey(providerId, deviceId)).annotations());
        }
    }
    return annotations;
}
Also used : ProviderId(org.onosproject.net.provider.ProviderId) DeviceDescription(org.onosproject.net.device.DeviceDescription) DefaultAnnotations(org.onosproject.net.DefaultAnnotations)

Example 32 with ProviderId

use of org.onosproject.net.provider.ProviderId in project onos by opennetworkinglab.

the class GossipDeviceStore method updatePorts.

@Override
public synchronized List<DeviceEvent> updatePorts(ProviderId providerId, DeviceId deviceId, List<PortDescription> portDescriptions) {
    NodeId localNode = clusterService.getLocalNode().id();
    // TODO: It might be negligible, but this will have negative impact to topology discovery performance,
    // since it will trigger distributed store read.
    // Also, it'll probably be better if side-way communication happened on ConfigurationProvider, etc.
    // outside Device subsystem. so that we don't have to modify both Device and Link stores.
    // If we don't care much about topology performance, then it might be OK.
    NodeId deviceNode = mastershipService.getMasterFor(deviceId);
    // Process port update only if we're the master of the device,
    // otherwise signal the actual master.
    List<DeviceEvent> deviceEvents = null;
    if (localNode.equals(deviceNode)) {
        final Timestamp newTimestamp;
        try {
            newTimestamp = deviceClockService.getTimestamp(deviceId);
        } catch (IllegalStateException e) {
            log.info("Timestamp was not available for device {}", deviceId);
            log.debug("  discarding {}", portDescriptions);
            return Collections.emptyList();
        }
        log.debug("timestamp for {} {}", deviceId, newTimestamp);
        final Timestamped<List<PortDescription>> timestampedInput = new Timestamped<>(portDescriptions, newTimestamp);
        final Timestamped<List<PortDescription>> merged;
        final Map<ProviderId, DeviceDescriptions> device = getOrCreateDeviceDescriptionsMap(deviceId);
        synchronized (device) {
            deviceEvents = updatePortsInternal(providerId, deviceId, timestampedInput);
            final DeviceDescriptions descs = device.get(providerId);
            List<PortDescription> mergedList = FluentIterable.from(portDescriptions).transform(input -> descs.getPortDesc(input.portNumber()).value()).toList();
            merged = new Timestamped<>(mergedList, newTimestamp);
        }
        if (!deviceEvents.isEmpty()) {
            log.debug("Notifying peers of a ports update topology event for providerId: {} and deviceId: {}", providerId, deviceId);
            notifyPeers(new InternalPortEvent(providerId, deviceId, merged));
        }
    } else {
        return Collections.emptyList();
    }
    return deviceEvents;
}
Also used : ProviderId(org.onosproject.net.provider.ProviderId) PortNumber(org.onosproject.net.PortNumber) Tools.groupedThreads(org.onlab.util.Tools.groupedThreads) DEVICE_STATUS_CHANGE(org.onosproject.store.device.impl.GossipDeviceStoreMessageSubjects.DEVICE_STATUS_CHANGE) DeviceStore(org.onosproject.net.device.DeviceStore) DefaultDevice(org.onosproject.net.DefaultDevice) Preconditions.checkArgument(com.google.common.base.Preconditions.checkArgument) Executors.newSingleThreadScheduledExecutor(java.util.concurrent.Executors.newSingleThreadScheduledExecutor) StorageService(org.onosproject.store.service.StorageService) ControllerNodeToNodeId.toNodeId(org.onosproject.cluster.ControllerNodeToNodeId.toNodeId) FluentIterable(com.google.common.collect.FluentIterable) Port(org.onosproject.net.Port) Map(java.util.Map) PORT_STATUS_UPDATE(org.onosproject.store.device.impl.GossipDeviceStoreMessageSubjects.PORT_STATUS_UPDATE) MessageSubject(org.onosproject.store.cluster.messaging.MessageSubject) DefaultPortStatistics(org.onosproject.net.device.DefaultPortStatistics) KryoNamespaces(org.onosproject.store.serializers.KryoNamespaces) MastershipService(org.onosproject.mastership.MastershipService) DeviceStoreDelegate(org.onosproject.net.device.DeviceStoreDelegate) DistributedStoreSerializers(org.onosproject.store.serializers.custom.DistributedStoreSerializers) DeviceDescription(org.onosproject.net.device.DeviceDescription) NodeId(org.onosproject.cluster.NodeId) Serializer(org.onosproject.store.service.Serializer) DefaultPort(org.onosproject.net.DefaultPort) Device(org.onosproject.net.Device) EventuallyConsistentMapEvent(org.onosproject.store.service.EventuallyConsistentMapEvent) Deactivate(org.osgi.service.component.annotations.Deactivate) DEVICE_UPDATE(org.onosproject.store.device.impl.GossipDeviceStoreMessageSubjects.DEVICE_UPDATE) Collection(java.util.Collection) MastershipTermService(org.onosproject.mastership.MastershipTermService) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) DEVICE_REMOVED(org.onosproject.store.device.impl.GossipDeviceStoreMessageSubjects.DEVICE_REMOVED) Set(java.util.Set) PUT(org.onosproject.store.service.EventuallyConsistentMapEvent.Type.PUT) WallClockTimestamp(org.onosproject.store.service.WallClockTimestamp) PORT_UPDATE(org.onosproject.store.device.impl.GossipDeviceStoreMessageSubjects.PORT_UPDATE) PORT_REMOVED(org.onosproject.net.device.DeviceEvent.Type.PORT_REMOVED) Sets(com.google.common.collect.Sets) Objects(java.util.Objects) DeviceClockService(org.onosproject.net.device.DeviceClockService) List(java.util.List) DEVICE_ADVERTISE(org.onosproject.store.device.impl.GossipDeviceStoreMessageSubjects.DEVICE_ADVERTISE) Stream(java.util.stream.Stream) Annotations(org.onosproject.net.Annotations) DeviceEvent(org.onosproject.net.device.DeviceEvent) Entry(java.util.Map.Entry) ClusterCommunicationService(org.onosproject.store.cluster.messaging.ClusterCommunicationService) Optional(java.util.Optional) ClusterService(org.onosproject.cluster.ClusterService) DeviceId(org.onosproject.net.DeviceId) DEVICE_AVAILABILITY_CHANGED(org.onosproject.net.device.DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED) ChassisId(org.onlab.packet.ChassisId) RandomUtils(org.apache.commons.lang3.RandomUtils) PortStatistics(org.onosproject.net.device.PortStatistics) HashMap(java.util.HashMap) KryoNamespace(org.onlab.util.KryoNamespace) Predicates.notNull(com.google.common.base.Predicates.notNull) ControllerNode(org.onosproject.cluster.ControllerNode) ArrayList(java.util.ArrayList) ConcurrentMap(java.util.concurrent.ConcurrentMap) HashSet(java.util.HashSet) Component(org.osgi.service.component.annotations.Component) ImmutableList(com.google.common.collect.ImmutableList) Verify.verify(com.google.common.base.Verify.verify) PortDescription(org.onosproject.net.device.PortDescription) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) Timestamp(org.onosproject.store.Timestamp) Activate(org.osgi.service.component.annotations.Activate) EventuallyConsistentMap(org.onosproject.store.service.EventuallyConsistentMap) EventuallyConsistentMapListener(org.onosproject.store.service.EventuallyConsistentMapListener) ExecutorService(java.util.concurrent.ExecutorService) Type(org.onosproject.net.Device.Type) PORT_STATS_UPDATED(org.onosproject.net.device.DeviceEvent.Type.PORT_STATS_UPDATED) Logger(org.slf4j.Logger) Iterator(java.util.Iterator) MastershipRole(org.onosproject.net.MastershipRole) Tools.minPriority(org.onlab.util.Tools.minPriority) DEVICE_REMOVE_REQ(org.onosproject.store.device.impl.GossipDeviceStoreMessageSubjects.DEVICE_REMOVE_REQ) ProviderId(org.onosproject.net.provider.ProviderId) MastershipBasedTimestamp(org.onosproject.store.impl.MastershipBasedTimestamp) IOException(java.io.IOException) Maps(com.google.common.collect.Maps) PORT_ADDED(org.onosproject.net.device.DeviceEvent.Type.PORT_ADDED) ReferenceCardinality(org.osgi.service.component.annotations.ReferenceCardinality) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) DefaultAnnotations(org.onosproject.net.DefaultAnnotations) MultiValuedTimestamp(org.onosproject.store.service.MultiValuedTimestamp) Executors.newCachedThreadPool(java.util.concurrent.Executors.newCachedThreadPool) AnnotationsUtil(org.onosproject.net.AnnotationsUtil) AbstractStore(org.onosproject.store.AbstractStore) LoggerFactory.getLogger(org.slf4j.LoggerFactory.getLogger) Timestamped(org.onosproject.store.impl.Timestamped) Reference(org.osgi.service.component.annotations.Reference) PORT_UPDATED(org.onosproject.net.device.DeviceEvent.Type.PORT_UPDATED) Collections(java.util.Collections) DeviceEvent(org.onosproject.net.device.DeviceEvent) PortDescription(org.onosproject.net.device.PortDescription) WallClockTimestamp(org.onosproject.store.service.WallClockTimestamp) Timestamp(org.onosproject.store.Timestamp) MastershipBasedTimestamp(org.onosproject.store.impl.MastershipBasedTimestamp) MultiValuedTimestamp(org.onosproject.store.service.MultiValuedTimestamp) ControllerNodeToNodeId.toNodeId(org.onosproject.cluster.ControllerNodeToNodeId.toNodeId) NodeId(org.onosproject.cluster.NodeId) Timestamped(org.onosproject.store.impl.Timestamped) List(java.util.List) ArrayList(java.util.ArrayList) ImmutableList(com.google.common.collect.ImmutableList)

Example 33 with ProviderId

use of org.onosproject.net.provider.ProviderId in project onos by opennetworkinglab.

the class GossipDeviceStore method composeDevice.

/**
 * Returns a Device, merging description given from multiple Providers.
 *
 * @param deviceId      device identifier
 * @param providerDescs Collection of Descriptions from multiple providers
 * @return Device instance
 */
private Device composeDevice(DeviceId deviceId, Map<ProviderId, DeviceDescriptions> providerDescs) {
    checkArgument(!providerDescs.isEmpty(), "No device descriptions supplied");
    ProviderId primary = pickPrimaryPid(providerDescs);
    DeviceDescriptions desc = providerDescs.get(primary);
    final DeviceDescription base = desc.getDeviceDesc().value();
    Type type = base.type();
    String manufacturer = base.manufacturer();
    String hwVersion = base.hwVersion();
    String swVersion = base.swVersion();
    String serialNumber = base.serialNumber();
    ChassisId chassisId = base.chassisId();
    DefaultAnnotations.Builder annotations = DefaultAnnotations.builder();
    annotations.putAll(base.annotations());
    for (Entry<ProviderId, DeviceDescriptions> e : providerDescs.entrySet()) {
        if (e.getKey().equals(primary)) {
            continue;
        }
        // Note: should keep track of Description timestamp in the future
        // and only merge conflicting keys when timestamp is newer.
        // Currently assuming there will never be a key conflict between
        // providers
        // annotation merging. not so efficient, should revisit later
        annotations.putAll(e.getValue().getDeviceDesc().value().annotations());
    }
    return new DefaultDevice(primary, deviceId, type, manufacturer, hwVersion, swVersion, serialNumber, chassisId, annotations.buildCompressed());
}
Also used : ProviderId(org.onosproject.net.provider.ProviderId) DeviceDescription(org.onosproject.net.device.DeviceDescription) Type(org.onosproject.net.Device.Type) ChassisId(org.onlab.packet.ChassisId) DefaultAnnotations(org.onosproject.net.DefaultAnnotations) DefaultDevice(org.onosproject.net.DefaultDevice)

Example 34 with ProviderId

use of org.onosproject.net.provider.ProviderId in project onos by opennetworkinglab.

the class GossipDeviceStore method handlePortEvent.

private void handlePortEvent(InternalPortEvent event) {
    ProviderId providerId = event.providerId();
    DeviceId deviceId = event.deviceId();
    Timestamped<List<PortDescription>> portDescriptions = event.portDescriptions();
    if (getDevice(deviceId) == null) {
        log.debug("{} not found on this node yet, ignoring.", deviceId);
        // Note: dropped information will be recovered by anti-entropy
        return;
    }
    try {
        notifyDelegate(updatePortsInternal(providerId, deviceId, portDescriptions));
    } catch (Exception e) {
        log.warn("Exception thrown handling port update", e);
    }
}
Also used : ProviderId(org.onosproject.net.provider.ProviderId) DeviceId(org.onosproject.net.DeviceId) List(java.util.List) ArrayList(java.util.ArrayList) ImmutableList(com.google.common.collect.ImmutableList) IOException(java.io.IOException)

Example 35 with ProviderId

use of org.onosproject.net.provider.ProviderId in project onos by opennetworkinglab.

the class GossipDeviceStore method handlePortStatusEvent.

private void handlePortStatusEvent(InternalPortStatusEvent event) {
    ProviderId providerId = event.providerId();
    DeviceId deviceId = event.deviceId();
    Timestamped<PortDescription> portDescription = event.portDescription();
    if (getDevice(deviceId) == null) {
        log.debug("{} not found on this node yet, ignoring.", deviceId);
        // Note: dropped information will be recovered by anti-entropy
        return;
    }
    try {
        notifyDelegateIfNotNull(updatePortStatusInternal(providerId, deviceId, portDescription));
    } catch (Exception e) {
        log.warn("Exception thrown handling port update", e);
    }
}
Also used : ProviderId(org.onosproject.net.provider.ProviderId) DeviceId(org.onosproject.net.DeviceId) PortDescription(org.onosproject.net.device.PortDescription) IOException(java.io.IOException)

Aggregations

ProviderId (org.onosproject.net.provider.ProviderId)62 DefaultDevice (org.onosproject.net.DefaultDevice)15 DeviceId (org.onosproject.net.DeviceId)13 Tunnel (org.onosproject.incubator.net.tunnel.Tunnel)12 DefaultAnnotations (org.onosproject.net.DefaultAnnotations)12 Device (org.onosproject.net.Device)12 PortDescription (org.onosproject.net.device.PortDescription)12 TunnelProvider (org.onosproject.incubator.net.tunnel.TunnelProvider)10 DefaultPort (org.onosproject.net.DefaultPort)10 Port (org.onosproject.net.Port)10 DeviceEvent (org.onosproject.net.device.DeviceEvent)10 MastershipBasedTimestamp (org.onosproject.store.impl.MastershipBasedTimestamp)10 PortNumber (org.onosproject.net.PortNumber)9 DeviceDescription (org.onosproject.net.device.DeviceDescription)9 Timestamp (org.onosproject.store.Timestamp)9 MultiValuedTimestamp (org.onosproject.store.service.MultiValuedTimestamp)9 WallClockTimestamp (org.onosproject.store.service.WallClockTimestamp)9 DefaultTunnel (org.onosproject.incubator.net.tunnel.DefaultTunnel)7 TunnelId (org.onosproject.incubator.net.tunnel.TunnelId)7 DefaultLinkDescription (org.onosproject.net.link.DefaultLinkDescription)7