[libvirt] [go PATCH] Add support for virNetworkPort object and APIs

Daniel P. Berrangé posted 1 patch 4 years, 10 months ago
Failed in applying to current master (apply log)
network.go              |  80 ++++++++++++++
network_port.go         | 233 ++++++++++++++++++++++++++++++++++++++++
network_port_compat.h   |  67 ++++++++++++
network_port_wrapper.go | 197 +++++++++++++++++++++++++++++++++
network_port_wrapper.h  |  79 ++++++++++++++
network_wrapper.go      |  73 +++++++++++++
network_wrapper.h       |  23 ++++
7 files changed, 752 insertions(+)
create mode 100644 network_port.go
create mode 100644 network_port_compat.h
create mode 100644 network_port_wrapper.go
create mode 100644 network_port_wrapper.h
[libvirt] [go PATCH] Add support for virNetworkPort object and APIs
Posted by Daniel P. Berrangé 4 years, 10 months ago
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 network.go              |  80 ++++++++++++++
 network_port.go         | 233 ++++++++++++++++++++++++++++++++++++++++
 network_port_compat.h   |  67 ++++++++++++
 network_port_wrapper.go | 197 +++++++++++++++++++++++++++++++++
 network_port_wrapper.h  |  79 ++++++++++++++
 network_wrapper.go      |  73 +++++++++++++
 network_wrapper.h       |  23 ++++
 7 files changed, 752 insertions(+)
 create mode 100644 network_port.go
 create mode 100644 network_port_compat.h
 create mode 100644 network_port_wrapper.go
 create mode 100644 network_port_wrapper.h

