Search in sources :

Example 1 with ANNOTATION_SEGMENT_ID

use of org.onosproject.openstacknetworking.api.Constants.ANNOTATION_SEGMENT_ID in project onos by opennetworkinglab.

the class OpenstackSwitchingHostProvider method processPortAdded.

/**
 * Processes port addition event.
 * Once a port addition event is detected, it tries to create a host instance
 * with openstack augmented host information such as networkId, portId,
 * createTime, segmentId and notifies to host provider.
 *
 * @param port port object used in ONOS
 */
void processPortAdded(Port port) {
    // TODO check the node state is COMPLETE
    org.openstack4j.model.network.Port osPort = osNetworkService.port(port);
    if (osPort == null) {
        log.warn(ERR_ADD_HOST + "OpenStack port for {} not found", port);
        return;
    }
    Network osNet = osNetworkService.network(osPort.getNetworkId());
    if (osNet == null) {
        log.warn(ERR_ADD_HOST + "OpenStack network {} not found", osPort.getNetworkId());
        return;
    }
    if (osPort.getFixedIps().isEmpty()) {
        log.warn(ERR_ADD_HOST + "no fixed IP for port {}", osPort.getId());
        return;
    }
    MacAddress mac = MacAddress.valueOf(osPort.getMacAddress());
    HostId hostId = HostId.hostId(mac);
    /* typically one openstack port should only be bound to one fix IP address;
           however, openstack4j binds multiple fixed IPs to one port, this might
           be a defect of openstack4j implementation */
    // TODO: we need to find a way to bind multiple ports from multiple
    // openstack networks into one host sooner or later
    Set<IpAddress> fixedIps = osPort.getFixedIps().stream().map(ip -> IpAddress.valueOf(ip.getIpAddress())).collect(Collectors.toSet());
    // connect point is the combination of switch ID with port number where
    // the host is attached to
    ConnectPoint connectPoint = new ConnectPoint(port.element().id(), port.number());
    long createTime = System.currentTimeMillis();
    // we check whether the host already attached to same locations
    Host host = hostService.getHost(hostId);
    // build host annotations to include a set of meta info from neutron
    DefaultAnnotations.Builder annotations = DefaultAnnotations.builder().set(ANNOTATION_NETWORK_ID, osPort.getNetworkId()).set(ANNOTATION_PORT_ID, osPort.getId()).set(ANNOTATION_CREATE_TIME, String.valueOf(createTime));
    // FLAT typed network does not require segment ID
    Type netType = osNetworkService.networkType(osNet.getId());
    if (netType != FLAT) {
        annotations.set(ANNOTATION_SEGMENT_ID, osNet.getProviderSegID());
    }
    // build host description object
    HostDescription hostDesc = new DefaultHostDescription(mac, VlanId.NONE, new HostLocation(connectPoint, createTime), fixedIps, annotations.build());
    if (host != null) {
        Set<HostLocation> locations = host.locations().stream().filter(l -> l.deviceId().equals(connectPoint.deviceId())).filter(l -> l.port().equals(connectPoint.port())).collect(Collectors.toSet());
        // therefore, we simply add this into the location list
        if (locations.isEmpty()) {
            hostProviderService.addLocationToHost(hostId, new HostLocation(connectPoint, createTime));
        }
        // the hostDetected method invocation in turn triggers host Update event
        if (locations.size() == 1) {
            hostProviderService.hostDetected(hostId, hostDesc, false);
        }
    } else {
        hostProviderService.hostDetected(hostId, hostDesc, false);
    }
}
Also used : HostLocation(org.onosproject.net.HostLocation) CoreService(org.onosproject.core.CoreService) DeviceService(org.onosproject.net.device.DeviceService) LoggerFactory(org.slf4j.LoggerFactory) Tools.groupedThreads(org.onlab.util.Tools.groupedThreads) Constants(org.onosproject.openstacknetworking.api.Constants) OpenstackNetworkListener(org.onosproject.openstacknetworking.api.OpenstackNetworkListener) OpenstackNetworkingUtil.vnicType(org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.vnicType) ConnectPoint(org.onosproject.net.ConnectPoint) HostProviderService(org.onosproject.net.host.HostProviderService) OpenstackNodeListener(org.onosproject.openstacknode.api.OpenstackNodeListener) TUNNEL_TYPE(org.onosproject.openstacknetworking.api.Constants.TUNNEL_TYPE) Port(org.onosproject.net.Port) Type(org.onosproject.openstacknetworking.api.OpenstackNetwork.Type) OpenstackNetworkEvent(org.onosproject.openstacknetworking.api.OpenstackNetworkEvent) MastershipService(org.onosproject.mastership.MastershipService) OpenstackNodeService(org.onosproject.openstacknode.api.OpenstackNodeService) Constants.portNamePrefixMap(org.onosproject.openstacknetworking.api.Constants.portNamePrefixMap) Device(org.onosproject.net.Device) Deactivate(org.osgi.service.component.annotations.Deactivate) Set(java.util.Set) Collectors(java.util.stream.Collectors) Executors(java.util.concurrent.Executors) OPENSTACK_NETWORKING_APP_ID(org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_APP_ID) FLAT(org.onosproject.openstacknetworking.api.OpenstackNetwork.Type.FLAT) DeviceEvent(org.onosproject.net.device.DeviceEvent) Optional(java.util.Optional) HostDescription(org.onosproject.net.host.HostDescription) ANNOTATION_NETWORK_ID(org.onosproject.openstacknetworking.api.Constants.ANNOTATION_NETWORK_ID) HostProviderRegistry(org.onosproject.net.host.HostProviderRegistry) Tools(org.onlab.util.Tools) Host(org.onosproject.net.Host) OpenstackNode(org.onosproject.openstacknode.api.OpenstackNode) Network(org.openstack4j.model.network.Network) PORT_NAME(org.onosproject.net.AnnotationKeys.PORT_NAME) PORT_NAME_PREFIX_VM(org.onosproject.openstacknetworking.api.Constants.PORT_NAME_PREFIX_VM) HostService(org.onosproject.net.host.HostService) CONTROLLER(org.onosproject.openstacknode.api.OpenstackNode.NodeType.CONTROLLER) Strings(com.google.common.base.Strings) OpenstackNetworkService(org.onosproject.openstacknetworking.api.OpenstackNetworkService) PORT_NAME_VHOST_USER_PREFIX_VM(org.onosproject.openstacknetworking.api.Constants.PORT_NAME_VHOST_USER_PREFIX_VM) DefaultHostDescription(org.onosproject.net.host.DefaultHostDescription) Component(org.osgi.service.component.annotations.Component) ANNOTATION_SEGMENT_ID(org.onosproject.openstacknetworking.api.Constants.ANNOTATION_SEGMENT_ID) Activate(org.osgi.service.component.annotations.Activate) HostId(org.onosproject.net.HostId) ExecutorService(java.util.concurrent.ExecutorService) IpAddress(org.onlab.packet.IpAddress) AbstractProvider(org.onosproject.net.provider.AbstractProvider) ANNOTATION_PORT_ID(org.onosproject.openstacknetworking.api.Constants.ANNOTATION_PORT_ID) DeviceListener(org.onosproject.net.device.DeviceListener) Logger(org.slf4j.Logger) HostProvider(org.onosproject.net.host.HostProvider) VlanId(org.onlab.packet.VlanId) ANNOTATION_CREATE_TIME(org.onosproject.openstacknetworking.api.Constants.ANNOTATION_CREATE_TIME) ProviderId(org.onosproject.net.provider.ProviderId) ReferenceCardinality(org.osgi.service.component.annotations.ReferenceCardinality) DefaultAnnotations(org.onosproject.net.DefaultAnnotations) OpenstackNodeEvent(org.onosproject.openstacknode.api.OpenstackNodeEvent) MacAddress(org.onlab.packet.MacAddress) Reference(org.osgi.service.component.annotations.Reference) DefaultHostDescription(org.onosproject.net.host.DefaultHostDescription) DefaultAnnotations(org.onosproject.net.DefaultAnnotations) Host(org.onosproject.net.Host) MacAddress(org.onlab.packet.MacAddress) HostId(org.onosproject.net.HostId) ConnectPoint(org.onosproject.net.ConnectPoint) HostDescription(org.onosproject.net.host.HostDescription) DefaultHostDescription(org.onosproject.net.host.DefaultHostDescription) OpenstackNetworkingUtil.vnicType(org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.vnicType) Type(org.onosproject.openstacknetworking.api.OpenstackNetwork.Type) Network(org.openstack4j.model.network.Network) HostLocation(org.onosproject.net.HostLocation) IpAddress(org.onlab.packet.IpAddress)

Aggregations

Strings (com.google.common.base.Strings)1 Optional (java.util.Optional)1 Set (java.util.Set)1 ExecutorService (java.util.concurrent.ExecutorService)1 Executors (java.util.concurrent.Executors)1 Collectors (java.util.stream.Collectors)1 IpAddress (org.onlab.packet.IpAddress)1 MacAddress (org.onlab.packet.MacAddress)1 VlanId (org.onlab.packet.VlanId)1 Tools (org.onlab.util.Tools)1 Tools.groupedThreads (org.onlab.util.Tools.groupedThreads)1 CoreService (org.onosproject.core.CoreService)1 MastershipService (org.onosproject.mastership.MastershipService)1 PORT_NAME (org.onosproject.net.AnnotationKeys.PORT_NAME)1 ConnectPoint (org.onosproject.net.ConnectPoint)1 DefaultAnnotations (org.onosproject.net.DefaultAnnotations)1 Device (org.onosproject.net.Device)1 Host (org.onosproject.net.Host)1 HostId (org.onosproject.net.HostId)1 HostLocation (org.onosproject.net.HostLocation)1