use of org.onosproject.net.topology.LinkWeigher in project onos by opennetworkinglab.
the class OpticalConnectivityIntentCompiler method getOpticalPaths.
/**
* Calculates optical paths in WDM topology.
*
* @param intent optical connectivity intent
* @return set of paths in WDM topology
*/
private Stream<Path> getOpticalPaths(OpticalConnectivityIntent intent) {
// Route in WDM topology
Topology topology = topologyService.currentTopology();
// TODO: refactor with LinkWeigher class Implementation
LinkWeigher weight = new LinkWeigher() {
@Override
public Weight getInitialWeight() {
return ScalarWeight.toWeight(0.0);
}
@Override
public Weight getNonViableWeight() {
return ScalarWeight.NON_VIABLE_WEIGHT;
}
/**
* @param edge edge to be weighed
* @return the metric retrieved from the annotations otherwise 1
*/
@Override
public Weight weight(TopologyEdge edge) {
log.debug("Link {} metric {}", edge.link(), edge.link().annotations().value("metric"));
// Disregard inactive or non-optical links
if (edge.link().state() == Link.State.INACTIVE) {
return ScalarWeight.toWeight(-1);
}
if (edge.link().type() != Link.Type.OPTICAL) {
return ScalarWeight.toWeight(-1);
}
// Adhere to static port mappings
DeviceId srcDeviceId = edge.link().src().deviceId();
if (srcDeviceId.equals(intent.getSrc().deviceId())) {
ConnectPoint srcStaticPort = staticPort(intent.getSrc());
if (srcStaticPort != null) {
return ScalarWeight.toWeight(srcStaticPort.equals(edge.link().src()) ? 1 : -1);
}
}
DeviceId dstDeviceId = edge.link().dst().deviceId();
if (dstDeviceId.equals(intent.getDst().deviceId())) {
ConnectPoint dstStaticPort = staticPort(intent.getDst());
if (dstStaticPort != null) {
return ScalarWeight.toWeight(dstStaticPort.equals(edge.link().dst()) ? 1 : -1);
}
}
Annotations annotations = edge.link().annotations();
if (annotations != null && annotations.value("metric") != null && !annotations.value("metric").isEmpty()) {
double metric = Double.parseDouble(annotations.value("metric"));
return ScalarWeight.toWeight(metric);
} else {
return ScalarWeight.toWeight(1);
}
}
};
ConnectPoint start = intent.getSrc();
ConnectPoint end = intent.getDst();
// 0 hop case
if (start.deviceId().equals(end.deviceId())) {
log.debug("install optical intent for 0 hop i.e srcDeviceId=dstDeviceId");
DefaultLink defaultLink = DefaultLink.builder().providerId(PROVIDER_ID).src(start).dst(end).state(Link.State.ACTIVE).type(Link.Type.DIRECT).isExpected(true).build();
List<Link> links = ImmutableList.<Link>builder().add(defaultLink).build();
Annotations annotations = DefaultAnnotations.builder().build();
DefaultPath defaultPath = new DefaultPath(PROVIDER_ID, links, null, annotations);
return ImmutableList.<Path>builder().add(defaultPath).build().stream();
}
// head link's src port should be same as intent src port and tail link dst port
// should be same as intent dst port in the path.
Stream<Path> paths = topologyService.getKShortestPaths(topology, start.deviceId(), end.deviceId(), weight).filter(p -> p.links().get(0).src().port().equals(start.port()) && p.links().get(p.links().size() - 1).dst().port().equals(end.port()));
if (log.isDebugEnabled()) {
return paths.map(path -> {
// no-op map stage to add debug logging
log.debug("Candidate path: {}", path.links().stream().map(lk -> lk.src() + "-" + lk.dst()).collect(Collectors.toList()));
return path;
});
}
return paths;
}
use of org.onosproject.net.topology.LinkWeigher in project onos by opennetworkinglab.
the class OpticalOduIntentCompiler method getOpticalPaths.
/**
* Calculates optical paths in OTU topology.
*
* @param intent optical ODU intent
* @return set of paths in OTU topology
*/
private Set<Path> getOpticalPaths(OpticalOduIntent intent) {
// Route in OTU topology
Topology topology = topologyService.currentTopology();
class Weigher implements LinkWeigher {
@Override
public Weight weight(TopologyEdge edge) {
if (edge.link().state() == Link.State.INACTIVE) {
return ScalarWeight.toWeight(-1);
}
if (edge.link().type() != Link.Type.OPTICAL) {
return ScalarWeight.toWeight(-1);
}
// Find path with available TributarySlots resources
if (!isAvailableTributarySlots(intent, edge.link())) {
return ScalarWeight.toWeight(-1);
}
return ScalarWeight.toWeight(1);
}
@Override
public Weight getInitialWeight() {
return null;
}
@Override
public Weight getNonViableWeight() {
return null;
}
}
LinkWeigher weigher = new Weigher();
ConnectPoint start = intent.getSrc();
ConnectPoint end = intent.getDst();
return topologyService.getPaths(topology, start.deviceId(), end.deviceId(), weigher);
}
use of org.onosproject.net.topology.LinkWeigher in project trellis-control by opennetworkinglab.
the class DefaultL2TunnelHandler method getPath.
/**
* Returns the path betwwen two connect points.
*
* @param srcCp source connect point
* @param dstCp destination connect point
* @return the path
*/
private List<Link> getPath(ConnectPoint srcCp, ConnectPoint dstCp) {
// use SRLinkWeigher to avoid pair links, and also
// avoid going from the spine to the leaf and to the
// spine again, we need to have the leaf as CP1 here.
LinkWeigher srLw = new SRLinkWeigher(srManager, srcCp.deviceId(), new HashSet<Link>());
Set<Path> paths = srManager.topologyService.getPaths(srManager.topologyService.currentTopology(), srcCp.deviceId(), dstCp.deviceId(), srLw);
log.debug("Paths obtained from topology service {}", paths);
// We randomly pick a path.
if (paths.isEmpty()) {
return null;
}
int size = paths.size();
int index = RandomUtils.nextInt(0, size);
List<Link> result = Iterables.get(paths, index).links();
log.debug("Randomly picked a path {}", result);
return result;
}
use of org.onosproject.net.topology.LinkWeigher in project trellis-control by opennetworkinglab.
the class McastUtils method getPaths.
/**
* Gets path from src to dst computed using the custom link weigher.
*
* @param src source device ID
* @param dst destination device ID
* @param linksToEnforce links to be enforced
* @return list of paths from src to dst
*/
List<Path> getPaths(DeviceId src, DeviceId dst, Set<Link> linksToEnforce) {
final Topology currentTopology = topologyService.currentTopology();
final LinkWeigher linkWeigher = new SRLinkWeigher(srManager, src, linksToEnforce);
List<Path> allPaths = Lists.newArrayList(topologyService.getPaths(currentTopology, src, dst, linkWeigher));
log.trace("{} path(s) found from {} to {}", allPaths.size(), src, dst);
return allPaths;
}
Aggregations