Python-API: Inital commit of Python bindings for the VPP API.

See: https://wiki.fd.io/view/VPP/Python_API

Change-Id: If135fc32208c7031787e1935b399d930e0e1ea1f
Signed-off-by: Ole Troan <ot@cisco.com>
This commit is contained in:
Ole Troan
2016-04-09 03:16:30 +02:00
committed by Dave Wallace
parent 633951c3d8
commit 6855f6cdfe
60 changed files with 1333 additions and 10115 deletions

View File

@ -0,0 +1,35 @@
/*
* Copyright (c) 2015 Cisco and/or its affiliates.
* 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.openvpp.vppjapi;
import java.io.IOException;
import org.openvpp.vppjapi.vppApi;
public abstract class vppApiCallbacks extends vppApi {
public vppApiCallbacks(String clientName) throws IOException {
super(clientName);
}
/* Disabled!
*
* public abstract void interfaceDetails(
int ifIndex, String interfaceName, int supIfIndex, byte[] physAddr,
byte adminUp, byte linkUp, byte linkDuplex, byte linkSpeed,
int subId, byte subDot1ad, byte subNumberOfTags, int subOuterVlanId, int subInnerVlanId,
byte subExactMatch, byte subDefault, byte subOuterVlanIdAny, byte subInnerVlanIdAny,
int vtrOp, int vtrPushDot1q, int vtrTag1, int vtrTag2);
*/
}

View File

