/*
* 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.csit.libraries;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.concurrent.atomic.AtomicLong;
import org.opendaylight.sxp.core.Configuration;
import org.opendaylight.sxp.core.SxpConnection;
import org.opendaylight.sxp.core.SxpNode;
import org.opendaylight.sxp.core.threading.ThreadsWorker;
import org.opendaylight.sxp.csit.LibraryServer;
import org.opendaylight.sxp.util.database.MasterDatabaseImpl;
import org.opendaylight.sxp.util.database.SxpDatabaseImpl;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.SxpBindingFields;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.sxp.database.fields.binding.database.binding.sources.binding.source.sxp.database.bindings.SxpDatabaseBinding;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.SxpNodeIdentityBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.sxp.domains.SxpDomainBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.node.fields.SecurityBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.node.identity.fields.TimersBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.protocol.rev141002.NodeId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.protocol.rev141002.Version;
import org.robotframework.javalib.annotation.ArgumentNames;
import org.robotframework.javalib.annotation.RobotKeyword;
import org.robotframework.javalib.annotation.RobotKeywords;
import org.robotframework.remoteserver.RemoteServer;
/**
* Robot library used for connectivity measuring
*/
@RobotKeywords public class ConnectionTestLibrary extends AbstractLibrary {
private final AtomicLong connectedPeers = new AtomicLong(0), connectingTimeEnd = new AtomicLong(0);
private final ThreadsWorker worker = new ThreadsWorker(10, 10, 10, 4);
private long connectingTimeBegin, totalPeers;
/**
* @param libraryServer Server where Library will be added
*/
public ConnectionTestLibrary(RemoteServer libraryServer) {
super(libraryServer);
}
/**
* @return Sum of Sxp peers that are currently with state On
*/
@RobotKeyword("Get Connected Peers") @ArgumentNames({}) public synchronized long getConnectedPeers() {
connectedPeers.set(LibraryServer.getNodes()
.stream()
.flatMap(sxpNode -> sxpNode.getAllConnections().stream())
.filter(SxpConnection::isStateOn)
.count());
if (connectedPeers.get() >= totalPeers) {
connectingTimeEnd.set(System.currentTimeMillis());
}
return connectedPeers.get();
}
/**
* @return Time elapsed to connect all peers or 0 if some peers are still in progress of connecting
*/
@RobotKeyword("Get Connect Time") @ArgumentNames({}) public synchronized double getConnectTime() {
long time = connectingTimeEnd.get();
return time == 0 ? 0 : (time - connectingTimeBegin) / 1000f;
}
/**
* @param peersCount Starts SxpNodes and sets expected Peers count
*/
@RobotKeyword("Initiate Connecting") @ArgumentNames({"peers_count"}) public synchronized void initiateConnecting(
String peersCount) {
close();
totalPeers = Integer.parseInt(peersCount);
connectingTimeBegin = System.currentTimeMillis();
LibraryServer.getNodes().forEach(SxpNode::start);
}
@RobotKeyword("Add Node") @ArgumentNames({"node_id", "version", "port", "password"}) @Override
public synchronized void addNode(String nodeId, String version, String port, String password) {
LibraryServer.putNode(SxpNode.createInstance(new NodeId(nodeId),
new SxpNodeIdentityBuilder().setSourceIp(new IpAddress(nodeId.toCharArray()))
.setCapabilities(Configuration.getCapabilities(Version.Version4))
.setEnabled(true)
.setVersion(getVersion(version))
.setTcpPort(new PortNumber(Integer.parseInt(port)))
.setSecurity(new SecurityBuilder().setPassword(
password == null || password.isEmpty() ? null : password).build())
.setTimers(new TimersBuilder().setHoldTime(90)
.setHoldTimeMin(90)
.setHoldTimeMax(180)
.setHoldTimeMinAcceptable(120)
.setReconciliationTime(120)
.setDeleteHoldDownTime(120)
.setRetryOpenTime(5 + (new Random().nextInt() % 10))
.build())
.build(), new MasterDatabaseImpl(), new SxpDatabaseImpl() {
@Override
public synchronized <T extends SxpBindingFields> List<SxpDatabaseBinding> deleteBindings(
NodeId nodeId, List<T> bindings) {
return Collections.emptyList();
}
@Override
public synchronized <T extends SxpBindingFields> List<SxpDatabaseBinding> addBinding(NodeId nodeId,
List<T> bindings) {
return Collections.emptyList();
}
}, worker));
LibraryServer.getNode(nodeId).addDomain(new SxpDomainBuilder().setDomainName(SxpNode.DEFAULT_DOMAIN).build());
}
@Override public synchronized void close() {
totalPeers = 0;
connectedPeers.set(0);
connectingTimeBegin = 0;
connectingTimeEnd.set(0);
}
}