[libvirt] [PATCH] Initial work on the JNA port, still a work in progress

Daniel Veillard veillard at redhat.com
Mon Jul 27 14:16:33 UTC 2009


On Sat, Jul 25, 2009 at 08:02:08AM -0400, Bryan Kearney wrote:
> ---
>  src/org/libvirt/Connect.java         |  336 +++++++++++++++++++---------------
>  src/org/libvirt/Domain.java          |  183 +++++++++++--------
>  src/org/libvirt/Error.java           |   21 ++
>  src/org/libvirt/ErrorHandler.java    |   22 +++
>  src/org/libvirt/Network.java         |   74 +++++---
>  src/org/libvirt/NodeInfo.java        |   16 ++
>  src/org/libvirt/jna/Libvirt.java     |   66 +++++++
>  src/org/libvirt/jna/virError.java    |   19 ++
>  src/org/libvirt/jna/virNodeInfo.java |   19 ++
>  src/test.java                        |  237 ++++++++++++------------
>  10 files changed, 630 insertions(+), 363 deletions(-)
>  create mode 100644 src/org/libvirt/ErrorHandler.java
>  create mode 100644 src/org/libvirt/jna/Libvirt.java
>  create mode 100644 src/org/libvirt/jna/virError.java
>  create mode 100644 src/org/libvirt/jna/virNodeInfo.java
> 
> diff --git a/src/org/libvirt/Connect.java b/src/org/libvirt/Connect.java
[...]
> +import org.libvirt.jna.Libvirt;
> +import org.libvirt.jna.virError;
> +import org.libvirt.jna.virNodeInfo;
> +
> +import com.sun.jna.Native;
> +import com.sun.jna.Pointer;
> +import com.sun.jna.ptr.ByReference;
> +import com.sun.jna.ptr.LongByReference;

  As said before that new dependancy should be fine

>  	/**
>  	 * the native virConnectPtr.
>  	 */
> -	long VCP;
> +	protected Pointer VCP;

  that

> -	private static native int _virInitialize();

  and the removal of all the "private native" look a real improvement !