@ -0,0 +1,30 @@
/*
* Copyright (c) 2015 Cisco and/or its affiliates.
* 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.openvpp.vppjapi;
import org.openvpp.vppjapi.vppBridgeDomainInterfaceDetails;
public final class vppBridgeDomainDetails {
public String name;
public int bdId;
public boolean flood;
public boolean uuFlood;
public boolean forward;
public boolean learn;
public boolean arpTerm;
public String bviInterfaceName;
public vppBridgeDomainInterfaceDetails[] interfaces;
}

View File

@ -0,0 +1,21 @@
/*
* Copyright (c) 2015 Cisco and/or its affiliates.
* 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.openvpp.vppjapi;
public final class vppBridgeDomainInterfaceDetails {
public String interfaceName;
public byte splitHorizonGroup;
}

View File

@ -0,0 +1,237 @@
/*
* Copyright (c) 2015 Cisco and/or its affiliates.
* 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.openvpp.vppjapi;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.Set;
import org.openvpp.vppjapi.vppVersion;
import org.openvpp.vppjapi.vppInterfaceDetails;
import org.openvpp.vppjapi.vppInterfaceCounters;
import org.openvpp.vppjapi.vppBridgeDomainDetails;
import org.openvpp.vppjapi.vppIPv4Address;
import org.openvpp.vppjapi.vppIPv6Address;
import org.openvpp.vppjapi.vppVxlanTunnelDetails;
public class vppConn implements AutoCloseable {
private static final String LIBNAME = "libvppjni.so.0.0.0";
static {
try {
loadLibrary();
} catch (Exception e) {
System.out.printf("Can't find vpp jni library: %s\n", LIBNAME);
throw new ExceptionInInitializerError(e);
}
}
private static void loadStream(final InputStream is) throws IOException {
final Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxr-x---");
final Path p = Files.createTempFile(LIBNAME, null, PosixFilePermissions.asFileAttribute(perms));
try {
Files.copy(is, p, StandardCopyOption.REPLACE_EXISTING);
try {
Runtime.getRuntime().load(p.toString());
} catch (UnsatisfiedLinkError e) {
throw new IOException(String.format("Failed to load library %s", p), e);
}
} finally {
try {
Files.deleteIfExists(p);
} catch (IOException e) {
}
}
}
private static void loadLibrary() throws IOException {
try (final InputStream is = vppConn.class.getResourceAsStream('/' + LIBNAME)) {
if (is == null) {
throw new IOException(String.format("Failed to open library resource %s",
LIBNAME));
}
loadStream(is);
}
}
private static vppConn currentConnection = null;
private final String clientName;
private volatile boolean disconnected = false;
// Hidden on purpose to prevent external instantiation
vppConn(final String clientName) throws IOException {
this.clientName = clientName;
synchronized (vppConn.class) {
if (currentConnection != null) {
throw new IOException("Already connected as " + currentConnection.clientName);
}
final int ret = clientConnect(clientName);
if (ret != 0) {
throw new IOException("Connection returned error " + ret);
}
currentConnection = this;
}
}
@Override
public synchronized final void close() {
if (!disconnected) {
disconnected = true;
synchronized (vppConn.class) {
clientDisconnect();
currentConnection = null;
}
}
}
/**
* Check if this instance is connected.
*
* @throws IllegalStateException if this instance was disconnected.
*/
protected final void checkConnected() {
if (disconnected) {
throw new IllegalStateException("Disconnected client " + clientName);
}
}
public final int getRetval(int context, int release) {
checkConnected();
return getRetval0(context, release);
}
public final String getInterfaceList (String nameFilter) {
checkConnected();
return getInterfaceList0(nameFilter);
}
public final int swIfIndexFromName (String interfaceName) {
checkConnected();
return swIfIndexFromName0(interfaceName);
}
public final String interfaceNameFromSwIfIndex (int swIfIndex) {
checkConnected();
return interfaceNameFromSwIfIndex0(swIfIndex);
}
public final void clearInterfaceTable () {
checkConnected();
clearInterfaceTable0();
}
public final vppInterfaceDetails[] swInterfaceDump (byte nameFilterValid, byte [] nameFilter) {
checkConnected();
return swInterfaceDump0(nameFilterValid, nameFilter);
}
public final int bridgeDomainIdFromName(String bridgeDomain) {
checkConnected();
return bridgeDomainIdFromName0(bridgeDomain);
}
public final int findOrAddBridgeDomainId(String bridgeDomain) {
checkConnected();
return findOrAddBridgeDomainId0(bridgeDomain);
}
public final vppVersion getVppVersion() {
checkConnected();
return getVppVersion0();
}
public final vppInterfaceCounters getInterfaceCounters(int swIfIndex) {
checkConnected();
return getInterfaceCounters0(swIfIndex);
}
public final int[] bridgeDomainDump(int bdId) {
checkConnected();
return bridgeDomainDump0(bdId);
}
public final vppBridgeDomainDetails getBridgeDomainDetails(int bdId) {
checkConnected();
return getBridgeDomainDetails0(bdId);
}
public final vppL2Fib[] l2FibTableDump(int bdId) {
checkConnected();
return l2FibTableDump0(bdId);
}
public final int bridgeDomainIdFromInterfaceName(String interfaceName) {
checkConnected();
return bridgeDomainIdFromInterfaceName0(interfaceName);
}
public final vppIPv4Address[] ipv4AddressDump(String interfaceName) {
checkConnected();
return ipv4AddressDump0(interfaceName);
}
public final vppIPv6Address[] ipv6AddressDump(String interfaceName) {
checkConnected();
return ipv6AddressDump0(interfaceName);
}
public final vppVxlanTunnelDetails[] vxlanTunnelDump(int swIfIndex) {
checkConnected();
return vxlanTunnelDump0(swIfIndex);
}
public final int setInterfaceDescription(String ifName, String ifDesc) {
checkConnected();
return setInterfaceDescription0(ifName, ifDesc);
}
public final String getInterfaceDescription(String ifName) {
checkConnected();
return getInterfaceDescription0(ifName);
}
private static native int clientConnect(String clientName);
private static native void clientDisconnect();
private static native int getRetval0(int context, int release);
private static native String getInterfaceList0(String nameFilter);
private static native int swIfIndexFromName0(String interfaceName);
private static native String interfaceNameFromSwIfIndex0(int swIfIndex);
private static native void clearInterfaceTable0();
private static native vppInterfaceDetails[] swInterfaceDump0(byte nameFilterValid, byte [] nameFilter);
private static native int bridgeDomainIdFromName0(String bridgeDomain);
private static native int findOrAddBridgeDomainId0(String bridgeDomain);
private static native vppVersion getVppVersion0();
private static native vppInterfaceCounters getInterfaceCounters0(int swIfIndex);
private static native int[] bridgeDomainDump0(int bdId);
private static native vppBridgeDomainDetails getBridgeDomainDetails0(int bdId);
private static native vppL2Fib[] l2FibTableDump0(int bdId);
private static native int bridgeDomainIdFromInterfaceName0(String interfaceName);
private static native vppIPv4Address[] ipv4AddressDump0(String interfaceName);
private static native vppIPv6Address[] ipv6AddressDump0(String interfaceName);
private static native vppVxlanTunnelDetails[] vxlanTunnelDump0(int swIfIndex);
private static native int setInterfaceDescription0(String ifName, String ifDesc);
private static native String getInterfaceDescription0(String ifName);
}

