Search in sources :

Example 46 with PortDescription

use of org.onosproject.net.device.PortDescription in project onos by opennetworkinglab.

the class LumentumWaveReadyDiscovery method extractPorts.

// Extract ports from response on pluggable inventory retrieval.
// Client ports are identified by 850nm, everything else is a network port.
private List<PortDescription> extractPorts(String s) {
    List<PortDescription> ports = new ArrayList<>();
    if (s.length() == 0) {
        return ports;
    }
    Arrays.stream(s.split("\"\"")).forEach(p -> {
        if (p.contains(EIGHTFIFTY)) {
            PortDescription cltPort = oduCltPortDescription(PortNumber.portNumber(ports.size() + 1L), true, CltSignalType.CLT_10GBE, extractAnnotations(p));
            ports.add(cltPort);
        } else {
            PortDescription netPort = ochPortDescription(PortNumber.portNumber(ports.size() + 1L), true, OduSignalType.ODU2e, true, new OchSignal(GridType.DWDM, ChannelSpacing.CHL_50GHZ, 0, 4), extractAnnotations(p));
            ports.add(netPort);
        }
    });
    return ports;
}
Also used : ArrayList(java.util.ArrayList) OchPortHelper.ochPortDescription(org.onosproject.net.optical.device.OchPortHelper.ochPortDescription) PortDescription(org.onosproject.net.device.PortDescription) OduCltPortHelper.oduCltPortDescription(org.onosproject.net.optical.device.OduCltPortHelper.oduCltPortDescription) OchSignal(org.onosproject.net.OchSignal)

Example 47 with PortDescription

use of org.onosproject.net.device.PortDescription in project onos by opennetworkinglab.

the class DeviceDescriptions method putPortDesc.

/**
 * Puts PortDescription, merging annotations as necessary.
 *
 * @param newDesc new PortDescription
 */
public void putPortDesc(Timestamped<PortDescription> newDesc) {
    Timestamped<PortDescription> oldOne = portDescs.get(newDesc.value().portNumber());
    Timestamped<PortDescription> newOne = newDesc;
    if (oldOne != null) {
        SparseAnnotations merged = union(oldOne.value().annotations(), newDesc.value().annotations());
        newOne = new Timestamped<>(DefaultPortDescription.builder(newDesc.value()).annotations(merged).build(), newDesc.timestamp());
    }
    portDescs.put(newOne.value().portNumber(), newOne);
}
Also used : SparseAnnotations(org.onosproject.net.SparseAnnotations) DefaultPortDescription(org.onosproject.net.device.DefaultPortDescription) PortDescription(org.onosproject.net.device.PortDescription)

Example 48 with PortDescription

use of org.onosproject.net.device.PortDescription 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 49 with PortDescription

use of org.onosproject.net.device.PortDescription 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)

Example 50 with PortDescription

use of org.onosproject.net.device.PortDescription in project onos by opennetworkinglab.

the class GossipDeviceStore method updatePortStatusInternal.

private DeviceEvent updatePortStatusInternal(ProviderId providerId, DeviceId deviceId, Timestamped<PortDescription> deltaDesc) {
    Device device = devices.get(deviceId);
    checkArgument(device != null, DEVICE_NOT_FOUND, deviceId);
    Map<ProviderId, DeviceDescriptions> descsMap = deviceDescs.get(deviceId);
    checkArgument(descsMap != null, DEVICE_NOT_FOUND, deviceId);
    synchronized (descsMap) {
        if (isDeviceRemoved(deviceId, deltaDesc.timestamp())) {
            log.debug("Ignoring outdated event: {}", deltaDesc);
            return null;
        }
        DeviceDescriptions descs = descsMap.get(providerId);
        // assuming all providers must to give DeviceDescription
        verify(descs != null, "Device description for Device ID %s from Provider %s was not found", deviceId, providerId);
        ConcurrentMap<PortNumber, Port> ports = getPortMap(deviceId);
        final PortNumber number = deltaDesc.value().portNumber();
        final Port oldPort = ports.get(number);
        final Port newPort;
        final Timestamped<PortDescription> existingPortDesc = descs.getPortDesc(number);
        boolean toDelete;
        if (existingPortDesc == null || deltaDesc.isNewer(existingPortDesc)) {
            // on new port or valid update
            // update description
            descs.putPortDesc(deltaDesc);
            newPort = composePort(device, number, descsMap);
            toDelete = deltaDesc.value().isRemoved();
        } else {
            // same or outdated event, ignored.
            log.trace("ignore same or outdated {} >= {}", existingPortDesc, deltaDesc);
            return null;
        }
        if (!toDelete) {
            return oldPort == null ? createPort(device, newPort, ports) : updatePort(device, oldPort, newPort, ports);
        } else {
            return removePort(deviceId, number, providerId, descsMap);
        }
    }
}
Also used : ProviderId(org.onosproject.net.provider.ProviderId) DefaultDevice(org.onosproject.net.DefaultDevice) Device(org.onosproject.net.Device) Port(org.onosproject.net.Port) DefaultPort(org.onosproject.net.DefaultPort) PortDescription(org.onosproject.net.device.PortDescription) PortNumber(org.onosproject.net.PortNumber)

Aggregations

PortDescription (org.onosproject.net.device.PortDescription)82 DefaultPortDescription (org.onosproject.net.device.DefaultPortDescription)42 Test (org.junit.Test)25 DefaultAnnotations (org.onosproject.net.DefaultAnnotations)25 PortNumber (org.onosproject.net.PortNumber)25 DeviceId (org.onosproject.net.DeviceId)24 Port (org.onosproject.net.Port)23 ArrayList (java.util.ArrayList)22 DeviceEvent (org.onosproject.net.device.DeviceEvent)15 ProviderId (org.onosproject.net.provider.ProviderId)14 Device (org.onosproject.net.Device)13 HierarchicalConfiguration (org.apache.commons.configuration.HierarchicalConfiguration)11 DeviceService (org.onosproject.net.device.DeviceService)10 DefaultPort (org.onosproject.net.DefaultPort)9 NetconfSession (org.onosproject.netconf.NetconfSession)8 IOException (java.io.IOException)7 HashMap (java.util.HashMap)7 OduCltPortHelper.oduCltPortDescription (org.onosproject.net.optical.device.OduCltPortHelper.oduCltPortDescription)7 OmsPortHelper.omsPortDescription (org.onosproject.net.optical.device.OmsPortHelper.omsPortDescription)7 ConnectPoint (org.onosproject.net.ConnectPoint)6