blob: b38a7f7df0b75972256984e666042e38f9ee7fe4 [file] [log] [blame]
/*
* Copyright 2015 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.ui.topo;
import org.onosproject.net.Link;
import org.onosproject.net.LinkKey;
import java.text.DecimalFormat;
import static org.onosproject.net.LinkKey.linkKey;
/**
* Utility methods for helping out with formatting data for the Topology View
* in the web client.
*/
public final class TopoUtils {
// explicit decision made to not 'javadoc' these self explanatory constants
public static final double KILO = 1024;
public static final double MEGA = 1024 * KILO;
public static final double GIGA = 1024 * MEGA;
public static final String GBITS_UNIT = "Gb";
public static final String MBITS_UNIT = "Mb";
public static final String KBITS_UNIT = "Kb";
public static final String BITS_UNIT = "b";
public static final String GBYTES_UNIT = "GB";
public static final String MBYTES_UNIT = "MB";
public static final String KBYTES_UNIT = "KB";
public static final String BYTES_UNIT = "B";
private static final DecimalFormat DF2 = new DecimalFormat("#,###.##");
private static final String COMPACT = "%s/%s-%s/%s";
private static final String EMPTY = "";
private static final String SPACE = " ";
private static final String PER_SEC = "ps";
private static final String FLOW = "flow";
private static final String FLOWS = "flows";
// non-instantiable
private TopoUtils() { }
/**
* Returns a compact identity for the given link, in the form
* used to identify links in the Topology View on the client.
*
* @param link link
* @return compact link identity
*/
public static String compactLinkString(Link link) {
return String.format(COMPACT, link.src().elementId(), link.src().port(),
link.dst().elementId(), link.dst().port());
}
/**
* Produces a canonical link key, that is, one that will match both a link
* and its inverse.
*
* @param link the link
* @return canonical key
*/
public static LinkKey canonicalLinkKey(Link link) {
String sn = link.src().elementId().toString();
String dn = link.dst().elementId().toString();
return sn.compareTo(dn) < 0 ?
linkKey(link.src(), link.dst()) : linkKey(link.dst(), link.src());
}
/**
* Returns human readable count of bytes, to be displayed as a label.
*
* @param bytes number of bytes
* @return formatted byte count
*/
public static String formatBytes(long bytes) {
String unit;
double value;
if (bytes > GIGA) {
value = bytes / GIGA;
unit = GBYTES_UNIT;
} else if (bytes > MEGA) {
value = bytes / MEGA;
unit = MBYTES_UNIT;
} else if (bytes > KILO) {
value = bytes / KILO;
unit = KBYTES_UNIT;
} else {
value = bytes;
unit = BYTES_UNIT;
}
return DF2.format(value) + SPACE + unit;
}
/**
* Returns human readable bit rate, to be displayed as a label.
*
* @param bytes bytes per second
* @return formatted bits per second
*/
public static String formatBitRate(long bytes) {
String unit;
double value;
//Convert to bits
long bits = bytes * 8;
if (bits > GIGA) {
value = bits / GIGA;
unit = GBITS_UNIT;
// NOTE: temporary hack to clip rate at 10.0 Gbps
// Added for the CORD Fabric demo at ONS 2015
// TODO: provide a more elegant solution to this issue
if (value > 10.0) {
value = 10.0;
}
} else if (bits > MEGA) {
value = bits / MEGA;
unit = MBITS_UNIT;
} else if (bits > KILO) {
value = bits / KILO;
unit = KBITS_UNIT;
} else {
value = bits;
unit = BITS_UNIT;
}
return DF2.format(value) + SPACE + unit + PER_SEC;
}
/**
* Returns human readable flow count, to be displayed as a label.
*
* @param flows number of flows
* @return formatted flow count
*/
public static String formatFlows(long flows) {
if (flows < 1) {
return EMPTY;
}
return String.valueOf(flows) + SPACE + (flows > 1 ? FLOWS : FLOW);
}
}