View File

@ -0,0 +1,26 @@
/*
* Copyright (c) 2015 Cisco and/or its affiliates.
* 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.openvpp.vppjapi;
public final class vppIPv4Address {
public final int ip;
public final byte prefixLength;
public vppIPv4Address(int ip, byte prefixLength) {
this.ip = ip;
this.prefixLength = prefixLength;
}
}

View File

@ -0,0 +1,27 @@
/*
* Copyright (c) 2015 Cisco and/or its affiliates.
* 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.openvpp.vppjapi;
public class vppIPv6Address {
// FIXME: this is dangerous
public final byte[] ip;
public final byte prefixLength;
public vppIPv6Address(byte[] ip, byte prefixLength) {
this.ip = ip;
this.prefixLength = prefixLength;
}
}

View File

@ -0,0 +1,77 @@
/*
* Copyright (c) 2015 Cisco and/or its affiliates.
* 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.openvpp.vppjapi;
public final class vppInterfaceCounters {
public final long rxOctets;
public final long rxIp4;
public final long rxIp6;
public final long rxUnicast;
public final long rxMulticast;
public final long rxBroadcast;
public final long rxDiscard;
public final long rxFifoFull;
public final long rxError;
public final long rxUnknownProto;
public final long rxMiss;
public final long txOctets;
public final long txIp4;
public final long txIp6;
public final long txUnicast;
public final long txMulticast;
public final long txBroadcast;
public final long txDiscard;
public final long txFifoFull;
public final long txError;
public final long txUnknownProto;
public final long txMiss;
public vppInterfaceCounters(
long rxOctets, long rxIp4, long rxIp6, long rxUni, long rxMulti,
long rxBcast, long rxDiscard, long rxFifoFull, long rxError,
long rxUnknownProto, long rxMiss,
long txOctets, long txIp4, long txIp6, long txUni, long txMulti,
long txBcast, long txDiscard, long txFifoFull, long txError,
long txUnknownProto, long txMiss)
{
this.rxOctets = rxOctets;
this.rxIp4 = rxIp4;
this.rxIp6 = rxIp6;
this.rxUnicast = rxUni;
this.rxMulticast = rxMulti;
this.rxBroadcast = rxBcast;
this.rxDiscard = rxDiscard;
this.rxFifoFull = rxFifoFull;
this.rxError = rxError;
this.rxUnknownProto = rxUnknownProto;
this.rxMiss = rxMiss;
this.txOctets = txOctets;
this.txIp4 = txIp4;
this.txIp6 = txIp6;
this.txUnicast = txUni;
this.txMulticast = txMulti;
this.txBroadcast = txBcast;
this.txDiscard = txDiscard;
this.txFifoFull = txFifoFull;
this.txError = txError;
this.txUnknownProto = txUnknownProto;
this.txMiss = txMiss;
}
}

View File

@ -0,0 +1,71 @@
/*
* Copyright (c) 2015 Cisco and/or its affiliates.
* 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.openvpp.vppjapi;
public final class vppInterfaceDetails {
public final int ifIndex;
public final String interfaceName;
public final int supIfIndex;
// FIXME: this is dangerous
public final byte[] physAddr;
public final byte adminUp;
public final byte linkUp;
public final byte linkDuplex;
public final byte linkSpeed;
public final int subId;
public final byte subDot1ad;
public final byte subNumberOfTags;
public final int subOuterVlanId;
public final int subInnerVlanId;
public final byte subExactMatch;
public final byte subDefault;
public final byte subOuterVlanIdAny;
public final byte subInnerVlanIdAny;
public final int vtrOp;
public final int vtrPushDot1q;
public final int vtrTag1;
public final int vtrTag2;
public final int linkMtu;
public vppInterfaceDetails(int ifIndex, String interfaceName, int supIfIndex, byte[] physAddr, byte adminUp,
byte linkUp, byte linkDuplex, byte linkSpeed, int subId, byte subDot1ad, byte subNumberOfTags,
int subOuterVlanId, int subInnerVlanId, byte subExactMatch, byte subDefault, byte subOuterVlanIdAny,
byte subInnerVlanIdAny, int vtrOp, int vtrPushDot1q, int vtrTag1, int vtrTag2, int linkMtu)
{
this.ifIndex = ifIndex;
this.interfaceName = interfaceName;
this.supIfIndex = supIfIndex;
this.physAddr = physAddr;
this.adminUp = adminUp;
this.linkUp = linkUp;
this.linkDuplex = linkDuplex;
this.linkSpeed = linkSpeed;
this.subId = subId;
this.subDot1ad = subDot1ad;
this.subNumberOfTags = subNumberOfTags;
this.subOuterVlanId = subOuterVlanId;
this.subInnerVlanId = subInnerVlanId;
this.subExactMatch = subExactMatch;
this.subDefault = subDefault;
this.subOuterVlanIdAny = subOuterVlanIdAny;
this.subInnerVlanIdAny = subInnerVlanIdAny;
this.vtrOp = vtrOp;
this.vtrPushDot1q = vtrPushDot1q;
this.vtrTag1 = vtrTag1;
this.vtrTag2 = vtrTag2;
this.linkMtu = linkMtu;
}
}

View File

@ -0,0 +1,35 @@
/*
* Copyright (c) 2015 Cisco and/or its affiliates.
* 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.openvpp.vppjapi;
public final class vppL2Fib {
// FIXME: this is dangerous
public final byte[] physAddress;
public final boolean staticConfig;
public final String outgoingInterface;
public final boolean filter;
public final boolean bridgedVirtualInterface;
public vppL2Fib(byte[] physAddress, boolean staticConfig,
String outgoingInterface, boolean filter,
boolean bridgedVirtualInterface) {
this.physAddress = physAddress;
this.staticConfig = staticConfig;
this.outgoingInterface = outgoingInterface;
this.filter = filter;
this.bridgedVirtualInterface = bridgedVirtualInterface;
}
}

View File

@ -0,0 +1,31 @@
/*
* Copyright (c) 2015 Cisco and/or its affiliates.
* 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.openvpp.vppjapi;
public final class vppVersion {
public final String programName;
public final String buildDirectory;
public final String gitBranch;
public final String buildDate;
public vppVersion(String progName, String buildDir, String gitBranch, String buildDate) {
this.programName = progName;
this.buildDirectory = buildDir;
this.gitBranch = gitBranch;
this.buildDate = buildDate;
}
}

View File

@ -0,0 +1,33 @@
/*
* Copyright (c) 2015 Cisco and/or its affiliates.
* 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.openvpp.vppjapi;
public final class vppVxlanTunnelDetails {
public final int srcAddress;
public final int dstAddress;
public final int encapVrfId;
public final int vni;
public final int decapNextIndex;
public vppVxlanTunnelDetails(int srcAddress, int dstAddress,
int encapVrfId, int vni, int decapNextIndex) {
this.srcAddress = srcAddress;
this.dstAddress = dstAddress;
this.encapVrfId = encapVrfId;
this.vni = vni;
this.decapNextIndex = decapNextIndex;
}
}