/*
* Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.sxp.route.util;
import java.util.Collection;
import java.util.Collections;
import java.util.Objects;
import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import org.opendaylight.sxp.core.SxpNode;
import org.opendaylight.sxp.route.spi.Routing;
import org.opendaylight.sxp.util.time.TimeConv;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.cluster.route.rev161212.sxp.cluster.route.RoutingDefinition;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.cluster.route.rev161212.sxp.cluster.route.RoutingDefinitionBuilder;
/**
* Purpose: utility for routing tasks
*/
public class RouteUtil {
/**
* Address to string with null check
*
* @param address any address
* @return string form of given address
*/
public static String addressToString(IpAddress address) {
return String.valueOf(address.getValue());
}
/**
* Filter out all sxp nodes which involve given virtual interface
*
* @param virtualIp virtual interface
* @param sxpNodes all available sxp nodes
* @return sxp nodes which use given virtualIp iface
*/
public static Collection<SxpNode> findSxpNodesOnVirtualIp(final IpAddress virtualIp,
final Collection<SxpNode> sxpNodes) {
final Collection<SxpNode> affectedNodes;
if (Objects.isNull(virtualIp)) {
affectedNodes = Collections.emptyList();
} else {
affectedNodes =
sxpNodes.stream()
.filter(node -> Objects.nonNull(node) && Objects.nonNull(node.getSourceIp())
&& addressToString(virtualIp).equals(node.getSourceIp().getHostAddress()))
.collect(Collectors.toList());
}
return affectedNodes;
}
/**
* Create copy of given routing definition and add timestamp, consistency and detailed info
*
* @param originalDefinition source
* @param consistent true if routing is consistent with system
* @param info explanation / cause of state
* @return rich routing definition
*/
public static RoutingDefinition createOperationalRouteDefinition(
@Nonnull final RoutingDefinition originalDefinition, final boolean consistent, final String info) {
return new RoutingDefinitionBuilder(originalDefinition)
.setTimestamp(TimeConv.toDt(System.currentTimeMillis()))
.setConsistent(consistent)
.setInfo(info)
.build();
}
/**
* Extract all parts of routing definition contained in routing service
*
* @param existingRouting routing service containing all essential parts of routing definition
* @return extracted definition
*/
public static RoutingDefinition extractRoutingDefinition(final Routing existingRouting) {
return new RoutingDefinitionBuilder()
.setIpAddress(existingRouting.getVirtualIp())
.setNetmask(existingRouting.getNetmask())
.setInterface(existingRouting.getInterface())
.build();
}
}