> diff --git a/src/org/libvirt/Error.java b/src/org/libvirt/Error.java
> index ef05702..ada7be8 100644
> --- a/src/org/libvirt/Error.java
> +++ b/src/org/libvirt/Error.java
> @@ -2,6 +2,8 @@ package org.libvirt;
>  
>  import java.io.Serializable;
>  
> +import org.libvirt.jna.virError;
> +
>  public class Error implements Serializable {
>  
>  	public static enum ErrorDomain {
> @@ -308,6 +310,25 @@ public class Error implements Serializable {
>  	int int1;
>  	int int2;
>  	long VNP; /* Deprecated */
> +	
> +    public Error() {
> +        
> +    }
> +    
> +    public Error(virError vError) {
> +        code = ErrorNumber.values()[vError.code] ;
> +        domain = ErrorDomain.values()[vError.domain] ;
> +        level = ErrorLevel.values()[vError.level] ;        
> +        message = vError.message ;
> +        str1 = vError.str1 ;
> +        str2 = vError.str2 ;
> +        str3 = vError.str3 ;   
> +        int1 = vError.int1 ;
> +        int2 = vError.int2 ; 
> +        VCP = vError.conn ;
> +        VDP = vError.dom ;
> +        VNP = vError.net ;
> +    }	
>  
>  	/**

  I think there are some cleanups needed w.r.t. spaces at end of lines 

> +++ b/src/org/libvirt/ErrorHandler.java
> @@ -0,0 +1,22 @@
> +package org.libvirt;
> +
> +import org.libvirt.jna.Libvirt;
> +import org.libvirt.jna.virError;
> +
> +import com.sun.jna.Pointer;
> +
> +public class ErrorHandler implements Libvirt.virErrorFunc
> +{
> +    public static ErrorHandler INSTANCE = new ErrorHandler() ;
> +
> +    @Override
> +    public void handleError(Pointer userData, virError vError) throws LibvirtException
> +    {
> +        System.out.println("Hello") ;
> +        if (vError != null) {
> +            Error error = new Error(vError) ;
> +            throw new LibvirtException(error) ;
> +        }
> +        
> +    }
> +}

  That look rather simple

> diff --git a/src/org/libvirt/Network.java b/src/org/libvirt/Network.java
> index 6fda985..a194ca7 100644
> --- a/src/org/libvirt/Network.java
> +++ b/src/org/libvirt/Network.java
> @@ -1,15 +1,25 @@
>  package org.libvirt;
>  
> +import org.libvirt.jna.Libvirt;
> +
> +import com.sun.jna.Pointer;
> +
>  public class Network {
>  
>  	/**
>  	 * The native virNetworkPtr
>  	 */
> -	private long VNP;
> +	protected Pointer VNP;

  For my own education, that means that subclasses implementations may
  still use iit instead of keeping it fully private, right ?

> @@ -18,9 +28,10 @@ public class Network {
>  	 * @param virConnect
>  	 * @param VNP
>  	 */
> -	Network(Connect virConnect, long VNP){
> +	Network(Connect virConnect, Pointer VNP){	
>  		this.virConnect = virConnect;
>  		this.VNP = VNP;
> +		this.libvirt = virConnect.libvirt ;
>  	}

  I think we are slightly breaking the API here but in a way that should
  be compatible with existing code, since VNP was returned from the
  library, right ?

[...]
> diff --git a/src/org/libvirt/NodeInfo.java b/src/org/libvirt/NodeInfo.java
> index b7e2840..16855ca 100644
> --- a/src/org/libvirt/NodeInfo.java
> +++ b/src/org/libvirt/NodeInfo.java
> @@ -1,5 +1,7 @@
>  package org.libvirt;
>  
> +import org.libvirt.jna.virNodeInfo;
> +
>  public class NodeInfo {
>  	/**
>  	 * string indicating the CPU model
> @@ -34,6 +36,20 @@ public class NodeInfo {
>  	 */
>  	public int threads;
>  
> +	
> +	public NodeInfo() {
> +	}
> +	
> +	public NodeInfo(virNodeInfo vInfo) {
> +//	    this.model = new String(vInfo.model) ;

  err, why ?

> +        this.memory = vInfo.memory.longValue() ;
> +        this.cpus = vInfo.cpus ;
> +        this.mhz = vInfo.mhz ;        
> +        this.nodes = vInfo.nodes ;    
> +        this.sockets = vInfo.sockets ;    
> +        this.cores = vInfo.cores ;        
> +        this.threads = vInfo.threads ;
> +	}
>  	/**
>  	 * @return the total number of CPUs supported but not neccessarily active in the host.
>  	 */
> diff --git a/src/org/libvirt/jna/Libvirt.java b/src/org/libvirt/jna/Libvirt.java
> new file mode 100644
> index 0000000..1874d3e
> --- /dev/null
> +++ b/src/org/libvirt/jna/Libvirt.java
> @@ -0,0 +1,66 @@
> +package org.libvirt.jna;
> +
> +
> +import com.sun.jna.Callback;
> +import com.sun.jna.Library ;
> +import com.sun.jna.Native;
> +import com.sun.jna.Pointer;
> +import com.sun.jna.Structure.ByReference;
> +import com.sun.jna.ptr.LongByReference;
> +import com.sun.jna.ptr.PointerByReference;
> +
> +public interface Libvirt extends Library
> +{
> +    Libvirt INSTANCE = (Libvirt) Native.loadLibrary("libvirt", Libvirt.class) ;
> +    
> +    //Callbacks 
> +    interface virErrorFunc extends Callback {
> +        void handleError(Pointer userData, virError error) throws Exception ;
> +    }    
> +    
> +    // Global functions
> +    public virError virGetLastError() ;    
> +    public int virGetVersion(LongByReference libVer, String type, LongByReference typeVer) ;
> +    public int virInitialize() ;    
> +    public void virSetErrorFunc(long userData, virErrorFunc handler) ;
> +    
> +    //Connection Functions
> +    public int virConnCopyLastError(Pointer virConnectPtr) ;        
> +    public int virConnectClose(Pointer virConnectPtr) ;    
> +    public String virConnectGetCapabilities(Pointer virConnectPtr) ;
> +    public String virConnectGetHostname(Pointer virConnectPtr) ;    
> +    public virError virConnGetLastError(Pointer virConnectPtr)  ;    
> +    public int virConnectGetMaxVcpus(Pointer virConnectPtr, String type) ;
> +    public String virConnectGetType(Pointer virConnectPtr) ;
> +    public String virConnectGetURI(Pointer virConnectPtr) ; 
> +    public int virConnectGetVersion(Pointer virConnectPtr, LongByReference hvVer) ;  
> +    public int virConnectListDomains(Pointer virConnectPtr, int[] ids, int maxnames) ;
> +    public int virConnectListNetworks(Pointer virConnectPtr, String[] name, int maxnames) ;       
> +    public int virConnectListDefinedDomains(Pointer virConnectPtr, String[] name, int maxnames) ;
> +    public int virConnectListDefinedNetworks(Pointer virConnectPtr, String[] name, int maxnames) ;    
> +    public int virConnectNumOfDomains(Pointer virConnectPtr) ;
> +    public int virConnectNumOfDefinedDomains(Pointer virConnectPtr) ;    
> +    public int virConnectNumOfDefinedNetworks(Pointer virConnectPtr) ;
> +    public int virConnectNumOfNetworks(Pointer virConnectPtr) ;    
> +    public Pointer virConnectOpen(String name) ;
> +    public Pointer virConnectOpenReadOnly(String name) ;
> +    public void virConnSetErrorFunc(Pointer virConnectPtr, long userData, virErrorFunc handler) ;
> +    
> +    // Node functions
> +    public int virNodeGetInfo(Pointer virConnectPtr, virNodeInfo virNodeInfo) ;
> +    
> +    // Network functions
> +    public Pointer virNetworkCreateXML(Pointer virConnectPtr, String xmlDesc) ;
> +    public Pointer virNetworkDefineXML(Pointer virConnectPtr, String xmlDesc) ;  
> +    public String virNetworkGetName(Pointer virNetorkPtr) ;
> +    public Pointer virNetworkLookupByName(Pointer virConnectPtr, String name) ;
> +    public Pointer virNetworkLookupByUUIDString(Pointer virConnectPtr, String uuidstr) ;    
> +    public Pointer virNetworkLookupByUUID(Pointer virConnectPtr, String uuidstr) ;        
> +    
> +    // Domain functions
> +    public Pointer virDomainCreateLinux(Pointer virConnectPtr, String xmlDesc, int flags) ;    
> +    public Pointer virDomainCreateXML(Pointer virConnectPtr, String xmlDesc, int flags) ;
> +    public Pointer virDomainDefineXML(Pointer virConnectPtr, String xmlDesc) ;       
> +    public Pointer virDomainLookupByUUIDString(Pointer virConnectPtr, String uuidstr) ;
> +
> +}

 That's refreshingly simple !!!

> diff --git a/src/org/libvirt/jna/virError.java b/src/org/libvirt/jna/virError.java
> new file mode 100644
> index 0000000..db462fa
> --- /dev/null
> +++ b/src/org/libvirt/jna/virError.java
> @@ -0,0 +1,19 @@
> +package org.libvirt.jna;
> +
> +import com.sun.jna.Structure ;
> +
> +public class virError extends Structure
> +{
> +    public int code ;
> +    public int domain ;
> +    public String message ;
> +    public int level ;
> +    public long conn ;
> +    public long dom ;
> +    public String str1 ;
> +    public String str2 ;
> +    public String str3 ;   
> +    public int int1 ;
> +    public int int2 ;    
> +    public long net  ;    
> +}

 same here 

> diff --git a/src/org/libvirt/jna/virNodeInfo.java b/src/org/libvirt/jna/virNodeInfo.java
> new file mode 100644
> index 0000000..5a6449e
> --- /dev/null
> +++ b/src/org/libvirt/jna/virNodeInfo.java
> @@ -0,0 +1,19 @@
> +package org.libvirt.jna;
> +
> +import com.sun.jna.NativeLong;
> +import com.sun.jna.Structure;
> +
> +public class virNodeInfo extends Structure 
> +{
> +    public class ByValue extends virNodeInfo implements Structure.ByValue {};
> +    public class ByReference extends virNodeInfo implements Structure.ByReference {};    
> +    
> +    public byte model[] = new byte[32];
> +    public NativeLong memory ;
> +    public int cpus ;
> +    public int mhz ;
> +    public int nodes ;
> +    public int sockets ;
> +    public int cores ;
> +    public int threads ;    
> +}

  and here

> \ No newline at end of file

  Should be fixed, only one though !
It would be great to trick your editor into showing extra spaces at the
end of lines.

> diff --git a/src/test.java b/src/test.java
> index 73f4eb7..2ca6a92 100644
> --- a/src/test.java
> +++ b/src/test.java
> @@ -18,20 +18,21 @@ public class test {
>  				Integer.decode("0xf0"), Integer.decode("0x3c"), Integer.decode("0x87"), Integer.decode("0xd2"), Integer.decode("0x1e"), Integer.decode("0x69")} ;
>  

  I just hope that at the end of the patch series the test file is back
  to its original state. Maybe not worth fixing in all intermediary
  steps ...

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list