diff --git a/network.go b/network.go
index 99954aa..a0bc361 100644
--- a/network.go
+++ b/network.go
@@ -34,6 +34,7 @@ package libvirt
 import "C"
 
 import (
+	"fmt"
 	"reflect"
 	"time"
 	"unsafe"
@@ -333,3 +334,82 @@ func (n *Network) GetDHCPLeases() ([]NetworkDHCPLease, error) {
 	C.free(unsafe.Pointer(cLeases))
 	return leases, nil
 }
+
+// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortLookupByUUIDString
+func (n *Network) LookupNetworkPortByUUIDString(uuid string) (*NetworkPort, error) {
+	if C.LIBVIR_VERSION_NUMBER < 5005000 {
+		return nil, makeNotImplementedError("virNetworkPortLookupByUUIDString")
+	}
+
+	cUuid := C.CString(uuid)
+	defer C.free(unsafe.Pointer(cUuid))
+	var err C.virError
+	ptr := C.virNetworkPortLookupByUUIDStringWrapper(n.ptr, cUuid, &err)
+	if ptr == nil {
+		return nil, makeError(&err)
+	}
+	return &NetworkPort{ptr: ptr}, nil
+}
+
+// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortLookupByUUID
+func (n *Network) LookupNetworkPortByUUID(uuid []byte) (*NetworkPort, error) {
+	if C.LIBVIR_VERSION_NUMBER < 5005000 {
+		return nil, makeNotImplementedError("virNetworkPortLookupByUUID")
+	}
+
+	if len(uuid) != C.VIR_UUID_BUFLEN {
+		return nil, fmt.Errorf("UUID must be exactly %d bytes in size",
+			int(C.VIR_UUID_BUFLEN))
+	}
+	cUuid := make([]C.uchar, C.VIR_UUID_BUFLEN)
+	for i := 0; i < C.VIR_UUID_BUFLEN; i++ {
+		cUuid[i] = C.uchar(uuid[i])
+	}
+	var err C.virError
+	ptr := C.virNetworkPortLookupByUUIDWrapper(n.ptr, &cUuid[0], &err)
+	if ptr == nil {
+		return nil, makeError(&err)
+	}
+	return &NetworkPort{ptr: ptr}, nil
+}
+
+// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortCreateXML
+func (n *Network) PortCreateXML(xmlConfig string, flags uint) (*NetworkPort, error) {
+	if C.LIBVIR_VERSION_NUMBER < 5005000 {
+		return nil, makeNotImplementedError("virNetworkPortCreateXML")
+	}
+	cXml := C.CString(string(xmlConfig))
+	defer C.free(unsafe.Pointer(cXml))
+	var err C.virError
+	ptr := C.virNetworkPortCreateXMLWrapper(n.ptr, cXml, C.uint(flags), &err)
+	if ptr == nil {
+		return nil, makeError(&err)
+	}
+	return &NetworkPort{ptr: ptr}, nil
+}
+
+// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkListAllPorts
+func (n *Network) ListAllPorts(flags uint) ([]NetworkPort, error) {
+	if C.LIBVIR_VERSION_NUMBER < 5005000 {
+		return []NetworkPort{}, makeNotImplementedError("virNetworkListAllPorts")
+	}
+
+	var cList *C.virNetworkPortPtr
+	var err C.virError
+	numPorts := C.virNetworkListAllPortsWrapper(n.ptr, (**C.virNetworkPortPtr)(&cList), C.uint(flags), &err)
+	if numPorts == -1 {
+		return []NetworkPort{}, makeError(&err)
+	}
+	hdr := reflect.SliceHeader{
+		Data: uintptr(unsafe.Pointer(cList)),
+		Len:  int(numPorts),
+		Cap:  int(numPorts),
+	}
+	var ports []NetworkPort
+	slice := *(*[]C.virNetworkPortPtr)(unsafe.Pointer(&hdr))
+	for _, ptr := range slice {
+		ports = append(ports, NetworkPort{ptr})
+	}
+	C.free(unsafe.Pointer(cList))
+	return ports, nil
+}
diff --git a/network_port.go b/network_port.go
new file mode 100644
index 0000000..e701c2d
--- /dev/null
+++ b/network_port.go
@@ -0,0 +1,233 @@
+/*
+ * This file is part of the libvirt-go project
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * Copyright (C) 2019 Red Hat, Inc.
+ *
+ */
+
+package libvirt
+
+/*
+#cgo pkg-config: libvirt
+#include <stdlib.h>
+#include "network_port_wrapper.h"
+*/
+import "C"
+
+import (
+	"unsafe"
+)
+
+type NetworkPortCreateFlags int
+
+const (
+	NETWORK_PORT_CREATE_RECLAIM = NetworkPortCreateFlags(C.VIR_NETWORK_PORT_CREATE_RECLAIM)
+)
+
+type NetworkPort struct {
+	ptr C.virNetworkPortPtr
+}
+
+// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortFree
+func (n *NetworkPort) Free() error {
+	if C.LIBVIR_VERSION_NUMBER < 5005000 {
+		return makeNotImplementedError("virNetworkPortFree")
+	}
+
+	var err C.virError
+	ret := C.virNetworkPortFreeWrapper(n.ptr, &err)
+	if ret == -1 {
+		return makeError(&err)
+	}
+	return nil
+}
+
+// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortRef
+func (c *NetworkPort) Ref() error {
+	if C.LIBVIR_VERSION_NUMBER < 5005000 {
+		return makeNotImplementedError("virNetworkPortRef")
+	}
+
+	var err C.virError
+	ret := C.virNetworkPortRefWrapper(c.ptr, &err)
+	if ret == -1 {
+		return makeError(&err)
+	}
+	return nil
+}
+
+// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortGetUUID
+func (n *NetworkPort) GetUUID() ([]byte, error) {
+	if C.LIBVIR_VERSION_NUMBER < 5005000 {
+		return []byte{}, makeNotImplementedError("virNetworkPortGetUUID")
+	}
+
+	var cUuid [C.VIR_UUID_BUFLEN](byte)
+	cuidPtr := unsafe.Pointer(&cUuid)
+	var err C.virError
+	result := C.virNetworkPortGetUUIDWrapper(n.ptr, (*C.uchar)(cuidPtr), &err)
+	if result != 0 {
+		return []byte{}, makeError(&err)
+	}
+	return C.GoBytes(cuidPtr, C.VIR_UUID_BUFLEN), nil
+}
+
+// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortGetUUIDString
+func (n *NetworkPort) GetUUIDString() (string, error) {
+	if C.LIBVIR_VERSION_NUMBER < 5005000 {
+		return "", makeNotImplementedError("virNetworkPortGetUUIDString")
+	}
+
+	var cUuid [C.VIR_UUID_STRING_BUFLEN](C.char)
+	cuidPtr := unsafe.Pointer(&cUuid)
+	var err C.virError
+	result := C.virNetworkPortGetUUIDStringWrapper(n.ptr, (*C.char)(cuidPtr), &err)
+	if result != 0 {
+		return "", makeError(&err)
+	}
+	return C.GoString((*C.char)(cuidPtr)), nil
+}
+
+// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortDelete
+func (n *NetworkPort) Delete(flags uint) error {
+	if C.LIBVIR_VERSION_NUMBER < 5005000 {
+		return makeNotImplementedError("virNetworkPortDelete")
+	}
+
+	var err C.virError
+	result := C.virNetworkPortDeleteWrapper(n.ptr, C.uint(flags), &err)
+	if result == -1 {
+		return makeError(&err)
+	}
+	return nil
+}
+
+// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortGetXMLDesc
+func (d *NetworkPort) GetXMLDesc(flags uint) (string, error) {
+	var err C.virError
+	result := C.virNetworkPortGetXMLDescWrapper(d.ptr, C.uint(flags), &err)
+	if result == nil {
+		return "", makeError(&err)
+	}
+	xml := C.GoString(result)
+	C.free(unsafe.Pointer(result))
+	return xml, nil
+}
+
+type NetworkPortParameters struct {
+	BandwidthInAverageSet  bool
+	BandwidthInAverage     uint
+	BandwidthInPeakSet     bool
+	BandwidthInPeak        uint
+	BandwidthInBurstSet    bool
+	BandwidthInBurst       uint
+	BandwidthInFloorSet    bool
+	BandwidthInFloor       uint
+	BandwidthOutAverageSet bool
+	BandwidthOutAverage    uint
+	BandwidthOutPeakSet    bool
+	BandwidthOutPeak       uint
+	BandwidthOutBurstSet   bool
+	BandwidthOutBurst      uint
+}
+
+func getNetworkPortParametersFieldInfo(params *NetworkPortParameters) map[string]typedParamsFieldInfo {
+	return map[string]typedParamsFieldInfo{
+		C.VIR_NETWORK_PORT_BANDWIDTH_IN_AVERAGE: typedParamsFieldInfo{
+			set: &params.BandwidthInAverageSet,
+			ui:  &params.BandwidthInAverage,
+		},
+		C.VIR_NETWORK_PORT_BANDWIDTH_IN_PEAK: typedParamsFieldInfo{
+			set: &params.BandwidthInPeakSet,
+			ui:  &params.BandwidthInPeak,
+		},
+		C.VIR_NETWORK_PORT_BANDWIDTH_IN_BURST: typedParamsFieldInfo{
+			set: &params.BandwidthInBurstSet,
+			ui:  &params.BandwidthInBurst,
+		},
+		C.VIR_NETWORK_PORT_BANDWIDTH_IN_FLOOR: typedParamsFieldInfo{
+			set: &params.BandwidthInFloorSet,
+			ui:  &params.BandwidthInFloor,
+		},
+		C.VIR_NETWORK_PORT_BANDWIDTH_OUT_AVERAGE: typedParamsFieldInfo{
+			set: &params.BandwidthOutAverageSet,
+			ui:  &params.BandwidthOutAverage,
+		},
+		C.VIR_NETWORK_PORT_BANDWIDTH_OUT_PEAK: typedParamsFieldInfo{
+			set: &params.BandwidthOutPeakSet,
+			ui:  &params.BandwidthOutPeak,
+		},
+		C.VIR_NETWORK_PORT_BANDWIDTH_OUT_BURST: typedParamsFieldInfo{
+			set: &params.BandwidthOutBurstSet,
+			ui:  &params.BandwidthOutBurst,
+		},
+	}
+}
+
+// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortGetParameters
+func (d *NetworkPort) GetParameters(flags uint) (*NetworkPortParameters, error) {
+	if C.LIBVIR_VERSION_NUMBER < 5005000 {
+		return nil, makeNotImplementedError("virNetworkPortGetParameters")
+	}
+
+	params := &NetworkPortParameters{}
+	info := getNetworkPortParametersFieldInfo(params)
+
+	var cparams C.virTypedParameterPtr
+	var cnparams C.int
+	var err C.virError
+	ret := C.virNetworkPortGetParametersWrapper(d.ptr, &cparams, &cnparams, C.uint(flags), &err)
+	if ret == -1 {
+		return nil, makeError(&err)
+	}
+
+	defer C.virTypedParamsFree(cparams, cnparams)
+
+	_, gerr := typedParamsUnpack(cparams, cnparams, info)
+	if gerr != nil {
+		return nil, gerr
+	}
+
+	return params, nil
+}
+
+// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortSetParameters
+func (d *NetworkPort) SetParameters(params *NetworkPortParameters, flags uint) error {
+	if C.LIBVIR_VERSION_NUMBER < 5005000 {
+		return makeNotImplementedError("virNetworkPortSetParameters")
+	}
+
+	info := getNetworkPortParametersFieldInfo(params)
+
+	cparams, cnparams, gerr := typedParamsPackNew(info)
+	if gerr != nil {
+		return gerr
+	}
+	defer C.virTypedParamsFree(cparams, cnparams)
+
+	var err C.virError
+	ret := C.virNetworkPortSetParametersWrapper(d.ptr, cparams, cnparams, C.uint(flags), &err)
+	if ret == -1 {
+		return makeError(&err)
+	}
+
+	return nil
+}
diff --git a/network_port_compat.h b/network_port_compat.h
new file mode 100644
index 0000000..77f541b
--- /dev/null
+++ b/network_port_compat.h
@@ -0,0 +1,67 @@
+/*
+ * This file is part of the libvirt-go project
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * Copyright (C) 2019 Red Hat, Inc.
+ *
+ */
+
+#ifndef LIBVIRT_GO_NETWORK_PORT_COMPAT_H__
+#define LIBVIRT_GO_NETWORK_PORT_COMPAT_H__
+
+/* 5.5.0 */
+
+#if LIBVIR_VERSION_NUMBER < 5005000
+typedef struct _virNetworkPort *virNetworkPortPtr;
+#endif
+
+#ifndef VIR_NETWORK_PORT_CREATE_RECLAIM
+#define VIR_NETWORK_PORT_CREATE_RECLAIM (1 << 0)
+#endif
+
+#ifndef VIR_NETWORK_PORT_BANDWIDTH_IN_AVERAGE
+#define VIR_NETWORK_PORT_BANDWIDTH_IN_AVERAGE "inbound.average"
+#endif
+
+#ifndef VIR_NETWORK_PORT_BANDWIDTH_IN_PEAK
+#define VIR_NETWORK_PORT_BANDWIDTH_IN_PEAK "inbound.peak"
+#endif
+
+#ifndef VIR_NETWORK_PORT_BANDWIDTH_IN_BURST
+#define VIR_NETWORK_PORT_BANDWIDTH_IN_BURST "inbound.burst"
+#endif
+
+#ifndef VIR_NETWORK_PORT_BANDWIDTH_IN_FLOOR
+#define VIR_NETWORK_PORT_BANDWIDTH_IN_FLOOR "inbound.floor"
+#endif
+
+#ifndef VIR_NETWORK_PORT_BANDWIDTH_OUT_AVERAGE
+#define VIR_NETWORK_PORT_BANDWIDTH_OUT_AVERAGE "outbound.average"
+#endif
+
+#ifndef VIR_NETWORK_PORT_BANDWIDTH_OUT_PEAK
+#define VIR_NETWORK_PORT_BANDWIDTH_OUT_PEAK "outbound.peak"
+#endif
+
+#ifndef VIR_NETWORK_PORT_BANDWIDTH_OUT_BURST
+#define VIR_NETWORK_PORT_BANDWIDTH_OUT_BURST "outbound.burst"
+#endif
+
+#endif /* LIBVIRT_GO_NETWORK_PORT_COMPAT_H__ */
diff --git a/network_port_wrapper.go b/network_port_wrapper.go
new file mode 100644
index 0000000..2b69167
--- /dev/null
+++ b/network_port_wrapper.go
@@ -0,0 +1,197 @@
+/*
+ * This file is part of the libvirt-go project
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * Copyright (C) 2019 Red Hat, Inc.
+ *
+ */
+
+package libvirt
+
+/*
+#cgo pkg-config: libvirt
+#include <assert.h>
+#include "network_port_wrapper.h"
+
+virNetworkPtr
+virNetworkPortGetNetworkWrapper(virNetworkPortPtr port,
+				virErrorPtr err)
+{
+#if LIBVIR_VERSION_NUMBER < 5005000
+    assert(0); // Caller should have checked version
+#else
+    virNetworkPtr ret;
+    ret = virNetworkPortGetNetwork(port);
+    if (!ret) {
+        virCopyLastError(err);
+    }
+    return ret;
+#endif
+}
+
+
+char *
+virNetworkPortGetXMLDescWrapper(virNetworkPortPtr port,
+				unsigned int flags,
+				virErrorPtr err)
+{
+#if LIBVIR_VERSION_NUMBER < 5005000
+    assert(0); // Caller should have checked version
+#else
+    char *ret;
+    ret = virNetworkPortGetXMLDesc(port, flags);
+    if (!ret) {
+        virCopyLastError(err);
+    }
+    return ret;
+#endif
+}
+
+
+int
+virNetworkPortGetUUIDWrapper(virNetworkPortPtr port,
+			     unsigned char *uuid,
+			     virErrorPtr err)
+{
+#if LIBVIR_VERSION_NUMBER < 5005000
+    assert(0); // Caller should have checked version
+#else
+    int ret;
+    ret = virNetworkPortGetUUID(port, uuid);
+    if (ret < 0) {
+        virCopyLastError(err);
+    }
+    return ret;
+#endif
+}
+
+
+int
+virNetworkPortGetUUIDStringWrapper(virNetworkPortPtr port,
+				   char *buf,
+				   virErrorPtr err)
+{
+#if LIBVIR_VERSION_NUMBER < 5005000
+    assert(0); // Caller should have checked version
+#else
+    int ret;
+    ret = virNetworkPortGetUUIDString(port, buf);
+    if (ret < 0) {
+        virCopyLastError(err);
+    }
+    return ret;
+#endif
+}
+
+
+int
+virNetworkPortSetParametersWrapper(virNetworkPortPtr port,
+				   virTypedParameterPtr params,
+				   int nparams,
+				   unsigned int flags,
+				   virErrorPtr err)
+{
+#if LIBVIR_VERSION_NUMBER < 5005000
+    assert(0); // Caller should have checked version
+#else
+    int ret;
+    ret = virNetworkPortSetParameters(port, params, nparams, flags);
+    if (ret < 0) {
+        virCopyLastError(err);
+    }
+    return ret;
+#endif
+}
+
+
+int
+virNetworkPortGetParametersWrapper(virNetworkPortPtr port,
+				   virTypedParameterPtr *params,
+				   int *nparams,
+				   unsigned int flags,
+				   virErrorPtr err)
+{
+#if LIBVIR_VERSION_NUMBER < 5005000
+    assert(0); // Caller should have checked version
+#else
+    int ret;
+    ret = virNetworkPortGetParameters(port, params, nparams, flags);
+    if (ret < 0) {
+        virCopyLastError(err);
+    }
+    return ret;
+#endif
+}
+
+
+int
+virNetworkPortDeleteWrapper(virNetworkPortPtr port,
+			    unsigned int flags,
+			    virErrorPtr err)
+{
+#if LIBVIR_VERSION_NUMBER < 5005000
+    assert(0); // Caller should have checked version
+#else
+    int ret;
+    ret = virNetworkPortDelete(port, flags);
+    if (ret < 0) {
+        virCopyLastError(err);
+    }
+    return ret;
+#endif
+}
+
+
+int
+virNetworkPortFreeWrapper(virNetworkPortPtr port,
+			  virErrorPtr err)
+{
+#if LIBVIR_VERSION_NUMBER < 5005000
+    assert(0); // Caller should have checked version
+#else
+    int ret;
+    ret = virNetworkPortFree(port);
+    if (ret < 0) {
+        virCopyLastError(err);
+    }
+    return ret;
+#endif
+}
+
+
+int
+virNetworkPortRefWrapper(virNetworkPortPtr port,
+			 virErrorPtr err)
+{
+#if LIBVIR_VERSION_NUMBER < 5005000
+    assert(0); // Caller should have checked version
+#else
+    int ret;
+    ret = virNetworkPortRef(port);
+    if (ret < 0) {
+        virCopyLastError(err);
+    }
+    return ret;
+#endif
+}
+
+
+*/
+import "C"
diff --git a/network_port_wrapper.h b/network_port_wrapper.h
new file mode 100644
index 0000000..054d459
--- /dev/null
+++ b/network_port_wrapper.h
@@ -0,0 +1,79 @@
+/*
+ * This file is part of the libvirt-go project
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * Copyright (C) 2019 Red Hat, Inc.
+ *
+ */
+
+#ifndef LIBVIRT_GO_NETWORK_PORT_WRAPPER_H__
+#define LIBVIRT_GO_NETWORK_PORT_WRAPPER_H__
+
+#include <libvirt/libvirt.h>
+#include <libvirt/virterror.h>
+#include "network_port_compat.h"
+
+
+virNetworkPtr
+virNetworkPortGetNetworkWrapper(virNetworkPortPtr port,
+				virErrorPtr err);
+
+char *
+virNetworkPortGetXMLDescWrapper(virNetworkPortPtr port,
+				unsigned int flags,
+				virErrorPtr err);
+
+int
+virNetworkPortGetUUIDWrapper(virNetworkPortPtr port,
+			     unsigned char *uuid,
+			     virErrorPtr err);
+int
+virNetworkPortGetUUIDStringWrapper(virNetworkPortPtr port,
+				   char *buf,
+				   virErrorPtr err);
+
+int
+virNetworkPortSetParametersWrapper(virNetworkPortPtr port,
+				   virTypedParameterPtr params,
+				   int nparams,
+				   unsigned int flags,
+				   virErrorPtr err);
+int
+virNetworkPortGetParametersWrapper(virNetworkPortPtr port,
+				   virTypedParameterPtr *params,
+				   int *nparams,
+				   unsigned int flags,
+				   virErrorPtr err);
+
+int
+virNetworkPortDeleteWrapper(virNetworkPortPtr port,
+			    unsigned int flags,
+			    virErrorPtr err);
+
+int
+virNetworkPortFreeWrapper(virNetworkPortPtr port,
+			  virErrorPtr err);
+
+int
+virNetworkPortRefWrapper(virNetworkPortPtr port,
+			 virErrorPtr err);
+
+
+#endif /* LIBVIRT_GO_NETWORK_PORT_WRAPPER_H__ */
diff --git a/network_wrapper.go b/network_wrapper.go
index 2fc443f..6105612 100644
--- a/network_wrapper.go
+++ b/network_wrapper.go
@@ -263,5 +263,78 @@ virNetworkUpdateWrapper(virNetworkPtr network,
 }
 
 
+virNetworkPortPtr
+virNetworkPortLookupByUUIDWrapper(virNetworkPtr net,
+				  const unsigned char *uuid,
+				  virErrorPtr err)
+{
+#if LIBVIR_VERSION_NUMBER < 5005000
+    assert(0); // Caller should have checked version
+#else
+    virNetworkPortPtr ret;
+    ret = virNetworkPortLookupByUUID(net, uuid);
+    if (!ret) {
+        virCopyLastError(err);
+    }
+    return ret;
+#endif
+}
+
+virNetworkPortPtr
+virNetworkPortLookupByUUIDStringWrapper(virNetworkPtr net,
+					const char *uuidstr,
+					virErrorPtr err)
+{
+#if LIBVIR_VERSION_NUMBER < 5005000
+    assert(0); // Caller should have checked version
+#else
+    virNetworkPortPtr ret;
+    ret = virNetworkPortLookupByUUIDString(net, uuidstr);
+    if (!ret) {
+        virCopyLastError(err);
+    }
+    return ret;
+#endif
+}
+
+
+virNetworkPortPtr
+virNetworkPortCreateXMLWrapper(virNetworkPtr net,
+			       const char *xmldesc,
+			       unsigned int flags,
+			       virErrorPtr err)
+{
+#if LIBVIR_VERSION_NUMBER < 5005000
+    assert(0); // Caller should have checked version
+#else
+    virNetworkPortPtr ret;
+    ret = virNetworkPortCreateXML(net, xmldesc, flags);
+    if (!ret) {
+        virCopyLastError(err);
+    }
+    return ret;
+#endif
+}
+
+
+int
+virNetworkListAllPortsWrapper(virNetworkPtr network,
+			      virNetworkPortPtr **ports,
+			      unsigned int flags,
+			      virErrorPtr err)
+{
+#if LIBVIR_VERSION_NUMBER < 5005000
+    assert(0); // Caller should have checked version
+#else
+    int ret;
+    ret = virNetworkListAllPorts(network, ports, flags);
+    if (ret < 0) {
+        virCopyLastError(err);
+    }
+    return ret;
+#endif
+}
+
+
 */
 import "C"
diff --git a/network_wrapper.h b/network_wrapper.h
index 405bf89..d76167b 100644
--- a/network_wrapper.h
+++ b/network_wrapper.h
@@ -30,6 +30,7 @@
 #include <libvirt/libvirt.h>
 #include <libvirt/virterror.h>
 #include "network_compat.h"
+#include "network_port_compat.h"
 
 int
 virNetworkCreateWrapper(virNetworkPtr network,
@@ -115,5 +116,27 @@ virNetworkUpdateWrapper(virNetworkPtr network,
                         unsigned int flags,
                         virErrorPtr err);
 
+virNetworkPortPtr
+virNetworkPortLookupByUUIDWrapper(virNetworkPtr net,
+				  const unsigned char *uuid,
+				  virErrorPtr err);
+
+virNetworkPortPtr
+virNetworkPortLookupByUUIDStringWrapper(virNetworkPtr net,
+					const char *uuidstr,
+					virErrorPtr err);
+
+virNetworkPortPtr
+virNetworkPortCreateXMLWrapper(virNetworkPtr net,
+			       const char *xmldesc,
+			       unsigned int flags,
+			       virErrorPtr err);
+
+int
+virNetworkListAllPortsWrapper(virNetworkPtr network,
+			      virNetworkPortPtr **ports,
+			      unsigned int flags,
+			      virErrorPtr err);
+
 
 #endif /* LIBVIRT_GO_NETWORK_WRAPPER_H__ */
-- 
2.21.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [go PATCH] Add support for virNetworkPort object and APIs
Posted by Christophe de Dinechin 4 years, 10 months ago

> On 18 Jun 2019, at 17:43, Daniel P. Berrangé <berrange@redhat.com> wrote:
> 
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
> network.go              |  80 ++++++++++++++
> network_port.go         | 233 ++++++++++++++++++++++++++++++++++++++++
> network_port_compat.h   |  67 ++++++++++++
> network_port_wrapper.go | 197 +++++++++++++++++++++++++++++++++
> network_port_wrapper.h  |  79 ++++++++++++++
> network_wrapper.go      |  73 +++++++++++++
> network_wrapper.h       |  23 ++++
> 7 files changed, 752 insertions(+)
> create mode 100644 network_port.go
> create mode 100644 network_port_compat.h
> create mode 100644 network_port_wrapper.go
> create mode 100644 network_port_wrapper.h
> 
> diff --git a/network.go b/network.go
> index 99954aa..a0bc361 100644
> --- a/network.go
> +++ b/network.go
> @@ -34,6 +34,7 @@ package libvirt
> import "C"
> 
> import (
> +	"fmt"
> 	"reflect"
> 	"time"
> 	"unsafe"
> @@ -333,3 +334,82 @@ func (n *Network) GetDHCPLeases() ([]NetworkDHCPLease, error) {
> 	C.free(unsafe.Pointer(cLeases))
> 	return leases, nil
> }
> +
> +// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortLookupByUUIDString
> +func (n *Network) LookupNetworkPortByUUIDString(uuid string) (*NetworkPort, error) {
> +	if C.LIBVIR_VERSION_NUMBER < 5005000 {
> +		return nil, makeNotImplementedError("virNetworkPortLookupByUUIDString")
> +	}
> +
> +	cUuid := C.CString(uuid)
> +	defer C.free(unsafe.Pointer(cUuid))
> +	var err C.virError
> +	ptr := C.virNetworkPortLookupByUUIDStringWrapper(n.ptr, cUuid, &err)
> +	if ptr == nil {
> +		return nil, makeError(&err)
> +	}
> +	return &NetworkPort{ptr: ptr}, nil
> +}
> +
> +// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortLookupByUUID
> +func (n *Network) LookupNetworkPortByUUID(uuid []byte) (*NetworkPort, error) {
> +	if C.LIBVIR_VERSION_NUMBER < 5005000 {
> +		return nil, makeNotImplementedError("virNetworkPortLookupByUUID")
> +	}
> +
> +	if len(uuid) != C.VIR_UUID_BUFLEN {
> +		return nil, fmt.Errorf("UUID must be exactly %d bytes in size",
> +			int(C.VIR_UUID_BUFLEN))
> +	}
> +	cUuid := make([]C.uchar, C.VIR_UUID_BUFLEN)
> +	for i := 0; i < C.VIR_UUID_BUFLEN; i++ {
> +		cUuid[i] = C.uchar(uuid[i])
> +	}
> +	var err C.virError
> +	ptr := C.virNetworkPortLookupByUUIDWrapper(n.ptr, &cUuid[0], &err)
> +	if ptr == nil {
> +		return nil, makeError(&err)
> +	}
> +	return &NetworkPort{ptr: ptr}, nil
> +}
> +
> +// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortCreateXML
> +func (n *Network) PortCreateXML(xmlConfig string, flags uint) (*NetworkPort, error) {
> +	if C.LIBVIR_VERSION_NUMBER < 5005000 {
> +		return nil, makeNotImplementedError("virNetworkPortCreateXML")
> +	}
> +	cXml := C.CString(string(xmlConfig))
> +	defer C.free(unsafe.Pointer(cXml))
> +	var err C.virError
> +	ptr := C.virNetworkPortCreateXMLWrapper(n.ptr, cXml, C.uint(flags), &err)
> +	if ptr == nil {
> +		return nil, makeError(&err)
> +	}
> +	return &NetworkPort{ptr: ptr}, nil
> +}
> +
> +// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkListAllPorts
> +func (n *Network) ListAllPorts(flags uint) ([]NetworkPort, error) {
> +	if C.LIBVIR_VERSION_NUMBER < 5005000 {
> +		return []NetworkPort{}, makeNotImplementedError("virNetworkListAllPorts")
> +	}
> +
> +	var cList *C.virNetworkPortPtr
> +	var err C.virError
> +	numPorts := C.virNetworkListAllPortsWrapper(n.ptr, (**C.virNetworkPortPtr)(&cList), C.uint(flags), &err)
> +	if numPorts == -1 {
> +		return []NetworkPort{}, makeError(&err)
> +	}
> +	hdr := reflect.SliceHeader{
> +		Data: uintptr(unsafe.Pointer(cList)),
> +		Len:  int(numPorts),
> +		Cap:  int(numPorts),
> +	}
> +	var ports []NetworkPort
> +	slice := *(*[]C.virNetworkPortPtr)(unsafe.Pointer(&hdr))
> +	for _, ptr := range slice {
> +		ports = append(ports, NetworkPort{ptr})
> +	}
> +	C.free(unsafe.Pointer(cList))
> +	return ports, nil
> +}
> diff --git a/network_port.go b/network_port.go
> new file mode 100644
> index 0000000..e701c2d
> --- /dev/null
> +++ b/network_port.go
> @@ -0,0 +1,233 @@
> +/*
> + * This file is part of the libvirt-go project
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a copy
> + * of this software and associated documentation files (the "Software"), to deal
> + * in the Software without restriction, including without limitation the rights
> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> + * copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> + * THE SOFTWARE.
> + *
> + * Copyright (C) 2019 Red Hat, Inc.
> + *
> + */
> +
> +package libvirt
> +
> +/*
> +#cgo pkg-config: libvirt
> +#include <stdlib.h>
> +#include "network_port_wrapper.h"
> +*/
> +import "C"
> +
> +import (
> +	"unsafe"
> +)
> +
> +type NetworkPortCreateFlags int
> +
> +const (
> +	NETWORK_PORT_CREATE_RECLAIM = NetworkPortCreateFlags(C.VIR_NETWORK_PORT_CREATE_RECLAIM)
> +)
> +
> +type NetworkPort struct {
> +	ptr C.virNetworkPortPtr
> +}
> +
> +// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortFree
> +func (n *NetworkPort) Free() error {
> +	if C.LIBVIR_VERSION_NUMBER < 5005000 {
> +		return makeNotImplementedError("virNetworkPortFree")
> +	}
> +
> +	var err C.virError
> +	ret := C.virNetworkPortFreeWrapper(n.ptr, &err)
> +	if ret == -1 {
> +		return makeError(&err)
> +	}
> +	return nil
> +}
> +
> +// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortRef
> +func (c *NetworkPort) Ref() error {
> +	if C.LIBVIR_VERSION_NUMBER < 5005000 {
> +		return makeNotImplementedError("virNetworkPortRef")
> +	}
> +
> +	var err C.virError
> +	ret := C.virNetworkPortRefWrapper(c.ptr, &err)
> +	if ret == -1 {
> +		return makeError(&err)
> +	}
> +	return nil
> +}
> +
> +// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortGetUUID
> +func (n *NetworkPort) GetUUID() ([]byte, error) {
> +	if C.LIBVIR_VERSION_NUMBER < 5005000 {
> +		return []byte{}, makeNotImplementedError("virNetworkPortGetUUID")
> +	}
> +
> +	var cUuid [C.VIR_UUID_BUFLEN](byte)
> +	cuidPtr := unsafe.Pointer(&cUuid)
> +	var err C.virError
> +	result := C.virNetworkPortGetUUIDWrapper(n.ptr, (*C.uchar)(cuidPtr), &err)
> +	if result != 0 {
> +		return []byte{}, makeError(&err)
> +	}
> +	return C.GoBytes(cuidPtr, C.VIR_UUID_BUFLEN), nil
> +}
> +
> +// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortGetUUIDString
> +func (n *NetworkPort) GetUUIDString() (string, error) {
> +	if C.LIBVIR_VERSION_NUMBER < 5005000 {
> +		return "", makeNotImplementedError("virNetworkPortGetUUIDString")
> +	}
> +
> +	var cUuid [C.VIR_UUID_STRING_BUFLEN](C.char)
> +	cuidPtr := unsafe.Pointer(&cUuid)
> +	var err C.virError
> +	result := C.virNetworkPortGetUUIDStringWrapper(n.ptr, (*C.char)(cuidPtr), &err)
> +	if result != 0 {
> +		return "", makeError(&err)
> +	}
> +	return C.GoString((*C.char)(cuidPtr)), nil
> +}
> +
> +// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortDelete
> +func (n *NetworkPort) Delete(flags uint) error {
> +	if C.LIBVIR_VERSION_NUMBER < 5005000 {
> +		return makeNotImplementedError("virNetworkPortDelete")
> +	}
> +
> +	var err C.virError
> +	result := C.virNetworkPortDeleteWrapper(n.ptr, C.uint(flags), &err)
> +	if result == -1 {
> +		return makeError(&err)
> +	}
> +	return nil
> +}
> +
> +// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortGetXMLDesc
> +func (d *NetworkPort) GetXMLDesc(flags uint) (string, error) {
> +	var err C.virError
> +	result := C.virNetworkPortGetXMLDescWrapper(d.ptr, C.uint(flags), &err)
> +	if result == nil {
> +		return "", makeError(&err)
> +	}
> +	xml := C.GoString(result)
> +	C.free(unsafe.Pointer(result))
> +	return xml, nil
> +}
> +
> +type NetworkPortParameters struct {
> +	BandwidthInAverageSet  bool
> +	BandwidthInAverage     uint
> +	BandwidthInPeakSet     bool
> +	BandwidthInPeak        uint
> +	BandwidthInBurstSet    bool
> +	BandwidthInBurst       uint
> +	BandwidthInFloorSet    bool
> +	BandwidthInFloor       uint
> +	BandwidthOutAverageSet bool
> +	BandwidthOutAverage    uint
> +	BandwidthOutPeakSet    bool
> +	BandwidthOutPeak       uint
> +	BandwidthOutBurstSet   bool
> +	BandwidthOutBurst      uint
> +}
> +
> +func getNetworkPortParametersFieldInfo(params *NetworkPortParameters) map[string]typedParamsFieldInfo {
> +	return map[string]typedParamsFieldInfo{
> +		C.VIR_NETWORK_PORT_BANDWIDTH_IN_AVERAGE: typedParamsFieldInfo{
> +			set: &params.BandwidthInAverageSet,
> +			ui:  &params.BandwidthInAverage,
> +		},
> +		C.VIR_NETWORK_PORT_BANDWIDTH_IN_PEAK: typedParamsFieldInfo{
> +			set: &params.BandwidthInPeakSet,
> +			ui:  &params.BandwidthInPeak,
> +		},
> +		C.VIR_NETWORK_PORT_BANDWIDTH_IN_BURST: typedParamsFieldInfo{
> +			set: &params.BandwidthInBurstSet,
> +			ui:  &params.BandwidthInBurst,
> +		},
> +		C.VIR_NETWORK_PORT_BANDWIDTH_IN_FLOOR: typedParamsFieldInfo{
> +			set: &params.BandwidthInFloorSet,
> +			ui:  &params.BandwidthInFloor,
> +		},
> +		C.VIR_NETWORK_PORT_BANDWIDTH_OUT_AVERAGE: typedParamsFieldInfo{
> +			set: &params.BandwidthOutAverageSet,
> +			ui:  &params.BandwidthOutAverage,
> +		},
> +		C.VIR_NETWORK_PORT_BANDWIDTH_OUT_PEAK: typedParamsFieldInfo{
> +			set: &params.BandwidthOutPeakSet,
> +			ui:  &params.BandwidthOutPeak,
> +		},
> +		C.VIR_NETWORK_PORT_BANDWIDTH_OUT_BURST: typedParamsFieldInfo{
> +			set: &params.BandwidthOutBurstSet,
> +			ui:  &params.BandwidthOutBurst,
> +		},
> +	}
> +}
> +
> +// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortGetParameters
> +func (d *NetworkPort) GetParameters(flags uint) (*NetworkPortParameters, error) {
> +	if C.LIBVIR_VERSION_NUMBER < 5005000 {
> +		return nil, makeNotImplementedError("virNetworkPortGetParameters")
> +	}
> +
> +	params := &NetworkPortParameters{}
> +	info := getNetworkPortParametersFieldInfo(params)
> +
> +	var cparams C.virTypedParameterPtr
> +	var cnparams C.int
> +	var err C.virError
> +	ret := C.virNetworkPortGetParametersWrapper(d.ptr, &cparams, &cnparams, C.uint(flags), &err)
> +	if ret == -1 {
> +		return nil, makeError(&err)
> +	}
> +
> +	defer C.virTypedParamsFree(cparams, cnparams)
> +
> +	_, gerr := typedParamsUnpack(cparams, cnparams, info)
> +	if gerr != nil {
> +		return nil, gerr
> +	}
> +
> +	return params, nil
> +}
> +
> +// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortSetParameters
> +func (d *NetworkPort) SetParameters(params *NetworkPortParameters, flags uint) error {
> +	if C.LIBVIR_VERSION_NUMBER < 5005000 {
> +		return makeNotImplementedError("virNetworkPortSetParameters")
> +	}
> +
> +	info := getNetworkPortParametersFieldInfo(params)
> +
> +	cparams, cnparams, gerr := typedParamsPackNew(info)
> +	if gerr != nil {
> +		return gerr
> +	}
> +	defer C.virTypedParamsFree(cparams, cnparams)
> +
> +	var err C.virError
> +	ret := C.virNetworkPortSetParametersWrapper(d.ptr, cparams, cnparams, C.uint(flags), &err)
> +	if ret == -1 {
> +		return makeError(&err)
> +	}
> +
> +	return nil
> +}
> diff --git a/network_port_compat.h b/network_port_compat.h
> new file mode 100644
> index 0000000..77f541b
> --- /dev/null
> +++ b/network_port_compat.h
> @@ -0,0 +1,67 @@
> +/*
> + * This file is part of the libvirt-go project
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a copy
> + * of this software and associated documentation files (the "Software"), to deal
> + * in the Software without restriction, including without limitation the rights
> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> + * copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> + * THE SOFTWARE.
> + *
> + * Copyright (C) 2019 Red Hat, Inc.
> + *
> + */
> +
> +#ifndef LIBVIRT_GO_NETWORK_PORT_COMPAT_H__
> +#define LIBVIRT_GO_NETWORK_PORT_COMPAT_H__
> +
> +/* 5.5.0 */
> +
> +#if LIBVIR_VERSION_NUMBER < 5005000
> +typedef struct _virNetworkPort *virNetworkPortPtr;
> +#endif
> +
> +#ifndef VIR_NETWORK_PORT_CREATE_RECLAIM
> +#define VIR_NETWORK_PORT_CREATE_RECLAIM (1 << 0)
> +#endif
> +
> +#ifndef VIR_NETWORK_PORT_BANDWIDTH_IN_AVERAGE
> +#define VIR_NETWORK_PORT_BANDWIDTH_IN_AVERAGE "inbound.average"
> +#endif
> +
> +#ifndef VIR_NETWORK_PORT_BANDWIDTH_IN_PEAK
> +#define VIR_NETWORK_PORT_BANDWIDTH_IN_PEAK "inbound.peak"
> +#endif
> +
> +#ifndef VIR_NETWORK_PORT_BANDWIDTH_IN_BURST
> +#define VIR_NETWORK_PORT_BANDWIDTH_IN_BURST "inbound.burst"
> +#endif
> +
> +#ifndef VIR_NETWORK_PORT_BANDWIDTH_IN_FLOOR
> +#define VIR_NETWORK_PORT_BANDWIDTH_IN_FLOOR "inbound.floor"
> +#endif
> +
> +#ifndef VIR_NETWORK_PORT_BANDWIDTH_OUT_AVERAGE
> +#define VIR_NETWORK_PORT_BANDWIDTH_OUT_AVERAGE "outbound.average"
> +#endif
> +
> +#ifndef VIR_NETWORK_PORT_BANDWIDTH_OUT_PEAK
> +#define VIR_NETWORK_PORT_BANDWIDTH_OUT_PEAK "outbound.peak"
> +#endif
> +
> +#ifndef VIR_NETWORK_PORT_BANDWIDTH_OUT_BURST
> +#define VIR_NETWORK_PORT_BANDWIDTH_OUT_BURST "outbound.burst"
> +#endif
> +
> +#endif /* LIBVIRT_GO_NETWORK_PORT_COMPAT_H__ */
> diff --git a/network_port_wrapper.go b/network_port_wrapper.go
> new file mode 100644
> index 0000000..2b69167
> --- /dev/null
> +++ b/network_port_wrapper.go
> @@ -0,0 +1,197 @@
> +/*
> + * This file is part of the libvirt-go project
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a copy
> + * of this software and associated documentation files (the "Software"), to deal
> + * in the Software without restriction, including without limitation the rights
> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> + * copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> + * THE SOFTWARE.
> + *
> + * Copyright (C) 2019 Red Hat, Inc.
> + *
> + */
> +
> +package libvirt
> +
> +/*
> +#cgo pkg-config: libvirt
> +#include <assert.h>
> +#include "network_port_wrapper.h"
> +
> +virNetworkPtr
> +virNetworkPortGetNetworkWrapper(virNetworkPortPtr port,
> +				virErrorPtr err)
> +{
> +#if LIBVIR_VERSION_NUMBER < 5005000
> +    assert(0); // Caller should have checked version

What about

assert(!”C function not available in this version - Caller should have checked version”);

?

> +#else
> +    virNetworkPtr ret;
> +    ret = virNetworkPortGetNetwork(port);
> +    if (!ret) {
> +        virCopyLastError(err);
> +    }
> +    return ret;
> +#endif
> +}
> +
> +
> +char *
> +virNetworkPortGetXMLDescWrapper(virNetworkPortPtr port,
> +				unsigned int flags,
> +				virErrorPtr err)
> +{
> +#if LIBVIR_VERSION_NUMBER < 5005000
> +    assert(0); // Caller should have checked version
> +#else
> +    char *ret;
> +    ret = virNetworkPortGetXMLDesc(port, flags);
> +    if (!ret) {
> +        virCopyLastError(err);
> +    }
> +    return ret;
> +#endif
> +}
> +
> +
> +int
> +virNetworkPortGetUUIDWrapper(virNetworkPortPtr port,
> +			     unsigned char *uuid,
> +			     virErrorPtr err)
> +{
> +#if LIBVIR_VERSION_NUMBER < 5005000
> +    assert(0); // Caller should have checked version
> +#else
> +    int ret;
> +    ret = virNetworkPortGetUUID(port, uuid);
> +    if (ret < 0) {
> +        virCopyLastError(err);
> +    }
> +    return ret;
> +#endif
> +}
> +
> +
> +int
> +virNetworkPortGetUUIDStringWrapper(virNetworkPortPtr port,
> +				   char *buf,
> +				   virErrorPtr err)
> +{
> +#if LIBVIR_VERSION_NUMBER < 5005000
> +    assert(0); // Caller should have checked version
> +#else
> +    int ret;
> +    ret = virNetworkPortGetUUIDString(port, buf);
> +    if (ret < 0) {
> +        virCopyLastError(err);
> +    }
> +    return ret;
> +#endif
> +}
> +
> +
> +int
> +virNetworkPortSetParametersWrapper(virNetworkPortPtr port,
> +				   virTypedParameterPtr params,
> +				   int nparams,
> +				   unsigned int flags,
> +				   virErrorPtr err)
> +{
> +#if LIBVIR_VERSION_NUMBER < 5005000
> +    assert(0); // Caller should have checked version
> +#else
> +    int ret;
> +    ret = virNetworkPortSetParameters(port, params, nparams, flags);
> +    if (ret < 0) {
> +        virCopyLastError(err);
> +    }
> +    return ret;
> +#endif
> +}
> +
> +
> +int
> +virNetworkPortGetParametersWrapper(virNetworkPortPtr port,
> +				   virTypedParameterPtr *params,
> +				   int *nparams,
> +				   unsigned int flags,
> +				   virErrorPtr err)
> +{
> +#if LIBVIR_VERSION_NUMBER < 5005000
> +    assert(0); // Caller should have checked version
> +#else
> +    int ret;
> +    ret = virNetworkPortGetParameters(port, params, nparams, flags);
> +    if (ret < 0) {
> +        virCopyLastError(err);
> +    }
> +    return ret;
> +#endif
> +}
> +
> +
> +int
> +virNetworkPortDeleteWrapper(virNetworkPortPtr port,
> +			    unsigned int flags,
> +			    virErrorPtr err)
> +{
> +#if LIBVIR_VERSION_NUMBER < 5005000
> +    assert(0); // Caller should have checked version
> +#else
> +    int ret;
> +    ret = virNetworkPortDelete(port, flags);
> +    if (ret < 0) {
> +        virCopyLastError(err);
> +    }
> +    return ret;
> +#endif
> +}
> +
> +
> +int
> +virNetworkPortFreeWrapper(virNetworkPortPtr port,
> +			  virErrorPtr err)
> +{
> +#if LIBVIR_VERSION_NUMBER < 5005000
> +    assert(0); // Caller should have checked version
> +#else
> +    int ret;
> +    ret = virNetworkPortFree(port);
> +    if (ret < 0) {
> +        virCopyLastError(err);
> +    }
> +    return ret;
> +#endif
> +}
> +
> +
> +int
> +virNetworkPortRefWrapper(virNetworkPortPtr port,
> +			 virErrorPtr err)
> +{
> +#if LIBVIR_VERSION_NUMBER < 5005000
> +    assert(0); // Caller should have checked version
> +#else
> +    int ret;
> +    ret = virNetworkPortRef(port);
> +    if (ret < 0) {
> +        virCopyLastError(err);
> +    }
> +    return ret;
> +#endif
> +}
> +
> +
> +*/
> +import "C"
> diff --git a/network_port_wrapper.h b/network_port_wrapper.h
> new file mode 100644
> index 0000000..054d459
> --- /dev/null
> +++ b/network_port_wrapper.h
> @@ -0,0 +1,79 @@
> +/*
> + * This file is part of the libvirt-go project
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a copy
> + * of this software and associated documentation files (the "Software"), to deal
> + * in the Software without restriction, including without limitation the rights
> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> + * copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> + * THE SOFTWARE.
> + *
> + * Copyright (C) 2019 Red Hat, Inc.
> + *
> + */
> +
> +#ifndef LIBVIRT_GO_NETWORK_PORT_WRAPPER_H__
> +#define LIBVIRT_GO_NETWORK_PORT_WRAPPER_H__
> +
> +#include <libvirt/libvirt.h>
> +#include <libvirt/virterror.h>
> +#include "network_port_compat.h"
> +
> +
> +virNetworkPtr
> +virNetworkPortGetNetworkWrapper(virNetworkPortPtr port,
> +				virErrorPtr err);
> +
> +char *
> +virNetworkPortGetXMLDescWrapper(virNetworkPortPtr port,
> +				unsigned int flags,
> +				virErrorPtr err);
> +
> +int
> +virNetworkPortGetUUIDWrapper(virNetworkPortPtr port,
> +			     unsigned char *uuid,
> +			     virErrorPtr err);
> +int
> +virNetworkPortGetUUIDStringWrapper(virNetworkPortPtr port,
> +				   char *buf,
> +				   virErrorPtr err);
> +
> +int
> +virNetworkPortSetParametersWrapper(virNetworkPortPtr port,
> +				   virTypedParameterPtr params,
> +				   int nparams,
> +				   unsigned int flags,
> +				   virErrorPtr err);
> +int
> +virNetworkPortGetParametersWrapper(virNetworkPortPtr port,
> +				   virTypedParameterPtr *params,
> +				   int *nparams,
> +				   unsigned int flags,
> +				   virErrorPtr err);
> +
> +int
> +virNetworkPortDeleteWrapper(virNetworkPortPtr port,
> +			    unsigned int flags,
> +			    virErrorPtr err);
> +
> +int
> +virNetworkPortFreeWrapper(virNetworkPortPtr port,
> +			  virErrorPtr err);
> +
> +int
> +virNetworkPortRefWrapper(virNetworkPortPtr port,
> +			 virErrorPtr err);
> +
> +
> +#endif /* LIBVIRT_GO_NETWORK_PORT_WRAPPER_H__ */
> diff --git a/network_wrapper.go b/network_wrapper.go
> index 2fc443f..6105612 100644
> --- a/network_wrapper.go
> +++ b/network_wrapper.go
> @@ -263,5 +263,78 @@ virNetworkUpdateWrapper(virNetworkPtr network,
> }
> 
> 
> +virNetworkPortPtr
> +virNetworkPortLookupByUUIDWrapper(virNetworkPtr net,
> +				  const unsigned char *uuid,
> +				  virErrorPtr err)
> +{
> +#if LIBVIR_VERSION_NUMBER < 5005000
> +    assert(0); // Caller should have checked version
> +#else
> +    virNetworkPortPtr ret;
> +    ret = virNetworkPortLookupByUUID(net, uuid);
> +    if (!ret) {
> +        virCopyLastError(err);
> +    }
> +    return ret;
> +#endif
> +}
> +
> +virNetworkPortPtr
> +virNetworkPortLookupByUUIDStringWrapper(virNetworkPtr net,
> +					const char *uuidstr,
> +					virErrorPtr err)
> +{
> +#if LIBVIR_VERSION_NUMBER < 5005000
> +    assert(0); // Caller should have checked version
> +#else
> +    virNetworkPortPtr ret;
> +    ret = virNetworkPortLookupByUUIDString(net, uuidstr);
> +    if (!ret) {
> +        virCopyLastError(err);
> +    }
> +    return ret;
> +#endif
> +}
> +
> +
> +virNetworkPortPtr
> +virNetworkPortCreateXMLWrapper(virNetworkPtr net,
> +			       const char *xmldesc,
> +			       unsigned int flags,
> +			       virErrorPtr err)
> +{
> +#if LIBVIR_VERSION_NUMBER < 5005000
> +    assert(0); // Caller should have checked version
> +#else
> +    virNetworkPortPtr ret;
> +    ret = virNetworkPortCreateXML(net, xmldesc, flags);
> +    if (!ret) {
> +        virCopyLastError(err);
> +    }
> +    return ret;
> +#endif
> +}
> +
> +
> +int
> +virNetworkListAllPortsWrapper(virNetworkPtr network,
> +			      virNetworkPortPtr **ports,
> +			      unsigned int flags,
> +			      virErrorPtr err)
> +{
> +#if LIBVIR_VERSION_NUMBER < 5005000
> +    assert(0); // Caller should have checked version
> +#else
> +    int ret;
> +    ret = virNetworkListAllPorts(network, ports, flags);
> +    if (ret < 0) {
> +        virCopyLastError(err);
> +    }
> +    return ret;
> +#endif
> +}
> +
> +
> */
> import "C"
> diff --git a/network_wrapper.h b/network_wrapper.h
> index 405bf89..d76167b 100644
> --- a/network_wrapper.h
> +++ b/network_wrapper.h
> @@ -30,6 +30,7 @@
> #include <libvirt/libvirt.h>
> #include <libvirt/virterror.h>
> #include "network_compat.h"
> +#include "network_port_compat.h"
> 
> int
> virNetworkCreateWrapper(virNetworkPtr network,
> @@ -115,5 +116,27 @@ virNetworkUpdateWrapper(virNetworkPtr network,
>                         unsigned int flags,
>                         virErrorPtr err);
> 
> +virNetworkPortPtr
> +virNetworkPortLookupByUUIDWrapper(virNetworkPtr net,
> +				  const unsigned char *uuid,
> +				  virErrorPtr err);
> +
> +virNetworkPortPtr
> +virNetworkPortLookupByUUIDStringWrapper(virNetworkPtr net,
> +					const char *uuidstr,
> +					virErrorPtr err);
> +
> +virNetworkPortPtr
> +virNetworkPortCreateXMLWrapper(virNetworkPtr net,
> +			       const char *xmldesc,
> +			       unsigned int flags,
> +			       virErrorPtr err);
> +
> +int
> +virNetworkListAllPortsWrapper(virNetworkPtr network,
> +			      virNetworkPortPtr **ports,
> +			      unsigned int flags,
> +			      virErrorPtr err);
> +
> 
> #endif /* LIBVIRT_GO_NETWORK_WRAPPER_H__ */
> -- 
> 2.21.0
> 
> --
> libvir-list mailing list
> libvir-list@redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [go PATCH] Add support for virNetworkPort object and APIs
Posted by Daniel P. Berrangé 4 years, 10 months ago
On Tue, Jun 18, 2019 at 06:33:01PM +0200, Christophe de Dinechin wrote:
> 
> 
> > On 18 Jun 2019, at 17:43, Daniel P. Berrangé <berrange@redhat.com> wrote:
> > 
> > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> > ---
> > network.go              |  80 ++++++++++++++
> > network_port.go         | 233 ++++++++++++++++++++++++++++++++++++++++
> > network_port_compat.h   |  67 ++++++++++++
> > network_port_wrapper.go | 197 +++++++++++++++++++++++++++++++++
> > network_port_wrapper.h  |  79 ++++++++++++++
> > network_wrapper.go      |  73 +++++++++++++
> > network_wrapper.h       |  23 ++++
> > 7 files changed, 752 insertions(+)
> > create mode 100644 network_port.go
> > create mode 100644 network_port_compat.h
> > create mode 100644 network_port_wrapper.go
> > create mode 100644 network_port_wrapper.h

> > +package libvirt
> > +
> > +/*
> > +#cgo pkg-config: libvirt
> > +#include <assert.h>
> > +#include "network_port_wrapper.h"
> > +
> > +virNetworkPtr
> > +virNetworkPortGetNetworkWrapper(virNetworkPortPtr port,
> > +				virErrorPtr err)
> > +{
> > +#if LIBVIR_VERSION_NUMBER < 5005000
> > +    assert(0); // Caller should have checked version
> 
> What about
> 
> assert(!”C function not available in this version - Caller should have checked version”);
> 
> ?

That's certainly possible, but I'm not sure its worth bothering with
since this should never be hit in practice & if it is hit we'll  see
the offending code in the crash dump easily enough.


Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [go PATCH] Add support for virNetworkPort object and APIs
Posted by Christophe de Dinechin 4 years, 10 months ago

> On 18 Jun 2019, at 19:01, Daniel P. Berrangé <berrange@redhat.com> wrote:
> 
> On Tue, Jun 18, 2019 at 06:33:01PM +0200, Christophe de Dinechin wrote:
>> 
>> 
>>> On 18 Jun 2019, at 17:43, Daniel P. Berrangé <berrange@redhat.com> wrote:
>>> 
>>> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
>>> ---
>>> network.go              |  80 ++++++++++++++
>>> network_port.go         | 233 ++++++++++++++++++++++++++++++++++++++++
>>> network_port_compat.h   |  67 ++++++++++++
>>> network_port_wrapper.go | 197 +++++++++++++++++++++++++++++++++
>>> network_port_wrapper.h  |  79 ++++++++++++++
>>> network_wrapper.go      |  73 +++++++++++++
>>> network_wrapper.h       |  23 ++++
>>> 7 files changed, 752 insertions(+)
>>> create mode 100644 network_port.go
>>> create mode 100644 network_port_compat.h
>>> create mode 100644 network_port_wrapper.go
>>> create mode 100644 network_port_wrapper.h
> 
>>> +package libvirt
>>> +
>>> +/*
>>> +#cgo pkg-config: libvirt
>>> +#include <assert.h>
>>> +#include "network_port_wrapper.h"
>>> +
>>> +virNetworkPtr
>>> +virNetworkPortGetNetworkWrapper(virNetworkPortPtr port,
>>> +				virErrorPtr err)
>>> +{
>>> +#if LIBVIR_VERSION_NUMBER < 5005000
>>> +    assert(0); // Caller should have checked version
>> 
>> What about
>> 
>> assert(!”C function not available in this version - Caller should have checked version”);
>> 
>> ?
> 
> That's certainly possible, but I'm not sure its worth bothering with
> since this should never be hit in practice & if it is hit we'll  see
> the offending code in the crash dump easily enough.

By construction, this case happens for a non-libvirt developer.
The stack trace is useless, nothing in the names there explains
that it’s a version mismatch. So the non-libvirt Go developer will need
to install C source code just to be able to read a comment that could
have been shown in the crash? To me, it looks like like the bother
is much higher on their side than on yours.

Also, given that the sole purpose of these wrappers is to fail if
the underlying C function does not exist, would it make sense to
just not emit the wrapper in that case? That would lead to a link-time
failure that might be even more friendly, insofar as it catches things earlier.


Cheers,
Christophe
> 
> 
> Regards,
> Daniel
> -- 
> |: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
> |: https://libvirt.org         -o-            https://fstop138.berrange.com :|
> |: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [go PATCH] Add support for virNetworkPort object and APIs
Posted by Daniel P. Berrangé 4 years, 10 months ago
On Wed, Jun 19, 2019 at 10:50:14AM +0200, Christophe de Dinechin wrote:
> 
> 
> > On 18 Jun 2019, at 19:01, Daniel P. Berrangé <berrange@redhat.com> wrote:
> > 
> > On Tue, Jun 18, 2019 at 06:33:01PM +0200, Christophe de Dinechin wrote:
> >> 
> >> 
> >>> On 18 Jun 2019, at 17:43, Daniel P. Berrangé <berrange@redhat.com> wrote:
> >>> 
> >>> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> >>> ---
> >>> network.go              |  80 ++++++++++++++
> >>> network_port.go         | 233 ++++++++++++++++++++++++++++++++++++++++
> >>> network_port_compat.h   |  67 ++++++++++++
> >>> network_port_wrapper.go | 197 +++++++++++++++++++++++++++++++++
> >>> network_port_wrapper.h  |  79 ++++++++++++++
> >>> network_wrapper.go      |  73 +++++++++++++
> >>> network_wrapper.h       |  23 ++++
> >>> 7 files changed, 752 insertions(+)
> >>> create mode 100644 network_port.go
> >>> create mode 100644 network_port_compat.h
> >>> create mode 100644 network_port_wrapper.go
> >>> create mode 100644 network_port_wrapper.h
> > 
> >>> +package libvirt
> >>> +
> >>> +/*
> >>> +#cgo pkg-config: libvirt
> >>> +#include <assert.h>
> >>> +#include "network_port_wrapper.h"
> >>> +
> >>> +virNetworkPtr
> >>> +virNetworkPortGetNetworkWrapper(virNetworkPortPtr port,
> >>> +				virErrorPtr err)
> >>> +{
> >>> +#if LIBVIR_VERSION_NUMBER < 5005000
> >>> +    assert(0); // Caller should have checked version
> >> 
> >> What about
> >> 
> >> assert(!”C function not available in this version - Caller should have checked version”);
> >> 
> >> ?
> > 
> > That's certainly possible, but I'm not sure its worth bothering with
> > since this should never be hit in practice & if it is hit we'll  see
> > the offending code in the crash dump easily enough.
> 
> By construction, this case happens for a non-libvirt developer.
> The stack trace is useless, nothing in the names there explains
> that it’s a version mismatch. So the non-libvirt Go developer will need
> to install C source code just to be able to read a comment that could
> have been shown in the crash? To me, it looks like like the bother
> is much higher on their side than on yours.
> 
> Also, given that the sole purpose of these wrappers is to fail if
> the underlying C function does not exist, would it make sense to
> just not emit the wrapper in that case? That would lead to a link-time
> failure that might be even more friendly, insofar as it catches things earlier.

I'm not sure how familiar you are with Go, so I'll explain the reason why
it is done this way...

example:

  func (n *NetworkPort) Delete(flags uint) error {

        return nil
  }

These functions will always exist from the view of a developers calling
code, as there is no practical way to have conditionally defined Go code
on a per-function basis. The only conditional builds are per-file level
in Go and even that's practically unusable.

So the first thing our Go code does is check the libvirt native library
version number and report an error

eg

  func (n *NetworkPort) Delete(flags uint) error {
        if C.LIBVIR_VERSION_NUMBER < 5005000 {
                return makeNotImplementedError("virNetworkPortDelete")
        }

Then, the Go code will call into the C wrapper function we define...

        var err C.virError
        result := C.virNetworkPortDeleteWrapper(n.ptr, C.uint(flags), &err)
        if result == -1 {
                return makeError(&err)
        }

Since there's no conditional compilation at the Go level the call to
virNetworkPortDeleteWrapper will always be compiled,.

Thus the C wrapper function must always exist despite the fact that it
will not be called when using old libvirt. Hence we have

int
virNetworkPortDeleteWrapper(virNetworkPortPtr port,
                            unsigned int flags,
                            virErrorPtr err)
{
#if LIBVIR_VERSION_NUMBER < 5005000
    assert(0); // Caller should have checked version
#else
    int ret;
    ret = virNetworkPortDelete(port, flags);
    if (ret < 0) {
        virCopyLastError(err);
    }
    return ret;
#endif
}

The assert is dead code - it will never run - we just have it there as
a sanity check. Any usage by application developers will get stopped
at the Go level and turned into a friendly error message.

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [go PATCH] Add support for virNetworkPort object and APIs
Posted by Christophe de Dinechin 4 years, 10 months ago

> On 19 Jun 2019, at 11:14, Daniel P. Berrangé <berrange@redhat.com> wrote:
> 
> On Wed, Jun 19, 2019 at 10:50:14AM +0200, Christophe de Dinechin wrote:
> 
> So the first thing our Go code does is check the libvirt native library
> version number and report an error
> 
> eg
> 
>  func (n *NetworkPort) Delete(flags uint) error {
>        if C.LIBVIR_VERSION_NUMBER < 5005000 {
>                return makeNotImplementedError("virNetworkPortDelete")
>        }

Duh, of course, that’s supposed to be the only consumer!

I somehow imagined that the wrappers themselves were exposed,
i.e. some Go programmer could have some weird reason to write

	C.virtFunc(blah)

I don’t think you can prevent it, but I agree that with proper Go wrappers, there
is no reason this would ever happen…

FWIW, the code looks sane to me, but I don’t consider myself enough of an
expert in this area to report a Reviewed-by.


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [go PATCH] Add support for virNetworkPort object and APIs
Posted by Daniel P. Berrangé 4 years, 10 months ago
On Tue, Jun 18, 2019 at 04:43:35PM +0100, Daniel P. Berrangé wrote:
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
>  network.go              |  80 ++++++++++++++
>  network_port.go         | 233 ++++++++++++++++++++++++++++++++++++++++
>  network_port_compat.h   |  67 ++++++++++++
>  network_port_wrapper.go | 197 +++++++++++++++++++++++++++++++++
>  network_port_wrapper.h  |  79 ++++++++++++++
>  network_wrapper.go      |  73 +++++++++++++
>  network_wrapper.h       |  23 ++++
>  7 files changed, 752 insertions(+)
>  create mode 100644 network_port.go
>  create mode 100644 network_port_compat.h
>  create mode 100644 network_port_wrapper.go
>  create mode 100644 network_port_wrapper.h


> diff --git a/network_port.go b/network_port.go
> new file mode 100644
> index 0000000..e701c2d
> --- /dev/null
> +++ b/network_port.go


> +func (n *NetworkPort) Delete(flags uint) error {
> +	if C.LIBVIR_VERSION_NUMBER < 5005000 {
> +		return makeNotImplementedError("virNetworkPortDelete")
> +	}
> +
> +	var err C.virError
> +	result := C.virNetworkPortDeleteWrapper(n.ptr, C.uint(flags), &err)
> +	if result == -1 {
> +		return makeError(&err)
> +	}
> +	return nil
> +}
> +
> +// See also https://libvirt.org/html/libvirt-libvirt-network.html#virNetworkPortGetXMLDesc
> +func (d *NetworkPort) GetXMLDesc(flags uint) (string, error) {

This method mmissed the version check. I've fixed locally the same way
as seen in other methods.

> +	var err C.virError
> +	result := C.virNetworkPortGetXMLDescWrapper(d.ptr, C.uint(flags), &err)
> +	if result == nil {
> +		return "", makeError(&err)
> +	}
> +	xml := C.GoString(result)
> +	C.free(unsafe.Pointer(result))
> +	return xml, nil
> +}

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list