/* * Copyright 2016-present Open Networking Laboratory * * 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.incubator.protobuf.net; import java.net.URI; import java.util.HashMap; import java.util.Map; import org.onlab.packet.ChassisId; import org.onosproject.grpc.net.Device.DeviceType; import org.onosproject.grpc.net.Port.PortType; import org.onosproject.net.Annotations; import org.onosproject.net.DefaultAnnotations; import org.onosproject.net.Device; import org.onosproject.net.MastershipRole; import org.onosproject.net.Port; import org.onosproject.net.Port.Type; import org.onosproject.net.PortNumber; import org.onosproject.net.SparseAnnotations; import org.onosproject.net.device.DefaultDeviceDescription; import org.onosproject.net.device.DefaultPortDescription; import org.onosproject.net.device.DefaultPortStatistics; import org.onosproject.net.device.DeviceDescription; import org.onosproject.net.device.PortDescription; import org.onosproject.net.device.PortStatistics; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.annotations.Beta; /** * gRPC message conversion related utilities. */ @Beta public final class ProtobufUtils { private static final Logger log = LoggerFactory.getLogger(ProtobufUtils.class); /** * Translates gRPC enum MastershipRole to ONOS enum. * * @param role mastership role in gRPC enum * @return equivalent in ONOS enum */ public static MastershipRole translate(org.onosproject.grpc.net.Device.MastershipRole role) { switch (role) { case NONE: return MastershipRole.NONE; case MASTER: return MastershipRole.MASTER; case STANDBY: return MastershipRole.STANDBY; case UNRECOGNIZED: log.warn("Unrecognized MastershipRole gRPC message: {}", role); return MastershipRole.NONE; default: return MastershipRole.NONE; } } /** * Translates ONOS enum MastershipRole to gRPC enum. * * @param newRole ONOS' mastership role * @return equivalent in gRPC message enum */ public static org.onosproject.grpc.net.Device.MastershipRole translate(MastershipRole newRole) { switch (newRole) { case MASTER: return org.onosproject.grpc.net.Device.MastershipRole.MASTER; case STANDBY: return org.onosproject.grpc.net.Device.MastershipRole.STANDBY; case NONE: default: return org.onosproject.grpc.net.Device.MastershipRole.NONE; } } /** * Translates gRPC DeviceDescription to {@link DeviceDescription}. * * @param deviceDescription gRPC message * @return {@link DeviceDescription} */ public static DeviceDescription translate(org.onosproject.grpc.net.Device.DeviceDescription deviceDescription) { URI uri = URI.create(deviceDescription.getDeviceUri()); Device.Type type = translate(deviceDescription.getType()); String manufacturer = deviceDescription.getManufacturer(); String hwVersion = deviceDescription.getHwVersion(); String swVersion = deviceDescription.getSwVersion(); String serialNumber = deviceDescription.getSerialNumber(); ChassisId chassis = new ChassisId(deviceDescription.getChassisId()); boolean defaultAvailable = deviceDescription.getIsDefaultAvailable(); return new DefaultDeviceDescription(uri, type, manufacturer, hwVersion, swVersion, serialNumber, chassis, defaultAvailable, asAnnotations(deviceDescription.getAnnotationsMap())); } /** * Translates {@link DeviceDescription} to gRPC DeviceDescription message. * * @param deviceDescription {@link DeviceDescription} * @return gRPC DeviceDescription message */ public static org.onosproject.grpc.net.Device.DeviceDescription translate(DeviceDescription deviceDescription) { return org.onosproject.grpc.net.Device.DeviceDescription.newBuilder() .setDeviceUri(deviceDescription.deviceUri().toString()) .setType(translate(deviceDescription.type())) .setManufacturer(deviceDescription.manufacturer()) .setHwVersion(deviceDescription.hwVersion()) .setSwVersion(deviceDescription.swVersion()) .setSerialNumber(deviceDescription.serialNumber()) .setChassisId(deviceDescription.chassisId().toString()) .setIsDefaultAvailable(deviceDescription.isDefaultAvailable()) .putAllAnnotations(asMap(deviceDescription.annotations())) .build(); } /** * Translates gRPC DeviceType to {@link Device.Type}. * * @param type gRPC message * @return {@link Device.Type} */ public static Device.Type translate(org.onosproject.grpc.net.Device.DeviceType type) { switch (type) { case BALANCER: return Device.Type.BALANCER; case CONTROLLER: return Device.Type.CONTROLLER; case FIBER_SWITCH: return Device.Type.FIBER_SWITCH; case FIREWALL: return Device.Type.FIREWALL; case IDS: return Device.Type.IDS; case IPS: return Device.Type.IPS; case MICROWAVE: return Device.Type.MICROWAVE; case OTHER: return Device.Type.OTHER; case OTN: return Device.Type.OTN; case ROADM: return Device.Type.ROADM; case ROADM_OTN: return Device.Type.ROADM_OTN; case ROUTER: return Device.Type.ROUTER; case SWITCH: return Device.Type.SWITCH; case VIRTUAL: return Device.Type.VIRTUAL; case UNRECOGNIZED: default: log.warn("Unexpected DeviceType: {}", type); return Device.Type.OTHER; } } /** * Translates {@link Type} to gRPC DeviceType. * * @param type {@link Type} * @return gRPC message */ public static DeviceType translate(Device.Type type) { switch (type) { case BALANCER: return DeviceType.BALANCER; case CONTROLLER: return DeviceType.CONTROLLER; case FIBER_SWITCH: return DeviceType.FIBER_SWITCH; case FIREWALL: return DeviceType.FIREWALL; case IDS: return DeviceType.IDS; case IPS: return DeviceType.IPS; case MICROWAVE: return DeviceType.MICROWAVE; case OTHER: return DeviceType.OTHER; case OTN: return DeviceType.OTN; case ROADM: return DeviceType.ROADM; case ROADM_OTN: return DeviceType.ROADM_OTN; case ROUTER: return DeviceType.ROUTER; case SWITCH: return DeviceType.SWITCH; case VIRTUAL: return DeviceType.VIRTUAL; default: log.warn("Unexpected Device.Type: {}", type); return DeviceType.OTHER; } } /** * Translates gRPC PortDescription message to {@link PortDescription}. * * @param portDescription gRPC message * @return {@link PortDescription} */ public static PortDescription translate(org.onosproject.grpc.net.Port.PortDescription portDescription) { PortNumber number = PortNumber.fromString(portDescription.getPortNumber()); boolean isEnabled = portDescription.getIsEnabled(); Port.Type type = translate(portDescription.getType()); long portSpeed = portDescription.getPortSpeed(); SparseAnnotations annotations = asAnnotations(portDescription.getAnnotationsMap()); // TODO How to deal with more specific Port... return new DefaultPortDescription(number, isEnabled, type, portSpeed, annotations); } /** * Translates {@link PortDescription} to gRPC PortDescription message. * * @param portDescription {@link PortDescription} * @return gRPC PortDescription message */ public static org.onosproject.grpc.net.Port.PortDescription translate(PortDescription portDescription) { return org.onosproject.grpc.net.Port.PortDescription.newBuilder() .setPortNumber(portDescription.portNumber().toString()) .setIsEnabled(portDescription.isEnabled()) .setType(translate(portDescription.type())) .setPortSpeed(portDescription.portSpeed()) .putAllAnnotations(asMap(portDescription.annotations())) .build(); } /** * Translates gRPC PortType to {@link Port.Type}. * * @param type gRPC message * @return {@link Port.Type} */ public static Port.Type translate(PortType type) { switch (type) { case COPPER: return Type.COPPER; case FIBER: return Type.FIBER; case OCH: return Type.OCH; case ODUCLT: return Type.ODUCLT; case OMS: return Type.OMS; case PACKET: return Type.PACKET; case VIRTUAL: return Type.VIRTUAL; case UNRECOGNIZED: default: log.warn("Unexpected PortType: {}", type); return Type.COPPER; } } /** * Translates {@link Port.Type} to gRPC PortType. * * @param type {@link Port.Type} * @return gRPC message */ public static PortType translate(Port.Type type) { switch (type) { case COPPER: return PortType.COPPER; case FIBER: return PortType.FIBER; case OCH: return PortType.OCH; case ODUCLT: return PortType.ODUCLT; case OMS: return PortType.OMS; case PACKET: return PortType.PACKET; case VIRTUAL: return PortType.VIRTUAL; default: log.warn("Unexpected Port.Type: {}", type); return PortType.COPPER; } } /** * Translates gRPC PortStatistics message to {@link PortStatistics}. * * @param portStatistics gRPC PortStatistics message * @return {@link PortStatistics} */ public static PortStatistics translate(org.onosproject.grpc.net.Port.PortStatistics portStatistics) { // TODO implement adding missing fields return DefaultPortStatistics.builder() .setPort(portStatistics.getPort()) .setPacketsReceived(portStatistics.getPacketsReceived()) .setPacketsSent(portStatistics.getPacketsSent()) .build(); } /** * Translates {@link PortStatistics} to gRPC PortStatistics message. * * @param portStatistics {@link PortStatistics} * @return gRPC PortStatistics message */ public static org.onosproject.grpc.net.Port.PortStatistics translate(PortStatistics portStatistics) { // TODO implement adding missing fields return org.onosproject.grpc.net.Port.PortStatistics.newBuilder() .setPort(portStatistics.port()) .setPacketsReceived(portStatistics.packetsReceived()) .setPacketsSent(portStatistics.packetsSent()) .build(); } // may be this can be moved to Annotation itself or AnnotationsUtils /** * Converts Annotations to Map of Strings. * * @param annotations {@link Annotations} * @return Map of annotation key and values */ public static Map<String, String> asMap(Annotations annotations) { if (annotations instanceof DefaultAnnotations) { return ((DefaultAnnotations) annotations).asMap(); } Map<String, String> map = new HashMap<>(); annotations.keys() .forEach(k -> map.put(k, annotations.value(k))); return map; } // may be this can be moved to Annotation itself or AnnotationsUtils /** * Converts Map of Strings to {@link SparseAnnotations}. * * @param annotations Map of annotation key and values * @return {@link SparseAnnotations} */ public static SparseAnnotations asAnnotations(Map<String, String> annotations) { DefaultAnnotations.Builder builder = DefaultAnnotations.builder(); annotations.entrySet().forEach(e -> { if (e.getValue() != null) { builder.set(e.getKey(), e.getValue()); } else { builder.remove(e.getKey()); } }); return builder.build(); } // Utility class not intended for instantiation. private ProtobufUtils() {} }