On Mon, Oct 29, 2007 at 03:57:01AM +0000, Daniel P. Berrange wrote:
This patch adds a public header file defining the application facing
contract
for the storage APIs.
+/* -*- c -*-
+ * storage.h:
+ * Summary: storage management interfaces
+ * Description: Provides the interfaces of the libvirt library to handle
+ * storage management from a process running in the host
+ *
+ * Copy: Copyright (C) 2005-2007 Red Hat, Inc.
+ *
+ * See COPYING.LIB for the License of this software
+ *
+ * Author: Daniel Veillard <veillard(a)redhat.com>
Need to fix the author I guess :-)
+ */
+
+
+
+#ifndef __VIR_VIRLIB_H__
+#error "Do not include storage.h directly. Use libvirt.h instead"
+#endif
That would be one reason against the split, if you can't reference files
individually I don't think we can export them as an API...
+#ifndef __VIR_VIRLIB_STORAGE_H__
+#define __VIR_VIRLIB_STORAGE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * virStoragePool:
+ *
+ * a virStoragePool is a private structure representing a storage pool
+ */
+typedef struct _virStoragePool virStoragePool;
+
+/**
+ * virStoragePoolPtr:
+ *
+ * a virStoragePoolPtr is pointer to a virStoragePool private structure, this is the
+ * type used to reference a storage pool in the API.
+ */
+typedef virStoragePool *virStoragePoolPtr;
+
+
+typedef enum {
+ VIR_STORAGE_POOL_INACTIVE = 0,
+ VIR_STORAGE_POOL_ACTIVE = 1,
+} virStoragePoolState;
+
+typedef struct _virStoragePoolInfo virStoragePoolInfo;
+
+struct _virStoragePoolInfo {
+ int state; /* virStoragePoolState flags */
+ unsigned long long capacity; /* Logical size bytes */
+ unsigned long long allocation; /* Current allocation bytes */
+};
There is no name available ? Once you got a pointer to that structure,
how do you expose its capability to the user ?
+typedef virStoragePoolInfo *virStoragePoolInfoPtr;
+
+
+/**
+ * virStorageVol:
+ *
+ * a virStorageVol is a private structure representing a storage volume
+ */
+typedef struct _virStorageVol virStorageVol;
+
+/**
+ * virStorageVolPtr:
+ *
+ * a virStorageVolPtr is pointer to a virStorageVol private structure, this is the
+ * type used to reference a storage volume in the API.
+ */
+typedef virStorageVol *virStorageVolPtr;
+
+
+typedef enum {
+ VIR_STORAGE_POOL_FILE = 0,
+ VIR_STORAGE_POOL_BLOCK = 1,
+} virStoragePoolType;
+
+typedef struct _virStorageVolInfo virStorageVolInfo;
+
+struct _virStorageVolInfo {
+ int type; /* virStoragePoolType flags */
+ unsigned long long capacity; /* Logical size bytes */
+ unsigned long long allocation; /* Current allocation bytes */
+};
Same thing, I feel it lacks some external naming in the structure,
+typedef virStorageVolInfo *virStorageVolInfoPtr;
+
+/*
+ * Get connection from pool.
+ */
+virConnectPtr virStoragePoolGetConnect (virStoragePoolPtr pool);
+
+/*
+ * List active storage pools
+ */
+int virConnectNumOfStoragePools (virConnectPtr conn);
+int virConnectListStoragePools (virConnectPtr conn,
+ char **const names,
+ int maxnames);
+
+/*
+ * List inactive storage pools
+ */
+int virConnectNumOfDefinedStoragePools(virConnectPtr conn);
+int virConnectListDefinedStoragePools(virConnectPtr conn,
+ char **const names,
+ int maxnames);
+
+/*
+ * Lookup network by name or uuid
+ */
+virStoragePoolPtr virStoragePoolLookupByName(virConnectPtr conn,
+ const char *name);
+virStoragePoolPtr virStoragePoolLookupByUUID(virConnectPtr conn,
+ const unsigned char *uuid);
+virStoragePoolPtr virStoragePoolLookupByUUIDString(virConnectPtr conn,
+ const char *uuid);
+
+/*
+ * Create active transient storage pool
+ */
+virStoragePoolPtr virStoragePoolCreateXML(virConnectPtr conn,
+ const char *xmlDesc);
+
+/*
+ * Define inactive persistent storage pool
+ */
+virStoragePoolPtr virStoragePoolDefineXML(virConnectPtr conn,
+ const char *xmlDesc);
+
+/*
+ * Delete persistent storage pool
+ */
+int virStoragePoolUndefine(virStoragePoolPtr pool);
+
+/*
+ * Activate persistent pool
+ */
+int virStoragePoolCreate(virStoragePoolPtr pool);
+
+/*
+ * StoragePool destroy/free
+ */
+int virStoragePoolShutdown(virStoragePoolPtr pool);
+int virStoragePoolDestroy (virStoragePoolPtr pool);
+int virStoragePoolFree (virStoragePoolPtr pool);
Hum, I really wonder about the precise semantic for those 3 operations
+/*
+ * StoragePool information
+ */
+const char* virStoragePoolGetName (virStoragePoolPtr pool);
+int virStoragePoolGetUUID (virStoragePoolPtr pool,
+ unsigned char *uuid);
+int virStoragePoolGetUUIDString(virStoragePoolPtr pool,
+ char *buf);
+
+int virStoragePoolGetInfo(virStoragePoolPtr vol,
+ virStoragePoolInfoPtr info);
+
+char * virStoragePoolGetXMLDesc(virStoragePoolPtr pool,
+ int flags);
+
+int virStoragePoolGetAutostart(virStoragePoolPtr pool,
+ int *autostart);
+int virStoragePoolSetAutostart(virStoragePoolPtr pool,
+ int autostart);
+
+
+
+/*
+ * List storage volumes within a pool
+ */
+int virStoragePoolNumOfVolumes(virStoragePoolPtr pool);
+int virStoragePoolListVolumes (virStoragePoolPtr pool,
+ char **const names,
+ int maxnames);
+
+/*
+ * Lookup network by name or uuid
s/network/storage/ :-)
+ */
+virStorageVolPtr virStorageVolLookupByName(virStoragePoolPtr pool,
+ const char *name);
+virStorageVolPtr virStorageVolLookupByUUID(virStoragePoolPtr pool,
+ const unsigned char *uuid);
+virStorageVolPtr virStorageVolLookupByUUIDString(virStoragePoolPtr pool,
+ const char *uuid);
+
+const char* virStorageVolGetName (virStorageVolPtr vol);
so there is a public name, keep it in the structure, you can't garantee
the storage will have exactly the name the user expect, aliasing is
frequent in storage I think.
+int virStorageVolGetUUID (virStorageVolPtr vol,
+ unsigned char *uuid);
+int virStorageVolGetUUIDString(virStorageVolPtr vol,
+ char *buf);
+
+
+virStorageVolPtr virStorageVolCreateXML(virStoragePoolPtr pool,
+ const char *xmldesc,
+ int flags);
+
+int virStorageVolDestroy(virStorageVolPtr vol);
+int virStorageVolFree(virStorageVolPtr vol);
+
+int virStorageVolGetInfo(virStorageVolPtr vol,
+ virStorageVolInfoPtr info);
+char * virStorageVolGetXMLDesc(virStorageVolPtr pool,
+ int flags);
+
+char * virStorageVolGetPath(virStorageVolPtr vol);
+
+#ifdef __cplusplus
+}
The API being derived from existing APIs they of course looks rather sane
to me, but the XML formats is also part of the APIs not described here.
Daniel
--
Red Hat Virtualization group
http://redhat.com/virtualization/
Daniel Veillard | virtualization library
http://libvirt.org/
veillard(a)redhat.com | libxml GNOME XML XSLT toolkit
http://xmlsoft.org/
http://veillard.com/ | Rpmfind RPM search engine
http://rpmfind.net/